diff --git a/native/cpp/CommonCpp/DatabaseManagers/SQLiteSchema.cpp b/native/cpp/CommonCpp/DatabaseManagers/SQLiteSchema.cpp --- a/native/cpp/CommonCpp/DatabaseManagers/SQLiteSchema.cpp +++ b/native/cpp/CommonCpp/DatabaseManagers/SQLiteSchema.cpp @@ -30,6 +30,18 @@ " target_message TEXT" ");" + "CREATE TABLE IF NOT EXISTS backup_messages (" + " id TEXT UNIQUE PRIMARY KEY NOT NULL," + " local_id TEXT," + " thread TEXT NOT NULL," + " user TEXT NOT NULL," + " type INTEGER NOT NULL," + " future_type INTEGER," + " content TEXT," + " time INTEGER NOT NULL," + " target_message TEXT" + ");" + "CREATE TABLE IF NOT EXISTS olm_persist_account (" " id INTEGER UNIQUE PRIMARY KEY NOT NULL," " account_data TEXT NOT NULL" @@ -50,6 +62,15 @@ " extras TEXT NOT NULL" ");" + "CREATE TABLE IF NOT EXISTS backup_media (" + " id TEXT UNIQUE PRIMARY KEY NOT NULL," + " container TEXT NOT NULL," + " thread TEXT NOT NULL," + " uri TEXT NOT NULL," + " type TEXT NOT NULL," + " extras TEXT NOT NULL" + ");" + "CREATE TABLE IF NOT EXISTS threads (" " id TEXT UNIQUE PRIMARY KEY NOT NULL," " type INTEGER NOT NULL," @@ -70,6 +91,26 @@ " timestamps TEXT" ");" + "CREATE TABLE IF NOT EXISTS backup_threads (" + " id TEXT UNIQUE PRIMARY KEY NOT NULL," + " type INTEGER NOT NULL," + " name TEXT," + " description TEXT," + " color TEXT NOT NULL," + " creation_time BIGINT NOT NULL," + " parent_thread_id TEXT," + " containing_thread_id TEXT," + " community TEXT," + " members TEXT NOT NULL," + " roles TEXT NOT NULL," + " current_user TEXT NOT NULL," + " source_message_id TEXT," + " replies_count INTEGER NOT NULL," + " avatar TEXT," + " pinned_count INTEGER NOT NULL DEFAULT 0," + " timestamps TEXT" + ");" + "CREATE TABLE IF NOT EXISTS metadata (" " name TEXT UNIQUE PRIMARY KEY NOT NULL," " data TEXT NOT NULL" @@ -80,6 +121,11 @@ " start_reached INTEGER NOT NULL" ");" + "CREATE TABLE IF NOT EXISTS backup_message_store_threads (" + " id TEXT UNIQUE PRIMARY KEY NOT NULL," + " start_reached INTEGER NOT NULL" + ");" + "CREATE TABLE IF NOT EXISTS reports (" " id TEXT UNIQUE PRIMARY KEY NOT NULL," " report TEXT NOT NULL" @@ -142,6 +188,11 @@ " thread_activity_store_entry TEXT NOT NULL" ");" + "CREATE TABLE IF NOT EXISTS backup_thread_activity (" + " id TEXT UNIQUE PRIMARY KEY NOT NULL," + " thread_activity_store_entry TEXT NOT NULL" + ");" + "CREATE TABLE IF NOT EXISTS inbound_p2p_messages (" " id INTEGER PRIMARY KEY," " message_id TEXT NOT NULL," @@ -156,11 +207,21 @@ " entry TEXT NOT NULL" ");" + "CREATE TABLE IF NOT EXISTS backup_entries (" + " id TEXT UNIQUE PRIMARY KEY NOT NULL," + " entry TEXT NOT NULL" + ");" + "CREATE TABLE IF NOT EXISTS message_store_local (" " id TEXT UNIQUE PRIMARY KEY NOT NULL," " local_message_info TEXT NOT NULL" ");" + "CREATE TABLE IF NOT EXISTS backup_message_store_local (" + " id TEXT UNIQUE PRIMARY KEY NOT NULL," + " local_message_info TEXT NOT NULL" + ");" + "CREATE VIRTUAL TABLE IF NOT EXISTS message_search USING fts5(" " original_message_id UNINDEXED," " message_id UNINDEXED," @@ -177,12 +238,21 @@ "CREATE INDEX IF NOT EXISTS media_idx_container" " ON media (container);" + "CREATE INDEX IF NOT EXISTS backup_media_idx_container" + " ON backup_media (container);" + "CREATE INDEX IF NOT EXISTS messages_idx_thread_time" " ON messages (thread, time);" + "CREATE INDEX IF NOT EXISTS backup_messages_idx_thread_time" + " ON backup_messages (thread, time);" + "CREATE INDEX IF NOT EXISTS messages_idx_target_message_type_time" " ON messages (target_message, type, time);" + "CREATE INDEX IF NOT EXISTS backup_messages_idx_target_message_type_time" + " ON backup_messages (target_message, type, time);" + "CREATE INDEX IF NOT EXISTS outbound_p2p_messages_idx_id_timestamp" " ON outbound_p2p_messages (device_id, timestamp);" diff --git a/native/cpp/CommonCpp/DatabaseManagers/SQLiteSchemaMigrations.cpp b/native/cpp/CommonCpp/DatabaseManagers/SQLiteSchemaMigrations.cpp --- a/native/cpp/CommonCpp/DatabaseManagers/SQLiteSchemaMigrations.cpp +++ b/native/cpp/CommonCpp/DatabaseManagers/SQLiteSchemaMigrations.cpp @@ -821,6 +821,91 @@ return false; } +bool create_backup_tables(sqlite3 *db) { + std::string query = + "CREATE TABLE IF NOT EXISTS backup_messages (" + " id TEXT UNIQUE PRIMARY KEY NOT NULL," + " local_id TEXT," + " thread TEXT NOT NULL," + " user TEXT NOT NULL," + " type INTEGER NOT NULL," + " future_type INTEGER," + " content TEXT," + " time INTEGER NOT NULL," + " target_message TEXT" + ");" + + "CREATE TABLE IF NOT EXISTS backup_media (" + " id TEXT UNIQUE PRIMARY KEY NOT NULL," + " container TEXT NOT NULL," + " thread TEXT NOT NULL," + " uri TEXT NOT NULL," + " type TEXT NOT NULL," + " extras TEXT NOT NULL" + ");" + + "CREATE TABLE IF NOT EXISTS backup_threads (" + " id TEXT UNIQUE PRIMARY KEY NOT NULL," + " type INTEGER NOT NULL," + " name TEXT," + " description TEXT," + " color TEXT NOT NULL," + " creation_time BIGINT NOT NULL," + " parent_thread_id TEXT," + " containing_thread_id TEXT," + " community TEXT," + " members TEXT NOT NULL," + " roles TEXT NOT NULL," + " current_user TEXT NOT NULL," + " source_message_id TEXT," + " replies_count INTEGER NOT NULL," + " avatar TEXT," + " pinned_count INTEGER NOT NULL DEFAULT 0," + " timestamps TEXT" + ");" + + "CREATE TABLE IF NOT EXISTS backup_message_store_threads (" + " id TEXT UNIQUE PRIMARY KEY NOT NULL," + " start_reached INTEGER NOT NULL" + ");" + + "CREATE TABLE IF NOT EXISTS backup_thread_activity (" + " id TEXT UNIQUE PRIMARY KEY NOT NULL," + " thread_activity_store_entry TEXT NOT NULL" + ");" + + "CREATE TABLE IF NOT EXISTS backup_entries (" + " id TEXT UNIQUE PRIMARY KEY NOT NULL," + " entry TEXT NOT NULL" + ");" + + "CREATE TABLE IF NOT EXISTS backup_message_store_local (" + " id TEXT UNIQUE PRIMARY KEY NOT NULL," + " local_message_info TEXT NOT NULL" + ");" + + "CREATE INDEX IF NOT EXISTS backup_media_idx_container" + " ON backup_media (container);" + "CREATE INDEX IF NOT EXISTS backup_messages_idx_thread_time" + " ON backup_messages (thread, time);" + "CREATE INDEX IF NOT EXISTS backup_messages_idx_target_message_type_time" + " ON backup_messages (target_message, type, time);"; + + char *error; + sqlite3_exec(db, query.c_str(), nullptr, nullptr, &error); + + if (!error) { + return true; + } + + std::ostringstream stringStream; + stringStream << "Error creating backup tables: " << error; + Logger::log(stringStream.str()); + + sqlite3_free(error); + return false; +} + SQLiteMigrations SQLiteSchema::migrations{ {{1, {create_drafts_table, true}}, {2, {rename_threadID_to_key, true}}, @@ -866,6 +951,7 @@ {52, {recreate_inbound_p2p_messages_table, true}}, {53, {add_timestamps_column_to_threads_table, true}}, {54, {create_dm_operations_table, true}}, - {55, {convert_target_message_to_standard_column, true}}}}; + {55, {convert_target_message_to_standard_column, true}}, + {56, {create_backup_tables, true}}}}; } // namespace comm diff --git a/web/shared-worker/_generated/comm_query_executor.wasm b/web/shared-worker/_generated/comm_query_executor.wasm index 0000000000000000000000000000000000000000..0000000000000000000000000000000000000000 GIT binary patch literal 0 Hc$@