Add StoryDb::get_active_story_list.

This commit is contained in:
levlam 2023-07-16 23:15:38 +03:00
parent caaf0ce0dc
commit 99d38d9fc6
2 changed files with 58 additions and 0 deletions

View File

@ -107,6 +107,12 @@ class StoryDbImpl final : public StoryDbSyncInterface {
TRY_RESULT_ASSIGN(delete_active_stories_stmt_,
db_.get_statement("DELETE FROM active_stories WHERE dialog_id = ?1"));
TRY_RESULT_ASSIGN(
get_active_story_list_stmt_,
db_.get_statement("SELECT data, dialog_id, dialog_order FROM active_stories WHERE "
"story_list_id = ?1 AND (dialog_order < ?2 OR (dialog_order = ?2 AND dialog_id < ?3)) ORDER "
"BY dialog_order DESC, dialog_id DESC LIMIT ?4"));
TRY_RESULT_ASSIGN(get_active_stories_stmt_,
db_.get_statement("SELECT data FROM active_stories WHERE dialog_id = ?1"));
@ -257,6 +263,33 @@ class StoryDbImpl final : public StoryDbSyncInterface {
return BufferSlice(get_active_stories_stmt_.view_blob(0));
}
StoryDbGetActiveStoryListResult get_active_story_list(StoryListId story_list_id, int64 order, DialogId dialog_id,
int32 limit) final {
SCOPE_EXIT {
get_active_story_list_stmt_.reset();
};
get_active_story_list_stmt_.bind_int32(1, story_list_id == StoryListId::archive() ? 1 : 0).ensure();
get_active_story_list_stmt_.bind_int64(2, order).ensure();
get_active_story_list_stmt_.bind_int64(3, dialog_id.get()).ensure();
get_active_story_list_stmt_.bind_int32(4, limit).ensure();
StoryDbGetActiveStoryListResult result;
result.next_dialog_id_ = dialog_id;
result.next_order_ = order;
get_active_story_list_stmt_.step().ensure();
while (get_active_story_list_stmt_.has_row()) {
BufferSlice data(get_active_story_list_stmt_.view_blob(0));
result.next_dialog_id_ = DialogId(get_active_story_list_stmt_.view_int64(1));
result.next_order_ = get_active_story_list_stmt_.view_int64(2);
LOG(INFO) << "Load active stories in " << result.next_dialog_id_ << " with order " << result.next_order_;
result.active_stories_.emplace_back(result.next_dialog_id_, std::move(data));
get_active_story_list_stmt_.step().ensure();
}
return result;
}
void add_active_story_list_state(StoryListId story_list_id, BufferSlice data) final {
SCOPE_EXIT {
add_active_story_list_state_stmt_.reset();
@ -298,6 +331,7 @@ class StoryDbImpl final : public StoryDbSyncInterface {
SqliteStatement add_active_stories_stmt_;
SqliteStatement delete_active_stories_stmt_;
SqliteStatement get_active_stories_stmt_;
SqliteStatement get_active_story_list_stmt_;
SqliteStatement add_active_story_list_state_stmt_;
SqliteStatement get_active_story_list_state_stmt_;
@ -366,6 +400,11 @@ class StoryDbAsync final : public StoryDbAsyncInterface {
send_closure_later(impl_, &Impl::get_active_stories, dialog_id, std::move(promise));
}
void get_active_story_list(StoryListId story_list_id, int64 order, DialogId dialog_id, int32 limit,
Promise<StoryDbGetActiveStoryListResult> promise) final {
send_closure_later(impl_, &Impl::get_active_story_list, story_list_id, order, dialog_id, limit, std::move(promise));
}
void add_active_story_list_state(StoryListId story_list_id, BufferSlice data, Promise<Unit> promise) final {
send_closure_later(impl_, &Impl::add_active_story_list_state, story_list_id, std::move(data), std::move(promise));
}
@ -445,6 +484,12 @@ class StoryDbAsync final : public StoryDbAsyncInterface {
promise.set_result(sync_db_->get_active_stories(dialog_id));
}
void get_active_story_list(StoryListId story_list_id, int64 order, DialogId dialog_id, int32 limit,
Promise<StoryDbGetActiveStoryListResult> promise) {
add_read_query();
promise.set_value(sync_db_->get_active_story_list(story_list_id, order, dialog_id, limit));
}
void add_active_story_list_state(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_state(story_list_id, std::move(data));

View File

@ -17,6 +17,7 @@
#include "td/utils/Status.h"
#include <memory>
#include <utility>
namespace td {
@ -31,6 +32,12 @@ struct StoryDbStory {
}
};
struct StoryDbGetActiveStoryListResult {
vector<std::pair<DialogId, BufferSlice>> active_stories_;
int64 next_order_ = 0;
DialogId next_dialog_id_;
};
class StoryDbSyncInterface {
public:
StoryDbSyncInterface() = default;
@ -57,6 +64,9 @@ class StoryDbSyncInterface {
virtual Result<BufferSlice> get_active_stories(DialogId dialog_id) = 0;
virtual StoryDbGetActiveStoryListResult get_active_story_list(StoryListId story_list_id, int64 order,
DialogId dialog_id, int32 limit) = 0;
virtual void add_active_story_list_state(StoryListId story_list_id, BufferSlice data) = 0;
virtual Result<BufferSlice> get_active_story_list_state(StoryListId story_list_id) = 0;
@ -101,6 +111,9 @@ class StoryDbAsyncInterface {
virtual void get_active_stories(DialogId dialog_id, Promise<BufferSlice> promise) = 0;
virtual void get_active_story_list(StoryListId story_list_id, int64 order, DialogId dialog_id, int32 limit,
Promise<StoryDbGetActiveStoryListResult> promise) = 0;
virtual void add_active_story_list_state(StoryListId story_list_id, BufferSlice data, Promise<Unit> promise) = 0;
virtual void get_active_story_list_state(StoryListId story_list_id, Promise<BufferSlice> promise) = 0;