--- /dev/null
+DELETE FROM backlog
+WHERE bufferid = :bufferid
--- /dev/null
+DELETE FROM buffer
+WHERE bufferid = :bufferid
--- /dev/null
+SELECT bufferid
+FROM buffer
+WHERE userid = :userid AND bufferid = :bufferid
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);
*/
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
//! 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);
<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>
<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>
<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>
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 "
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());
/* 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);
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);
};
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.
*/
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
quasselVersion = "0.2.0-pre";
quasselDate = "2008-02-18";
- quasselBuild = 528;
+ quasselBuild = 530;
//! Minimum client build number the core needs
clientBuildNeeded = 526;