implemented the core part for removing buffers permanently
authorMarcus Eggenberger <egs@quassel-irc.org>
Mon, 18 Feb 2008 12:29:50 +0000 (12:29 +0000)
committerMarcus Eggenberger <egs@quassel-irc.org>
Mon, 18 Feb 2008 12:29:50 +0000 (12:29 +0000)
src/core/SQL/SQLite/7/delete_backlog_for_buffer.sql [new file with mode: 0644]
src/core/SQL/SQLite/7/delete_buffer_for_bufferid.sql [new file with mode: 0644]
src/core/SQL/SQLite/7/select_bufferExists.sql [new file with mode: 0644]
src/core/core.cpp
src/core/core.h
src/core/sql.qrc
src/core/sqlitestorage.cpp
src/core/sqlitestorage.h
src/core/storage.h
version.inc

diff --git a/src/core/SQL/SQLite/7/delete_backlog_for_buffer.sql b/src/core/SQL/SQLite/7/delete_backlog_for_buffer.sql
new file mode 100644 (file)
index 0000000..38bf564
--- /dev/null
@@ -0,0 +1,2 @@
+DELETE FROM backlog
+WHERE bufferid = :bufferid
diff --git a/src/core/SQL/SQLite/7/delete_buffer_for_bufferid.sql b/src/core/SQL/SQLite/7/delete_buffer_for_bufferid.sql
new file mode 100644 (file)
index 0000000..91dfeb9
--- /dev/null
@@ -0,0 +1,2 @@
+DELETE FROM buffer
+WHERE bufferid = :bufferid
diff --git a/src/core/SQL/SQLite/7/select_bufferExists.sql b/src/core/SQL/SQLite/7/select_bufferExists.sql
new file mode 100644 (file)
index 0000000..47caae1
--- /dev/null
@@ -0,0 +1,3 @@
+SELECT bufferid
+FROM buffer
+WHERE userid = :userid AND bufferid = :bufferid
index c0b9a50..add0e90 100644 (file)
@@ -265,6 +265,11 @@ QList<BufferInfo> Core::requestBuffers(UserId user, QDateTime since) {
   return instance()->storage->requestBuffers(user, since);
 }
 
