From b8430baeadd62b643ff07a2588c62141146c08fd Mon Sep 17 00:00:00 2001 From: Bill King Date: Mon, 15 Jun 2009 10:28:47 +1000 Subject: BT Revert "Fix the behaviour of sql classes regarding quoted identifiers" This reverts commit bb7bddc47dd0748b45d22180d9e3c8e5209010b3 due to forward binary compatibility issues in a point release. --- src/sql/drivers/db2/qsql_db2.cpp | 70 +--- src/sql/drivers/ibase/qsql_ibase.cpp | 16 +- src/sql/drivers/mysql/qsql_mysql.cpp | 19 +- src/sql/drivers/mysql/qsql_mysql.h | 3 - src/sql/drivers/oci/qsql_oci.cpp | 58 +-- src/sql/drivers/odbc/qsql_odbc.cpp | 128 ------ src/sql/drivers/odbc/qsql_odbc.h | 4 - src/sql/drivers/psql/qsql_psql.cpp | 32 +- src/sql/drivers/sqlite/qsql_sqlite.cpp | 16 +- src/sql/drivers/sqlite2/qsql_sqlite2.cpp | 20 +- src/sql/drivers/tds/qsql_tds.cpp | 21 +- src/sql/kernel/qsqldriver.cpp | 131 +----- src/sql/kernel/qsqldriver.h | 6 - src/sql/models/qsqlrelationaltablemodel.cpp | 73 +--- src/sql/models/qsqltablemodel.cpp | 20 +- tests/auto/qsqldatabase/tst_databases.h | 19 +- tests/auto/qsqldriver/qsqldriver.pro | 16 - tests/auto/qsqldriver/tst_qsqldriver.cpp | 218 ---------- .../tst_qsqlrelationaltablemodel.cpp | 455 ++------------------- tests/auto/qsqltablemodel/tst_qsqltablemodel.cpp | 15 +- 20 files changed, 131 insertions(+), 1209 deletions(-) delete mode 100644 tests/auto/qsqldriver/qsqldriver.pro delete mode 100644 tests/auto/qsqldriver/tst_qsqldriver.cpp diff --git a/src/sql/drivers/db2/qsql_db2.cpp b/src/sql/drivers/db2/qsql_db2.cpp index 11d0041..2786dbb 100644 --- a/src/sql/drivers/db2/qsql_db2.cpp +++ b/src/sql/drivers/db2/qsql_db2.cpp @@ -1182,7 +1182,7 @@ QDB2Driver::~QDB2Driver() delete d; } -bool QDB2Driver::open(const QString& db, const QString& user, const QString& password, const QString& host, int port, +bool QDB2Driver::open(const QString& db, const QString& user, const QString& password, const QString&, int, const QString& connOpts) { if (isOpen()) @@ -1205,8 +1205,6 @@ bool QDB2Driver::open(const QString& db, const QString& user, const QString& pas setOpenError(true); return false; } - - QString protocol; // Set connection attributes const QStringList opts(connOpts.split(QLatin1Char(';'), QString::SkipEmptyParts)); for (int i = 0; i < opts.count(); ++i) { @@ -1237,10 +1235,7 @@ bool QDB2Driver::open(const QString& db, const QString& user, const QString& pas } else if (opt == QLatin1String("SQL_ATTR_LOGIN_TIMEOUT")) { v = val.toUInt(); r = SQLSetConnectAttr(d->hDbc, SQL_ATTR_LOGIN_TIMEOUT, (SQLPOINTER) v, 0); - } else if (opt.compare(QLatin1String("PROTOCOL"), Qt::CaseInsensitive) == 0) { - protocol = tmp; - } - else { + } else { qWarning("QDB2Driver::open: Unknown connection attribute '%s'", tmp.toLocal8Bit().constData()); } @@ -1249,18 +1244,9 @@ bool QDB2Driver::open(const QString& db, const QString& user, const QString& pas "Unable to set connection attribute '%1'").arg(opt), d); } - if (protocol.isEmpty()) - protocol = QLatin1String("PROTOCOL=TCPIP"); - - if (port < 0 ) - port = 50000; - QString connQStr; - connQStr = protocol + QLatin1String(";DATABASE=") + db + QLatin1String(";HOSTNAME=") + host - + QLatin1String(";PORT=") + QString::number(port) + QLatin1String(";UID=") + user - + QLatin1String(";PWD=") + password; - - + connQStr = QLatin1String("DSN=") + db + QLatin1String(";UID=") + user + QLatin1String(";PWD=") + + password; SQLTCHAR connOut[SQL_MAX_OPTION_STRING_LENGTH]; SQLSMALLINT cb; @@ -1279,7 +1265,7 @@ bool QDB2Driver::open(const QString& db, const QString& user, const QString& pas return false; } - d->user = user; + d->user = user.toUpper(); setOpen(true); setOpenError(false); return true; @@ -1324,25 +1310,10 @@ QSqlRecord QDB2Driver::record(const QString& tableName) const SQLHANDLE hStmt; QString catalog, schema, table; - qSplitTableQualifier(tableName, &catalog, &schema, &table); + qSplitTableQualifier(tableName.toUpper(), &catalog, &schema, &table); if (schema.isEmpty()) schema = d->user; - if (isIdentifierEscaped(catalog, QSqlDriver::TableName)) - catalog = stripDelimiters(catalog, QSqlDriver::TableName); - else - catalog = catalog.toUpper(); - - if (isIdentifierEscaped(schema, QSqlDriver::TableName)) - schema = stripDelimiters(schema, QSqlDriver::TableName); - else - schema = schema.toUpper(); - - if (isIdentifierEscaped(table, QSqlDriver::TableName)) - table = stripDelimiters(table, QSqlDriver::TableName); - else - table = table.toUpper(); - SQLRETURN r = SQLAllocHandle(SQL_HANDLE_STMT, d->hDbc, &hStmt); @@ -1356,9 +1327,6 @@ QSqlRecord QDB2Driver::record(const QString& tableName) const (SQLPOINTER) SQL_CURSOR_FORWARD_ONLY, SQL_IS_UINTEGER); - - //Aside: szSchemaName and szTableName parameters of SQLColumns - //are case sensitive search patterns, so no escaping is used. r = SQLColumns(hStmt, NULL, 0, @@ -1439,13 +1407,7 @@ QStringList QDB2Driver::tables(QSql::TableType type) const bool isNull; QString fieldVal = qGetStringData(hStmt, 2, -1, isNull); QString userVal = qGetStringData(hStmt, 1, -1, isNull); - QString user = d->user; - if ( isIdentifierEscaped(user, QSqlDriver::TableName)) - user = stripDelimiters(user, QSqlDriver::TableName); - else - user = user.toUpper(); - - if (userVal != user) + if (userVal != d->user) fieldVal = userVal + QLatin1Char('.') + fieldVal; tl.append(fieldVal); r = SQLFetchScroll(hStmt, @@ -1476,23 +1438,7 @@ QSqlIndex QDB2Driver::primaryIndex(const QString& tablename) const return index; } QString catalog, schema, table; - qSplitTableQualifier(tablename, &catalog, &schema, &table); - - if (isIdentifierEscaped(catalog, QSqlDriver::TableName)) - catalog = stripDelimiters(catalog, QSqlDriver::TableName); - else - catalog = catalog.toUpper(); - - if (isIdentifierEscaped(schema, QSqlDriver::TableName)) - schema = stripDelimiters(schema, QSqlDriver::TableName); - else - schema = schema.toUpper(); - - if (isIdentifierEscaped(table, QSqlDriver::TableName)) - table = stripDelimiters(table, QSqlDriver::TableName); - else - table = table.toUpper(); - + qSplitTableQualifier(tablename.toUpper(), &catalog, &schema, &table); r = SQLSetStmtAttr(hStmt, SQL_ATTR_CURSOR_TYPE, (SQLPOINTER)SQL_CURSOR_FORWARD_ONLY, diff --git a/src/sql/drivers/ibase/qsql_ibase.cpp b/src/sql/drivers/ibase/qsql_ibase.cpp index 1645555..523ec4d 100644 --- a/src/sql/drivers/ibase/qsql_ibase.cpp +++ b/src/sql/drivers/ibase/qsql_ibase.cpp @@ -1558,16 +1558,12 @@ QSqlRecord QIBaseDriver::record(const QString& tablename) const QSqlQuery q(createResult()); q.setForwardOnly(true); - QString table = tablename; - if (isIdentifierEscaped(table, QSqlDriver::TableName)) - table = stripDelimiters(table, QSqlDriver::TableName); - else - table = table.toUpper(); + q.exec(QLatin1String("SELECT a.RDB$FIELD_NAME, b.RDB$FIELD_TYPE, b.RDB$FIELD_LENGTH, " "b.RDB$FIELD_SCALE, b.RDB$FIELD_PRECISION, a.RDB$NULL_FLAG " "FROM RDB$RELATION_FIELDS a, RDB$FIELDS b " "WHERE b.RDB$FIELD_NAME = a.RDB$FIELD_SOURCE " - "AND a.RDB$RELATION_NAME = '") + table + QLatin1String("' " + "AND a.RDB$RELATION_NAME = '") + tablename.toUpper() + QLatin1String("' " "ORDER BY a.RDB$FIELD_POSITION")); while (q.next()) { @@ -1595,18 +1591,12 @@ QSqlIndex QIBaseDriver::primaryIndex(const QString &table) const if (!isOpen()) return index; - QString tablename = table; - if (isIdentifierEscaped(tablename, QSqlDriver::TableName)) - tablename = stripDelimiters(tablename, QSqlDriver::TableName); - else - tablename = tablename.toUpper(); - QSqlQuery q(createResult()); q.setForwardOnly(true); q.exec(QLatin1String("SELECT a.RDB$INDEX_NAME, b.RDB$FIELD_NAME, d.RDB$FIELD_TYPE, d.RDB$FIELD_SCALE " "FROM RDB$RELATION_CONSTRAINTS a, RDB$INDEX_SEGMENTS b, RDB$RELATION_FIELDS c, RDB$FIELDS d " "WHERE a.RDB$CONSTRAINT_TYPE = 'PRIMARY KEY' " - "AND a.RDB$RELATION_NAME = '") + tablename + + "AND a.RDB$RELATION_NAME = '") + table.toUpper() + QLatin1String(" 'AND a.RDB$INDEX_NAME = b.RDB$INDEX_NAME " "AND c.RDB$RELATION_NAME = a.RDB$RELATION_NAME " "AND c.RDB$FIELD_NAME = b.RDB$FIELD_NAME " diff --git a/src/sql/drivers/mysql/qsql_mysql.cpp b/src/sql/drivers/mysql/qsql_mysql.cpp index 53645c9..4468686 100644 --- a/src/sql/drivers/mysql/qsql_mysql.cpp +++ b/src/sql/drivers/mysql/qsql_mysql.cpp @@ -1342,7 +1342,7 @@ QSqlIndex QMYSQLDriver::primaryIndex(const QString& tablename) const QSqlQuery i(createResult()); QString stmt(QLatin1String("show index from %1;")); QSqlRecord fil = record(tablename); - i.exec(stmt.arg(tablename)); + i.exec(stmt.arg(escapeIdentifier(tablename, QSqlDriver::TableName))); while (i.isActive() && i.next()) { if (i.value(2).toString() == QLatin1String("PRIMARY")) { idx.append(fil.field(i.value(4).toString())); @@ -1357,14 +1357,10 @@ QSqlIndex QMYSQLDriver::primaryIndex(const QString& tablename) const QSqlRecord QMYSQLDriver::record(const QString& tablename) const { - QString table=tablename; - if(isIdentifierEscaped(table, QSqlDriver::TableName)) - table = stripDelimiters(table, QSqlDriver::TableName); - QSqlRecord info; if (!isOpen()) return info; - MYSQL_RES* r = mysql_list_fields(d->mysql, table.toLocal8Bit().constData(), 0); + MYSQL_RES* r = mysql_list_fields(d->mysql, tablename.toLocal8Bit().constData(), 0); if (!r) { return info; } @@ -1475,17 +1471,6 @@ QString QMYSQLDriver::escapeIdentifier(const QString &identifier, IdentifierType return res; } -bool QMYSQLDriver::isIdentifierEscapedImplementation(const QString &identifier, IdentifierType type) const -{ - Q_UNUSED(type); - bool isLeftDelimited = (identifier.left(1) == QString(QLatin1Char('`'))); - bool isRightDelimited = (identifier.right(1) == QString(QLatin1Char('`'))); - if( identifier.size() > 2 && isLeftDelimited && isRightDelimited ) - return true; - else - return false; -} - QT_END_NAMESPACE #include "qsql_mysql.moc" \ No newline at end of file diff --git a/src/sql/drivers/mysql/qsql_mysql.h b/src/sql/drivers/mysql/qsql_mysql.h index 31d9dcf..97aa346 100644 --- a/src/sql/drivers/mysql/qsql_mysql.h +++ b/src/sql/drivers/mysql/qsql_mysql.h @@ -123,9 +123,6 @@ public: QVariant handle() const; QString escapeIdentifier(const QString &identifier, IdentifierType type) const; -protected Q_SLOTS: - bool isIdentifierEscapedImplementation(const QString &identifier, IdentifierType type) const; - protected: bool beginTransaction(); bool commitTransaction(); diff --git a/src/sql/drivers/oci/qsql_oci.cpp b/src/sql/drivers/oci/qsql_oci.cpp index a7031b1..f3dabee 100644 --- a/src/sql/drivers/oci/qsql_oci.cpp +++ b/src/sql/drivers/oci/qsql_oci.cpp @@ -2108,7 +2108,7 @@ bool QOCIDriver::open(const QString & db, setOpen(true); setOpenError(false); - d->user = user; + d->user = user.toUpper(); return true; } @@ -2210,15 +2210,8 @@ QStringList QOCIDriver::tables(QSql::TableType type) const "and owner != 'WKSYS'" "and owner != 'CTXSYS'" "and owner != 'WMSYS'")); - - QString user = d->user; - if ( isIdentifierEscaped(user, QSqlDriver::TableName)) - user = stripDelimiters(user, QSqlDriver::TableName); - else - user = user.toUpper(); - while (t.next()) { - if (t.value(0).toString().toUpper() != user.toUpper()) + if (t.value(0).toString().toUpper() != d->user.toUpper()) tl.append(t.value(0).toString() + QLatin1String(".") + t.value(1).toString()); else tl.append(t.value(1).toString()); @@ -2254,10 +2247,10 @@ void qSplitTableAndOwner(const QString & tname, QString * tbl, { int i = tname.indexOf(QLatin1Char('.')); // prefixed with owner? if (i != -1) { - *tbl = tname.right(tname.length() - i - 1); - *owner = tname.left(i); + *tbl = tname.right(tname.length() - i - 1).toUpper(); + *owner = tname.left(i).toUpper(); } else { - *tbl = tname; + *tbl = tname.toUpper(); } } @@ -2273,7 +2266,7 @@ QSqlRecord QOCIDriver::record(const QString& tablename) const QString stmt(QLatin1String("select column_name, data_type, data_length, " "data_precision, data_scale, nullable, data_default%1" "from all_tab_columns " - "where table_name=%2")); + "where upper(table_name)=%2")); if (d->serverVersion >= 9) stmt = stmt.arg(QLatin1String(", char_length ")); else @@ -2281,23 +2274,11 @@ QSqlRecord QOCIDriver::record(const QString& tablename) const bool buildRecordInfo = false; QString table, owner, tmpStmt; qSplitTableAndOwner(tablename, &table, &owner); - - if (isIdentifierEscaped(table, QSqlDriver::TableName)) - table = stripDelimiters(table, QSqlDriver::TableName); - else - table = table.toUpper(); - tmpStmt = stmt.arg(QLatin1Char('\'') + table + QLatin1Char('\'')); if (owner.isEmpty()) { owner = d->user; } - - if (isIdentifierEscaped(owner, QSqlDriver::TableName)) - owner = stripDelimiters(owner, QSqlDriver::TableName); - else - owner = owner.toUpper(); - - tmpStmt += QLatin1String(" and owner='") + owner + QLatin1String("'"); + tmpStmt += QLatin1String(" and upper(owner)='") + owner + QLatin1String("'"); t.setForwardOnly(true); t.exec(tmpStmt); if (!t.next()) { // try and see if the tablename is a synonym @@ -2346,23 +2327,11 @@ QSqlIndex QOCIDriver::primaryIndex(const QString& tablename) const bool buildIndex = false; QString table, owner, tmpStmt; qSplitTableAndOwner(tablename, &table, &owner); - - if (isIdentifierEscaped(table, QSqlDriver::TableName)) - table = stripDelimiters(table, QSqlDriver::TableName); - else - table = table.toUpper(); - - tmpStmt = stmt + QLatin1String(" and a.table_name='") + table + QLatin1String("'"); + tmpStmt = stmt + QLatin1String(" and upper(a.table_name)='") + table + QLatin1String("'"); if (owner.isEmpty()) { owner = d->user; } - - if (isIdentifierEscaped(owner, QSqlDriver::TableName)) - owner = stripDelimiters(owner, QSqlDriver::TableName); - else - owner = owner.toUpper(); - - tmpStmt += QLatin1String(" and a.owner='") + owner + QLatin1String("'"); + tmpStmt += QLatin1String(" and upper(a.owner)='") + owner + QLatin1String("'"); t.setForwardOnly(true); t.exec(tmpStmt); @@ -2456,14 +2425,13 @@ QVariant QOCIDriver::handle() const return qVariantFromValue(d->env); } -QString QOCIDriver::escapeIdentifier(const QString &identifier, IdentifierType type) const +QString QOCIDriver::escapeIdentifier(const QString &identifier, IdentifierType /* type */) const { QString res = identifier; - if(!identifier.isEmpty() && !isIdentifierEscaped(identifier, type)) { - res.replace(QLatin1Char('"'), QLatin1String("\"\"")); + res.replace(QLatin1Char('"'), QLatin1String("\"\"")); + if (identifier.indexOf(QLatin1Char(' ')) != -1) res.prepend(QLatin1Char('"')).append(QLatin1Char('"')); - res.replace(QLatin1Char('.'), QLatin1String("\".\"")); - } +// res.replace(QLatin1Char('.'), QLatin1String("\".\"")); return res; } diff --git a/src/sql/drivers/odbc/qsql_odbc.cpp b/src/sql/drivers/odbc/qsql_odbc.cpp index ee500a0..b711b95 100644 --- a/src/sql/drivers/odbc/qsql_odbc.cpp +++ b/src/sql/drivers/odbc/qsql_odbc.cpp @@ -86,7 +86,6 @@ static const SQLSMALLINT qParamType[4] = { SQL_PARAM_INPUT, SQL_PARAM_INPUT, SQL class QODBCDriverPrivate { public: - enum DefaultCase{Lower, Mixed, Upper, Sensitive}; QODBCDriverPrivate() : hEnv(0), hDbc(0), useSchema(false), disconnectCount(0), isMySqlServer(false), isMSSqlServer(false), hasSQLFetchScroll(true), hasMultiResultSets(false) @@ -118,9 +117,6 @@ public: bool setConnectionOptions(const QString& connOpts); void splitTableQualifier(const QString &qualifier, QString &catalog, QString &schema, QString &table); - DefaultCase defaultCase() const; - QString adjustCase(const QString&) const; - QChar quoteChar() const; }; class QODBCPrivate @@ -557,28 +553,6 @@ static int qGetODBCVersion(const QString &connOpts) return SQL_OV_ODBC2; } -QChar QODBCDriverPrivate::quoteChar() const -{ - static bool isQuoteInitialized = false; - static QChar quote = QChar::fromLatin1('"'); - if (!isQuoteInitialized) { - char driverResponse[4]; - SQLSMALLINT length; - int r = SQLGetInfo(hDbc, - SQL_IDENTIFIER_QUOTE_CHAR, - &driverResponse, - sizeof(driverResponse), - &length); - if (r == SQL_SUCCESS || r == SQL_SUCCESS_WITH_INFO) { - quote = QChar::fromLatin1(driverResponse[0]); - } else { - quote = QChar::fromLatin1('"'); - } - isQuoteInitialized = true; - } - return quote; -} - bool QODBCDriverPrivate::setConnectionOptions(const QString& connOpts) { // Set any connection attributes @@ -729,65 +703,6 @@ void QODBCDriverPrivate::splitTableQualifier(const QString & qualifier, QString } } -QODBCDriverPrivate::DefaultCase QODBCDriverPrivate::defaultCase() const -{ - static bool isInitialized = false; - static DefaultCase ret; - - if (!isInitialized) { - SQLUSMALLINT casing; - int r = SQLGetInfo(hDbc, - SQL_IDENTIFIER_CASE, - &casing, - sizeof(casing), - NULL); - if ( r != SQL_SUCCESS) - ret = Lower;//arbitrary case if driver cannot be queried - else { - switch (casing) { - case (SQL_IC_UPPER): - ret = Upper; - break; - case (SQL_IC_LOWER): - ret = Lower; - break; - case (SQL_IC_SENSITIVE): - ret = Sensitive; - break; - case (SQL_IC_MIXED): - ret = Mixed; - break; - default: - ret = Upper; - } - } - isInitialized = true; - } - return ret; -} - -/* - Adjust the casing of an identifier to match what the - database engine would have done to it. -*/ -QString QODBCDriverPrivate::adjustCase(const QString &identifier) const -{ - QString ret = identifier; - switch(defaultCase()) { - case (Lower): - ret = identifier.toLower(); - break; - case (Upper): - ret = identifier.toUpper(); - break; - case(Mixed): - case(Sensitive): - default: - ret = identifier; - } - return ret; -} - //////////////////////////////////////////////////////////////////////////// QODBCResult::QODBCResult(const QODBCDriver * db, QODBCDriverPrivate* p) @@ -2171,22 +2086,6 @@ QSqlIndex QODBCDriver::primaryIndex(const QString& tablename) const } QString catalog, schema, table; d->splitTableQualifier(tablename, catalog, schema, table); - - if (isIdentifierEscaped(catalog, QSqlDriver::TableName)) - catalog = stripDelimiters(catalog, QSqlDriver::TableName); - else - catalog = d->adjustCase(catalog); - - if (isIdentifierEscaped(schema, QSqlDriver::TableName)) - schema = stripDelimiters(schema, QSqlDriver::TableName); - else - schema = d->adjustCase(schema); - - if (isIdentifierEscaped(table, QSqlDriver::TableName)) - table = stripDelimiters(table, QSqlDriver::TableName); - else - table = d->adjustCase(table); - r = SQLSetStmtAttr(hStmt, SQL_ATTR_CURSOR_TYPE, (SQLPOINTER)SQL_CURSOR_FORWARD_ONLY, @@ -2289,22 +2188,6 @@ QSqlRecord QODBCDriver::record(const QString& tablename) const SQLHANDLE hStmt; QString catalog, schema, table; d->splitTableQualifier(tablename, catalog, schema, table); - - if (isIdentifierEscaped(catalog, QSqlDriver::TableName)) - catalog = stripDelimiters(catalog, QSqlDriver::TableName); - else - catalog = d->adjustCase(catalog); - - if (isIdentifierEscaped(schema, QSqlDriver::TableName)) - schema = stripDelimiters(schema, QSqlDriver::TableName); - else - schema = d->adjustCase(schema); - - if (isIdentifierEscaped(table, QSqlDriver::TableName)) - table = stripDelimiters(table, QSqlDriver::TableName); - else - table = d->adjustCase(table); - SQLRETURN r = SQLAllocHandle(SQL_HANDLE_STMT, d->hDbc, &hStmt); @@ -2428,15 +2311,4 @@ QString QODBCDriver::escapeIdentifier(const QString &identifier, IdentifierType) return res; } -bool QODBCDriver::isIdentifierEscapedImplementation(const QString &identifier, IdentifierType) const -{ - QString quote = d->quoteChar(); - bool isLeftDelimited = identifier.left(1) == quote; - bool isRightDelimited = identifier.right(1) == quote; - if( identifier.size() > 2 && isLeftDelimited && isRightDelimited ) - return true; - else - return false; -} - QT_END_NAMESPACE diff --git a/src/sql/drivers/odbc/qsql_odbc.h b/src/sql/drivers/odbc/qsql_odbc.h index 51f53ea..4148007 100644 --- a/src/sql/drivers/odbc/qsql_odbc.h +++ b/src/sql/drivers/odbc/qsql_odbc.h @@ -145,14 +145,10 @@ public: QString escapeIdentifier(const QString &identifier, IdentifierType type) const; -protected Q_SLOTS: - bool isIdentifierEscapedImplementation(const QString &identifier, IdentifierType type) const; - protected: bool beginTransaction(); bool commitTransaction(); bool rollbackTransaction(); - private: void init(); bool endTrans(); diff --git a/src/sql/drivers/psql/qsql_psql.cpp b/src/sql/drivers/psql/qsql_psql.cpp index 16d19f1..afe45fc 100644 --- a/src/sql/drivers/psql/qsql_psql.cpp +++ b/src/sql/drivers/psql/qsql_psql.cpp @@ -894,16 +894,6 @@ QSqlIndex QPSQLDriver::primaryIndex(const QString& tablename) const QString schema; qSplitTableName(tbl, schema); - if (isIdentifierEscaped(tbl, QSqlDriver::TableName)) - tbl = stripDelimiters(tbl, QSqlDriver::TableName); - else - tbl = tbl.toLower(); - - if (isIdentifierEscaped(schema, QSqlDriver::TableName)) - schema = stripDelimiters(schema, QSqlDriver::TableName); - else - schema = schema.toLower(); - switch(d->pro) { case QPSQLDriver::Version6: stmt = QLatin1String("select pg_att1.attname, int(pg_att1.atttypid), pg_cl.relname " @@ -936,7 +926,7 @@ QSqlIndex QPSQLDriver::primaryIndex(const QString& tablename) const "FROM pg_attribute, pg_class " "WHERE %1 pg_class.oid IN " "(SELECT indexrelid FROM pg_index WHERE indisprimary = true AND indrelid IN " - " (SELECT oid FROM pg_class WHERE relname = '%2')) " + " (SELECT oid FROM pg_class WHERE lower(relname) = '%2')) " "AND pg_attribute.attrelid = pg_class.oid " "AND pg_attribute.attisdropped = false " "ORDER BY pg_attribute.attnum"); @@ -944,11 +934,11 @@ QSqlIndex QPSQLDriver::primaryIndex(const QString& tablename) const stmt = stmt.arg(QLatin1String("pg_table_is_visible(pg_class.oid) AND")); else stmt = stmt.arg(QString::fromLatin1("pg_class.relnamespace = (select oid from " - "pg_namespace where pg_namespace.nspname = '%1') AND ").arg(schema)); + "pg_namespace where pg_namespace.nspname = '%1') AND ").arg(schema.toLower())); break; } - i.exec(stmt.arg(tbl)); + i.exec(stmt.arg(tbl.toLower())); while (i.isActive() && i.next()) { QSqlField f(i.value(0).toString(), qDecodePSQLType(i.value(1).toInt())); idx.append(f); @@ -967,16 +957,6 @@ QSqlRecord QPSQLDriver::record(const QString& tablename) const QString schema; qSplitTableName(tbl, schema); - if (isIdentifierEscaped(tbl, QSqlDriver::TableName)) - tbl = stripDelimiters(tbl, QSqlDriver::TableName); - else - tbl = tbl.toLower(); - - if (isIdentifierEscaped(schema, QSqlDriver::TableName)) - schema = stripDelimiters(schema, QSqlDriver::TableName); - else - schema = schema.toLower(); - QString stmt; switch(d->pro) { case QPSQLDriver::Version6: @@ -1021,7 +1001,7 @@ QSqlRecord QPSQLDriver::record(const QString& tablename) const "left join pg_attrdef on (pg_attrdef.adrelid = " "pg_attribute.attrelid and pg_attrdef.adnum = pg_attribute.attnum) " "where %1 " - "and pg_class.relname = '%2' " + "and lower(pg_class.relname) = '%2' " "and pg_attribute.attnum > 0 " "and pg_attribute.attrelid = pg_class.oid " "and pg_attribute.attisdropped = false " @@ -1030,12 +1010,12 @@ QSqlRecord QPSQLDriver::record(const QString& tablename) const stmt = stmt.arg(QLatin1String("pg_table_is_visible(pg_class.oid)")); else stmt = stmt.arg(QString::fromLatin1("pg_class.relnamespace = (select oid from " - "pg_namespace where pg_namespace.nspname = '%1')").arg(schema)); + "pg_namespace where pg_namespace.nspname = '%1')").arg(schema.toLower())); break; } QSqlQuery query(createResult()); - query.exec(stmt.arg(tbl)); + query.exec(stmt.arg(tbl.toLower())); if (d->pro >= QPSQLDriver::Version71) { while (query.next()) { int len = query.value(3).toInt(); diff --git a/src/sql/drivers/sqlite/qsql_sqlite.cpp b/src/sql/drivers/sqlite/qsql_sqlite.cpp index f732077..605c4e8 100644 --- a/src/sql/drivers/sqlite/qsql_sqlite.cpp +++ b/src/sql/drivers/sqlite/qsql_sqlite.cpp @@ -661,13 +661,9 @@ QSqlIndex QSQLiteDriver::primaryIndex(const QString &tblname) const if (!isOpen()) return QSqlIndex(); - QString table = tblname; - if (isIdentifierEscaped(table, QSqlDriver::TableName)) - table = stripDelimiters(table, QSqlDriver::TableName); - QSqlQuery q(createResult()); q.setForwardOnly(true); - return qGetTableInfo(q, table, true); + return qGetTableInfo(q, tblname, true); } QSqlRecord QSQLiteDriver::record(const QString &tbl) const @@ -675,13 +671,9 @@ QSqlRecord QSQLiteDriver::record(const QString &tbl) const if (!isOpen()) return QSqlRecord(); - QString table = tbl; - if (isIdentifierEscaped(table, QSqlDriver::TableName)) - table = stripDelimiters(table, QSqlDriver::TableName); - QSqlQuery q(createResult()); q.setForwardOnly(true); - return qGetTableInfo(q, table); + return qGetTableInfo(q, tbl); } QVariant QSQLiteDriver::handle() const @@ -689,10 +681,10 @@ QVariant QSQLiteDriver::handle() const return qVariantFromValue(d->access); } -QString QSQLiteDriver::escapeIdentifier(const QString &identifier, IdentifierType type) const +QString QSQLiteDriver::escapeIdentifier(const QString &identifier, IdentifierType /*type*/) const { QString res = identifier; - if(!identifier.isEmpty() && !isIdentifierEscaped(identifier, type) ) { + if(!identifier.isEmpty() && identifier.left(1) != QString(QLatin1Char('"')) && identifier.right(1) != QString(QLatin1Char('"')) ) { res.replace(QLatin1Char('"'), QLatin1String("\"\"")); res.prepend(QLatin1Char('"')).append(QLatin1Char('"')); res.replace(QLatin1Char('.'), QLatin1String("\".\"")); diff --git a/src/sql/drivers/sqlite2/qsql_sqlite2.cpp b/src/sql/drivers/sqlite2/qsql_sqlite2.cpp index d0c6e18..ff73caa 100644 --- a/src/sql/drivers/sqlite2/qsql_sqlite2.cpp +++ b/src/sql/drivers/sqlite2/qsql_sqlite2.cpp @@ -167,15 +167,7 @@ void QSQLite2ResultPrivate::init(const char **cnames, int numCols) for (int i = 0; i < numCols; ++i) { const char* lastDot = strrchr(cnames[i], '.'); const char* fieldName = lastDot ? lastDot + 1 : cnames[i]; - - //remove quotations around the field name if any - QString fieldStr = QString::fromAscii(fieldName); - QString quote = QString::fromLatin1("\""); - if ( fieldStr.length() > 2 && fieldStr.left(1) == quote && fieldStr.right(1) == quote) { - fieldStr = fieldStr.mid(1); - fieldStr.chop(1); - } - rInf.append(QSqlField(fieldStr, + rInf.append(QSqlField(QString::fromAscii(fieldName), nameToType(QString::fromAscii(cnames[i+numCols])))); } } @@ -511,11 +503,8 @@ QSqlIndex QSQLite2Driver::primaryIndex(const QString &tblname) const QSqlQuery q(createResult()); q.setForwardOnly(true); - QString table = tblname; - if (isIdentifierEscaped(table, QSqlDriver::TableName)) - table = stripDelimiters(table, QSqlDriver::TableName); // finrst find a UNIQUE INDEX - q.exec(QLatin1String("PRAGMA index_list('") + table + QLatin1String("');")); + q.exec(QLatin1String("PRAGMA index_list('") + tblname + QLatin1String("');")); QString indexname; while(q.next()) { if (q.value(2).toInt()==1) { @@ -528,7 +517,7 @@ QSqlIndex QSQLite2Driver::primaryIndex(const QString &tblname) const q.exec(QLatin1String("PRAGMA index_info('") + indexname + QLatin1String("');")); - QSqlIndex index(table, indexname); + QSqlIndex index(tblname, indexname); while(q.next()) { QString name = q.value(2).toString(); QVariant::Type type = QVariant::Invalid; @@ -543,9 +532,6 @@ QSqlRecord QSQLite2Driver::record(const QString &tbl) const { if (!isOpen()) return QSqlRecord(); - QString table = tbl; - if (isIdentifierEscaped(tbl, QSqlDriver::TableName)) - table = stripDelimiters(table, QSqlDriver::TableName); QSqlQuery q(createResult()); q.setForwardOnly(true); diff --git a/src/sql/drivers/tds/qsql_tds.cpp b/src/sql/drivers/tds/qsql_tds.cpp index 515f0de..46e4a0b 100644 --- a/src/sql/drivers/tds/qsql_tds.cpp +++ b/src/sql/drivers/tds/qsql_tds.cpp @@ -293,8 +293,6 @@ QTDSResult::QTDSResult(const QTDSDriver* db) // insert d in error handler dict errs()->insert(d->dbproc, d); - dbcmd(d->dbproc, "set quoted_identifier on"); - dbsqlexec(d->dbproc); } QTDSResult::~QTDSResult() @@ -369,7 +367,7 @@ bool QTDSResult::gotoNext(QSqlCachedResult::ValueCache &values, int index) if (qIsNull(d->buffer.at(i * 2 + 1))) values[idx] = QVariant(QVariant::String); else - values[idx] = QString::fromLocal8Bit((const char*)d->buffer.at(i * 2)).trimmed(); + values[idx] = QString::fromLocal8Bit((const char*)d->buffer.at(i * 2)); break; case QVariant::ByteArray: { if (qIsNull(d->buffer.at(i * 2 + 1))) @@ -700,14 +698,9 @@ QSqlRecord QTDSDriver::record(const QString& tablename) const return info; QSqlQuery t(createResult()); t.setForwardOnly(true); - - QString table = tablename; - if (isIdentifierEscaped(table, QSqlDriver::TableName)) - table = stripDelimiters(table, QSqlDriver::TableName); - QString stmt (QLatin1String("select name, type, length, prec from syscolumns " "where id = (select id from sysobjects where name = '%1')")); - t.exec(stmt.arg(table)); + t.exec(stmt.arg(tablename)); while (t.next()) { QSqlField f(t.value(0).toString().simplified(), qDecodeTDSType(t.value(1).toInt())); f.setLength(t.value(2).toInt()); @@ -777,17 +770,13 @@ QSqlIndex QTDSDriver::primaryIndex(const QString& tablename) const { QSqlRecord rec = record(tablename); - QString table = tablename; - if (isIdentifierEscaped(table, QSqlDriver::TableName)) - table = stripDelimiters(table, QSqlDriver::TableName); - - QSqlIndex idx(table); - if ((!isOpen()) || (table.isEmpty())) + QSqlIndex idx(tablename); + if ((!isOpen()) || (tablename.isEmpty())) return QSqlIndex(); QSqlQuery t(createResult()); t.setForwardOnly(true); - t.exec(QString::fromLatin1("sp_helpindex '%1'").arg(table)); + t.exec(QString::fromLatin1("sp_helpindex '%1'").arg(tablename)); if (t.next()) { QStringList fNames = t.value(2).toString().simplified().split(QLatin1Char(',')); QRegExp regx(QLatin1String("\\s*(\\S+)(?:\\s+(DESC|desc))?\\s*")); diff --git a/src/sql/kernel/qsqldriver.cpp b/src/sql/kernel/qsqldriver.cpp index 40bc0df..a995005 100644 --- a/src/sql/kernel/qsqldriver.cpp +++ b/src/sql/kernel/qsqldriver.cpp @@ -49,17 +49,6 @@ QT_BEGIN_NAMESPACE -static QString prepareIdentifier(const QString &identifier, - QSqlDriver::IdentifierType type, const QSqlDriver *driver) -{ - Q_ASSERT( driver != NULL ); - QString ret = identifier; - if (!driver->isIdentifierEscaped(identifier, type)) { - ret = driver->escapeIdentifier(identifier, type); - } - return ret; -} - class QSqlDriverPrivate : public QObjectPrivate { public: @@ -383,7 +372,6 @@ QSqlRecord QSqlDriver::record(const QString & /* tableName */) const on \a type. The default implementation does nothing. - \sa isIdentifierEscaped() */ QString QSqlDriver::escapeIdentifier(const QString &identifier, IdentifierType) const { @@ -391,55 +379,6 @@ QString QSqlDriver::escapeIdentifier(const QString &identifier, IdentifierType) } /*! - Returns whether \a identifier is escaped according to the database rules. - \a identifier can either be a table name or field name, dependent - on \a type. - - \warning Because of binary compatability constraints, this function is not virtual. - If you want to provide your own implementation in your QSqlDriver subclass, - reimplement the isIdentifierEscapedImplementation() slot in your subclass instead. - The isIdentifierEscapedFunction() will dynamically detect the slot and call it. - - \sa stripDelimiters(), escapeIdentifier() - */ -bool QSqlDriver::isIdentifierEscaped(const QString &identifier, IdentifierType type) const -{ - bool result; - QMetaObject::invokeMethod(const_cast(this), - "isIdentifierEscapedImplementation", Qt::DirectConnection, - Q_RETURN_ARG(bool, result), - Q_ARG(QString, identifier), - Q_ARG(IdentifierType, type)); - return result; -} - -/*! - Returns the \a identifier with the leading and trailing delimiters removed, - \a identifier can either be a table name or field name, - dependent on \a type. If \a identifier does not have leading - and trailing delimiter characters, \a identifier is returned without - modification. - - \warning Because of binary compatability constraints, this function is not virtual, - If you want to provide your own implementation in your QSqlDriver subclass, - reimplement the stripDelimitersImplementation() slot in your subclass instead. - The stripDelimiters() function will dynamically detect the slot and call it. - - \since 4.5 - \sa isIdentifierEscaped() - */ -QString QSqlDriver::stripDelimiters(const QString &identifier, IdentifierType type) const -{ - QString result; - QMetaObject::invokeMethod(const_cast(this), - "stripDelimitersImplementation", Qt::DirectConnection, - Q_RETURN_ARG(QString, result), - Q_ARG(QString, identifier), - Q_ARG(IdentifierType, type)); - return result; -} - -/*! Returns a SQL statement of type \a type for the table \a tableName with the values from \a rec. If \a preparedStatement is true, the string will contain placeholders instead of values. @@ -458,17 +397,17 @@ QString QSqlDriver::sqlStatement(StatementType type, const QString &tableName, case SelectStatement: for (i = 0; i < rec.count(); ++i) { if (rec.isGenerated(i)) - s.append(prepareIdentifier(rec.fieldName(i), QSqlDriver::FieldName, this)).append(QLatin1String(", ")); + s.append(escapeIdentifier(rec.fieldName(i), FieldName)).append(QLatin1String(", ")); } if (s.isEmpty()) return s; s.chop(2); - s.prepend(QLatin1String("SELECT ")).append(QLatin1String(" FROM ")).append(tableName); + s.prepend(QLatin1String("SELECT ")).append(QLatin1String(" FROM ")).append(escapeIdentifier(tableName, TableName)); break; case WhereStatement: if (preparedStatement) { for (int i = 0; i < rec.count(); ++i) { - s.append(prepareIdentifier(rec.fieldName(i), FieldName,this)); + s.append(escapeIdentifier(rec.fieldName(i), FieldName)); if (rec.isNull(i)) s.append(QLatin1String(" IS NULL")); else @@ -477,7 +416,7 @@ QString QSqlDriver::sqlStatement(StatementType type, const QString &tableName, } } else { for (i = 0; i < rec.count(); ++i) { - s.append(prepareIdentifier(rec.fieldName(i), QSqlDriver::FieldName, this)); + s.append(escapeIdentifier(rec.fieldName(i), FieldName)); QString val = formatValue(rec.field(i)); if (val == QLatin1String("NULL")) s.append(QLatin1String(" IS NULL")); @@ -492,12 +431,12 @@ QString QSqlDriver::sqlStatement(StatementType type, const QString &tableName, } break; case UpdateStatement: - s.append(QLatin1String("UPDATE ")).append(tableName).append( + s.append(QLatin1String("UPDATE ")).append(escapeIdentifier(tableName, TableName)).append( QLatin1String(" SET ")); for (i = 0; i < rec.count(); ++i) { if (!rec.isGenerated(i) || !rec.value(i).isValid()) continue; - s.append(prepareIdentifier(rec.fieldName(i), QSqlDriver::FieldName, this)).append(QLatin1Char('=')); + s.append(escapeIdentifier(rec.fieldName(i), FieldName)).append(QLatin1Char('=')); if (preparedStatement) s.append(QLatin1Char('?')); else @@ -510,15 +449,15 @@ QString QSqlDriver::sqlStatement(StatementType type, const QString &tableName, s.clear(); break; case DeleteStatement: - s.append(QLatin1String("DELETE FROM ")).append(tableName); + s.append(QLatin1String("DELETE FROM ")).append(escapeIdentifier(tableName, TableName)); break; case InsertStatement: { - s.append(QLatin1String("INSERT INTO ")).append(tableName).append(QLatin1String(" (")); + s.append(QLatin1String("INSERT INTO ")).append(escapeIdentifier(tableName, TableName)).append(QLatin1String(" (")); QString vals; for (i = 0; i < rec.count(); ++i) { if (!rec.isGenerated(i) || !rec.value(i).isValid()) continue; - s.append(prepareIdentifier(rec.fieldName(i), QSqlDriver::FieldName, this)).append(QLatin1String(", ")); + s.append(escapeIdentifier(rec.fieldName(i), FieldName)).append(QLatin1String(", ")); if (preparedStatement) vals.append(QLatin1String("?")); else @@ -866,56 +805,4 @@ QStringList QSqlDriver::subscribedToNotificationsImplementation() const return QStringList(); } -/*! - This slot returns whether \a identifier is escaped according to the database rules. - \a identifier can either be a table name or field name, dependent - on \a type. - - Because of binary compatability constraints, isIdentifierEscaped() function - (introduced in Qt 4.5) is not virtual. Instead, isIdentifierEscaped() will - dynamically detect and call \e this slot. The default implementation - assumes the escape/delimiter character is a double quote. Reimplement this - slot in your own QSqlDriver if your database engine uses a different - delimiter character. - - \since 4.5 - \sa isIdentifierEscaped() - */ -bool QSqlDriver::isIdentifierEscapedImplementation(const QString &identifier, IdentifierType type) const -{ - Q_UNUSED(type); - bool isLeftDelimited = identifier.left(1) == QString(QLatin1Char('"')); - bool isRightDelimited = identifier.right(1) == QString(QLatin1Char('"')); - if( identifier.size() > 2 && isLeftDelimited && isRightDelimited ) - return true; - else - return false; -} - -/*! - This slot returns \a identifier with the leading and trailing delimiters removed, - \a identifier can either be a tablename or field name, dependent on \a type. - If \a identifier does not have leading and trailing delimiter characters, \a - identifier is returned without modification. - - Because of binary compatability constraints, the stripDelimiters() function - (introduced in Qt 4.5) is not virtual. Instead, stripDelimiters() will - dynamically detect and call \e this slot. It generally unnecessary - to reimplement this slot. - - \since 4.5 - \sa stripDelimiters() - */ -QString QSqlDriver::stripDelimitersImplementation(const QString &identifier, IdentifierType type) const -{ - QString ret; - if (this->isIdentifierEscaped(identifier, type)) { - ret = identifier.mid(1); - ret.chop(1); - } else { - ret = identifier; - } - return ret; -} - QT_END_NAMESPACE diff --git a/src/sql/kernel/qsqldriver.h b/src/sql/kernel/qsqldriver.h index 8ac1471..e763719 100644 --- a/src/sql/kernel/qsqldriver.h +++ b/src/sql/kernel/qsqldriver.h @@ -127,9 +127,6 @@ public: bool unsubscribeFromNotification(const QString &name); // ### Qt 5: make virtual QStringList subscribedToNotifications() const; // ### Qt 5: make virtual - bool isIdentifierEscaped(const QString &identifier, IdentifierType type) const; // ### Qt 5: make virtual - QString stripDelimiters(const QString &identifier, IdentifierType type) const; // ### Qt 5: make virtual - Q_SIGNALS: void notification(const QString &name); @@ -143,9 +140,6 @@ protected Q_SLOTS: bool unsubscribeFromNotificationImplementation(const QString &name); // ### Qt 5: eliminate, see unsubscribeFromNotification() QStringList subscribedToNotificationsImplementation() const; // ### Qt 5: eliminate, see subscribedNotifications() - bool isIdentifierEscapedImplementation(const QString &identifier, IdentifierType type) const; // ### Qt 5: eliminate, see isIdentifierEscaped() - QString stripDelimitersImplementation(const QString &identifier, IdentifierType type) const; // ### Qt 5: eliminate, see stripDelimiters() - private: Q_DISABLE_COPY(QSqlDriver) }; diff --git a/src/sql/models/qsqlrelationaltablemodel.cpp b/src/sql/models/qsqlrelationaltablemodel.cpp index 12eae84..935466b 100644 --- a/src/sql/models/qsqlrelationaltablemodel.cpp +++ b/src/sql/models/qsqlrelationaltablemodel.cpp @@ -182,21 +182,10 @@ void QRelation::populateDictionary() populateModel(); QSqlRecord record; - QString indexColumn; - QString displayColumn; for (int i=0; i < model->rowCount(); ++i) { record = model->record(i); - - indexColumn = rel.indexColumn(); - if (m_parent->database().driver()->isIdentifierEscaped(indexColumn, QSqlDriver::FieldName)) - indexColumn = m_parent->database().driver()->stripDelimiters(indexColumn, QSqlDriver::FieldName); - - displayColumn = rel.displayColumn(); - if (m_parent->database().driver()->isIdentifierEscaped(displayColumn, QSqlDriver::FieldName)) - displayColumn = m_parent->database().driver()->stripDelimiters(displayColumn, QSqlDriver::FieldName); - - dictionary[record.field(indexColumn).value().toString()] = - record.field(displayColumn).value(); + dictionary[record.field(rel.indexColumn()).value().toString()] = + record.field(rel.displayColumn()).value(); } m_dictInitialized = true; } @@ -226,7 +215,7 @@ public: QSqlRelationalTableModelPrivate() : QSqlTableModelPrivate() {} - QString relationField(const QString &tableName, const QString &fieldName) const; + QString escapedRelationField(const QString &tableName, const QString &fieldName) const; int nameToIndex(const QString &name) const; mutable QVector relations; @@ -266,10 +255,7 @@ void QSqlRelationalTableModelPrivate::revertCachedRow(int row) int QSqlRelationalTableModelPrivate::nameToIndex(const QString &name) const { - QString fieldname = name; - if (db.driver()->isIdentifierEscaped(fieldname, QSqlDriver::FieldName)) - fieldname = db.driver()->stripDelimiters(fieldname, QSqlDriver::FieldName); - return baseRec.indexOf(fieldname); + return baseRec.indexOf(name); } void QSqlRelationalTableModelPrivate::clearEditBuffer() @@ -495,14 +481,14 @@ QSqlRelation QSqlRelationalTableModel::relation(int column) const return d->relations.value(column).rel; } -QString QSqlRelationalTableModelPrivate::relationField(const QString &tableName, +QString QSqlRelationalTableModelPrivate::escapedRelationField(const QString &tableName, const QString &fieldName) const { - QString ret; - ret.reserve(tableName.size() + fieldName.size() + 1); - ret.append(tableName).append(QLatin1Char('.')).append(fieldName); + QString esc; + esc.reserve(tableName.size() + fieldName.size() + 1); + esc.append(tableName).append(QLatin1Char('.')).append(fieldName); - return ret; + return db.driver()->escapeIdentifier(esc, QSqlDriver::FieldName); } /*! @@ -528,29 +514,15 @@ QString QSqlRelationalTableModel::selectStatement() const // Count how many times each field name occurs in the record QHash fieldNames; - QStringList fieldList; for (int i = 0; i < rec.count(); ++i) { QSqlRelation relation = d->relations.value(i, nullRelation).rel; QString name; if (relation.isValid()) - { // Count the display column name, not the original foreign key name = relation.displayColumn(); - if (d->db.driver()->isIdentifierEscaped(name, QSqlDriver::FieldName)) - name = d->db.driver()->stripDelimiters(name, QSqlDriver::FieldName); - - QSqlRecord rec = database().record(relation.tableName()); - for (int i = 0; i < rec.count(); ++i) { - if (name.compare(rec.fieldName(i), Qt::CaseInsensitive) == 0) { - name = rec.fieldName(i); - break; - } - } - } else name = rec.fieldName(i); fieldNames.insert(name, fieldNames.value(name, 0) + 1); - fieldList.append(name); } for (int i = 0; i < rec.count(); ++i) { @@ -559,30 +531,27 @@ QString QSqlRelationalTableModel::selectStatement() const QString relTableAlias = QString::fromLatin1("relTblAl_%1").arg(i); if (!fList.isEmpty()) fList.append(QLatin1String(", ")); - fList.append(d->relationField(relTableAlias,relation.displayColumn())); + fList.append(d->escapedRelationField(relTableAlias, relation.displayColumn())); // If there are duplicate field names they must be aliased - if (fieldNames.value(fieldList[i]) > 1) { - QString relTableName = relation.tableName(); - if (d->db.driver()->isIdentifierEscaped(relTableName, QSqlDriver::TableName)) - relTableName = d->db.driver()->stripDelimiters(relTableName, QSqlDriver::TableName); - QString displayColumn = relation.displayColumn(); - if (d->db.driver()->isIdentifierEscaped(displayColumn, QSqlDriver::FieldName)) - displayColumn = d->db.driver()->stripDelimiters(displayColumn, QSqlDriver::FieldName); - fList.append(QString::fromLatin1(" AS %1_%2").arg(relTableName).arg(displayColumn)); + if (fieldNames.value(relation.displayColumn()) > 1) { + fList.append(QString::fromLatin1(" AS %1_%2").arg(relation.tableName()).arg(relation.displayColumn())); } // this needs fixing!! the below if is borken. - tables.append(relation.tableName().append(QLatin1String(" ")).append(relTableAlias)); + if (!tables.contains(relation.tableName())) + tables.append(d->db.driver()->escapeIdentifier(relation.tableName(),QSqlDriver::TableName) + .append(QLatin1String(" ")) + .append(d->db.driver()->escapeIdentifier(relTableAlias, QSqlDriver::TableName))); if(!where.isEmpty()) where.append(QLatin1String(" AND ")); - where.append(d->relationField(tableName(), d->db.driver()->escapeIdentifier(rec.fieldName(i), QSqlDriver::FieldName))); + where.append(d->escapedRelationField(tableName(), rec.fieldName(i))); where.append(QLatin1String(" = ")); - where.append(d->relationField(relTableAlias, relation.indexColumn())); + where.append(d->escapedRelationField(relTableAlias, relation.indexColumn())); } else { if (!fList.isEmpty()) fList.append(QLatin1String(", ")); - fList.append(d->relationField(tableName(), d->db.driver()->escapeIdentifier(rec.fieldName(i), QSqlDriver::FieldName))); + fList.append(d->escapedRelationField(tableName(), rec.fieldName(i))); } } if (!tables.isEmpty()) @@ -591,7 +560,7 @@ QString QSqlRelationalTableModel::selectStatement() const return query; if(!tList.isEmpty()) tList.prepend(QLatin1String(", ")); - tList.prepend(tableName()); + tList.prepend(d->db.driver()->escapeIdentifier(tableName(),QSqlDriver::TableName)); query.append(QLatin1String("SELECT ")); query.append(fList).append(QLatin1String(" FROM ")).append(tList); qAppendWhereClause(query, where, filter()); @@ -721,7 +690,7 @@ QString QSqlRelationalTableModel::orderByClause() const return QSqlTableModel::orderByClause(); QString s = QLatin1String("ORDER BY "); - s.append(d->relationField(QLatin1String("relTblAl_") + QString::number(d->sortColumn), + s.append(d->escapedRelationField(QLatin1String("relTblAl_") + QString::number(d->sortColumn), rel.displayColumn())); s += d->sortOrder == Qt::AscendingOrder ? QLatin1String(" ASC") : QLatin1String(" DESC"); return s; diff --git a/src/sql/models/qsqltablemodel.cpp b/src/sql/models/qsqltablemodel.cpp index c2442c5..2fb9b0f 100644 --- a/src/sql/models/qsqltablemodel.cpp +++ b/src/sql/models/qsqltablemodel.cpp @@ -98,10 +98,7 @@ bool QSqlTableModelPrivate::setRecord(int row, const QSqlRecord &record) int QSqlTableModelPrivate::nameToIndex(const QString &name) const { - QString fieldname = name; - if (db.driver()->isIdentifierEscaped(fieldname, QSqlDriver::FieldName)) - fieldname = db.driver()->stripDelimiters(fieldname, QSqlDriver::FieldName); - return rec.indexOf(fieldname); + return rec.indexOf(name); } void QSqlTableModelPrivate::initRecordAndPrimaryIndex() @@ -370,7 +367,10 @@ void QSqlTableModel::setTable(const QString &tableName) { Q_D(QSqlTableModel); clear(); - d->tableName = tableName; + if(d->db.tables().contains(tableName.toUpper())) + d->tableName = tableName.toUpper(); + else + d->tableName = tableName; d->initRecordAndPrimaryIndex(); d->initColOffsets(d->rec.count()); @@ -976,9 +976,7 @@ QString QSqlTableModel::orderByClause() const if (!f.isValid()) return s; - QString table = d->tableName; - //we can safely escape the field because it would have been obtained from the database - //and have the correct case + QString table = d->db.driver()->escapeIdentifier(d->tableName, QSqlDriver::TableName); QString field = d->db.driver()->escapeIdentifier(f.name(), QSqlDriver::FieldName); s.append(QLatin1String("ORDER BY ")).append(table).append(QLatin1Char('.')).append(field); s += d->sortOrder == Qt::AscendingOrder ? QLatin1String(" ASC") : QLatin1String(" DESC"); @@ -1319,12 +1317,8 @@ bool QSqlTableModel::setRecord(int row, const QSqlRecord &record) mrow.rec = d->rec; mrow.primaryValues = d->primaryValues(indexInQuery(createIndex(row, 0)).row()); } - QString fieldName; for (int i = 0; i < record.count(); ++i) { - fieldName = record.fieldName(i); - if (d->db.driver()->isIdentifierEscaped(fieldName, QSqlDriver::FieldName)) - fieldName = d->db.driver()->stripDelimiters(fieldName, QSqlDriver::FieldName); - int idx = mrow.rec.indexOf(fieldName); + int idx = mrow.rec.indexOf(record.fieldName(i)); if (idx == -1) isOk = false; else diff --git a/tests/auto/qsqldatabase/tst_databases.h b/tests/auto/qsqldatabase/tst_databases.h index ef51285..5b0fc7a 100644 --- a/tests/auto/qsqldatabase/tst_databases.h +++ b/tests/auto/qsqldatabase/tst_databases.h @@ -105,7 +105,11 @@ inline static QString qTableName( const QString& prefix, QSqlDriver* driver = 0 inline static bool testWhiteSpaceNames( const QString &name ) { - return name != QLatin1String("QTDS7"); +/* return name.startsWith( "QPSQL" ) + || name.startsWith( "QODBC" ) + || name.startsWith( "QSQLITE" ) + || name.startsWith( "QMYSQL" );*/ + return name != QLatin1String("QSQLITE2"); } inline static QString toHex( const QString& binary ) @@ -207,7 +211,7 @@ public: // This requires a local ODBC data source to be configured( pointing to a MySql database ) // addDb( "QODBC", "mysqlodbc", "troll", "trond" ); // addDb( "QODBC", "SqlServer", "troll", "trond" ); -// addDb( "QTDS7", "testdb", "troll", "trondk", "horsehead" ); +// addDb( "QTDS7", "testdb", "troll", "trondk", "horsehead.nokia.troll.no" ); // addDb( "QODBC", "silencetestdb", "troll", "trond", "silence" ); // addDb( "QODBC", "horseheadtestdb", "troll", "trondk", "horsehead" ); @@ -247,7 +251,6 @@ public: // addDb( "QODBC", "DRIVER={MySQL ODBC 3.51 Driver};SERVER=mysql5-nokia.trolltech.com.au;DATABASE=testdb", "testuser", "Ee4Gabf6_", "" ); // addDb( "QODBC", "DRIVER={FreeTDS};SERVER=horsehead.nokia.troll.no;DATABASE=testdb;PORT=4101;UID=troll;PWD=trondk", "troll", "trondk", "" ); // addDb( "QODBC", "DRIVER={FreeTDS};SERVER=silence.nokia.troll.no;DATABASE=testdb;PORT=2392;UID=troll;PWD=trond", "troll", "trond", "" ); - } void open() @@ -313,22 +316,16 @@ public: QSqlQuery q( db ); QStringList dbtables=db.tables(); - foreach(const QString &tableName, tableNames) - { + foreach(const QString &tableName, tableNames) { wasDropped = true; - QString table=tableName; - if ( db.driver()->isIdentifierEscaped(table, QSqlDriver::TableName)) - table = db.driver()->stripDelimiters(table, QSqlDriver::TableName); - foreach(const QString dbtablesName, dbtables) { - if(dbtablesName.toUpper() == table.toUpper()) { + if(dbtablesName.toUpper() == tableName.toUpper()) { dbtables.removeAll(dbtablesName); wasDropped = q.exec("drop table " + db.driver()->escapeIdentifier( dbtablesName, QSqlDriver::TableName )); if(!wasDropped) wasDropped = q.exec("drop table " + dbtablesName); } } - if ( !wasDropped ) qWarning() << dbToString(db) << "unable to drop table" << tableName << ':' << q.lastError().text() << "tables:" << dbtables; } diff --git a/tests/auto/qsqldriver/qsqldriver.pro b/tests/auto/qsqldriver/qsqldriver.pro deleted file mode 100644 index 0024841..0000000 --- a/tests/auto/qsqldriver/qsqldriver.pro +++ /dev/null @@ -1,16 +0,0 @@ -load(qttest_p4) -SOURCES += tst_qsqldriver.cpp - -QT += sql - -wince*: { - plugFiles.sources = ../../../plugins/sqldrivers - plugFiles.path = . - DEPLOYMENT += plugFiles -} else { - win32-g++ { - LIBS += -lws2_32 - } else:win32 { - LIBS += ws2_32.lib - } -} diff --git a/tests/auto/qsqldriver/tst_qsqldriver.cpp b/tests/auto/qsqldriver/tst_qsqldriver.cpp deleted file mode 100644 index bbd7483..0000000 --- a/tests/auto/qsqldriver/tst_qsqldriver.cpp +++ /dev/null @@ -1,218 +0,0 @@ -/**************************************************************************** -** -** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies). -** Contact: Qt Software Information (qt-info@nokia.com) -** -** This file is part of the test suite of the Qt Toolkit. -** -** $QT_BEGIN_LICENSE:LGPL$ -** No Commercial Usage -** This file contains pre-release code and may not be distributed. -** You may use this file in accordance with the terms and conditions -** contained in the either Technology Preview License Agreement or the -** Beta Release License Agreement. -** -** GNU Lesser General Public License Usage -** Alternatively, this file may be used under the terms of the GNU Lesser -** General Public License version 2.1 as published by the Free Software -** Foundation and appearing in the file LICENSE.LGPL included in the -** packaging of this file. Please review the following information to -** ensure the GNU Lesser General Public License version 2.1 requirements -** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. -** -** In addition, as a special exception, Nokia gives you certain -** additional rights. These rights are described in the Nokia Qt LGPL -** Exception version 1.0, included in the file LGPL_EXCEPTION.txt in this -** package. -** -** GNU General Public License Usage -** Alternatively, this file may be used under the terms of the GNU -** General Public License version 3.0 as published by the Free Software -** Foundation and appearing in the file LICENSE.GPL included in the -** packaging of this file. Please review the following information to -** ensure the GNU General Public License version 3.0 requirements will be -** met: http://www.gnu.org/copyleft/gpl.html. -** -** If you are unsure which license is appropriate for your use, please -** contact the sales department at qt-sales@nokia.com. -** $QT_END_LICENSE$ -** -****************************************************************************/ - - -#include -#include - -#include "../qsqldatabase/tst_databases.h" - - - -//TESTED_CLASS= -//TESTED_FILES= - -class tst_QSqlDriver : public QObject -{ - Q_OBJECT - -public: - void recreateTestTables(QSqlDatabase); - - tst_Databases dbs; - -public slots: - void initTestCase_data(); - void initTestCase(); - void cleanupTestCase(); - void init(); - void cleanup(); - -private slots: - void record(); - void primaryIndex(); -}; - - -void tst_QSqlDriver::initTestCase_data() -{ - dbs.open(); - if (dbs.fillTestTable() == 0) { - qWarning("NO DATABASES"); - QSKIP("No database drivers are available in this Qt configuration", SkipAll); - } -} - -void tst_QSqlDriver::recreateTestTables(QSqlDatabase db) -{ - QSqlQuery q(db); - - QStringList tableNames; - tableNames << qTableName( "relTEST1" ); - tst_Databases::safeDropTables( db, tableNames ); - - QVERIFY_SQL( q, exec("create table " + qTableName("relTEST1") + - " (id int not null primary key, name varchar(20), title_key int, another_title_key int)")); - QVERIFY_SQL( q, exec("insert into " + qTableName("relTEST1") + " values(1, 'harry', 1, 2)")); - QVERIFY_SQL( q, exec("insert into " + qTableName("relTEST1") + " values(2, 'trond', 2, 1)")); - QVERIFY_SQL( q, exec("insert into " + qTableName("relTEST1") + " values(3, 'vohi', 1, 2)")); - QVERIFY_SQL( q, exec("insert into " + qTableName("relTEST1") + " values(4, 'boris', 2, 2)")); -} - -void tst_QSqlDriver::initTestCase() -{ - foreach (const QString &dbname, dbs.dbNames) - recreateTestTables(QSqlDatabase::database(dbname)); -} - -void tst_QSqlDriver::cleanupTestCase() -{ - QStringList tableNames; - tableNames << qTableName( "relTEST1" ); - foreach (const QString &dbName, dbs.dbNames) { - QSqlDatabase db = QSqlDatabase::database(dbName); - tst_Databases::safeDropTables( db, tableNames ); - } - dbs.close(); -} - -void tst_QSqlDriver::init() -{ -} - -void tst_QSqlDriver::cleanup() -{ -} - -void tst_QSqlDriver::record() -{ - QFETCH_GLOBAL(QString, dbName); - QSqlDatabase db = QSqlDatabase::database(dbName); - CHECK_DATABASE(db); - - QString tablename = qTableName("relTEST1"); - QStringList fields; - fields << "id" << "name" << "title_key" << "another_title_key"; - - //check we can get records using an unquoted mixed case table name - QSqlRecord rec = db.driver()->record(tablename); - QCOMPARE(rec.count(), 4); - - if (db.driverName().startsWith("QIBASE")|| db.driverName().startsWith("QOCI") || db.driverName().startsWith("QDB2")) - for(int i = 0; i < fields.count(); ++i) - fields[i] = fields[i].toUpper(); - - for (int i = 0; i < fields.count(); ++i) - QCOMPARE(rec.fieldName(i), fields[i]); - - if (db.driverName().startsWith("QIBASE") || db.driverName().startsWith("QOCI") || db.driverName().startsWith("QDB2")) - tablename = tablename.toUpper(); - else if (db.driverName().startsWith("QPSQL")) - tablename = tablename.toLower(); - - //check we can get records using a properly quoted table name - rec = db.driver()->record(db.driver()->escapeIdentifier(tablename,QSqlDriver::TableName)); - QCOMPARE(rec.count(), 4); - - for (int i = 0; i < fields.count(); ++i) - QCOMPARE(rec.fieldName(i), fields[i]); - - if( db.driverName().startsWith("QIBASE") || db.driverName().startsWith("QOCI") || db.driverName().startsWith("QDB2")) - tablename = tablename.toLower(); - else if (db.driverName().startsWith("QPSQL")) - tablename = tablename.toUpper(); - - //check that we can't get records using incorrect tablename casing that's been quoted - rec = db.driver()->record(db.driver()->escapeIdentifier(tablename,QSqlDriver::TableName)); - if (db.driverName().startsWith("QMYSQL") || db.driverName().startsWith("QSQLITE") || db.driverName().startsWith("QTDS")) - QCOMPARE(rec.count(), 4); //mysql, sqlite and tds will match - else - QCOMPARE(rec.count(), 0); - -} - -void tst_QSqlDriver::primaryIndex() -{ - QFETCH_GLOBAL(QString, dbName); - QSqlDatabase db = QSqlDatabase::database(dbName); - CHECK_DATABASE(db); - - QString tablename = qTableName("relTEST1"); - //check that we can get primary index using unquoted mixed case table name - QSqlIndex index = db.driver()->primaryIndex(tablename); - QCOMPARE(index.count(), 1); - - if( db.driverName().startsWith("QIBASE") || db.driverName().startsWith("QOCI") || db.driverName().startsWith("QDB2")) - QCOMPARE(index.fieldName(0), QString::fromLatin1("ID")); - else - QCOMPARE(index.fieldName(0), QString::fromLatin1("id")); - - - //check that we can get the primary index using a quoted tablename - if( db.driverName().startsWith("QIBASE") || db.driverName().startsWith("QOCI") || db.driverName().startsWith("QDB2")) - tablename = tablename.toUpper(); - else if (db.driverName().startsWith("QPSQL")) - tablename = tablename.toLower(); - - index = db.driver()->primaryIndex(db.driver()->escapeIdentifier(tablename, QSqlDriver::TableName)); - QCOMPARE(index.count(), 1); - if( db.driverName().startsWith("QIBASE") || db.driverName().startsWith("QOCI") || db.driverName().startsWith("QDB2")) - QCOMPARE(index.fieldName(0), QString::fromLatin1("ID")); - else - QCOMPARE(index.fieldName(0), QString::fromLatin1("id")); - - - - //check that we can not get the primary index using a quoted but incorrect table name casing - if( db.driverName().startsWith("QIBASE") || db.driverName().startsWith("QOCI") || db.driverName().startsWith("QDB2")) - tablename = tablename.toLower(); - else if (db.driverName().startsWith("QPSQL")) - tablename = tablename.toUpper(); - - index = db.driver()->primaryIndex(db.driver()->escapeIdentifier(tablename, QSqlDriver::TableName)); - if (db.driverName().startsWith("QMYSQL") || db.driverName().startsWith("QSQLITE") || db.driverName().startsWith("QTDS")) - QCOMPARE(index.count(), 1); //mysql will always find the table name regardless of casing - else - QCOMPARE(index.count(), 0); -} - -QTEST_MAIN(tst_QSqlDriver) -#include "tst_qsqldriver.moc" diff --git a/tests/auto/qsqlrelationaltablemodel/tst_qsqlrelationaltablemodel.cpp b/tests/auto/qsqlrelationaltablemodel/tst_qsqlrelationaltablemodel.cpp index bb2cddd..76785c3 100644 --- a/tests/auto/qsqlrelationaltablemodel/tst_qsqlrelationaltablemodel.cpp +++ b/tests/auto/qsqlrelationaltablemodel/tst_qsqlrelationaltablemodel.cpp @@ -82,10 +82,6 @@ private slots: void insertRecordDuplicateFieldNames(); void invalidData(); void relationModel(); - void casing(); - void escapedRelations(); - void escapedTableName(); - void whiteSpaceInIdentifiers(); }; @@ -107,9 +103,7 @@ void tst_QSqlRelationalTableModel::recreateTestTables(QSqlDatabase db) << qTableName( "reltest2" ) << qTableName( "reltest3" ) << qTableName( "reltest4" ) - << qTableName( "reltest5" ) - << db.driver()->escapeIdentifier(qTableName( "rel test6" ), QSqlDriver::TableName) - << db.driver()->escapeIdentifier(qTableName( "rel test7" ), QSqlDriver::TableName); + << qTableName( "reltest5" ); tst_Databases::safeDropTables( db, tableNames ); QVERIFY_SQL( q, exec("create table " + qTableName("reltest1") + @@ -134,19 +128,6 @@ void tst_QSqlRelationalTableModel::recreateTestTables(QSqlDatabase db) QVERIFY_SQL( q, exec("create table " + qTableName("reltest5") + " (title varchar(20) not null primary key, abbrev varchar(20))")); QVERIFY_SQL( q, exec("insert into " + qTableName("reltest5") + " values('herr', 'Hr')")); QVERIFY_SQL( q, exec("insert into " + qTableName("reltest5") + " values('mister', 'Mr')")); - - if (testWhiteSpaceNames(db.driverName())) { - QString reltest6 = db.driver()->escapeIdentifier(qTableName("rel test6"), QSqlDriver::TableName); - QVERIFY_SQL( q, exec("create table " + reltest6 + " (id int not null primary key, " + db.driver()->escapeIdentifier("city key", QSqlDriver::FieldName) + - " int, " + db.driver()->escapeIdentifier("extra field", QSqlDriver::FieldName) + " int)")); - QVERIFY_SQL( q, exec("insert into " + reltest6 + " values(1, 1,9)")); - QVERIFY_SQL( q, exec("insert into " + reltest6 + " values(2, 2,8)")); - - QString reltest7 = db.driver()->escapeIdentifier(qTableName("rel test7"), QSqlDriver::TableName); - QVERIFY_SQL( q, exec("create table " + reltest7 + " (" + db.driver()->escapeIdentifier("city id", QSqlDriver::TableName) + " int not null primary key, " + db.driver()->escapeIdentifier("city name", QSqlDriver::FieldName) + " varchar(20))")); - QVERIFY_SQL( q, exec("insert into " + reltest7 + " values(1, 'New York')")); - QVERIFY_SQL( q, exec("insert into " + reltest7 + " values(2, 'Washington')")); - } } void tst_QSqlRelationalTableModel::initTestCase() @@ -161,14 +142,10 @@ void tst_QSqlRelationalTableModel::cleanupTestCase() tableNames << qTableName( "reltest1" ) << qTableName( "reltest2" ) << qTableName( "reltest3" ) - << qTableName( "reltest4" ) - << qTableName( "reltest5" ); + << qTableName( "reltest4" ); foreach (const QString &dbName, dbs.dbNames) { QSqlDatabase db = QSqlDatabase::database(dbName); - QStringList tables = tableNames; - tables << db.driver()->escapeIdentifier(qTableName( "rel test6" ), QSqlDriver::TableName) - << db.driver()->escapeIdentifier(qTableName( "rel test7" ), QSqlDriver::TableName); - tst_Databases::safeDropTables( db, tables ); + tst_Databases::safeDropTables( db, tableNames ); } dbs.close(); } @@ -296,12 +273,7 @@ void tst_QSqlRelationalTableModel::setData() model.setTable(qTableName("reltest1")); model.setRelation(2, QSqlRelation(qTableName("reltest2"), "tid", "title")); - - //sybase doesn't allow tables with the same alias used twice as col names - //so don't set up an identical relation when using the tds driver - if (!db.driverName().startsWith("QTDS")) - model.setRelation(3, QSqlRelation(qTableName("reltest2"), "tid", "title")); - + model.setRelation(3, QSqlRelation(qTableName("reltest2"), "tid", "title")); model.setEditStrategy(QSqlTableModel::OnManualSubmit); model.setSort(0, Qt::AscendingOrder); QVERIFY_SQL(model, select()); @@ -312,10 +284,7 @@ void tst_QSqlRelationalTableModel::setData() QCOMPARE(model.data(model.index(2, 1)).toString(), QString("vohi2")); QCOMPARE(model.data(model.index(3, 2)).toString(), QString("herr")); - if (!db.driverName().startsWith("QTDS")) - QCOMPARE(model.data(model.index(0, 3)).toString(), QString("herr")); - else - QCOMPARE(model.data(model.index(0, 3)).toInt(), 1); + QCOMPARE(model.data(model.index(0, 3)).toString(), QString("herr")); QVERIFY_SQL(model, submitAll()); } @@ -330,15 +299,10 @@ void tst_QSqlRelationalTableModel::setData() QCOMPARE(model.data(model.index(0, 3)).toInt(), 1); model.setRelation(2, QSqlRelation(qTableName("reltest2"), "tid", "title")); - if (!db.driverName().startsWith("QTDS")) - model.setRelation(3, QSqlRelation(qTableName("reltest2"), "tid", "title")); + model.setRelation(3, QSqlRelation(qTableName("reltest2"), "tid", "title")); QVERIFY_SQL(model, select()); QCOMPARE(model.data(model.index(3, 2)).toString(), QString("herr")); - - if (!db.driverName().startsWith("QTDS")) - QCOMPARE(model.data(model.index(0, 3)).toString(), QString("herr")); - else - QCOMPARE(model.data(model.index(0, 3)).toInt(), 1); + QCOMPARE(model.data(model.index(0, 3)).toString(), QString("herr")); } //check setting of data when the relational key is a non-integer type @@ -372,8 +336,7 @@ void tst_QSqlRelationalTableModel::multipleRelation() model.setTable(qTableName("reltest1")); model.setRelation(2, QSqlRelation(qTableName("reltest2"), "tid", "title")); - model.setRelation(3, QSqlRelation(qTableName("reltest4"), "id", "name")); - model.setSort(0, Qt::AscendingOrder); + model.setRelation(3, QSqlRelation(qTableName("reltest2"), "tid", "title")); QVERIFY_SQL(model, select()); QCOMPARE(model.data(model.index(2, 0)).toInt(), 3); @@ -381,7 +344,7 @@ void tst_QSqlRelationalTableModel::multipleRelation() QCOMPARE(model.data(model.index(0, 0)).toInt(), 1); QCOMPARE(model.data(model.index(0, 1)).toString(), QString("harry")); QCOMPARE(model.data(model.index(0, 2)).toString(), QString("herr")); - QCOMPARE(model.data(model.index(0, 3)).toString(), QString("Trondheim")); + QCOMPARE(model.data(model.index(0, 3)).toString(), QString("mister")); } void tst_QSqlRelationalTableModel::insertRecord() @@ -394,7 +357,6 @@ void tst_QSqlRelationalTableModel::insertRecord() model.setTable(qTableName("reltest1")); model.setRelation(2, QSqlRelation(qTableName("reltest2"), "tid", "title")); - model.setSort(0, Qt::AscendingOrder); QVERIFY_SQL(model, select()); QSqlRecord rec; @@ -436,7 +398,6 @@ void tst_QSqlRelationalTableModel::setRecord() model.setTable(qTableName("reltest1")); model.setRelation(2, QSqlRelation(qTableName("reltest2"), "tid", "title")); - model.setSort(0, Qt::AscendingOrder); QVERIFY_SQL(model, select()); QSqlRecord rec; @@ -489,18 +450,13 @@ void tst_QSqlRelationalTableModel::insertWithStrategies() model.setTable(qTableName("reltest1")); model.setRelation(2, QSqlRelation(qTableName("reltest2"), "tid", "title")); - - if (!db.driverName().startsWith("QTDS")) - model.setRelation(3, QSqlRelation(qTableName("reltest2"), "tid", "title")); + model.setRelation(3, QSqlRelation(qTableName("reltest2"), "tid", "title")); QVERIFY_SQL(model, select()); QCOMPARE(model.data(model.index(0,0)).toInt(), 1); QCOMPARE(model.data(model.index(0,1)).toString(), QString("harry")); QCOMPARE(model.data(model.index(0,2)).toString(), QString("herr")); - if (!db.driverName().startsWith("QTDS")) - QCOMPARE(model.data(model.index(0,3)).toString(), QString("mister")); - else - QCOMPARE(model.data(model.index(0,3)).toInt(), 2); + QCOMPARE(model.data(model.index(0,3)).toString(), QString("mister")); model.insertRows(0, 1); model.setData(model.index(0, 0), 1011); @@ -511,20 +467,12 @@ void tst_QSqlRelationalTableModel::insertWithStrategies() QCOMPARE(model.data(model.index(0,0)).toInt(), 1011); QCOMPARE(model.data(model.index(0,1)).toString(), QString("test")); QCOMPARE(model.data(model.index(0,2)).toString(), QString("mister")); - if (!db.driverName().startsWith("QTDS")) - QCOMPARE(model.data(model.index(0,3)).toString(), QString("herr")); - else - QCOMPARE(model.data(model.index(0,3)).toInt(), 1); + QCOMPARE(model.data(model.index(0,3)).toString(), QString("herr")); QCOMPARE(model.data(model.index(1,0)).toInt(), 1); QCOMPARE(model.data(model.index(1,1)).toString(), QString("harry")); QCOMPARE(model.data(model.index(1,2)).toString(), QString("herr")); - if (!db.driverName().startsWith("QTDS")) - QCOMPARE(model.data(model.index(1,3)).toString(), QString("mister")); - else - QCOMPARE(model.data(model.index(1,3)).toInt(), 2); - - + QCOMPARE(model.data(model.index(1,3)).toString(), QString("mister")); QVERIFY_SQL(model, submitAll()); @@ -533,16 +481,9 @@ void tst_QSqlRelationalTableModel::insertWithStrategies() QCOMPARE(model.data(model.index(0,0)).toInt(), 1); QCOMPARE(model.data(model.index(0,1)).toString(), QString("harry")); QCOMPARE(model.data(model.index(0,2)).toString(), QString("herr")); - - if (!db.driverName().startsWith("QTDS")) { - QCOMPARE(model.data(model.index(0,3)).toString(), QString("mister")); - model.setData(model.index(0,3),1); - QCOMPARE(model.data(model.index(0,3)).toString(), QString("herr")); - } else { - QCOMPARE(model.data(model.index(0,3)).toInt(), 2); - model.setData(model.index(0,3),1); - QCOMPARE(model.data(model.index(0,3)).toInt(), 1); - } + QCOMPARE(model.data(model.index(0,3)).toString(), QString("mister")); + model.setData(model.index(0,3),1); + QCOMPARE(model.data(model.index(0,3)).toString(), QString("herr")); model.insertRows(0, 2); model.setData(model.index(0, 0), 1012); @@ -558,27 +499,17 @@ void tst_QSqlRelationalTableModel::insertWithStrategies() QCOMPARE(model.data(model.index(0,0)).toInt(),1012); QCOMPARE(model.data(model.index(0,1)).toString(), QString("george")); QCOMPARE(model.data(model.index(0,2)).toString(), QString("mister")); - if (!db.driverName().startsWith("QTDS")) - QCOMPARE(model.data(model.index(0,3)).toString(), QString("mister")); - else - QCOMPARE(model.data(model.index(0,3)).toInt(), 2); - + QCOMPARE(model.data(model.index(0,3)).toString(), QString("mister")); QCOMPARE(model.data(model.index(1,0)).toInt(),1013); QCOMPARE(model.data(model.index(1,1)).toString(), QString("kramer")); QCOMPARE(model.data(model.index(1,2)).toString(), QString("mister")); - if (!db.driverName().startsWith("QTDS")) - QCOMPARE(model.data(model.index(1,3)).toString(), QString("herr")); - else - QCOMPARE(model.data(model.index(1,3)).toInt(), 1); + QCOMPARE(model.data(model.index(1,3)).toString(), QString("herr")); QCOMPARE(model.data(model.index(2,0)).toInt(), 1); QCOMPARE(model.data(model.index(2,1)).toString(), QString("harry")); QCOMPARE(model.data(model.index(2,2)).toString(), QString("herr")); - if (!db.driverName().startsWith("QTDS")) - QCOMPARE(model.data(model.index(2,3)).toString(), QString("herr")); - else - QCOMPARE(model.data(model.index(2,3)).toInt(), 1); + QCOMPARE(model.data(model.index(2,3)).toString(), QString("herr")); QVERIFY_SQL(model, submitAll()); } @@ -643,8 +574,7 @@ void tst_QSqlRelationalTableModel::sort() model.setTable(qTableName("reltest1")); model.setRelation(2, QSqlRelation(qTableName("reltest2"), "tid", "title")); - if (!db.driverName().startsWith("QTDS")) - model.setRelation(3, QSqlRelation(qTableName("reltest2"), "tid", "title")); + model.setRelation(3, QSqlRelation(qTableName("reltest2"), "tid", "title")); model.setSort(2, Qt::DescendingOrder); QVERIFY_SQL(model, select()); @@ -659,19 +589,11 @@ void tst_QSqlRelationalTableModel::sort() model.setSort(3, Qt::AscendingOrder); QVERIFY_SQL(model, select()); - if (!db.driverName().startsWith("QTDS")) { - QCOMPARE(model.rowCount(), 4); - QCOMPARE(model.data(model.index(0, 3)).toString(), QString("herr")); - QCOMPARE(model.data(model.index(1, 3)).toString(), QString("mister")); - QCOMPARE(model.data(model.index(2, 3)).toString(), QString("mister")); - QCOMPARE(model.data(model.index(3, 3)).toString(), QString("mister")); - } else { - QCOMPARE(model.data(model.index(0, 3)).toInt(), 1); - QCOMPARE(model.data(model.index(1, 3)).toInt(), 2); - QCOMPARE(model.data(model.index(2, 3)).toInt(), 2); - QCOMPARE(model.data(model.index(3, 3)).toInt(), 2); - } - + QCOMPARE(model.rowCount(), 4); + QCOMPARE(model.data(model.index(0, 3)).toString(), QString("herr")); + QCOMPARE(model.data(model.index(1, 3)).toString(), QString("mister")); + QCOMPARE(model.data(model.index(2, 3)).toString(), QString("mister")); + QCOMPARE(model.data(model.index(3, 3)).toString(), QString("mister")); } static void testRevert(QSqlRelationalTableModel &model) @@ -741,7 +663,7 @@ void tst_QSqlRelationalTableModel::revert() model.setTable(qTableName("reltest1")); model.setRelation(2, QSqlRelation(qTableName("reltest2"), "tid", "title")); - model.setRelation(3, QSqlRelation(qTableName("reltest4"), "id", "name")); + model.setRelation(3, QSqlRelation(qTableName("reltest2"), "tid", "title")); model.setSort(0, Qt::AscendingOrder); @@ -767,9 +689,7 @@ void tst_QSqlRelationalTableModel::clearDisplayValuesCache() model.setTable(qTableName("reltest1")); model.setRelation(2, QSqlRelation(qTableName("reltest2"), "tid", "title")); - - if (!db.driverName().startsWith("QTDS")) - model.setRelation(3, QSqlRelation(qTableName("reltest2"), "tid", "title")); + model.setRelation(3, QSqlRelation(qTableName("reltest2"), "tid", "title")); model.setSort(1, Qt::AscendingOrder); model.setEditStrategy(QSqlTableModel::OnManualSubmit); @@ -778,10 +698,7 @@ void tst_QSqlRelationalTableModel::clearDisplayValuesCache() QCOMPARE(model.data(model.index(3, 0)).toInt(), 3); QCOMPARE(model.data(model.index(3, 1)).toString(), QString("vohi")); QCOMPARE(model.data(model.index(3, 2)).toString(), QString("herr")); - if (!db.driverName().startsWith("QTDS")) - QCOMPARE(model.data(model.index(3, 3)).toString(), QString("mister")); - else - QCOMPARE(model.data(model.index(3, 3)).toInt(), 2 ); + QCOMPARE(model.data(model.index(3, 3)).toString(), QString("mister")); model.insertRow(model.rowCount()); QVERIFY(model.setData(model.index(4, 0), 5, Qt::EditRole)); @@ -793,18 +710,11 @@ void tst_QSqlRelationalTableModel::clearDisplayValuesCache() QCOMPARE(model.data(model.index(0, 0)).toInt(), 5); QCOMPARE(model.data(model.index(0, 1)).toString(), QString("anders")); QCOMPARE(model.data(model.index(0, 2)).toString(), QString("herr")); - if (!db.driverName().startsWith("QTDS")) - QCOMPARE(model.data(model.index(0, 3)).toString(), QString("herr")); - else - QCOMPARE(model.data(model.index(0, 3)).toInt(), 1); - + QCOMPARE(model.data(model.index(0, 3)).toString(), QString("herr")); QCOMPARE(model.data(model.index(4, 0)).toInt(), 3); QCOMPARE(model.data(model.index(4, 1)).toString(), QString("vohi")); QCOMPARE(model.data(model.index(4, 2)).toString(), QString("herr")); - if (!db.driverName().startsWith("QTDS")) - QCOMPARE(model.data(model.index(4, 3)).toString(), QString("mister")); - else - QCOMPARE(model.data(model.index(4, 3)).toInt(), 2); + QCOMPARE(model.data(model.index(4, 3)).toString(), QString("mister")); } // For task 140782 and 176374: If the main table and the the related tables uses the same @@ -819,38 +729,27 @@ void tst_QSqlRelationalTableModel::insertRecordDuplicateFieldNames() QSqlRelationalTableModel model(0, db); model.setTable(qTableName("reltest3")); model.setEditStrategy(QSqlTableModel::OnManualSubmit); - model.setSort(0, Qt::AscendingOrder); // Duplication of "name", used in both reltest3 and reltest4. model.setRelation(2, QSqlRelation(qTableName("reltest4"), "id", "name")); QVERIFY_SQL(model, select()); - if (db.driverName().startsWith("QIBASE") || db.driverName().startsWith("QOCI") || db.driverName().startsWith("QDB2")) { - QCOMPARE(model.record(1).value(qTableName("reltest4").append(QLatin1String("_name")).toUpper()).toString(), - QString("Trondheim")); - } else { - QCOMPARE(model.record(1).value(qTableName("reltest4").append(QLatin1String("_name"))).toString(), + QCOMPARE(model.record(1).value(qTableName("reltest4").append(QLatin1String("_name"))).toString(), QString("Trondheim")); - } QSqlRecord rec = model.record(); rec.setValue(0, 3); rec.setValue(1, "Berge"); rec.setValue(2, 1); // Must insert the key value - if (db.driverName().startsWith("QIBASE") || db.driverName().startsWith("QOCI") || db.driverName().startsWith("QDB2")) { - QCOMPARE(rec.fieldName(0), QLatin1String("ID")); - QCOMPARE(rec.fieldName(1), QLatin1String("NAME")); // This comes from main table - } else { - QCOMPARE(rec.fieldName(0), QLatin1String("id")); - QCOMPARE(rec.fieldName(1), QLatin1String("name")); - } + QCOMPARE(rec.fieldName(0), QLatin1String("id")); + QCOMPARE(rec.fieldName(1), QLatin1String("name")); // This comes from main table // The duplicate field names is aliased because it's comes from the relation's display column. - if(db.driverName().startsWith("QIBASE") || db.driverName().startsWith("QOCI") || db.driverName().startsWith("QDB2")) - QCOMPARE(rec.fieldName(2), (qTableName("reltest4").append(QLatin1String("_name"))).toUpper()); - else + if(!db.driverName().startsWith("QIBASE")) QCOMPARE(rec.fieldName(2), qTableName("reltest4").append(QLatin1String("_name"))); + else + QCOMPARE(rec.fieldName(2), (qTableName("reltest4").append(QLatin1String("_name"))).toUpper()); QVERIFY(model.insertRecord(-1, rec)); QCOMPARE(model.data(model.index(2, 2)).toString(), QString("Oslo")); @@ -894,7 +793,7 @@ void tst_QSqlRelationalTableModel::relationModel() QVERIFY(model.relationModel(3) == NULL); QVERIFY(model.relationModel(4) == NULL); - model.setRelation(3, QSqlRelation(qTableName("reltest4"), "id", "name")); + model.setRelation(3, QSqlRelation(qTableName("reltest2"), "tid", "title")); QVERIFY_SQL(model, select()); QVERIFY(model.relationModel(0) == NULL); @@ -907,285 +806,5 @@ void tst_QSqlRelationalTableModel::relationModel() QCOMPARE(rel_model->data(rel_model->index(0,1)).toString(), QString("herr")); } -void tst_QSqlRelationalTableModel::casing() -{ - QFETCH_GLOBAL(QString, dbName); - QSqlDatabase db = QSqlDatabase::database(dbName); - CHECK_DATABASE(db); - - if (db.driverName().startsWith("QSQLITE")) - QSKIP("The casing test for SQLITE is irrelevant since SQLITE is case insensitive", SkipAll); - - QStringList tableNames; - tableNames << qTableName("CASETEST1", db.driver()).toUpper(); - tableNames << qTableName("casetest1", db.driver()); - tst_Databases::safeDropTables(db, tableNames); - - QSqlQuery q(db); - QVERIFY_SQL( q, exec("create table " + qTableName("CASETEST1", db.driver()).toUpper() + - " (id int not null primary key, name varchar(20), title_key int, another_title_key int)")); - QVERIFY_SQL( q, exec("insert into " + qTableName("CASETEST1", db.driver()).toUpper() + " values(1, 'harry', 1, 2)")); - QVERIFY_SQL( q, exec("insert into " + qTableName("CASETEST1", db.driver()).toUpper() + " values(2, 'trond', 2, 1)")); - QVERIFY_SQL( q, exec("insert into " + qTableName("CASETEST1", db.driver()).toUpper() + " values(3, 'vohi', 1, 2)")); - QVERIFY_SQL( q, exec("insert into " + qTableName("CASETEST1", db.driver()).toUpper() + " values(4, 'boris', 2, 2)")); - - QVERIFY_SQL( q, exec("create table " + qTableName("casetest1", db.driver()) + - " (ident int not null primary key, name varchar(20), title_key int)")); - QVERIFY_SQL( q, exec("insert into " + qTableName("casetest1", db.driver()) + " values(1, 'jerry', 1)")); - QVERIFY_SQL( q, exec("insert into " + qTableName("casetest1", db.driver()) + " values(2, 'george', 2)")); - QVERIFY_SQL( q, exec("insert into " + qTableName("casetest1", db.driver()) + " values(4, 'kramer', 2)")); - - if (db.driverName().startsWith("QOCI")) { - //try an owner that doesn't exist - QSqlRecord rec = db.driver()->record("doug." + qTableName("CASETEST1", db.driver()).toUpper()); - QCOMPARE( rec.count(), 0); - - //try an owner that does exist - rec = db.driver()->record(db.userName() + "." + qTableName("CASETEST1", db.driver()).toUpper()); - QCOMPARE( rec.count(), 4); - } - QSqlRecord rec = db.driver()->record(qTableName("CASETEST1", db.driver()).toUpper()); - QCOMPARE( rec.count(), 4); - - rec = db.driver()->record(qTableName("casetest1", db.driver())); - QCOMPARE( rec.count(), 3); - - QSqlTableModel upperCaseModel(0, db); - upperCaseModel.setTable(qTableName("CASETEST1", db.driver()).toUpper()); - - QCOMPARE(upperCaseModel.tableName(),qTableName("CASETEST1",db.driver()).toUpper()); - - QVERIFY_SQL(upperCaseModel, select()); - - QCOMPARE(upperCaseModel.rowCount(), 4); - - QSqlTableModel lowerCaseModel(0, db); - lowerCaseModel.setTable(qTableName("casetest1", db.driver())); - QCOMPARE(lowerCaseModel.tableName(), qTableName("casetest1",db.driver())); - QVERIFY_SQL(lowerCaseModel, select()); - - QCOMPARE(lowerCaseModel.rowCount(), 3); - - QSqlRelationalTableModel model(0, db); - model.setTable(qTableName("CASETEST1", db.driver()).toUpper()); - model.setRelation(2, QSqlRelation(qTableName("reltest2"), "tid", "title")); - QVERIFY_SQL(model, select()); - - QCOMPARE(model.data(model.index(0, 0)).toInt(), 1); - QCOMPARE(model.data(model.index(0, 1)).toString(), QString("harry")); - QCOMPARE(model.data(model.index(0, 2)).toString(), QString("herr")); - - tst_Databases::safeDropTables(db, tableNames); -} - -void tst_QSqlRelationalTableModel::escapedRelations() -{ - QFETCH_GLOBAL(QString, dbName); - QSqlDatabase db = QSqlDatabase::database(dbName); - CHECK_DATABASE(db); - recreateTestTables(db); - - QSqlRelationalTableModel model(0, db); - model.setTable(qTableName("reltest1")); - - //try with relation table name quoted - if (db.driverName().startsWith("QIBASE") || db.driverName().startsWith("QOCI") || db.driverName().startsWith("QDB2")) { - model.setRelation(2, QSqlRelation(db.driver()->escapeIdentifier(qTableName("reltest2").toUpper(),QSqlDriver::TableName), - "tid", - "title")); - } else { - model.setRelation(2, QSqlRelation(db.driver()->escapeIdentifier(qTableName("reltest2"),QSqlDriver::TableName), - "tid", - "title")); - - } - QVERIFY_SQL(model, select()); - - QCOMPARE(model.data(model.index(0, 0)).toInt(), 1); - QCOMPARE(model.data(model.index(0, 1)).toString(), QString("harry")); - QCOMPARE(model.data(model.index(0, 2)).toString(), QString("herr")); - - //try with index column quoted - if (db.driverName().startsWith("QIBASE") || db.driverName().startsWith("QOCI") || db.driverName().startsWith("QDB2")) { - model.setRelation(2, QSqlRelation(qTableName("reltest2"), - db.driver()->escapeIdentifier("tid", QSqlDriver::FieldName).toUpper(), - "title")); - } else { - model.setRelation(2, QSqlRelation(qTableName("reltest2"), - db.driver()->escapeIdentifier("tid", QSqlDriver::FieldName), - "title")); - } - QVERIFY_SQL(model, select()); - - QCOMPARE(model.data(model.index(0, 0)).toInt(), 1); - QCOMPARE(model.data(model.index(0, 1)).toString(), QString("harry")); - QCOMPARE(model.data(model.index(0, 2)).toString(), QString("herr")); - - //try with display column quoted - - if (db.driverName().startsWith("QIBASE") || db.driverName().startsWith("QOCI") || db.driverName().startsWith("QDB2")) { - - model.setRelation(2, QSqlRelation(qTableName("reltest2"), - "tid", - db.driver()->escapeIdentifier("title", QSqlDriver::FieldName).toUpper())); - } else { - model.setRelation(2, QSqlRelation(qTableName("reltest2"), - "tid", - db.driver()->escapeIdentifier("title", QSqlDriver::FieldName))); - } - - QVERIFY_SQL(model, select()); - - QCOMPARE(model.data(model.index(0, 0)).toInt(), 1); - QCOMPARE(model.data(model.index(0, 1)).toString(), QString("harry")); - QCOMPARE(model.data(model.index(0, 2)).toString(), QString("herr")); - - //try with tablename and index and display columns quoted in the relation - - if (db.driverName().startsWith("QIBASE") || db.driverName().startsWith("QOCI") || db.driverName().startsWith("QDB2")) { - model.setRelation(2, QSqlRelation(qTableName("reltest2"), - "tid", - db.driver()->escapeIdentifier("title", QSqlDriver::FieldName).toUpper())); - } else { - model.setRelation(2, QSqlRelation(qTableName("reltest2"), - "tid", - db.driver()->escapeIdentifier("title", QSqlDriver::FieldName))); - } - QVERIFY_SQL(model, select()); - - QCOMPARE(model.data(model.index(0, 0)).toInt(), 1); - QCOMPARE(model.data(model.index(0, 1)).toString(), QString("harry")); - QCOMPARE(model.data(model.index(0, 2)).toString(), QString("herr")); -} - -void tst_QSqlRelationalTableModel::escapedTableName() -{ - QFETCH_GLOBAL(QString, dbName); - QSqlDatabase db = QSqlDatabase::database(dbName); - CHECK_DATABASE(db); - - // set the values using OnRowChange Strategy with an escaped tablename - { - QSqlRelationalTableModel model(0, db); - - if (db.driverName().startsWith("QIBASE") || db.driverName().startsWith("QOCI") || db.driverName().startsWith("QDB2")) { - model.setTable(db.driver()->escapeIdentifier(qTableName("reltest1").toUpper(), QSqlDriver::TableName)); - } else { - model.setTable(db.driver()->escapeIdentifier(qTableName("reltest1"), QSqlDriver::TableName)); - } - model.setSort(0, Qt::AscendingOrder); - model.setRelation(2, QSqlRelation(qTableName("reltest2"), "tid", "title")); - QVERIFY_SQL(model, select()); - - QVERIFY(model.setData(model.index(0, 1), QString("harry2"))); - QVERIFY(model.setData(model.index(0, 2), 2)); - - QCOMPARE(model.data(model.index(0, 1)).toString(), QString("harry2")); - QCOMPARE(model.data(model.index(0, 2)).toString(), QString("mister")); - - model.submit(); - - QVERIFY(model.setData(model.index(3,1), QString("boris2"))); - QVERIFY(model.setData(model.index(3, 2), 1)); - - QCOMPARE(model.data(model.index(3,1)).toString(), QString("boris2")); - QCOMPARE(model.data(model.index(3, 2)).toString(), QString("herr")); - - model.submit(); - } - { //verify values - QSqlRelationalTableModel model(0, db); - model.setTable(qTableName("reltest1")); - model.setSort(0, Qt::AscendingOrder); - QVERIFY_SQL(model, select()); - - QCOMPARE(model.data(model.index(0, 1)).toString(), QString("harry2")); - QCOMPARE(model.data(model.index(0, 2)).toInt(), 2); - QCOMPARE(model.data(model.index(3, 1)).toString(), QString("boris2")); - QCOMPARE(model.data(model.index(3, 2)).toInt(), 1); - - model.setRelation(2, QSqlRelation(qTableName("reltest2"), "tid", "title")); - QVERIFY_SQL(model, select()); - QCOMPARE(model.data(model.index(0, 2)).toString(), QString("mister")); - QCOMPARE(model.data(model.index(3,2)).toString(), QString("herr")); - - } -} - -void tst_QSqlRelationalTableModel::whiteSpaceInIdentifiers() { - - QFETCH_GLOBAL(QString, dbName); - QSqlDatabase db = QSqlDatabase::database(dbName); - CHECK_DATABASE(db); - - if (!testWhiteSpaceNames(db.driverName())) - QSKIP("White space test irrelevant for driver", SkipAll); - QSqlRelationalTableModel model(0, db); - model.setTable(db.driver()->escapeIdentifier(qTableName("rel test6"), QSqlDriver::TableName)); - model.setSort(0, Qt::DescendingOrder); - model.setRelation(1, QSqlRelation(db.driver()->escapeIdentifier(qTableName("rel test7"), QSqlDriver::TableName), - db.driver()->escapeIdentifier("city id", QSqlDriver::FieldName), - db.driver()->escapeIdentifier("city name", QSqlDriver::FieldName))); - QVERIFY_SQL(model, select()); - - QCOMPARE(model.data(model.index(0,1)).toString(), QString("Washington")); - QCOMPARE(model.data(model.index(1,1)).toString(), QString("New York")); - - QSqlRecord rec; - QSqlField f1("id", QVariant::Int); - QSqlField f2(db.driver()->escapeIdentifier("city key", QSqlDriver::FieldName), QVariant::Int); - QSqlField f3(db.driver()->escapeIdentifier("extra field", QSqlDriver::FieldName), QVariant::Int); - - f1.setValue(3); - f2.setValue(2); - f3.setValue(7); - - f1.setGenerated(true); - f2.setGenerated(true); - f3.setGenerated(true); - - rec.append(f1); - rec.append(f2); - rec.append(f3); - - QVERIFY_SQL(model, insertRecord(-1, rec)); - model.submitAll(); - - QCOMPARE(model.data(model.index(0, 0)).toInt(), 3); - QCOMPARE(model.data(model.index(0, 1)).toString(), QString("Washington")); - QCOMPARE(model.data(model.index(0, 2)).toInt(), 7); - - //TODO: For some reson setting a record using manual submit fails - //model.setEditStrategy(QSqlTableModel::OnManualSubmit); - - QSqlRecord recNew; - QSqlField f1New("id", QVariant::Int); - QSqlField f2New(db.driver()->escapeIdentifier("city key", QSqlDriver::FieldName), QVariant::Int); - QSqlField f3New(db.driver()->escapeIdentifier("extra field", QSqlDriver::FieldName), QVariant::Int); - - f1New.setValue(4); - f2New.setValue(1); - f3New.setValue(6); - - f1New.setGenerated(true); - f2New.setGenerated(true); - f3New.setGenerated(true); - - recNew.append(f1New); - recNew.append(f2New); - recNew.append(f3New); - - QVERIFY_SQL(model, setRecord(0, recNew)); - - QCOMPARE(model.data(model.index(0, 0)).toInt(), 4); - QCOMPARE(model.data(model.index(0, 1)).toString(), QString("New York")); - QCOMPARE(model.data(model.index(0, 2)).toInt(), 6); - - QVERIFY_SQL(model, submitAll()); - QCOMPARE(model.data(model.index(0, 0)).toInt(), 4); - QCOMPARE(model.data(model.index(0, 1)).toString(), QString("New York")); - QCOMPARE(model.data(model.index(0, 2)).toInt(), 6); -} - QTEST_MAIN(tst_QSqlRelationalTableModel) #include "tst_qsqlrelationaltablemodel.moc" diff --git a/tests/auto/qsqltablemodel/tst_qsqltablemodel.cpp b/tests/auto/qsqltablemodel/tst_qsqltablemodel.cpp index 0e7355e..d4affe4 100644 --- a/tests/auto/qsqltablemodel/tst_qsqltablemodel.cpp +++ b/tests/auto/qsqltablemodel/tst_qsqltablemodel.cpp @@ -145,7 +145,7 @@ void tst_QSqlTableModel::dropTestTables() << qTableName("bigtable") << qTableName("foo"); if (testWhiteSpaceNames(db.driverName())) - tableNames << qTableName("qtestw hitespace", db.driver()); + tableNames << qTableName("qtestw hitespace"); tst_Databases::safeDropTables(db, tableNames); @@ -277,7 +277,6 @@ void tst_QSqlTableModel::setRecord() QList policies = QList() << QSqlTableModel::OnFieldChange << QSqlTableModel::OnRowChange << QSqlTableModel::OnManualSubmit; - QString Xsuffix; foreach( QSqlTableModel::EditStrategy submitpolicy, policies) { QSqlTableModel model(0, db); @@ -296,8 +295,6 @@ void tst_QSqlTableModel::setRecord() if ((QSqlTableModel::EditStrategy)submitpolicy == QSqlTableModel::OnManualSubmit) QVERIFY(model.submitAll()); - else if ((QSqlTableModel::EditStrategy)submitpolicy == QSqlTableModel::OnRowChange && i == model.rowCount() -1) - model.submit(); else { // dataChanged() is not emitted when submitAll() is called QCOMPARE(spy.count(), 2); @@ -307,12 +304,10 @@ void tst_QSqlTableModel::setRecord() } } - Xsuffix.append('X'); - - QCOMPARE(model.data(model.index(0, 1)).toString(), QString("foo").append(Xsuffix)); - QCOMPARE(model.data(model.index(0, 2)).toString(), QString("bar").append(Xsuffix)); - QCOMPARE(model.data(model.index(1, 1)).toString(), QString("baz").append(Xsuffix)); - QCOMPARE(model.data(model.index(1, 2)).toString(), QString("joe").append(Xsuffix)); + QCOMPARE(model.data(model.index(0, 1)).toString(), QString("fooX")); + QCOMPARE(model.data(model.index(0, 2)).toString(), QString("barX")); + QCOMPARE(model.data(model.index(1, 1)).toString(), QString("bazX")); + QCOMPARE(model.data(model.index(1, 2)).toString(), QString("joeX")); } } -- cgit v0.12