Fixes #692 - double escaping of backslashes when using Postgres
authorMarcus Eggenberger <egs@quassel-irc.org>
Sun, 26 Jul 2009 16:04:03 +0000 (18:04 +0200)
committerMarcus Eggenberger <egs@quassel-irc.org>
Sun, 26 Jul 2009 16:04:03 +0000 (18:04 +0200)
It is strongly recommended that Postgres users do upgrade to this version.

src/core/abstractsqlstorage.cpp
src/core/abstractsqlstorage.h
src/core/postgresqlstorage.cpp
src/core/postgresqlstorage.h

index d8992df..92f03cb 100644 (file)
@@ -86,6 +86,8 @@ void AbstractSqlStorage::addConnectionToPool() {
   if(!db.open()) {
     qWarning() << "Unable to open database" << displayName() << "for thread" << QThread::currentThread();
     qWarning() << "-" << db.lastError().text();
+  } else {
+    initDbSession(db);
   }
 }
 
index cc9f619..c6c5521 100644 (file)
@@ -72,6 +72,16 @@ protected:
   inline virtual QString userName() { return QString(); }
   inline virtual QString password() { return QString(); }
 
+
+  //! Initialize db specific features on connect
+  /** This is called every time a connection to a specific SQL backend is established
+   *  the default implementation does nothing.
+   *
+   *  When reimplementing this method, don't use logDB() inside this function as
+   *  this would cause as we're just about to initialize that DB connection.
+   */
+  inline virtual void initDbSession(QSqlDatabase & /* db */) {}
+
 private slots:
   void connectionDestroyed();
 
index 13aa8c9..d8a6284 100644 (file)
@@ -79,12 +79,10 @@ QVariantMap PostgreSqlStorage::setupDefaults() const {
   return map;
 }
 
-bool PostgreSqlStorage::setup(const QVariantMap &settings) {
-  bool success = AbstractSqlStorage::setup(settings);
-  if(success) {
-    logDb().exec(QString("ALTER USER %1 SET standard_conforming_strings TO on").arg(userName()));
-  }
-  return success;
+void PostgreSqlStorage::initDbSession(QSqlDatabase &db) {
+  // this blows... but unfortunately Qt's PG driver forces us to this...
+  db.exec("set standard_conforming_strings = off");
+  db.exec("set escape_string_warning = off");
 }
 
 void PostgreSqlStorage::setConnectionProperties(const QVariantMap &properties) {
index de196cd..4d18d11 100644 (file)
@@ -42,7 +42,6 @@ public slots:
   virtual QString description() const;
   virtual QStringList setupKeys() const;
   virtual QVariantMap setupDefaults() const;
-  virtual bool setup(const QVariantMap &settings = QVariantMap());
 
   // TODO: Add functions for configuring the backlog handling, i.e. defining auto-cleanup settings etc
 
@@ -101,6 +100,7 @@ public slots:
   virtual QList<Message> requestAllMsgs(UserId user, MsgId first = -1, MsgId last = -1, int limit = -1);
 
 protected:
+  virtual void initDbSession(QSqlDatabase &db);
   virtual void setConnectionProperties(const QVariantMap &properties);
   inline virtual QString driverName() { return "QPSQL"; }
   inline virtual QString hostName() { return _hostName; }