+bool Core::removeBuffer(const UserId &user, const BufferId &bufferId) {
+  QMutexLocker locker(&mutex);
+  return instance()->storage->removeBuffer(user, bufferId);
+}
+
 void Core::setBufferLastSeen(UserId user, const BufferId &bufferId, const QDateTime &seenDate) {
   QMutexLocker locker(&mutex);
   return instance()->storage->setBufferLastSeen(user, bufferId, seenDate);
index 0cba29e..97725dd 100644 (file)
@@ -158,8 +158,20 @@ class Core : public QObject {
      */
     static QList<BufferInfo> requestBuffers(UserId user, QDateTime since = QDateTime());
 
+    //! Remove permanently a buffer and it's content from the storage backend
+    /** This call cannot be reverted!
+     *  \note This method is threadsafe.
+     *
+     *  \param user      The user who is the owner of the buffer
+     *  \param bufferId  The bufferId
+     *  \return true if successfull
+     */
+    static bool removeBuffer(const UserId &user, const BufferId &bufferId);
+
     //! Update the LastSeenDate for a Buffer
     /** This Method is used to make the LastSeenDate of a Buffer persistent
+     *  \note This method is threadsafe.
+     *
      * \param user      The Owner of that Buffer
      * \param bufferId  The buffer id
      * \param seenDate  Time the Buffer has been visited the last time
@@ -168,6 +180,8 @@ class Core : public QObject {
 
     //! Get a Hash of all last seen dates. 
     /** This Method is called when the Quassel Core is started to restore the lastSeenDates
+     *  \note This method is threadsafe.
+     *
      * \param user      The Owner of the buffers
      */
     static QHash<BufferId, QDateTime> bufferLastSeenDates(UserId user);
index b2ce8a4..69be2c9 100644 (file)
@@ -39,7 +39,9 @@
     <file>./SQL/SQLite/6/upgrade_160_update_msgtype.sql</file>
     <file>./SQL/SQLite/6/upgrade_999_version.sql</file>
     <file>./SQL/SQLite/7/delete_backlog_by_uid.sql</file>
+    <file>./SQL/SQLite/7/delete_backlog_for_buffer.sql</file>
     <file>./SQL/SQLite/7/delete_backlog_for_network.sql</file>
+    <file>./SQL/SQLite/7/delete_buffer_for_bufferid.sql</file>
     <file>./SQL/SQLite/7/delete_buffers_by_uid.sql</file>
     <file>./SQL/SQLite/7/delete_buffers_for_network.sql</file>
     <file>./SQL/SQLite/7/delete_ircservers_for_network.sql</file>
@@ -53,7 +55,9 @@
     <file>./SQL/SQLite/7/insert_sender.sql</file>
     <file>./SQL/SQLite/7/insert_server.sql</file>
     <file>./SQL/SQLite/7/select_authuser.sql</file>
+    <file>./SQL/SQLite/7/select_buffer_lastseen_dates.sql</file>
     <file>./SQL/SQLite/7/select_bufferByName.sql</file>
+    <file>./SQL/SQLite/7/select_bufferExists.sql</file>
     <file>./SQL/SQLite/7/select_buffers.sql</file>
     <file>./SQL/SQLite/7/select_lastMessage.sql</file>
     <file>./SQL/SQLite/7/select_messageRange.sql</file>
@@ -75,6 +79,7 @@
     <file>./SQL/SQLite/7/setup_070_coreinfo.sql</file>
     <file>./SQL/SQLite/7/setup_080_ircservers.sql</file>
     <file>./SQL/SQLite/7/setup_999_version.sql</file>
+    <file>./SQL/SQLite/7/update_buffer_lastseen.sql</file>
     <file>./SQL/SQLite/7/update_network.sql</file>
     <file>./SQL/SQLite/7/update_username.sql</file>
     <file>./SQL/SQLite/7/update_userpassword.sql</file>
index 507acee..0e3ea63 100644 (file)
@@ -336,6 +336,21 @@ bool SqliteStorage::isValidNetwork(UserId user, const NetworkId &networkId) {
   return true;
 }
 
+bool SqliteStorage::isValidBuffer(const UserId &user, const BufferId &bufferId) {
+  QSqlQuery query(logDb());
+  query.prepare(queryString("select_bufferExists"));
+  query.bindValue(":userid", user.toInt());
+  query.bindValue(":bufferid", bufferId.toInt());
+  query.exec();
+
+  watchQuery(&query);
+  if(!query.first())
+    return false;
+
+  Q_ASSERT(!query.next());
+  return true;
+}
+
 NetworkId SqliteStorage::getNetworkId(UserId user, const QString &network) {
   QSqlQuery query(logDb());
   query.prepare("SELECT networkid FROM network "
@@ -409,6 +424,27 @@ QList<BufferInfo> SqliteStorage::requestBuffers(UserId user, QDateTime since) {
   return bufferlist;
 }
 
+bool SqliteStorage::removeBuffer(const UserId &user, const BufferId &bufferId) {
+  if(!isValidBuffer(user, bufferId))
+    return false;
+
+  QSqlQuery delBacklogQuery(logDb());
+  delBacklogQuery.prepare(queryString("delete_backlog_for_buffer"));
+  delBacklogQuery.bindValue(":bufferid", bufferId.toInt());
+  delBacklogQuery.exec();
+  if(!watchQuery(&delBacklogQuery))
+    return false;
+
+  QSqlQuery delBufferQuery(logDb());
+  delBufferQuery.prepare(queryString("delete_buffer_for_bufferid"));
+  delBufferQuery.bindValue(":bufferid", bufferId.toInt());
+  delBufferQuery.exec();
+  if(!watchQuery(&delBufferQuery))
+    return false;
+
+  return true;
+}
+
 void SqliteStorage::setBufferLastSeen(UserId user, const BufferId &bufferId, const QDateTime &seenDate) {
   QSqlQuery *query = cachedQuery("update_buffer_lastseen");
   query->bindValue(":userid", user.toInt());
index b7db876..c553bdc 100644 (file)
@@ -60,6 +60,7 @@ public slots:
   /* Buffer handling */
   virtual BufferInfo getBufferInfo(UserId user, const NetworkId &networkId, BufferInfo::Type type, const QString &buffer = "");
   virtual QList<BufferInfo> requestBuffers(UserId user, QDateTime since = QDateTime());
+  virtual bool removeBuffer(const UserId &user, const BufferId &bufferId);
   virtual void setBufferLastSeen(UserId user, const BufferId &bufferId, const QDateTime &seenDate);
   virtual QHash<BufferId, QDateTime> bufferLastSeenDates(UserId user);
   
@@ -78,6 +79,7 @@ protected:
 private:
   static QString backlogFile();
   bool isValidNetwork(UserId user, const NetworkId &networkId);
+  bool isValidBuffer(const UserId &user, const BufferId &bufferId);
   NetworkId getNetworkId(UserId user, const QString &network);
   void createBuffer(UserId user, const NetworkId &networkId, BufferInfo::Type type, const QString &buffer);
 };
index c7444b1..8b264f4 100644 (file)
@@ -117,8 +117,7 @@ class Storage : public QObject {
     virtual NetworkId createNetwork(UserId user, const NetworkInfo &info) = 0;
 
     //! Apply the changes to NetworkInfo info to the storage engine
-    /** \note This method is thredsafe.
-     *
+    /**
      *  \param user        The core user
      *  \param networkInfo The Updated NetworkInfo
      *  \return true if successfull.
@@ -170,6 +169,14 @@ class Storage : public QObject {
      */
     virtual QList<BufferInfo> requestBuffers(UserId user, QDateTime since = QDateTime()) = 0;
 
+    //! Remove permanently a buffer and it's content from the storage backend
+    /** This call cannot be reverted!
+     *  \param user      The user who is the owner of the buffer
+     *  \param bufferId  The bufferId
+     *  \return true if successfull
+     */
+    virtual bool removeBuffer(const UserId &user, const BufferId &bufferId) = 0;
+  
     //! Update the LastSeenDate for a Buffer
     /** This Method is used to make the LastSeenDate of a Buffer persistent
      * \param user      The Owner of that Buffer
index 3a37ae6..62ba353 100644 (file)
@@ -5,7 +5,7 @@
 
   quasselVersion = "0.2.0-pre";
   quasselDate = "2008-02-18";
-  quasselBuild = 528;
+  quasselBuild = 530;
 
   //! Minimum client build number the core needs
   clientBuildNeeded = 526;