diff options
| author | levlam <levlam@telegram.org> | 2023-07-16 17:03:20 +0300 |
|---|---|---|
| committer | levlam <levlam@telegram.org> | 2023-07-16 17:03:20 +0300 |
| commit | 3e23b08e794978f95cdd5cbd0889fe6719d5eaf9 (patch) | |
| tree | 05002660770d81e384b62d97a90de6cd47ff25d6 /td/telegram/StoryDb.cpp | |
| parent | 7624311ac6892879981bfa8df35c9243b5592f41 (diff) | |
Add active_story_lists table.
Diffstat (limited to 'td/telegram/StoryDb.cpp')
| -rw-r--r-- | td/telegram/StoryDb.cpp | 61 |
1 files changed, 56 insertions, 5 deletions
diff --git a/td/telegram/StoryDb.cpp b/td/telegram/StoryDb.cpp index 6e496b35f..b33656f97 100644 --- a/td/telegram/StoryDb.cpp +++ b/td/telegram/StoryDb.cpp @@ -33,7 +33,8 @@ Status init_story_db(SqliteDb &db, int32 version) { // Check if database exists TRY_RESULT(has_stories_table, db.has_table("stories")); TRY_RESULT(has_active_stories_table, db.has_table("active_stories")); - if ((!has_stories_table || !has_active_stories_table) || version > current_db_version()) { + TRY_RESULT(has_story_list_table, db.has_table("active_story_lists")); + if ((!has_stories_table || !has_active_stories_table || !has_story_list_table) || version > current_db_version()) { TRY_STATUS(drop_story_db(db, version)); version = 0; } @@ -51,10 +52,6 @@ Status init_story_db(SqliteDb &db, int32 version) { "notification_id IS NOT NULL")); TRY_STATUS( - db.exec("CREATE TABLE IF NOT EXISTS stories (dialog_id INT8, story_id INT4, expires_at INT4, notification_id " - "INT4, data BLOB, PRIMARY KEY (dialog_id, story_id))")); - - TRY_STATUS( db.exec("CREATE TABLE IF NOT EXISTS active_stories (dialog_id INT8 PRIMARY KEY, story_list_id INT4, " "dialog_order INT8, data BLOB)")); @@ -62,6 +59,8 @@ Status init_story_db(SqliteDb &db, int32 version) { db.exec("CREATE INDEX IF NOT EXISTS active_stories_by_order ON active_stories (story_list_id, dialog_order, " "dialog_id) WHERE story_list_id IS NOT NULL")); + TRY_STATUS(db.exec("CREATE TABLE IF NOT EXISTS active_story_lists (story_list_id INT4 PRIMARY KEY, data BLOB)")); + version = current_db_version(); } return Status::OK(); @@ -75,6 +74,7 @@ Status drop_story_db(SqliteDb &db, int32 version) { } auto status = db.exec("DROP TABLE IF EXISTS stories"); TRY_STATUS(db.exec("DROP TABLE IF EXISTS active_stories")); + TRY_STATUS(db.exec("DROP TABLE IF EXISTS active_story_lists")); return status; } @@ -110,6 +110,12 @@ class StoryDbImpl final : public StoryDbSyncInterface { TRY_RESULT_ASSIGN(get_active_stories_stmt_, db_.get_statement("SELECT data FROM active_stories WHERE dialog_id = ?1")); + TRY_RESULT_ASSIGN(add_active_story_list_stmt_, + db_.get_statement("INSERT OR REPLACE INTO active_story_lists VALUES(?1, ?2)")); + + TRY_RESULT_ASSIGN(get_active_story_list_stmt_, + db_.get_statement("SELECT data FROM active_story_lists WHERE story_list_id = ?1")); + return Status::OK(); } @@ -251,6 +257,28 @@ class StoryDbImpl final : public StoryDbSyncInterface { return BufferSlice(get_active_stories_stmt_.view_blob(0)); } + void add_active_story_list(StoryListId story_list_id, BufferSlice data) final { + SCOPE_EXIT { + add_active_story_list_stmt_.reset(); + }; + add_active_story_list_stmt_.bind_int32(1, story_list_id == StoryListId::archive() ? 1 : 0).ensure(); + add_active_story_list_stmt_.bind_blob(2, data.as_slice()).ensure(); + add_active_story_list_stmt_.step().ensure(); + } + + Result<BufferSlice> get_active_story_list(StoryListId story_list_id) final { + SCOPE_EXIT { + get_active_story_list_stmt_.reset(); + }; + + get_active_story_list_stmt_.bind_int64(1, story_list_id == StoryListId::archive() ? 1 : 0).ensure(); + get_active_story_list_stmt_.step().ensure(); + if (!get_active_story_list_stmt_.has_row()) { + return Status::Error("Not found"); + } + return BufferSlice(get_active_story_list_stmt_.view_blob(0)); + } + Status begin_write_transaction() final { return db_.begin_write_transaction(); } @@ -270,6 +298,9 @@ class StoryDbImpl final : public StoryDbSyncInterface { SqliteStatement add_active_stories_stmt_; SqliteStatement delete_active_stories_stmt_; SqliteStatement get_active_stories_stmt_; + + SqliteStatement add_active_story_list_stmt_; + SqliteStatement get_active_story_list_stmt_; }; std::shared_ptr<StoryDbSyncSafeInterface> create_story_db_sync( @@ -335,6 +366,14 @@ class StoryDbAsync final : public StoryDbAsyncInterface { send_closure_later(impl_, &Impl::get_active_stories, dialog_id, std::move(promise)); } + void add_active_story_list(StoryListId story_list_id, BufferSlice data, Promise<Unit> promise) final { + send_closure_later(impl_, &Impl::add_active_story_list, story_list_id, std::move(data), std::move(promise)); + } + + void get_active_story_list(StoryListId story_list_id, Promise<BufferSlice> promise) final { + send_closure_later(impl_, &Impl::get_active_story_list, story_list_id, std::move(promise)); + } + void close(Promise<Unit> promise) final { send_closure_later(impl_, &Impl::close, std::move(promise)); } @@ -406,6 +445,18 @@ class StoryDbAsync final : public StoryDbAsyncInterface { promise.set_result(sync_db_->get_active_stories(dialog_id)); } + void add_active_story_list(StoryListId story_list_id, BufferSlice data, Promise<Unit> promise) { + add_write_query([this, story_list_id, data = std::move(data), promise = std::move(promise)](Unit) mutable { + sync_db_->add_active_story_list(story_list_id, std::move(data)); + on_write_result(std::move(promise)); + }); + } + + void get_active_story_list(StoryListId story_list_id, Promise<BufferSlice> promise) { + add_read_query(); + promise.set_result(sync_db_->get_active_story_list(story_list_id)); + } + void close(Promise<Unit> promise) { do_flush(); sync_db_safe_.reset(); |
