117
117
QThread* thread = QThread::currentThread();
118
118
QSqlDatabase db = threadDatabases[thread];
119
119
int isValid = databasesValid[thread];
120
121
if (!isValid || !db.isOpen())
122
123
// need to open a db for thread
123
124
bool success = open(db);
125
kDebug() << "Error while opening the database. Details: [" << db.lastError() << "]";
128
kDebug() << "Error while opening the database. Details: [" << db.lastError() << "]";
127
131
QObject::connect(thread, SIGNAL(finished()),
128
132
q, SLOT(slotThreadFinished()));
130
135
#ifdef DATABASCOREBACKEND_DEBUG
133
138
kDebug() << "Database ["<< connectionName(thread) <<"] already open for thread ["<< thread <<"].";
300
327
d->lock->mutex.unlock();
303
/** This suspends the current thread if the query status as
304
* set by setFlag() is Wait and until the thread is woken with wakeAll().
305
* The DatabaseAccess mutex will be unlocked while waiting.
330
/** This suspends the current thread if the query status as
331
* set by setFlag() is Wait and until the thread is woken with wakeAll().
332
* The DatabaseAccess mutex will be unlocked while waiting.
307
334
void DatabaseCoreBackendPrivate::ErrorLocker::wait()
309
336
// we use a copy of the flag under lock of the errorLockMutex to be able to check it here
310
337
while (d->errorLockOperationStatus == DatabaseCoreBackend::Wait)
311
339
d->errorLockCondVar.wait(&d->errorLockMutex);
314
343
DatabaseCoreBackendPrivate::ErrorLocker::~ErrorLocker()
438
475
// ---------------------------
440
DatabaseCoreBackend::DatabaseCoreBackend(const QString &backendName, DatabaseLocking *locking)
441
: d_ptr(new DatabaseCoreBackendPrivate(this))
477
DatabaseCoreBackend::DatabaseCoreBackend(const QString& backendName, DatabaseLocking* locking)
478
: d_ptr(new DatabaseCoreBackendPrivate(this))
443
480
d_ptr->init(backendName, locking);
446
DatabaseCoreBackend::DatabaseCoreBackend(const QString &backendName, DatabaseLocking *locking, DatabaseCoreBackendPrivate &dd)
483
DatabaseCoreBackend::DatabaseCoreBackend(const QString& backendName, DatabaseLocking* locking, DatabaseCoreBackendPrivate& dd)
449
486
d_ptr->init(backendName, locking);
464
501
DatabaseAction DatabaseCoreBackend::getDBAction(const QString& actionName) const
466
503
DatabaseAction action = configElement().sqlStatements.value(actionName);
467
505
if (action.name.isNull())
468
507
kError() << "No DB action defined for" << actionName << "! Implementation missing for this database type.";
472
513
DatabaseCoreBackend::QueryState DatabaseCoreBackend::execDBAction(const DatabaseAction& action, QList<QVariant>* values,
473
QVariant* lastInsertId)
514
QVariant* lastInsertId)
475
516
return execDBAction(action, QMap<QString, QVariant>(), values, lastInsertId);
478
519
DatabaseCoreBackend::QueryState DatabaseCoreBackend::execDBAction(const DatabaseAction& action, const QMap<QString, QVariant>& bindingMap,
479
QList<QVariant>* values, QVariant* lastInsertId)
520
QList<QVariant>* values, QVariant* lastInsertId)
481
522
Q_D(DatabaseCoreBackend);
715
787
DatabaseCoreBackend::QueryState DatabaseCoreBackend::execSql(const QString& sql, const QVariant& boundValue1,
716
QList<QVariant>* values, QVariant* lastInsertId)
788
QList<QVariant>* values, QVariant* lastInsertId)
718
790
SqlQuery query = execQuery(sql, boundValue1);
719
791
return handleQueryResult(query, values, lastInsertId);
722
794
DatabaseCoreBackend::QueryState DatabaseCoreBackend::execSql(const QString& sql,
723
const QVariant& boundValue1, const QVariant& boundValue2,
724
QList<QVariant>* values, QVariant* lastInsertId)
795
const QVariant& boundValue1, const QVariant& boundValue2,
796
QList<QVariant>* values, QVariant* lastInsertId)
726
798
SqlQuery query = execQuery(sql, boundValue1, boundValue2);
727
799
return handleQueryResult(query, values, lastInsertId);
730
802
DatabaseCoreBackend::QueryState DatabaseCoreBackend::execSql(const QString& sql,
731
const QVariant& boundValue1, const QVariant& boundValue2,
732
const QVariant& boundValue3, QList<QVariant>* values,
733
QVariant* lastInsertId)
803
const QVariant& boundValue1, const QVariant& boundValue2,
804
const QVariant& boundValue3, QList<QVariant>* values,
805
QVariant* lastInsertId)
735
807
SqlQuery query = execQuery(sql, boundValue1, boundValue2, boundValue3);
736
808
return handleQueryResult(query, values, lastInsertId);
739
811
DatabaseCoreBackend::QueryState DatabaseCoreBackend::execSql(const QString& sql,
740
const QVariant& boundValue1, const QVariant& boundValue2,
741
const QVariant& boundValue3, const QVariant& boundValue4,
742
QList<QVariant>* values, QVariant* lastInsertId)
812
const QVariant& boundValue1, const QVariant& boundValue2,
813
const QVariant& boundValue3, const QVariant& boundValue4,
814
QList<QVariant>* values, QVariant* lastInsertId)
744
816
SqlQuery query = execQuery(sql, boundValue1, boundValue2, boundValue3, boundValue4);
745
817
return handleQueryResult(query, values, lastInsertId);
748
820
DatabaseCoreBackend::QueryState DatabaseCoreBackend::execSql(const QString& sql, const QList<QVariant>& boundValues,
749
QList<QVariant>* values, QVariant* lastInsertId)
821
QList<QVariant>* values, QVariant* lastInsertId)
751
823
SqlQuery query = execQuery(sql, boundValues);
752
824
return handleQueryResult(query, values, lastInsertId);
755
827
DatabaseCoreBackend::QueryState DatabaseCoreBackend::execSql(const QString& sql, const QMap<QString, QVariant>& bindingMap,
756
QList<QVariant>* values, QVariant* lastInsertId)
828
QList<QVariant>* values, QVariant* lastInsertId)
758
830
SqlQuery query = execQuery(sql, bindingMap);
759
831
return handleQueryResult(query, values, lastInsertId);
840
916
while ((pos=identifierRegExp.indexIn(preparedString, pos))!=-1)
842
918
QString namedPlaceholder = identifierRegExp.cap(0);
843
920
if (!bindingMap.contains(namedPlaceholder))
845
922
kError()<<"Missing place holder ["<< namedPlaceholder <<"] in binding map. Following values are defined for this action ["<< bindingMap.keys() <<"]. This is a setup error!";
846
923
//TODO What should we do here? How can we cancel that action?
848
926
QVariant placeHolderValue = bindingMap[namedPlaceholder];
849
927
// Check if this is a map - then we assume, that there is a custom field/value list
850
928
QString replaceStr;
851
if (placeHolderValue.userType() == qMetaTypeId<DBActionType>()){
930
if (placeHolderValue.userType() == qMetaTypeId<DBActionType>())
852
932
DBActionType actionType = placeHolderValue.value<DBActionType>();
853
933
bool isValue = actionType.isValue();
854
934
QVariant value = actionType.getActionValue();
855
936
if ( value.type()==QVariant::Map )
857
938
QMap<QString, QVariant> placeHolderMap = value.toMap();
858
939
QMap<QString, QVariant>::const_iterator iterator;
859
941
for (iterator = placeHolderMap.constBegin(); iterator != placeHolderMap.constEnd(); ++iterator)
861
943
QString key = iterator.key();
1116
1236
Q_D(DatabaseCoreBackend);
1117
1237
// Call databaseForThread before touching transaction count - open() will reset the count
1118
1238
QSqlDatabase db = d->databaseForThread();
1119
1240
if (d->incrementTransactionCount())
1121
1242
if (!db.transaction())
1123
1244
d->decrementTransactionCount();
1124
1246
if (db.lastError().type() == QSqlError::ConnectionError)
1126
1248
return DatabaseCoreBackend::ConnectionError;
1129
1252
d->isInTransaction = true;
1131
1255
return DatabaseCoreBackend::NoErrors;
1134
1258
DatabaseCoreBackend::QueryState DatabaseCoreBackend::commitTransaction()
1136
1260
Q_D(DatabaseCoreBackend);
1137
1262
if (d->decrementTransactionCount())
1139
1264
QSqlDatabase db = d->databaseForThread();
1140
1266
if (!db.commit())
1142
1268
d->incrementTransactionCount();
1143
1270
if (db.lastError().type() == QSqlError::ConnectionError)
1145
1272
return DatabaseCoreBackend::ConnectionError;
1148
1276
d->isInTransaction = false;
1149
1277
d->transactionFinished();
1151
1280
return DatabaseCoreBackend::NoErrors;