Page Menu
Home
Phorge
Search
Configure Global Search
Log In
Files
F32305698
D10709.1765290488.diff
No One
Temporary
Actions
View File
Edit File
Delete File
View Transforms
Subscribe
Flag For Later
Award Token
Size
11 KB
Referenced Files
None
Subscribers
None
D10709.1765290488.diff
View Options
diff --git a/native/cpp/CommonCpp/DatabaseManagers/SQLiteQueryExecutor.h b/native/cpp/CommonCpp/DatabaseManagers/SQLiteQueryExecutor.h
--- a/native/cpp/CommonCpp/DatabaseManagers/SQLiteQueryExecutor.h
+++ b/native/cpp/CommonCpp/DatabaseManagers/SQLiteQueryExecutor.h
@@ -5,7 +5,6 @@
#include "entities/Draft.h"
#include "entities/KeyserverInfo.h"
#include "entities/UserInfo.h"
-#include "sqlite_orm.h"
#include <mutex>
#include <string>
@@ -14,7 +13,6 @@
class SQLiteQueryExecutor : public DatabaseQueryExecutor {
static void migrate();
- static auto &getStorage();
static sqlite3 *getConnection();
static void closeConnection();
diff --git a/native/cpp/CommonCpp/DatabaseManagers/SQLiteQueryExecutor.cpp b/native/cpp/CommonCpp/DatabaseManagers/SQLiteQueryExecutor.cpp
--- a/native/cpp/CommonCpp/DatabaseManagers/SQLiteQueryExecutor.cpp
+++ b/native/cpp/CommonCpp/DatabaseManagers/SQLiteQueryExecutor.cpp
@@ -18,8 +18,6 @@
namespace comm {
-using namespace sqlite_orm;
-
std::string SQLiteQueryExecutor::sqliteFilePath;
std::string SQLiteQueryExecutor::encryptionKey;
std::once_flag SQLiteQueryExecutor::initialized;
@@ -915,96 +913,6 @@
return true;
}
-auto getEncryptedStorageAtPath(
- const std::string &databasePath,
- std::function<void(sqlite3 *)> on_open_callback =
- default_on_db_open_callback) {
- auto storage = make_storage(
- databasePath,
- make_index("messages_idx_thread_time", &Message::thread, &Message::time),
- make_index("media_idx_container", &Media::container),
- make_table(
- "drafts",
- make_column("key", &Draft::key, unique(), primary_key()),
- make_column("text", &Draft::text)),
- make_table(
- "messages",
- make_column("id", &Message::id, unique(), primary_key()),
- make_column("local_id", &Message::local_id),
- make_column("thread", &Message::thread),
- make_column("user", &Message::user),
- make_column("type", &Message::type),
- make_column("future_type", &Message::future_type),
- make_column("content", &Message::content),
- make_column("time", &Message::time)),
- make_table(
- "olm_persist_account",
- make_column("id", &OlmPersistAccount::id, unique(), primary_key()),
- make_column("account_data", &OlmPersistAccount::account_data)),
- make_table(
- "olm_persist_sessions",
- make_column(
- "target_user_id",
- &OlmPersistSession::target_user_id,
- unique(),
- primary_key()),
- make_column("session_data", &OlmPersistSession::session_data)),
- make_table(
- "media",
- make_column("id", &Media::id, unique(), primary_key()),
- make_column("container", &Media::container),
- make_column("thread", &Media::thread),
- make_column("uri", &Media::uri),
- make_column("type", &Media::type),
- make_column("extras", &Media::extras)),
- make_table(
- "threads",
- make_column("id", &Thread::id, unique(), primary_key()),
- make_column("type", &Thread::type),
- make_column("name", &Thread::name),
- make_column("description", &Thread::description),
- make_column("color", &Thread::color),
- make_column("creation_time", &Thread::creation_time),
- make_column("parent_thread_id", &Thread::parent_thread_id),
- make_column("containing_thread_id", &Thread::containing_thread_id),
- make_column("community", &Thread::community),
- make_column("members", &Thread::members),
- make_column("roles", &Thread::roles),
- make_column("current_user", &Thread::current_user),
- make_column("source_message_id", &Thread::source_message_id),
- make_column("replies_count", &Thread::replies_count),
- make_column("avatar", &Thread::avatar),
- make_column("pinned_count", &Thread::pinned_count, default_value(0))),
- make_table(
- "metadata",
- make_column("name", &Metadata::name, unique(), primary_key()),
- make_column("data", &Metadata::data)),
- make_table(
- "message_store_threads",
- make_column("id", &MessageStoreThread::id, unique(), primary_key()),
- make_column("start_reached", &MessageStoreThread::start_reached)),
- make_table(
- "reports",
- make_column("id", &Report::id, unique(), primary_key()),
- make_column("report", &Report::report)),
- make_table(
- "persist_storage",
- make_column("key", &PersistItem::key, unique(), primary_key()),
- make_column("item", &PersistItem::item)),
- make_table(
- "users",
- make_column("id", &UserInfo::id, unique(), primary_key()),
- make_column("user_info", &UserInfo::user_info)),
- make_table(
- "keyservers",
- make_column("id", &KeyserverInfo::id, unique(), primary_key()),
- make_column("keyserver_info", &KeyserverInfo::keyserver_info))
-
- );
- storage.on_open = on_open_callback;
- return storage;
-}
-
void SQLiteQueryExecutor::migrate() {
// We don't want to run `PRAGMA key = ...;`
// on main web database. The context is here:
@@ -1071,12 +979,6 @@
sqlite3_close(db);
}
-auto &SQLiteQueryExecutor::getStorage() {
- static auto storage =
- getEncryptedStorageAtPath(SQLiteQueryExecutor::sqliteFilePath);
- return storage;
-}
-
SQLiteQueryExecutor::SQLiteQueryExecutor() {
SQLiteQueryExecutor::migrate();
}
@@ -1765,14 +1667,12 @@
"attempt.");
attempt_delete_file(
tempBackupPath,
- "Failed to delete temporary backup file from previous backup "
- "attempt.");
+ "Failed to delete temporary backup file from previous backup attempt.");
}
if (file_exists(tempAttachmentsPath)) {
Logger::log(
- "Attempting to delete temporary attachments file from previous "
- "backup "
+ "Attempting to delete temporary attachments file from previous backup "
"attempt.");
attempt_delete_file(
tempAttachmentsPath,
@@ -1780,28 +1680,40 @@
"attempt.");
}
- auto backupStorage = getEncryptedStorageAtPath(
- tempBackupPath, [](sqlite3 *db) { set_encryption_key(db); });
- auto backupObj =
- SQLiteQueryExecutor::getStorage().make_backup_to(backupStorage);
- int backupResult = backupObj.step(-1);
+ sqlite3 *backupDB;
+ sqlite3_open(tempBackupPath.c_str(), &backupDB);
+ set_encryption_key(backupDB);
+ sqlite3_backup *backupObj = sqlite3_backup_init(
+ backupDB, "main", SQLiteQueryExecutor::getConnection(), "main");
+ if (!backupObj) {
+ std::stringstream error_message;
+ error_message << "Failed to init backup for main compaction. Details: "
+ << sqlite3_errmsg(backupDB) << std::endl;
+ sqlite3_close(backupDB);
+ throw std::runtime_error(error_message.str());
+ }
+
+ int backupResult = sqlite3_backup_step(backupObj, -1);
+ sqlite3_backup_finish(backupObj);
if (backupResult == SQLITE_BUSY || backupResult == SQLITE_LOCKED) {
+ sqlite3_close(backupDB);
throw std::runtime_error(
"Programmer error. Database in transaction during backup attempt.");
} else if (backupResult != SQLITE_DONE) {
+ sqlite3_close(backupDB);
std::stringstream error_message;
error_message << "Failed to create database backup. Details: "
<< sqlite3_errstr(backupResult);
throw std::runtime_error(error_message.str());
}
- backupStorage.vacuum();
+ executeQuery(backupDB, "VACUUM;");
+ sqlite3_close(backupDB);
attempt_rename_file(
tempBackupPath,
finalBackupPath,
- "Failed to rename complete temporary backup file to final backup "
- "file.");
+ "Failed to rename complete temporary backup file to final backup file.");
std::ofstream tempAttachmentsFile(tempAttachmentsPath);
if (!tempAttachmentsFile.is_open()) {
@@ -1809,11 +1721,13 @@
"Unable to create attachments file for backup id: " + backupID);
}
- auto blobServiceURIRows = SQLiteQueryExecutor::getStorage().select(
- columns(&Media::uri), where(like(&Media::uri, "comm-blob-service://%")));
+ std::string getAllBlobServiceMediaSQL =
+ "SELECT * FROM media WHERE uri LIKE 'comm-blob-service://%';";
+ std::vector<Media> blobServiceMedia = getAllEntities<Media>(
+ SQLiteQueryExecutor::getConnection(), getAllBlobServiceMediaSQL);
- for (const auto &blobServiceURIRow : blobServiceURIRows) {
- std::string blobServiceURI = std::get<0>(blobServiceURIRow);
+ for (const auto &media : blobServiceMedia) {
+ std::string blobServiceURI = media.uri;
std::string blobHash = blob_hash_from_blob_service_uri(blobServiceURI);
tempAttachmentsFile << blobHash << "\n";
}
@@ -1843,9 +1757,9 @@
throw std::runtime_error("Restore attempt but backup file does not exist.");
}
- sqlite3 *backup_db;
+ sqlite3 *backupDB;
if (!is_database_queryable(
- backup_db, true, mainCompactionPath, mainCompactionEncryptionKey)) {
+ backupDB, true, mainCompactionPath, mainCompactionEncryptionKey)) {
throw std::runtime_error("Backup file or encryption key corrupted.");
}
@@ -1857,8 +1771,7 @@
if (file_exists(plaintextBackupPath)) {
attempt_delete_file(
plaintextBackupPath,
- "Failed to delete plaintext backup file from previous backup "
- "attempt.");
+ "Failed to delete plaintext backup file from previous backup attempt.");
}
std::string plaintextMigrationDBQuery = "PRAGMA key = \"x'" +
@@ -1870,16 +1783,16 @@
"SELECT sqlcipher_export('plaintext');"
"DETACH DATABASE plaintext;";
- sqlite3_open(mainCompactionPath.c_str(), &backup_db);
+ sqlite3_open(mainCompactionPath.c_str(), &backupDB);
char *plaintextMigrationErr;
sqlite3_exec(
- backup_db,
+ backupDB,
plaintextMigrationDBQuery.c_str(),
nullptr,
nullptr,
&plaintextMigrationErr);
- sqlite3_close(backup_db);
+ sqlite3_close(backupDB);
if (plaintextMigrationErr) {
std::stringstream error_message;
@@ -1891,18 +1804,27 @@
throw std::runtime_error(error_message_str);
}
- auto backupStorage = getEncryptedStorageAtPath(plaintextBackupPath);
+
+ sqlite3_open(plaintextBackupPath.c_str(), &backupDB);
#else
- auto backupStorage = getEncryptedStorageAtPath(
- mainCompactionPath, [mainCompactionEncryptionKey](sqlite3 *db) {
- set_encryption_key(db, mainCompactionEncryptionKey);
- });
+ sqlite3_open(mainCompactionPath.c_str(), &backupDB);
+ set_encryption_key(backupDB, mainCompactionEncryptionKey);
#endif
- auto backupObject =
- SQLiteQueryExecutor::getStorage().make_backup_from(backupStorage);
- int backupResult = backupObject.step(-1);
+ sqlite3_backup *backupObj = sqlite3_backup_init(
+ SQLiteQueryExecutor::getConnection(), "main", backupDB, "main");
+ if (!backupObj) {
+ std::stringstream error_message;
+ error_message << "Failed to init backup for main compaction. Details: "
+ << sqlite3_errmsg(SQLiteQueryExecutor::getConnection())
+ << std::endl;
+ sqlite3_close(backupDB);
+ throw std::runtime_error(error_message.str());
+ }
+ int backupResult = sqlite3_backup_step(backupObj, -1);
+ sqlite3_backup_finish(backupObj);
+ sqlite3_close(backupDB);
if (backupResult == SQLITE_BUSY || backupResult == SQLITE_LOCKED) {
throw std::runtime_error(
"Programmer error. Database in transaction during restore attempt.");
diff --git a/web/database/_generated/comm_query_executor.wasm b/web/database/_generated/comm_query_executor.wasm
index 0000000000000000000000000000000000000000..0000000000000000000000000000000000000000
GIT binary patch
literal 0
Hc$@<O00001
literal 0
Hc$@<O00001
File Metadata
Details
Attached
Mime Type
text/plain
Expires
Tue, Dec 9, 2:28 PM (4 h, 40 m)
Storage Engine
blob
Storage Format
Raw Data
Storage Handle
5854758
Default Alt Text
D10709.1765290488.diff (11 KB)
Attached To
Mode
D10709: Refactor main compaction creation and restore not to use ORM
Attached
Detach File
Event Timeline
Log In to Comment