From: <ibr...@us...> - 2013-12-06 14:45:52
|
Revision: 4974 http://sourceforge.net/p/tora/code/4974 Author: ibre5041 Date: 2013-12-06 14:45:44 +0000 (Fri, 06 Dec 2013) Log Message: ----------- Modified Paths: -------------- trunk/tora/src/result/toresulttabledata.cpp Modified: trunk/tora/src/result/toresulttabledata.cpp =================================================================== --- trunk/tora/src/result/toresulttabledata.cpp 2013-12-06 13:53:56 UTC (rev 4973) +++ trunk/tora/src/result/toresulttabledata.cpp 2013-12-06 14:45:44 UTC (rev 4974) @@ -891,11 +891,8 @@ sql += "<char[4000],in>"; args << row[num]; } - //qDebug() << sql; - { - toQuery q(conn, sql, args); - deleted += q.rowsProcessed(); - } + toQuery q(conn, sql, args); + deleted += q.rowsProcessed(); } unsigned toResultTableData::commitDelete(toConnectionSubLoan &conn, toResultModelEdit::ChangeSet &change) { @@ -958,16 +955,8 @@ } } - { - toQuery q(conn, sql, args); - - if (toConfigurationSingle::Instance().autoCommit()) - conn->commit(); - else - { - throw QString("Not implemented yet. %1").arg(__QHERE__); - //// TODO toGlobalEventSingle::Instance().setNeedCommit(conn); - } - return q.rowsProcessed(); - } + toQuery q(conn, sql, args); + if (toConfigurationSingle::Instance().autoCommit()) + conn->commit(); + return q.rowsProcessed(); } This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <ibr...@us...> - 2013-12-10 23:22:18
|
Revision: 4976 http://sourceforge.net/p/tora/code/4976 Author: ibre5041 Date: 2013-12-10 23:22:11 +0000 (Tue, 10 Dec 2013) Log Message: ----------- Modified Paths: -------------- trunk/tora/src/result/toresulttabledata.cpp Modified: trunk/tora/src/result/toresulttabledata.cpp =================================================================== --- trunk/tora/src/result/toresulttabledata.cpp 2013-12-10 18:57:43 UTC (rev 4975) +++ trunk/tora/src/result/toresulttabledata.cpp 2013-12-10 23:22:11 UTC (rev 4976) @@ -539,205 +539,51 @@ refresh(); } -void toResultTableData::commitUpdate(toConnectionSubLoan &conn, const toQuery::Row &row, unsigned int &updated) +unsigned toResultTableData::commitUpdate(toConnectionSubLoan &conn, toResultModelEdit::ChangeSet &change) { - toConnectionTraits const& connTraits = conn.ParentConnection.getTraits(); - QString sql = QString("UPDATE %1.%2 SET ").arg(connTraits.quote(Owner)).arg(connTraits.quote(Table)); - int num = 0; - toQueryParams args; - for (int i = Model->PriKeys.size() + 1; i < Model->headers().size(); i++) - { - // TODO if (row[i].isModified()) - { - // Only append columns that is not null - if (num > 0) - { - sql += ','; - } - num++; - // Construct place holder - sql += connTraits.quote(Model->headers()[i].name) + "=:f" + QString::number(num); + static const QString UPDATE = QString::fromAscii("UPDATE %1.%2 SET %3 WHERE 1=1 %4"); + static const QString CONJUNCTION = QString::fromAscii(" AND %1 = %2"); + static const QString ASSIGNMENT = QString::fromAscii("%1 = %2"); - if (row[i].isBinary()) - { - if (Model->headers()[i].datatype.toUpper().contains("LOB")) - sql += ("<blob,in>"); - else - sql += ("<raw_long,in>"); - } - else - { - if (Model->headers()[i].datatype.toUpper().contains("LOB")) - sql += ("<varchar_long,in>"); - else - sql += ("<char[4000],in>"); - } - // Construct value list - args << row[i]; - } - } - sql += " WHERE "; - QList<QString>::const_iterator ite; - int i; - for (i = 1, ite = Model->getPriKeys().constBegin(); ite != Model->getPriKeys().constEnd(); ite++, i++) - { - if(i > 1) - { - sql += " AND "; - } - sql += *ite + "=:k" + QString::number(i); - sql += "<char[4000],in>"; - args << row[i]; - } - //qDebug() << sql; + if (Model->getPriKeys().empty()) { - toQuery q(conn, sql, args); - updated += q.rowsProcessed(); + Utils::toStatusMessage(tr("This table has no known primary keys")); + return 0; } -} -unsigned toResultTableData::commitUpdate(toConnectionSubLoan &conn, toResultModelEdit::ChangeSet &change) -{ toConnectionTraits const& connTraits = conn.ParentConnection.getTraits(); - const toResultModel::HeaderList & Headers = Model->headers(); - bool oracle = conn.ParentConnection.providerIs("Oracle"); + QString sqlValuePlaceHolders, sqlCondPlaceHolders; - QString sql = QString("UPDATE %1.%2 SET ").arg(connTraits.quote(Owner)).arg(connTraits.quote(Table)); - sql += connTraits.quote(change.columnName); - // set new value in update statement if (change.newValue.isNull()) - sql += (" = NULL"); + sqlValuePlaceHolders = ASSIGNMENT.arg(change.columnName).arg("NULL"); else - { - sql += ("= :f0"); + sqlValuePlaceHolders = ASSIGNMENT.arg(change.columnName).arg(change.newValue); - if (change.row[change.column].isBinary()) - { - if (Headers[change.column].datatype.toUpper().contains("LOB")) - sql += ("<blob,in>"); - else - sql += ("<raw_long,in>"); - } - else - { - if (Headers[change.column].datatype.toUpper().contains("LOB")) - sql += ("<varchar_long,in>"); - else - sql += ("<char[4000],in>"); - } - } - - // set where clause for update statement - sql += (" WHERE ("); - int col = 1; - bool where = false; - - for (toQuery::Row::iterator j = change.row.begin() + 1; - j != change.row.end(); - j++, col++) + for(int i = 1; i < Model->getPriKeys().size() + 1; i++) { - - QString columnName = connTraits.quote(Model->headerData( - col, - Qt::Horizontal, - Qt::DisplayRole).toString()); - - if ((*j).isComplexType()) - { - Utils::toStatusMessage(tr("This table contains complex/user defined columns " - "and can not be edited")); - return 0; - } - - if (!oracle || (!Headers[col].datatype.toUpper().startsWith(("LONG")) && - !Headers[col].datatype.toUpper().contains(("LOB")))) - { - if (where) - sql += (" AND ("); - else - where = true; - - sql += columnName; - - if ((*j).isNull()) - { - sql += " IS NULL "; - - // QVariant cannot identify the type when value is null therefore - // we use the actual database type for this check. - if (Headers[col].datatype.startsWith("NUMBER") || - Headers[col].datatype.startsWith("INT") || - Headers[col].datatype.startsWith("DATE")) - sql += ")"; - else - { - sql += " OR " + columnName + " = :c"; - sql += QString::number(col); - if ((*j).isBinary()) - sql += ("<raw_long,in>)"); - else - sql += ("<char[4000],in>)"); - } - } - else - { - sql += " = :c"; - sql += QString::number(col); - if ((*j).isBinary()) - sql += ("<raw_long,in>)"); - else - sql += ("<char[4000],in>)"); - } - } + sqlCondPlaceHolders += CONJUNCTION + .arg(connTraits.quote(Model->headerData( + i, + Qt::Horizontal, + Qt::DisplayRole).toString())) + .arg(connTraits.quoteVarchar(change.row[i].editData())); } - if (!where) + QString sql = UPDATE.arg(connTraits.quote(Owner)).arg(connTraits.quote(Table)).arg(sqlValuePlaceHolders).arg(sqlCondPlaceHolders); + Logging->appendPlainText(sql); { - Utils::toStatusMessage(tr("This table contains only LOB/LONG " - "columns and can not be edited")); - return 0; + toQuery q(conn, sql, toQueryParams()); + q.eof(); + if (q.rowsProcessed() > 1) + { + Logging->appendPlainText("Rollback;"); + conn->rollback(); + return 0; + } + conn->commit(); + return q.rowsProcessed(); } - - toQueryParams args; - - // the "SET = " value - if (!change.newValue.isNull()) - args << change.newValue; - - col = 1; - for (toQuery::Row::iterator j = change.row.begin() + 1; - j != change.row.end(); - j++, col++) - { - if (!oracle || (!Headers[col].datatype.toUpper().startsWith(("LONG")) && - !Headers[col].datatype.toUpper().contains(("LOB")))) - { - if ((*j).isNull()) - { - if (!Headers[col].datatype.startsWith("NUMBER") && - !Headers[col].datatype.startsWith("INT") && - !Headers[col].datatype.startsWith("DATE")) - args << toQValue(QString("")); - // else don't push null for numbers - } - else - args << (*j); - } - } - - Logging->appendPlainText(sql); - { - toQuery q(conn, sql, args); - if (toConfigurationSingle::Instance().autoCommit()) - conn->commit(); - else - { - throw QString("Not implemented yet. %1").arg(__QHERE__); - ///toGlobalEventSingle::Instance().setNeedCommit(conn); - } - return q.rowsProcessed(); - } } unsigned toResultTableData::commitAdd(toConnectionSubLoan &conn, toResultModelEdit::ChangeSet &change) @@ -835,6 +681,12 @@ { toQuery q(conn, sql, toQueryParams()); q.eof(); + if (q.rowsProcessed() > 1) + { + Logging->appendPlainText("Rollback;"); + conn->rollback(); + return 0; + } conn->commit(); return q.rowsProcessed(); } This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <ibr...@us...> - 2013-12-12 20:24:49
|
Revision: 4983 http://sourceforge.net/p/tora/code/4983 Author: ibre5041 Date: 2013-12-12 20:24:45 +0000 (Thu, 12 Dec 2013) Log Message: ----------- do not commit rows one-by-one Modified Paths: -------------- trunk/tora/src/result/toresulttabledata.cpp Modified: trunk/tora/src/result/toresulttabledata.cpp =================================================================== --- trunk/tora/src/result/toresulttabledata.cpp 2013-12-12 08:15:31 UTC (rev 4982) +++ trunk/tora/src/result/toresulttabledata.cpp 2013-12-12 20:24:45 UTC (rev 4983) @@ -243,8 +243,8 @@ return; QModelIndex current = Edit->selectionModel()->currentIndex(); - int row = current.row(); - int col = current.column(); + int row = current.isValid() ? current.row() : 0; + int col = current.isValid() ? current.column() : 0; if (col < 1) col = 1; // can't select hidden first column @@ -252,19 +252,14 @@ if (action == firstAct) row = 0; else if (action == previousAct) - row--; + row = (std::max)(--row, 0); else if (action == nextAct) - row++; + row = (std::min)(++row, Edit->model()->rowCount() - 1); else if (action == lastAct) row = Edit->model()->rowCount() - 1; else return; // not a nav action - if (row < 0) - row = 0; - if (row >= Edit->model()->rowCount()) - row = Edit->model()->rowCount() - 1; - QModelIndex left = Edit->model()->createIndex(row, col); Edit->selectionModel()->select(QItemSelection(left, left), QItemSelectionModel::ClearAndSelect); @@ -454,6 +449,7 @@ if (!error) { + conn->commit(); ProgressBar->setValue(Changes.size()); Changes.clear(); } @@ -581,7 +577,6 @@ conn->rollback(); return 0; } - conn->commit(); return q.rowsProcessed(); } } @@ -646,9 +641,6 @@ // TODO use event query toQuery q(conn, sql, toQueryParams()); q.eof(); - //TODO add commit button - //if (toConfigurationSingle::Instance().autoCommit()) - conn->commit(); return q.rowsProcessed(); } } @@ -687,7 +679,6 @@ conn->rollback(); return 0; } - conn->commit(); return q.rowsProcessed(); } } This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |