[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