diff options
| author | 2011-06-27 19:54:28 +0000 | |
|---|---|---|
| committer | 2011-06-27 19:54:28 +0000 | |
| commit | 245ce4fcb794d4a7737e9697779a9af647086868 (patch) | |
| tree | 92b7ce1bb69d17f6357d556ec8c0b2b06ba908db /src/modules | |
| parent | fix for #1165 (diff) | |
| download | KVIrc-245ce4fcb794d4a7737e9697779a9af647086868.tar.gz KVIrc-245ce4fcb794d4a7737e9697779a9af647086868.tar.bz2 KVIrc-245ce4fcb794d4a7737e9697779a9af647086868.zip | |
Sql improvements
git-svn-id: https://svn.kvirc.de/svn/trunk/kvirc@5882 17fca916-40b9-46aa-a4ea-0a15b648b75c
Diffstat (limited to 'src/modules')
| -rw-r--r-- | src/modules/objects/KvsObject_sql.cpp | 217 | ||||
| -rw-r--r-- | src/modules/objects/KvsObject_sql.h | 12 |
2 files changed, 51 insertions, 178 deletions
diff --git a/src/modules/objects/KvsObject_sql.cpp b/src/modules/objects/KvsObject_sql.cpp index fc1da4276..34b7b519c 100644 --- a/src/modules/objects/KvsObject_sql.cpp +++ b/src/modules/objects/KvsObject_sql.cpp @@ -31,38 +31,10 @@ #include <stdlib.h> #include <QHash> -static KviPointerList <KvsObject_sql> sql_instances; - -static bool checkDuplicatedConnection(QString &szConnectionName) -{ - if(!sql_instances.count()) return false; - bool bFound=false; - for(KvsObject_sql *i = sql_instances.first(); i; i = sql_instances.next()) - { - QSqlQuery *q=i->getQueryConnectionsDict().value(szConnectionName); - if (q) - { - i->closeQueryConnection(q); - bFound=true; - break; - } - } - return bFound; -} -static void KviKvsSqlInstanceRegister(KvsObject_sql *instance) -{ - sql_instances.setAutoDelete(false); - sql_instances.append(instance); -} -static void KviKvsSqlInstanceUnregister(KvsObject_sql *instance) -{ - int idx=sql_instances.findRef(instance); - sql_instances.remove(idx); -} #define CHECK_QUERY_IS_INIT if (!m_pCurrentSQlQuery)\ - {\ - c->error("No query has been initialized!");\ + {\ + c->error("No connection has been initialized!");\ return false;} @@ -89,8 +61,6 @@ static void KviKvsSqlInstanceUnregister(KvsObject_sql *instance) Returns as array or, if the flag 's' is passed, as a comma separate string all the database active connection's names. !fn: <array> $tablesList(<connection_name:string>) Returns as array the database tables list. - !fn: $queryInit(<connection_name:string>) - Initialize the query for the database <connection_name> which has to be already connected. !fn: $transaction() Begin a transaction. !fn: $commit() @@ -145,11 +115,8 @@ KVSO_BEGIN_REGISTERCLASS(KvsObject_sql,"sql","object") KVSO_REGISTER_HANDLER_BY_NAME(KvsObject_sql,beginTransaction) KVSO_REGISTER_HANDLER_BY_NAME(KvsObject_sql,setConnection) KVSO_REGISTER_HANDLER_BY_NAME(KvsObject_sql,connectionNames) - KVSO_REGISTER_HANDLER_BY_NAME(KvsObject_sql,setCurrentQuery) KVSO_REGISTER_HANDLER_BY_NAME(KvsObject_sql,tablesList) - KVSO_REGISTER_HANDLER_BY_NAME(KvsObject_sql,currentQuery) KVSO_REGISTER_HANDLER_BY_NAME(KvsObject_sql,closeConnection) - KVSO_REGISTER_HANDLER_BY_NAME(KvsObject_sql,queryInit) KVSO_REGISTER_HANDLER_BY_NAME(KvsObject_sql,queryFinish) KVSO_REGISTER_HANDLER_BY_NAME(KvsObject_sql,queryResultsSize) KVSO_REGISTER_HANDLER_BY_NAME(KvsObject_sql,queryExec) @@ -166,31 +133,22 @@ KVSO_END_REGISTERCLASS(KvsObject_sql) KVSO_BEGIN_CONSTRUCTOR(KvsObject_sql,KviKvsObject) + m_pCurrentSQlQuery=0; - KviKvsSqlInstanceRegister(this); KVSO_END_CONSTRUCTOR(KvsObject_sql) KVSO_BEGIN_DESTRUCTOR(KvsObject_sql) - QHashIterator<QString,QSqlQuery *> t(queryConnectionsDict); - while (t.hasNext()) - { - t.next(); - QString szConnectionName=t.key(); - queryConnectionsDict.value(szConnectionName)->finish(); - delete queryConnectionsDict.value(szConnectionName); - QSqlDatabase::removeDatabase(szConnectionName); - } - KviKvsSqlInstanceUnregister(this); - queryConnectionsDict.clear(); + if(m_pCurrentSQlQuery) delete m_pCurrentSQlQuery; + m_pCurrentSQlQuery=0; KVSO_END_DESTRUCTOR(KvsObject_sql) KVSO_CLASS_FUNCTION(sql,setConnection) { QString szConnectionName,szDbName,szDbDriver,szUserName,szHostName,szPassword; KVSO_PARAMETERS_BEGIN(c) - KVSO_PARAMETER("connection_name",KVS_PT_STRING,0,szConnectionName) KVSO_PARAMETER("database_name",KVS_PT_STRING,0,szDbName) + KVSO_PARAMETER("connection_name",KVS_PT_STRING,KVS_PF_OPTIONAL,szConnectionName) KVSO_PARAMETER("user_name",KVS_PT_STRING,KVS_PF_OPTIONAL,szUserName) KVSO_PARAMETER("host_name",KVS_PT_STRING,KVS_PF_OPTIONAL,szHostName) KVSO_PARAMETER("password",KVS_PT_STRING,KVS_PF_OPTIONAL,szPassword) @@ -206,17 +164,19 @@ KVSO_CLASS_FUNCTION(sql,setConnection) } } else szDbDriver="QSQLITE"; - if (checkDuplicatedConnection(szConnectionName)) - { - c->warning(__tr2qs_ctx("Duplicate connection name '%Q', old query connection removed","objects"),&szConnectionName); - } QSqlDatabase db=QSqlDatabase::addDatabase(szDbDriver,szConnectionName); + mSzConnectionName = szConnectionName; db.setDatabaseName(szDbName); db.setHostName(szHostName); db.setUserName(szUserName); db.setPassword(szPassword); - - c->returnValue()->setBoolean(db.open()); + bool bOk = db.open(); + if(bOk) + { + if(m_pCurrentSQlQuery) delete m_pCurrentSQlQuery; + m_pCurrentSQlQuery = new QSqlQuery(db); + } + c->returnValue()->setBoolean(bOk); return true; } @@ -285,69 +245,65 @@ KVSO_CLASS_FUNCTION(sql,features) KVSO_CLASS_FUNCTION(sql,beginTransaction) { - QString szConnectionName; - KVSO_PARAMETERS_BEGIN(c) - KVSO_PARAMETER("connectionName",KVS_PT_STRING,0,szConnectionName) - KVSO_PARAMETERS_END(c) - - QStringList connections = QSqlDatabase::connectionNames(); - if (!connections.contains(szConnectionName)) + QSqlDatabase db = QSqlDatabase::database(mSzConnectionName); + if(!db.isValid()) { - c->warning(__tr2qs_ctx("Connection %Q does not exists","objects"),&szConnectionName); - return true; + c->error("No connection has been initialized!"); + return false; } - QSqlDatabase db=QSqlDatabase::database(szConnectionName); db.transaction(); return true; } KVSO_CLASS_FUNCTION(sql,commit) { - QString szConnectionName; - KVSO_PARAMETERS_BEGIN(c) - KVSO_PARAMETER("connectionName",KVS_PT_STRING,0,szConnectionName) - KVSO_PARAMETERS_END(c) - - QStringList connections = QSqlDatabase::connectionNames(); - if (!connections.contains(szConnectionName)) + QSqlDatabase db = QSqlDatabase::database(mSzConnectionName); + if(!db.isValid()) { - c->warning(__tr2qs_ctx("Connection %Q does not exists","objects"),&szConnectionName); - return true; + c->error("No connection has been initialized!"); + return false; } - QSqlDatabase db=QSqlDatabase::database(szConnectionName); - db.commit(); + db.commit(); return true; } KVSO_CLASS_FUNCTION(sql,closeConnection) { QString szConnectionName; KVSO_PARAMETERS_BEGIN(c) - KVSO_PARAMETER("connectionName",KVS_PT_STRING,0,szConnectionName) + KVSO_PARAMETER("connection_name",KVS_PT_STRING,KVS_PF_OPTIONAL,szConnectionName) KVSO_PARAMETERS_END(c) - QStringList connections = QSqlDatabase::connectionNames(); - if (!connections.contains(szConnectionName)) + if(!szConnectionName.isEmpty()) { + QStringList connections = QSqlDatabase::connectionNames(); + if (!connections.contains(szConnectionName)) + { c->warning(__tr2qs_ctx("Connection %Q does not exists","objects"),&szConnectionName); return true; + } + if(m_pCurrentSQlQuery) + { + delete m_pCurrentSQlQuery; + m_pCurrentSQlQuery = 0; + } + QSqlDatabase::removeDatabase(szConnectionName); + return true; } - QSqlQuery *q=queryConnectionsDict.value(szConnectionName); - if (q) closeQueryConnection(q); - QSqlDatabase::removeDatabase(szConnectionName); + if(m_pCurrentSQlQuery) + { + delete m_pCurrentSQlQuery; + m_pCurrentSQlQuery = 0; + } + QSqlDatabase::removeDatabase(mSzConnectionName); return true; } KVSO_CLASS_FUNCTION(sql,tablesList) { - QString szConnectionName; - KVSO_PARAMETERS_BEGIN(c) - KVSO_PARAMETER("connectionName",KVS_PT_STRING,0,szConnectionName) - KVSO_PARAMETERS_END(c) - QStringList connections = QSqlDatabase::connectionNames(); - if (!connections.contains(szConnectionName)) + QSqlDatabase db = QSqlDatabase::database(mSzConnectionName); + if(!db.isValid()) { - c->warning(__tr2qs_ctx("Connection %Q does not exists","objects"),&szConnectionName); - return true; + c->error("No connection has been initialized!"); + return false; } - QSqlDatabase db=QSqlDatabase::database(szConnectionName); QStringList tables=db.tables(); KviKvsArray *pArray=new KviKvsArray(); for(int i=0;i<tables.count();i++) @@ -357,81 +313,14 @@ KVSO_CLASS_FUNCTION(sql,tablesList) c->returnValue()->setArray(pArray); return true; } -KVSO_CLASS_FUNCTION(sql,setCurrentQuery) -{ - QString szConnectionName; - KVSO_PARAMETERS_BEGIN(c) - KVSO_PARAMETER("connection_name",KVS_PT_STRING,0,szConnectionName) - KVSO_PARAMETERS_END(c) - QSqlQuery *q=queryConnectionsDict.value(szConnectionName); - if(!q) - { - c->warning(__tr2qs_ctx("Connection query %Q does not exists","objects"),&szConnectionName); - return true; - } - m_pCurrentSQlQuery=q; - return true; -} + KVSO_CLASS_FUNCTION(sql,queryFinish) { - QString szConnectionName; - KVSO_PARAMETERS_BEGIN(c) - KVSO_PARAMETER("connection_name",KVS_PT_STRING,KVS_PF_OPTIONAL,szConnectionName) - KVSO_PARAMETERS_END(c) - QSqlQuery *q; - if(szConnectionName.isEmpty()) - { - q=m_pCurrentSQlQuery; - if (!q) - { - c->warning(__tr2qs_ctx("No query connection is open","objects")); - return true; - } - } - else - { - q=queryConnectionsDict.value(szConnectionName); - if(!q) - { - c->warning(__tr2qs_ctx("Query for connection %Q does not exists","objects"),&szConnectionName); - return true; - } - } - q->finish(); - return true; -} -KVSO_CLASS_FUNCTION(sql,currentQuery) -{ - if (!m_pCurrentSQlQuery) c->returnValue()->setString(QString()); - else - { - QString szKey=queryConnectionsDict.key(m_pCurrentSQlQuery); - c->returnValue()->setString(szKey); - } - return true; -} -KVSO_CLASS_FUNCTION(sql,queryInit) -{ - QString szConnectionName; - KVSO_PARAMETERS_BEGIN(c) - KVSO_PARAMETER("connection_name",KVS_PT_STRING,0,szConnectionName) - KVSO_PARAMETERS_END(c) - if (queryConnectionsDict.value(szConnectionName)) - { - c->warning(__tr2qs_ctx("Query %Q already initialized","objects"),&szConnectionName); - return true; - } - if(!QSqlDatabase::connectionNames().contains(szConnectionName)) - { - c->error(__tr2qs_ctx("Connection %Q is not open!","objects"),&szConnectionName); - return false; - } - m_pCurrentSQlQuery=new QSqlQuery(QSqlDatabase::database(szConnectionName)); - queryConnectionsDict[szConnectionName]=m_pCurrentSQlQuery; + CHECK_QUERY_IS_INIT + m_pCurrentSQlQuery->finish(); return true; } - KVSO_CLASS_FUNCTION(sql,queryPrepare) { CHECK_QUERY_IS_INIT @@ -588,11 +477,5 @@ KVSO_CLASS_FUNCTION(sql,lastError) c->returnValue()->setString(szError); return true; } -void KvsObject_sql::closeQueryConnection(QSqlQuery * query) -{ - if (query==m_pCurrentSQlQuery) m_pCurrentSQlQuery=0; - query->finish(); - queryConnectionsDict.remove(queryConnectionsDict.key(query)); - delete query; -} + diff --git a/src/modules/objects/KvsObject_sql.h b/src/modules/objects/KvsObject_sql.h index 5089574fa..431f6deea 100644 --- a/src/modules/objects/KvsObject_sql.h +++ b/src/modules/objects/KvsObject_sql.h @@ -38,16 +38,9 @@ public: KVSO_DECLARE_OBJECT(KvsObject_sql) protected: QSqlQuery *m_pCurrentSQlQuery; - QHash<QString,QSqlQuery *> queryConnectionsDict; + QString mSzConnectionName; public: - QHash<QString,QSqlQuery *> & getQueryConnectionsDict() { return queryConnectionsDict; }; - void closeQueryConnection(QSqlQuery *); - QSqlQuery & getQuery() - { - //if (currentSQlQuery) return *currentSQlQuery; - return *m_pCurrentSQlQuery; - }; bool setConnection(KviKvsObjectFunctionCall *c); bool connectionNames(KviKvsObjectFunctionCall *c); bool features(KviKvsObjectFunctionCall *c); @@ -66,10 +59,7 @@ public: bool queryRecord(KviKvsObjectFunctionCall *c); bool queryPrepare(KviKvsObjectFunctionCall *c); bool queryBindValue(KviKvsObjectFunctionCall *c); - bool setCurrentQuery(KviKvsObjectFunctionCall *c); - bool currentQuery(KviKvsObjectFunctionCall *c); bool queryFinish(KviKvsObjectFunctionCall *c); - bool queryInit(KviKvsObjectFunctionCall *c); bool closeConnection(KviKvsObjectFunctionCall *c); bool lastError(KviKvsObjectFunctionCall *c); |
