[prev in list] [next in list] [prev in thread] [next in thread]
List: kde-commits
Subject: koffice/kexi/kexidb/drivers/mySQL
From: Jarosław Staniek <staniek () kde ! org>
Date: 2010-04-26 23:21:33
Message-ID: 20100426232133.960BBAC8A4 () svn ! kde ! org
[Download RAW message or body]
SVN commit 1119294 by staniek:
KexiDB
*MySQL Driver: Fix "DB created but cannot open" error appearing on creating a new \
database for mysql backend. See \
http://dev.mysql.com/doc/refman/5.0/en/identifier-case-sensitivity.html (complex!) \
for logic of otherwise simple thing. The solution is to execute SHOW VARIABLES LIKE \
'lower_case_table_name' to get the flag and make the table and database names \
lowercase if needed.
M +22 -7 mysqlconnection.cpp
M +2 -1 mysqlconnection_p.cpp
M +2 -0 mysqlconnection_p.h
--- trunk/koffice/kexi/kexidb/drivers/mySQL/mysqlconnection.cpp #1119293:1119294
@@ -70,7 +70,7 @@
#else //better way to get the version info: use 'version' built-in variable:
//! @todo this is hardcoded for now; define api for retrieving variables and use \
this API... QString versionString;
- const tristate res = querySingleString("SELECT @@version", versionString, \
/*column*/0, false /*!addLimitTo1*/); + tristate res = querySingleString("SELECT \
@@version", versionString, /*column*/0, false /*!addLimitTo1*/); QRegExp \
versionRe("(\\d+)\\.(\\d+)\\.(\\d+)");
if (res == true && versionRe.exactMatch(versionString)) { // (if \
querySingleString failed, the version will be 0.0.0... version.major = \
versionRe.cap(1).toInt(); @@ -78,6 +78,15 @@
version.release = versionRe.cap(3).toInt();
}
#endif
+ // Get lower_case_table_name value so we know if there's case sensitivity \
supported + // See \
http://dev.mysql.com/doc/refman/5.0/en/identifier-case-sensitivity.html + int \
intLowerCaseTableNames = 0; + res = querySingleNumber(QLatin1String("SHOW \
VARIABLES LIKE 'lower_case_table_name'"), intLowerCaseTableNames, + \
0/*col*/, false/* !addLimitTo1 */); + if (res == false) // sanity
+ return false;
+ kDebug() << (res == true) << "lower_case_table_name:" << intLowerCaseTableNames;
+ d->lowerCaseTableNames = intLowerCaseTableNames > 0;
return true;
}
@@ -119,12 +128,14 @@
bool MySqlConnection::drv_databaseExists(const QString &dbName, bool ignoreErrors)
{
bool success;
+ /* db names can be lower case in mysql */
+ const QString storedDbName(d->lowerCaseTableNames ? dbName.toLower() : dbName);
bool exists = resultExists(
QString::fromLatin1("SHOW DATABASES LIKE %1")
- .arg(driver()->escapeString(dbName.toLower()/* db names are lower case in \
mysql */)), success); + .arg(driver()->escapeString(storedDbName)), \
success); if (!exists || !success) {
if (!ignoreErrors)
- setError(ERR_OBJECT_NOT_FOUND, i18n("The database \"%1\" does not \
exist.", dbName)); + setError(ERR_OBJECT_NOT_FOUND, i18n("The database \
\"%1\" does not exist.", storedDbName)); return false;
}
return true;
@@ -132,9 +143,11 @@
bool MySqlConnection::drv_createDatabase(const QString &dbName)
{
- KexiDBDrvDbg << "MySqlConnection::drv_createDatabase: " << dbName;
+ const QString storedDbName(d->lowerCaseTableNames ? dbName.toLower() : dbName);
+ KexiDBDrvDbg << "MySqlConnection::drv_createDatabase: " << storedDbName;
// mysql_create_db deprecated, use SQL here.
- if (drv_executeSQL(QString::fromLatin1("CREATE DATABASE \
%1").arg(escapeIdentifier(dbName)))) + // db names are lower case in mysql
+ if (drv_executeSQL(QString::fromLatin1("CREATE DATABASE \
%1").arg(escapeIdentifier(storedDbName)))) return true;
d->storeResult();
return false;
@@ -145,7 +158,8 @@
Q_UNUSED(cancelled);
Q_UNUSED(msgHandler);
//TODO is here escaping needed?
- return d->useDatabase(dbName);
+ const QString storedDbName(d->lowerCaseTableNames ? dbName.toLower() : dbName);
+ return d->useDatabase(storedDbName);
}
bool MySqlConnection::drv_closeDatabase()
@@ -158,7 +172,8 @@
bool MySqlConnection::drv_dropDatabase(const QString &dbName)
{
//TODO is here escaping needed
- return drv_executeSQL(QString::fromLatin1("DROP DATABASE \
%1").arg(escapeIdentifier(dbName))); + const QString \
storedDbName(d->lowerCaseTableNames ? dbName.toLower() : dbName); + return \
drv_executeSQL(QString::fromLatin1("DROP DATABASE \
%1").arg(escapeIdentifier(storedDbName))); }
bool MySqlConnection::drv_executeSQL(const QString& statement)
--- trunk/koffice/kexi/kexidb/drivers/mySQL/mysqlconnection_p.cpp #1119293:1119294
@@ -43,6 +43,7 @@
, mysql(0)
, mysql_owned(true)
, res(0)
+ , lowerCaseTableNames(false)
{
}
@@ -131,7 +132,7 @@
bool MySqlConnectionInternal::useDatabase(const QString &dbName)
{
//TODO is here escaping needed?
- return executeSQL("USE " + dbName);
+ return executeSQL(QLatin1String("USE ") + escapeIdentifier(dbName));
}
/*! Executes the given SQL statement on the server.
--- trunk/koffice/kexi/kexidb/drivers/mySQL/mysqlconnection_p.h #1119293:1119294
@@ -83,6 +83,8 @@
bool mysql_owned; //!< true if mysql pointer should be freed on destruction
QString errmsg; //!< server-specific message of last operation
int res; //!< result code of last operation on server
+ //! Get lower_case_table_name variable value so we know if there's case \
sensitivity supported for table and database names + bool lowerCaseTableNames;
};
[prev in list] [next in list] [prev in thread] [next in thread]
Configure |
About |
News |
Add a list |
Sponsored by KoreLogic