diff --git a/src/db/abstract/abstract-db-p.h b/src/db/abstract/abstract-db-p.h index fa2d12c3f..d596d7b8d 100644 --- a/src/db/abstract/abstract-db-p.h +++ b/src/db/abstract/abstract-db-p.h @@ -35,6 +35,8 @@ public: DbSession dbSession; private: + void safeInit (); + AbstractDb::Backend backend; L_DECLARE_PUBLIC(AbstractDb); diff --git a/src/db/abstract/abstract-db.cpp b/src/db/abstract/abstract-db.cpp index 79b94aaae..bf56b954d 100644 --- a/src/db/abstract/abstract-db.cpp +++ b/src/db/abstract/abstract-db.cpp @@ -43,6 +43,15 @@ LINPHONE_BEGIN_NAMESPACE } #endif // if defined(SOCI_ENABLED) && (TARGET_OS_IPHONE || defined(__ANDROID__)) +void AbstractDbPrivate::safeInit () { + #ifdef SOCI_ENABLED + L_Q(); + dbSession.enableForeignKeys(false); + q->init(); + dbSession.enableForeignKeys(true); + #endif // ifdef SOCI_ENABLED +} + AbstractDb::AbstractDb (AbstractDbPrivate &p) : Object(p) {} bool AbstractDb::connect (Backend backend, const string ¶meters) { @@ -66,11 +75,7 @@ bool AbstractDb::connect (Backend backend, const string ¶meters) { if (d->dbSession) { try { - #ifdef SOCI_ENABLED - d->dbSession.enableForeignKeys(false); - init(); - d->dbSession.enableForeignKeys(true); - #endif // ifdef SOCI_ENABLED + d->safeInit(); } catch (const exception &e) { lWarning() << "Unable to init database: " << e.what(); @@ -99,14 +104,11 @@ bool AbstractDb::forceReconnect () { lInfo() << "Trying sql backend reconnect..."; try { - soci::session *session = d->dbSession.getBackendSession(); - session->close(); - for (int i = 0; i < retryCount; ++i) { try { lInfo() << "Reconnect... Try: " << i; - session->reconnect(); - init(); + d->dbSession.getBackendSession()->reconnect(); // Equivalent to close and connect. + d->safeInit(); lInfo() << "Database reconnection successful!"; return true; } catch (const soci::soci_error &e) {