|
|
|
@ -27,7 +27,7 @@
@@ -27,7 +27,7 @@
|
|
|
|
|
#include "src/core/toxpk.h" |
|
|
|
|
|
|
|
|
|
namespace { |
|
|
|
|
static constexpr int SCHEMA_VERSION = 7; |
|
|
|
|
static constexpr int SCHEMA_VERSION = 8; |
|
|
|
|
|
|
|
|
|
bool createCurrentSchema(RawDatabase& db) |
|
|
|
|
{ |
|
|
|
@ -395,6 +395,19 @@ bool dbSchema6to7(RawDatabase& db)
@@ -395,6 +395,19 @@ bool dbSchema6to7(RawDatabase& db)
|
|
|
|
|
return db.execNow(upgradeQueries); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
bool dbSchema7to8(RawDatabase& db) |
|
|
|
|
{ |
|
|
|
|
// Dummy upgrade. This upgrade does not change the schema, however on
|
|
|
|
|
// version 7 if qtox saw a system message it would assert and crash. This
|
|
|
|
|
// upgrade ensures that old versions of qtox do not try to load the new
|
|
|
|
|
// database
|
|
|
|
|
|
|
|
|
|
QVector<RawDatabase::Query> upgradeQueries; |
|
|
|
|
upgradeQueries += RawDatabase::Query(QStringLiteral("PRAGMA user_version = 8;")); |
|
|
|
|
|
|
|
|
|
return db.execNow(upgradeQueries); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* @brief Upgrade the db schema |
|
|
|
|
* @note On future alterations of the database all you have to do is bump the SCHEMA_VERSION |
|
|
|
@ -444,7 +457,7 @@ bool dbSchemaUpgrade(std::shared_ptr<RawDatabase>& db)
@@ -444,7 +457,7 @@ bool dbSchemaUpgrade(std::shared_ptr<RawDatabase>& db)
|
|
|
|
|
using DbSchemaUpgradeFn = bool (*)(RawDatabase&); |
|
|
|
|
std::vector<DbSchemaUpgradeFn> upgradeFns = {dbSchema0to1, dbSchema1to2, dbSchema2to3, |
|
|
|
|
dbSchema3to4, dbSchema4to5, dbSchema5to6, |
|
|
|
|
dbSchema6to7}; |
|
|
|
|
dbSchema6to7, dbSchema7to8}; |
|
|
|
|
|
|
|
|
|
assert(databaseSchemaVersion < static_cast<int>(upgradeFns.size())); |
|
|
|
|
assert(upgradeFns.size() == SCHEMA_VERSION); |
|
|
|
@ -550,7 +563,26 @@ generateNewTextMessageQueries(const ToxPk& friendPk, const QString& message, con
@@ -550,7 +563,26 @@ generateNewTextMessageQueries(const ToxPk& friendPk, const QString& message, con
|
|
|
|
|
return queries; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
QVector<RawDatabase::Query> generateNewSystemMessageQueries(const ToxPk& friendPk, |
|
|
|
|
const SystemMessage& systemMessage) |
|
|
|
|
{ |
|
|
|
|
QVector<RawDatabase::Query> queries; |
|
|
|
|
|
|
|
|
|
queries += generateEnsurePkInPeers(friendPk); |
|
|
|
|
queries += generateHistoryTableInsertion('S', systemMessage.timestamp, friendPk); |
|
|
|
|
|
|
|
|
|
QVector<QByteArray> blobs; |
|
|
|
|
std::transform(systemMessage.args.begin(), systemMessage.args.end(), std::back_inserter(blobs), |
|
|
|
|
[](const QString& s) { return s.toUtf8(); }); |
|
|
|
|
|
|
|
|
|
queries += RawDatabase::Query(QString("INSERT INTO system_messages (id, message_type, " |
|
|
|
|
"system_message_type, arg1, arg2, arg3, arg4)" |
|
|
|
|
"VALUES (last_insert_rowid(), 'S', %1, ?, ?, ?, ?)") |
|
|
|
|
.arg(static_cast<int>(systemMessage.messageType)), |
|
|
|
|
blobs); |
|
|
|
|
|
|
|
|
|
return queries; |
|
|
|
|
} |
|
|
|
|
} // namespace
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
@ -756,6 +788,7 @@ History::generateNewFileTransferQueries(const ToxPk& friendPk, const ToxPk& send
@@ -756,6 +788,7 @@ History::generateNewFileTransferQueries(const ToxPk& friendPk, const ToxPk& send
|
|
|
|
|
|
|
|
|
|
return queries; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
RawDatabase::Query History::generateFileFinished(RowId id, bool success, const QString& filePath, |
|
|
|
|
const QByteArray& fileHash) |
|
|
|
|
{ |
|
|
|
@ -818,6 +851,16 @@ void History::addNewFileMessage(const ToxPk& friendPk, const QString& fileId,
@@ -818,6 +851,16 @@ void History::addNewFileMessage(const ToxPk& friendPk, const QString& fileId,
|
|
|
|
|
db->execLater(queries); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
void History::addNewSystemMessage(const ToxPk& friendPk, const SystemMessage& systemMessage) |
|
|
|
|
{ |
|
|
|
|
if (historyAccessBlocked()) |
|
|
|
|
return; |
|
|
|
|
|
|
|
|
|
const auto queries = generateNewSystemMessageQueries(friendPk, systemMessage); |
|
|
|
|
|
|
|
|
|
db->execLater(queries); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* @brief Saves a chat message in the database. |
|
|
|
|
* @param friendPk Friend publick key to save. |
|
|
|
@ -983,8 +1026,18 @@ QList<History::HistMessage> History::getMessagesForFriend(const ToxPk& friendPk,
@@ -983,8 +1026,18 @@ QList<History::HistMessage> History::getMessagesForFriend(const ToxPk& friendPk,
|
|
|
|
|
} |
|
|
|
|
default: |
|
|
|
|
case 'S': |
|
|
|
|
// System messages not yet supported
|
|
|
|
|
assert(false); |
|
|
|
|
it = std::next(row.begin(), systemOffset); |
|
|
|
|
assert(!it->isNull()); |
|
|
|
|
SystemMessage systemMessage; |
|
|
|
|
systemMessage.messageType = static_cast<SystemMessageType>((*it++).toLongLong()); |
|
|
|
|
|
|
|
|
|
auto argEnd = std::next(it, systemMessage.args.size()); |
|
|
|
|
std::transform(it, argEnd, systemMessage.args.begin(), [](const QVariant& arg) { |
|
|
|
|
return QString::fromUtf8(arg.toByteArray().replace('\0', "")); |
|
|
|
|
}); |
|
|
|
|
it = argEnd; |
|
|
|
|
|
|
|
|
|
messages += HistMessage(id, timestamp, friendPk.toString(), systemMessage); |
|
|
|
|
break; |
|
|
|
|
} |
|
|
|
|
}; |
|
|
|
|