diff options
| author | levlam <levlam@telegram.org> | 2023-07-13 02:03:02 +0300 |
|---|---|---|
| committer | levlam <levlam@telegram.org> | 2023-07-13 02:03:02 +0300 |
| commit | 961fe5fba786917cc3a4cad095cac6810110112b (patch) | |
| tree | 7cd28aba1782300b259c0ba2507d1c3cc8dab71b /td/telegram/StoryDb.cpp | |
| parent | 1669f8d4b8c1cd90bb835fe22450f221ac6a2f07 (diff) | |
Add database table for active stories.
Diffstat (limited to 'td/telegram/StoryDb.cpp')
| -rw-r--r-- | td/telegram/StoryDb.cpp | 63 |
1 files changed, 57 insertions, 6 deletions
diff --git a/td/telegram/StoryDb.cpp b/td/telegram/StoryDb.cpp index a81a02b10..661ef7f3d 100644 --- a/td/telegram/StoryDb.cpp +++ b/td/telegram/StoryDb.cpp @@ -43,10 +43,9 @@ Status init_story_db(SqliteDb &db, int32 version) { LOG(INFO) << "Init story database " << tag("version", version); // Check if database exists - TRY_RESULT(has_table, db.has_table("stories")); - if (!has_table) { - version = 0; - } else if (version < static_cast<int32>(DbVersion::DialogDbCreated) || version > current_db_version()) { + 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_STATUS(drop_story_db(db, version)); version = 0; } @@ -63,6 +62,18 @@ Status init_story_db(SqliteDb &db, int32 version) { db.exec("CREATE INDEX IF NOT EXISTS story_by_notification_id ON stories (dialog_id, notification_id) WHERE " "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)")); + + TRY_STATUS( + 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")); + version = current_db_version(); } return Status::OK(); @@ -70,8 +81,13 @@ Status init_story_db(SqliteDb &db, int32 version) { // NB: must happen inside a transaction Status drop_story_db(SqliteDb &db, int32 version) { - LOG(WARNING) << "Drop story database " << tag("version", version) << tag("current_db_version", current_db_version()); - return db.exec("DROP TABLE IF EXISTS stories"); + if (version != 0) { + LOG(WARNING) << "Drop story database " << tag("version", version) + << tag("current_db_version", current_db_version()); + } + auto status = db.exec("DROP TABLE IF EXISTS stories"); + TRY_STATUS(db.exec("DROP TABLE IF EXISTS active_stories")); + return status; } class StoryDbImpl final : public StoryDbSyncInterface { @@ -95,6 +111,9 @@ class StoryDbImpl final : public StoryDbSyncInterface { db_.get_statement("SELECT story_id, data FROM stories WHERE dialog_id = ?1 AND " "notification_id < ?2 ORDER BY notification_id DESC LIMIT ?3")); + TRY_RESULT_ASSIGN(add_active_stories_stmt_, + db_.get_statement("INSERT OR REPLACE INTO active_stories VALUES(?1, ?2, ?3, ?4)")); + return Status::OK(); } @@ -200,6 +219,21 @@ class StoryDbImpl final : public StoryDbSyncInterface { return stories; } + void add_active_stories(DialogId dialog_id, StoryListId story_list_id, int64 dialog_order, BufferSlice data) final { + SCOPE_EXIT { + add_active_stories_stmt_.reset(); + }; + add_active_stories_stmt_.bind_int64(1, dialog_id.get()).ensure(); + if (story_list_id.is_valid()) { + add_active_stories_stmt_.bind_int32(2, story_list_id == StoryListId::archive() ? 1 : 0).ensure(); + } else { + add_active_stories_stmt_.bind_null(2).ensure(); + } + add_active_stories_stmt_.bind_int64(3, dialog_order).ensure(); + add_active_stories_stmt_.bind_blob(4, data.as_slice()).ensure(); + add_active_stories_stmt_.step().ensure(); + } + Status begin_write_transaction() final { return db_.begin_write_transaction(); } @@ -215,6 +249,8 @@ class StoryDbImpl final : public StoryDbSyncInterface { SqliteStatement get_story_stmt_; SqliteStatement get_expiring_stories_stmt_; SqliteStatement get_stories_from_notification_id_stmt_; + + SqliteStatement add_active_stories_stmt_; }; std::shared_ptr<StoryDbSyncSafeInterface> create_story_db_sync( @@ -266,6 +302,12 @@ class StoryDbAsync final : public StoryDbAsyncInterface { std::move(promise)); } + void add_active_stories(DialogId dialog_id, StoryListId story_list_id, int64 dialog_order, BufferSlice data, + Promise<Unit> promise) final { + send_closure_later(impl_, &Impl::add_active_stories, dialog_id, story_list_id, dialog_order, std::move(data), + std::move(promise)); + } + void close(Promise<Unit> promise) final { send_closure_later(impl_, &Impl::close, std::move(promise)); } @@ -316,6 +358,15 @@ class StoryDbAsync final : public StoryDbAsyncInterface { promise.set_value(sync_db_->get_stories_from_notification_id(dialog_id, from_notification_id, limit)); } + void add_active_stories(DialogId dialog_id, StoryListId story_list_id, int64 dialog_order, BufferSlice data, + Promise<Unit> promise) { + add_write_query([this, dialog_id, story_list_id, dialog_order, data = std::move(data), + promise = std::move(promise)](Unit) mutable { + sync_db_->add_active_stories(dialog_id, story_list_id, dialog_order, std::move(data)); + on_write_result(std::move(promise)); + }); + } + void close(Promise<Unit> promise) { do_flush(); sync_db_safe_.reset(); |
