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 @@ -304,6 +304,45 @@ return false; } +bool add_pinned_count_column_to_threads(sqlite3 *db) { + sqlite3_stmt *pinned_column_stmt; + sqlite3_prepare_v2( + db, + "SELECT name AS col_name FROM pragma_table_xinfo ('threads') WHERE " + "col_name='pinned_count';", + -1, + &pinned_column_stmt, + nullptr); + sqlite3_step(pinned_column_stmt); + + auto num_bytes = sqlite3_column_bytes(pinned_column_stmt, 0); + sqlite3_finalize(pinned_column_stmt); + + if (num_bytes) { + return true; + } + + char *error; + sqlite3_exec( + db, + "ALTER TABLE threads ADD COLUMN pinned_count INTEGER NOT NULL DEFAULT 0;", + nullptr, + nullptr, + &error); + + if (!error) { + return true; + } + + std::ostringstream stringStream; + stringStream << "Error adding pinned_count column to threads table: " + << error; + Logger::log(stringStream.str()); + + sqlite3_free(error); + return false; +} + bool create_schema(sqlite3 *db) { char *error; sqlite3_exec( @@ -357,7 +396,8 @@ " roles TEXT NOT NULL," " current_user TEXT NOT NULL," " source_message_id TEXT," - " replies_count INTEGER NOT NULL" + " replies_count INTEGER NOT NULL," + " pinned_count INTEGER NOT NULL DEFAULT 0" ");" "CREATE TABLE IF NOT EXISTS metadata (" @@ -599,7 +639,8 @@ {22, {enable_write_ahead_logging_mode, false}}, {23, {create_metadata_table, true}}, {24, {add_not_null_constraint_to_drafts, true}}, - {25, {add_not_null_constraint_to_metadata, true}}}}; + {25, {add_not_null_constraint_to_metadata, true}}, + {26, {add_pinned_count_column_to_threads, true}}}}; enum class MigrationResult { SUCCESS, FAILURE, NOT_APPLIED }; @@ -800,7 +841,9 @@ 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("replies_count", &Thread::replies_count), + make_column("pinned_count", &Thread::pinned_count), + default_value(0)), make_table( "metadata", make_column("name", &Metadata::name, unique(), primary_key()), diff --git a/native/cpp/CommonCpp/DatabaseManagers/entities/Thread.h b/native/cpp/CommonCpp/DatabaseManagers/entities/Thread.h --- a/native/cpp/CommonCpp/DatabaseManagers/entities/Thread.h +++ b/native/cpp/CommonCpp/DatabaseManagers/entities/Thread.h @@ -20,6 +20,7 @@ std::string current_user; std::unique_ptr source_message_id; int replies_count; + int pinned_count; }; } // namespace comm