+++ /dev/null
-INSERT INTO coreinfo (key, value) VALUES ('schemaversion', '6')
-SELECT networkid, networkname, identityid, usecustomencoding, encodingcodec, decodingcodec,
+SELECT networkid, networkname, identityid, servercodec, encodingcodec, decodingcodec,
userandomserver, perform, useautoidentify, autoidentifyservice, autoidentifypassword,
- useautoreconnect, autoreconnectinterval, autoreconnectretries, rejoinchannels
+ useautoreconnect, autoreconnectinterval, autoreconnectretries, unlimitedconnectretries, rejoinchannels
FROM network
WHERE userid = :userid
\ No newline at end of file
userid INTEGER NOT NULL,
networkname TEXT NOT NULL,
identityid INTEGER NOT NULL DEFAULT 1,
- usecustomencoding INTEGER NOT NULL DEFAULT 0, -- BOOL
encodingcodec TEXT NOT NULL DEFAULT "ISO-8859-15",
decodingcodec TEXT NOT NULL DEFAULT "ISO-8859-15",
+ servercodec TEXT NOT NULL DEFAULT "",
userandomserver INTEGER NOT NULL DEFAULT 0, -- BOOL
perform TEXT,
useautoidentify INTEGER NOT NULL DEFAULT 0, -- BOOL
useautoreconnect INTEGER NOT NULL DEFAULT 0, -- BOOL
autoreconnectinterval INTEGER NOT NULL DEFAULT 0,
autoreconnectretries INTEGER NOT NULL DEFAULT 0,
+ unlimitedconnectretries INTEGER NOT NULL DEFAULT 0, -- BOOL
rejoinchannels INTEGER NOT NULL DEFAULT 0, -- BOOL
UNIQUE (userid, networkname)
)
--- /dev/null
+INSERT INTO coreinfo (key, value) VALUES ('schemaversion', '7')
UPDATE network SET
networkname = :networkname,
identityid = :identityid,
-usecustomencoding = :usecustomencoding,
+servercodec = :servercodec,
encodingcodec = :encodingcodec,
decodingcodec = :decodingcodec,
userandomserver = :userandomserver,
useautoreconnect = :useautoreconnect,
autoreconnectinterval = :autoreconnectinterval,
autoreconnectretries = :autoreconnectretries,
+unlimitedconnectretries = :unlimitedconnectretries,
rejoinchannels = :rejoinchannels
WHERE networkid = :networkid
return instance()->storage->requestBuffers(user, since);
}
+void Core::setBufferLastSeen(UserId user, const BufferId &bufferId, const QDateTime &seenDate) {
+ QMutexLocker locker(&mutex);
+ return instance()->storage->setBufferLastSeen(user, bufferId, seenDate);
+}
+
+QHash<BufferId, QDateTime> Core::bufferLastSeenDates(UserId user) {
+ QMutexLocker locker(&mutex);
+ return instance()->storage->bufferLastSeenDates(user);
+}
+
/*** Network Management ***/
bool Core::startListening(uint port) {
*/
static QList<BufferInfo> requestBuffers(UserId user, QDateTime since = QDateTime());
+ //! 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
+ * \param bufferId The buffer id
+ * \param seenDate Time the Buffer has been visited the last time
+ */
+ static void setBufferLastSeen(UserId user, const BufferId &bufferId, const QDateTime &seenDate);
+
+ //! Get a Hash of all last seen dates.
+ /** This Method is called when the Quassel Core is started to restore the lastSeenDates
+ * \param user The Owner of the buffers
+ */
+ static QHash<BufferId, QDateTime> bufferLastSeenDates(UserId user);
+
public slots:
//! Make storage data persistent
/** \note This method is threadsafe.
<file>./SQL/SQLite/5/upgrade_030_drop_oldnetworktable.sql</file>
<file>./SQL/SQLite/5/upgrade_180_create_ircservers.sql</file>
<file>./SQL/SQLite/5/upgrade_999_update_schemaversion.sql</file>
- <file>./SQL/SQLite/6/delete_backlog_by_uid.sql</file>
- <file>./SQL/SQLite/6/delete_backlog_for_network.sql</file>
- <file>./SQL/SQLite/6/delete_buffers_by_uid.sql</file>
- <file>./SQL/SQLite/6/delete_buffers_for_network.sql</file>
- <file>./SQL/SQLite/6/delete_ircservers_for_network.sql</file>
- <file>./SQL/SQLite/6/delete_network.sql</file>
- <file>./SQL/SQLite/6/delete_networks_by_uid.sql</file>
- <file>./SQL/SQLite/6/delete_quasseluser.sql</file>
- <file>./SQL/SQLite/6/insert_buffer.sql</file>
- <file>./SQL/SQLite/6/insert_message.sql</file>
- <file>./SQL/SQLite/6/insert_network.sql</file>
- <file>./SQL/SQLite/6/insert_quasseluser.sql</file>
- <file>./SQL/SQLite/6/insert_sender.sql</file>
- <file>./SQL/SQLite/6/insert_server.sql</file>
- <file>./SQL/SQLite/6/select_authuser.sql</file>
- <file>./SQL/SQLite/6/select_bufferByName.sql</file>
- <file>./SQL/SQLite/6/select_buffers.sql</file>
- <file>./SQL/SQLite/6/select_lastMessage.sql</file>
- <file>./SQL/SQLite/6/select_messageRange.sql</file>
- <file>./SQL/SQLite/6/select_messages.sql</file>
- <file>./SQL/SQLite/6/select_messagesOffset.sql</file>
- <file>./SQL/SQLite/6/select_messagesSince.sql</file>
- <file>./SQL/SQLite/6/select_messagesSinceOffset.sql</file>
- <file>./SQL/SQLite/6/select_networkExists.sql</file>
- <file>./SQL/SQLite/6/select_networks_for_user.sql</file>
- <file>./SQL/SQLite/6/select_servers_for_network.sql</file>
- <file>./SQL/SQLite/6/select_userid.sql</file>
- <file>./SQL/SQLite/6/setup_000_quasseluser.sql</file>
- <file>./SQL/SQLite/6/setup_010_sender.sql</file>
- <file>./SQL/SQLite/6/setup_020_network.sql</file>
- <file>./SQL/SQLite/6/setup_030_buffer.sql</file>
- <file>./SQL/SQLite/6/setup_040_buffer_idx.sql</file>
- <file>./SQL/SQLite/6/setup_050_buffer_cname_idx.sql</file>
- <file>./SQL/SQLite/6/setup_060_backlog.sql</file>
- <file>./SQL/SQLite/6/setup_070_coreinfo.sql</file>
- <file>./SQL/SQLite/6/setup_080_ircservers.sql</file>
- <file>./SQL/SQLite/6/setup_999_version.sql</file>
- <file>./SQL/SQLite/6/update_network.sql</file>
- <file>./SQL/SQLite/6/update_username.sql</file>
- <file>./SQL/SQLite/6/update_userpassword.sql</file>
<file>./SQL/SQLite/6/upgrade_000_alter_buffertable.sql</file>
<file>./SQL/SQLite/6/upgrade_010_set_statusbuffertype.sql</file>
<file>./SQL/SQLite/6/upgrade_020_set_channelbuffertype.sql</file>
<file>./SQL/SQLite/6/upgrade_150_update_msgtype.sql</file>
<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_network.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/delete_network.sql</file>
+ <file>./SQL/SQLite/7/delete_networks_by_uid.sql</file>
+ <file>./SQL/SQLite/7/delete_quasseluser.sql</file>
+ <file>./SQL/SQLite/7/insert_buffer.sql</file>
+ <file>./SQL/SQLite/7/insert_message.sql</file>
+ <file>./SQL/SQLite/7/insert_network.sql</file>
+ <file>./SQL/SQLite/7/insert_quasseluser.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_bufferByName.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/select_messages.sql</file>
+ <file>./SQL/SQLite/7/select_messagesOffset.sql</file>
+ <file>./SQL/SQLite/7/select_messagesSince.sql</file>
+ <file>./SQL/SQLite/7/select_messagesSinceOffset.sql</file>
+ <file>./SQL/SQLite/7/select_networkExists.sql</file>
+ <file>./SQL/SQLite/7/select_networks_for_user.sql</file>
+ <file>./SQL/SQLite/7/select_servers_for_network.sql</file>
+ <file>./SQL/SQLite/7/select_userid.sql</file>
+ <file>./SQL/SQLite/7/setup_000_quasseluser.sql</file>
+ <file>./SQL/SQLite/7/setup_010_sender.sql</file>
+ <file>./SQL/SQLite/7/setup_020_network.sql</file>
+ <file>./SQL/SQLite/7/setup_030_buffer.sql</file>
+ <file>./SQL/SQLite/7/setup_040_buffer_idx.sql</file>
+ <file>./SQL/SQLite/7/setup_050_buffer_cname_idx.sql</file>
+ <file>./SQL/SQLite/7/setup_060_backlog.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_network.sql</file>
+ <file>./SQL/SQLite/7/update_username.sql</file>
+ <file>./SQL/SQLite/7/update_userpassword.sql</file>
+ <file>./SQL/SQLite/7/upgrade_000_rename_networktable.sql</file>
+ <file>./SQL/SQLite/7/upgrade_010_create_newnetworktable.sql</file>
+ <file>./SQL/SQLite/7/upgrade_020_copy_networktable.sql</file>
+ <file>./SQL/SQLite/7/upgrade_030_drop_oldnetworktable.sql</file>
+ <file>./SQL/SQLite/7/upgrade_040_alter_buffer_add_lastseen.sql</file>
+ <file>./SQL/SQLite/7/upgrade_999_version.sql</file>
</qresource>
</RCC>
updateQuery.bindValue(":usecustomencoding", info.useCustomEncodings ? 1 : 0);
updateQuery.bindValue(":encodingcodec", QString(info.codecForEncoding));
updateQuery.bindValue(":decodingcodec", QString(info.codecForDecoding));
+ updateQuery.bindValue(":servercodec", QString(info.codecForServer));
updateQuery.bindValue(":userandomserver", info.useRandomServer ? 1 : 0);
updateQuery.bindValue(":perform", info.perform.join("\n"));
updateQuery.bindValue(":useautoidentify", info.useAutoIdentify ? 1 : 0);
updateQuery.bindValue(":useautoreconnect", info.useAutoReconnect ? 1 : 0);
updateQuery.bindValue(":autoreconnectinterval", info.autoReconnectInterval);
updateQuery.bindValue(":autoreconnectretries", info.autoReconnectRetries);
+ updateQuery.bindValue(":unlimitedconnectretries", info.unlimitedReconnectRetries ? 1 : 0);
updateQuery.bindValue(":rejoinchannels", info.rejoinChannels ? 1 : 0);
updateQuery.bindValue(":networkid", info.networkId.toInt());
updateQuery.exec();
net.networkId = networksQuery.value(0).toInt();
net.networkName = networksQuery.value(1).toString();
net.identity = networksQuery.value(2).toInt();
- net.useCustomEncodings = networksQuery.value(3).toInt() == 1 ? true : false;
+ net.codecForServer = networksQuery.value(3).toString().toAscii();
net.codecForEncoding = networksQuery.value(4).toString().toAscii();
net.codecForDecoding = networksQuery.value(5).toString().toAscii();
net.useRandomServer = networksQuery.value(6).toInt() == 1 ? true : false;
net.useAutoReconnect = networksQuery.value(11).toInt() == 1 ? true : false;
net.autoReconnectInterval = networksQuery.value(12).toUInt();
net.autoReconnectRetries = networksQuery.value(13).toInt();
- net.rejoinChannels = networksQuery.value(14).toInt() == 1 ? true : false;
+ net.unlimitedReconnectRetries = networksQuery.value(14).toInt() == 1 ? true : false;
+ net.rejoinChannels = networksQuery.value(15).toInt() == 1 ? true : false;
serversQuery.bindValue(":networkid", net.networkId.toInt());
serversQuery.exec();
return bufferlist;
}
+void SqliteStorage::setBufferLastSeen(UserId user, const BufferId &bufferId, const QDateTime &seenDate) {
+ QSqlQuery *query = cachedQuery("update_buffer_lastseen");
+ query->bindValue(":userid", user.toInt());
+ query->bindValue(":bufferid", bufferId.toInt());
+ query->bindValue(":lastseen", seenDate.toTime_t());
+ query->exec();
+ watchQuery(query);
+}
+
+QHash<BufferId, QDateTime> SqliteStorage::bufferLastSeenDates(UserId user) {
+ QHash<BufferId, QDateTime> lastSeenHash;
+ QSqlQuery query(logDb());
+ query.prepare(queryString("select_buffer_lastseen_dates"));
+ query.bindValue(":userid", user.toInt());
+ query.exec();
+ if(!watchQuery(&query))
+ return lastSeenHash;
+
+ while(query.next()) {
+ lastSeenHash[query.value(0).toInt()] = QDateTime::fromTime_t(query.value(1).toUInt());
+ }
+ return lastSeenHash;
+}
+
MsgId SqliteStorage::logMessage(Message msg) {
QSqlQuery *logMessageQuery = cachedQuery("insert_message");
logMessageQuery->bindValue(":time", msg.timestamp().toTime_t());
/* 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 void setBufferLastSeen(UserId user, const BufferId &bufferId, const QDateTime &seenDate);
+ virtual QHash<BufferId, QDateTime> bufferLastSeenDates(UserId user);
/* Message handling */
*/
virtual QList<BufferInfo> requestBuffers(UserId user, QDateTime since = QDateTime()) = 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
+ * \param bufferId The buffer id
+ * \param seenDate Time the Buffer has been visited the last time
+ */
+ virtual void setBufferLastSeen(UserId user, const BufferId &bufferId, const QDateTime &seenDate) = 0;
+
+ //! Get a Hash of all last seen dates.
+ /** This Method is called when the Quassel Core is started to restore the lastSeenDates
+ * \param user The Owner of the buffers
+ */
+ virtual QHash<BufferId, QDateTime> bufferLastSeenDates(UserId user) = 0;
+
+
/* Message handling */
//! Store a Message in the backlog.
{ using namespace Global;
quasselVersion = "0.2.0-pre";
- quasselDate = "2008-02-13";
- quasselBuild = 519;
+ quasselDate = "2008-02-14";
+ quasselBuild = 520;
//! Minimum client build number the core needs
clientBuildNeeded = 519;