Convert some if/else-if/else chains into switch()es

Some of the else if lines exceeded 100 characters, so should have been
split; and some lines already were split. So each whole chain should
have had braces on its bodies. Instead make it a switch, as this makes
it more evident what's going on in any case.  Furthermore, as each
branch did the same thing with dbType-specific strings, change to just
setting QLatin1String variables, so that the rest of the code needn't
be duplicated in each branch; it can simply be done once after the
switch, using the string's .arg() to embed fragments. In the process
break up the SQL query strings more gracefully, purge spaces just
inside C++ parentheses.

Change-Id: Ie26166e098ad74720bb6d7c4d9fe47718c33a13c
Reviewed-by: Marc Mutz <marc.mutz@qt.io>
This commit is contained in:
Edward Welbourne 2022-02-01 14:58:55 +01:00
parent 35ec6283dc
commit 3acaf3160d
1 changed files with 146 additions and 99 deletions

View File

@ -485,23 +485,31 @@ void tst_QSqlQuery::char1SelectUnicode()
if ( db.driver()->hasFeature( QSqlDriver::Unicode ) ) {
QString uniStr( QChar(0x0915) ); // DEVANAGARI LETTER KA
QSqlQuery q( db );
QString createQuery;
QLatin1String createQuery;
const QString char1SelectUnicode(qTableName("char1SU", __FILE__, db));
if (dbType == QSqlDriver::MSSqlServer)
createQuery = "create table " + char1SelectUnicode + "(id nchar(1))";
else if (dbType == QSqlDriver::DB2 || dbType == QSqlDriver::Oracle || dbType == QSqlDriver::PostgreSQL)
createQuery = "create table " + char1SelectUnicode + " (id char(3))";
else if (dbType == QSqlDriver::Interbase)
createQuery = "create table " + char1SelectUnicode +
" (id char(1) character set unicode_fss)";
else if (dbType == QSqlDriver::MySqlServer)
createQuery = "create table " + char1SelectUnicode + " (id char(1)) "
"default character set 'utf8'";
else
createQuery = "create table " + char1SelectUnicode + " (id char(1))";
switch (dbType) {
case QSqlDriver::MSSqlServer:
createQuery = QLatin1String("create table %1(id nchar(1))");
break;
case QSqlDriver::DB2:
case QSqlDriver::Oracle:
case QSqlDriver::PostgreSQL:
createQuery = QLatin1String("create table %1 (id char(3))");
break;
case QSqlDriver::Interbase:
createQuery = QLatin1String("create table %1 (id char(1) character set unicode_fss)");
break;
case QSqlDriver::MySqlServer:
createQuery =
QLatin1String("create table %1 (id char(1)) default character set 'utf8'");
break;
default:
createQuery = QLatin1String("create table %1 (id char(1))");
break;
}
QVERIFY_SQL( q, exec( createQuery ) );
QVERIFY_SQL(q, exec(createQuery.arg(char1SelectUnicode)));
QVERIFY_SQL( q, prepare( "insert into " + char1SelectUnicode + " values(?)" ) );
@ -929,30 +937,38 @@ void tst_QSqlQuery::outValues()
QSqlQuery q( db );
q.setForwardOnly( true );
QSqlDriver::DbmsType dbType = tst_Databases::getDatabaseType(db);
if (dbType == QSqlDriver::Oracle) {
QVERIFY_SQL( q, exec( "create or replace procedure " + tst_outValues + "(x out int) is\n"
QLatin1String creator, caller;
switch (tst_Databases::getDatabaseType(db)) {
case QSqlDriver::Oracle:
creator = QLatin1String("create or replace procedure %1(x out int) is\n"
"begin\n"
" x := 42;\n"
"end;\n" ) );
QVERIFY( q.prepare( "call " + tst_outValues + "(?)" ) );
} else if (dbType == QSqlDriver::DB2) {
q.exec( "drop procedure " + tst_outValues ); //non-fatal
QVERIFY_SQL( q, exec( "CREATE PROCEDURE " + tst_outValues + " (OUT x int)\n"
"end;\n");
caller = QLatin1String("call %1(?)");
break;
case QSqlDriver::DB2:
q.exec("drop procedure " + tst_outValues); // non-fatal
creator = QLatin1String("CREATE PROCEDURE %1 (OUT x int)\n"
"LANGUAGE SQL\n"
"P1: BEGIN\n"
" SET x = 42;\n"
"END P1" ) );
QVERIFY( q.prepare( "call " + tst_outValues + "(?)" ) );
} else if (dbType == QSqlDriver::MSSqlServer) {
q.exec( "drop procedure " + tst_outValues ); //non-fatal
QVERIFY_SQL( q, exec( "create procedure " + tst_outValues + " (@x int out) as\n"
"END P1");
caller = QLatin1String("call %1(?)");
break;
case QSqlDriver::MSSqlServer:
q.exec("drop procedure " + tst_outValues); // non-fatal
creator = QLatin1String("create procedure %1 (@x int out) as\n"
"begin\n"
" set @x = 42\n"
"end\n" ) );
QVERIFY( q.prepare( "{call " + tst_outValues + "(?)}" ) );
} else
QSKIP( "Don't know how to create a stored procedure for this database server, please fix this test");
"end\n");
caller = QLatin1String("{call %1(?)}");
break;
default:
QSKIP("Don't know how to create a stored procedure for this database server, "
"please fix this test");
}
QVERIFY_SQL(q, exec(creator.arg(tst_outValues)));
QVERIFY(q.prepare(caller.arg(tst_outValues)));
q.addBindValue( 0, QSql::Out );
@ -2181,20 +2197,33 @@ void tst_QSqlQuery::prepare_bind_exec()
bool useUnicode = db.driver()->hasFeature( QSqlDriver::Unicode );
QSqlQuery q( db );
QString createQuery;
QLatin1String createQuery;
QSqlDriver::DbmsType dbType = tst_Databases::getDatabaseType(db);
if (dbType == QSqlDriver::PostgreSQL)
QVERIFY_SQL( q, exec("set client_min_messages='warning'"));
if (dbType == QSqlDriver::MSSqlServer || dbType == QSqlDriver::Sybase)
createQuery = "create table " + qtest_prepare + " (id int primary key, name nvarchar(200) null, name2 nvarchar(200) null)";
else if (dbType == QSqlDriver::MySqlServer && useUnicode)
createQuery = "create table " + qtest_prepare + " (id int not null primary key, name varchar(200) character set utf8, name2 varchar(200) character set utf8)";
else
createQuery = "create table " + qtest_prepare + " (id int not null primary key, name varchar(200), name2 varchar(200))";
switch (dbType) {
case QSqlDriver::MSSqlServer:
case QSqlDriver::Sybase:
createQuery = QLatin1String("create table %1 (id int primary key, "
"name nvarchar(200) null, name2 nvarchar(200) null)");
break;
case QSqlDriver::MySqlServer:
if (useUnicode) {
createQuery = QLatin1String("create table %1 (id int not null primary key, "
"name varchar(200) character set utf8, "
"name2 varchar(200) character set utf8)");
break;
}
Q_FALLTHROUGH();
default:
createQuery = QLatin1String("create table %1 (id int not null primary key, "
"name varchar(200), name2 varchar(200))");
break;
}
q.exec("drop table " + qtest_prepare);
QVERIFY_SQL( q, exec( createQuery ) );
QVERIFY_SQL(q, exec(createQuery.arg(qtest_prepare)));
QVERIFY( q.prepare( "insert into " + qtest_prepare + " (id, name) values (:id, :name)" ) );
int i;
@ -3316,54 +3345,70 @@ void tst_QSqlQuery::nextResult()
};
dropProc(); // to make sure it's not there before we start
if (dbType == QSqlDriver::MySqlServer)
QVERIFY_SQL( q, exec( QString( "CREATE PROCEDURE %1()"
"\nBEGIN"
"\nSELECT id, text FROM %2;"
"\nSELECT empty, num, text, id FROM %3;"
"\nEND" ).arg( procName ).arg( tableName ).arg( tableName ) ) );
else if (dbType == QSqlDriver::DB2)
QVERIFY_SQL( q, exec( QString( "CREATE PROCEDURE %1()"
"\nRESULT SETS 2"
"\nLANGUAGE SQL"
"\np1:BEGIN"
"\nDECLARE cursor1 CURSOR WITH RETURN FOR SELECT id, text FROM %2;"
"\nDECLARE cursor2 CURSOR WITH RETURN FOR SELECT empty, num, text, id FROM %3;"
"\nOPEN cursor1;"
"\nOPEN cursor2;"
"\nEND p1" ).arg( procName ).arg( tableName ).arg( tableName ) ) );
else if (dbType == QSqlDriver::PostgreSQL)
QVERIFY_SQL(q, exec(QString("CREATE FUNCTION %1(ref1 refcursor, ref2 refcursor)"
"\nRETURNS SETOF refcursor AS $$"
"\nBEGIN"
"\nOPEN ref1 FOR SELECT id, text FROM %2;"
"\nRETURN NEXT ref1;"
"\nOPEN ref2 FOR SELECT empty, num, text, id FROM %2;"
"\nRETURN NEXT ref2;"
"\nEND;"
"\n$$ LANGUAGE plpgsql").arg(procName).arg(tableName)));
else
QVERIFY_SQL( q, exec( QString( "CREATE PROCEDURE %1"
"\nAS"
"\nSELECT id, text FROM %2"
"\nSELECT empty, num, text, id FROM %3" ).arg( procName ).arg( tableName ).arg( tableName ) ) );
QLatin1String creator;
switch (dbType) {
case QSqlDriver::MySqlServer:
creator = QLatin1String("CREATE PROCEDURE %1()\n"
"BEGIN\n"
" SELECT id, text FROM %2;\n"
" SELECT empty, num, text, id FROM %2;\n"
"END");
break;
case QSqlDriver::DB2:
creator = QLatin1String("CREATE PROCEDURE %1()\n"
"RESULT SETS 2\n"
"LANGUAGE SQL\n"
"p1:BEGIN\n"
" DECLARE cursor1 CURSOR WITH RETURN FOR "
"SELECT id, text FROM %2;\n"
" DECLARE cursor2 CURSOR WITH RETURN FOR "
"SELECT empty, num, text, id FROM %2;\n"
" OPEN cursor1;\n"
" OPEN cursor2;\n"
"END p1");
break;
case QSqlDriver::PostgreSQL:
creator = QLatin1String("CREATE FUNCTION %1(ref1 refcursor, ref2 refcursor)\n"
"RETURNS SETOF refcursor AS $$\n"
"BEGIN\n"
" OPEN ref1 FOR SELECT id, text FROM %2;\n"
" RETURN NEXT ref1;\n"
" OPEN ref2 FOR SELECT empty, num, text, id FROM %2;\n"
" RETURN NEXT ref2;\n"
"END;\n"
"$$ LANGUAGE plpgsql");
break;
default:
creator = QLatin1String("CREATE PROCEDURE %1\n"
"AS\n"
"SELECT id, text FROM %2\n"
"SELECT empty, num, text, id FROM %2");
break;
}
QVERIFY_SQL(q, exec(creator.arg(procName, tableName)));
const auto tidier = qScopeGuard(dropProc);
if (dbType == QSqlDriver::MySqlServer || dbType == QSqlDriver::DB2) {
q.setForwardOnly( true );
QVERIFY_SQL( q, exec( QString( "CALL %1()" ).arg( procName ) ) );
} else if (dbType == QSqlDriver::PostgreSQL) {
QLatin1String caller;
switch (dbType) {
case QSqlDriver::MySqlServer:
case QSqlDriver::DB2:
q.setForwardOnly(true);
caller = QLatin1String("CALL %1()");
break;
case QSqlDriver::PostgreSQL:
// Returning multiple result sets from PostgreSQL stored procedure:
// http://sqlines.com/postgresql/how-to/return_result_set_from_stored_procedure
QVERIFY_SQL(q, exec(QString("BEGIN;"
"SELECT %1('cur1', 'cur2');"
"FETCH ALL IN cur1;"
"FETCH ALL IN cur2;"
"COMMIT;").arg(procName)));
} else {
QVERIFY_SQL( q, exec( QString( "EXEC %1" ).arg( procName ) ) );
caller = QLatin1String("BEGIN;"
" SELECT %1('cur1', 'cur2');"
" FETCH ALL IN cur1;"
" FETCH ALL IN cur2;"
"COMMIT;");
break;
default:
caller = QLatin1String("EXEC %1");
break;
}
QVERIFY_SQL(q, exec(caller.arg(procName)));
if (dbType == QSqlDriver::PostgreSQL) {
// First result set - start of transaction
@ -3501,25 +3546,27 @@ void tst_QSqlQuery::timeStampParsing()
const QString tableName(qTableName("timeStampParsing", __FILE__, db));
tst_Databases::safeDropTable(db, tableName);
QSqlQuery q(db);
QSqlDriver::DbmsType dbType = tst_Databases::getDatabaseType(db);
if (dbType == QSqlDriver::PostgreSQL) {
QVERIFY_SQL(q, exec(QStringLiteral("CREATE TABLE ") + tableName + QStringLiteral("("
"id serial NOT NULL, "
"datefield timestamp, primary key(id));")));
} else if (dbType == QSqlDriver::MySqlServer) {
QVERIFY_SQL(q, exec(QStringLiteral("CREATE TABLE ") + tableName + QStringLiteral("("
"id integer NOT NULL AUTO_INCREMENT,"
"datefield timestamp, primary key(id));")));
} else if (dbType == QSqlDriver::Interbase) {
QLatin1String creator;
switch (tst_Databases::getDatabaseType(db)) {
case QSqlDriver::PostgreSQL:
creator = QLatin1String("CREATE TABLE %1(id serial NOT NULL, "
"datefield timestamp, primary key(id));");
break;
case QSqlDriver::MySqlServer:
creator = QLatin1String("CREATE TABLE %1(id integer NOT NULL AUTO_INCREMENT, "
"datefield timestamp, primary key(id));");
break;
case QSqlDriver::Interbase:
// Since there is no auto-increment feature in Interbase we allow it to be null
QVERIFY_SQL(q, exec(QStringLiteral("CREATE TABLE ") + tableName + QStringLiteral("("
"id integer,"
"datefield timestamp);")));
} else {
QVERIFY_SQL(q, exec(QStringLiteral("CREATE TABLE ") + tableName + QStringLiteral("("
"\"id\" integer NOT NULL PRIMARY KEY AUTOINCREMENT,"
"\"datefield\" timestamp);")));
creator = QLatin1String("CREATE TABLE %1(id integer, datefield timestamp);");
break;
default:
creator = QLatin1String("CREATE TABLE %1("
"\"id\" integer NOT NULL PRIMARY KEY AUTOINCREMENT, "
"\"datefield\" timestamp);");
break;
}
QVERIFY_SQL(q, exec(creator.arg(tableName)));
QVERIFY_SQL(q, exec(
QStringLiteral("INSERT INTO ") + tableName + QStringLiteral(" (datefield) VALUES (current_timestamp);"
)));