disable full-text search engine
This commit is contained in:
parent
1a90f2a01f
commit
6ca9672aba
@ -16,7 +16,6 @@ add_library(tdsqlite STATIC ${SQLITE_SOURCE})
|
|||||||
target_include_directories(tdsqlite PUBLIC $<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}>)
|
target_include_directories(tdsqlite PUBLIC $<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}>)
|
||||||
target_include_directories(tdsqlite SYSTEM PRIVATE ${OPENSSL_INCLUDE_DIR})
|
target_include_directories(tdsqlite SYSTEM PRIVATE ${OPENSSL_INCLUDE_DIR})
|
||||||
target_link_libraries(tdsqlite PRIVATE ${OPENSSL_CRYPTO_LIBRARY} ${CMAKE_DL_LIBS} ${ZLIB_LIBRARIES})
|
target_link_libraries(tdsqlite PRIVATE ${OPENSSL_CRYPTO_LIBRARY} ${CMAKE_DL_LIBS} ${ZLIB_LIBRARIES})
|
||||||
target_compile_definitions(tdsqlite PRIVATE -DSQLITE_ENABLE_FTS5)
|
|
||||||
|
|
||||||
if (NOT WIN32)
|
if (NOT WIN32)
|
||||||
target_compile_definitions(tdsqlite PRIVATE -DHAVE_USLEEP -DNDEBUG=1)
|
target_compile_definitions(tdsqlite PRIVATE -DHAVE_USLEEP -DNDEBUG=1)
|
||||||
|
@ -53,11 +53,11 @@ Status init_messages_db(SqliteDb &db, int32 version) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
auto add_media_indices = [&db](int begin, int end) {
|
auto add_media_indices = [&db](int begin, int end) {
|
||||||
for (int i = begin; i < end; i++) {
|
// for (int i = begin; i < end; i++) {
|
||||||
TRY_STATUS(db.exec(PSLICE() << "CREATE INDEX IF NOT EXISTS message_index_" << i
|
// TRY_STATUS(db.exec(PSLICE() << "CREATE INDEX IF NOT EXISTS message_index_" << i
|
||||||
<< " ON messages (dialog_id, message_id) WHERE (index_mask & " << (1 << i)
|
// << " ON messages (dialog_id, message_id) WHERE (index_mask & " << (1 << i)
|
||||||
<< ") != 0"));
|
// << ") != 0"));
|
||||||
}
|
// }
|
||||||
return Status::OK();
|
return Status::OK();
|
||||||
};
|
};
|
||||||
|
|
||||||
@ -66,31 +66,30 @@ Status init_messages_db(SqliteDb &db, int32 version) {
|
|||||||
db.exec("CREATE INDEX IF NOT EXISTS message_by_search_id ON messages "
|
db.exec("CREATE INDEX IF NOT EXISTS message_by_search_id ON messages "
|
||||||
"(search_id) WHERE search_id IS NOT NULL"));
|
"(search_id) WHERE search_id IS NOT NULL"));
|
||||||
|
|
||||||
TRY_STATUS(
|
// TRY_STATUS(
|
||||||
db.exec("CREATE VIRTUAL TABLE IF NOT EXISTS messages_fts USING fts5(text, content='messages', "
|
// db.exec("CREATE VIRTUAL TABLE IF NOT EXISTS messages_fts USING fts5(text, content='messages', "
|
||||||
"content_rowid='search_id', tokenize = \"unicode61 remove_diacritics 0 tokenchars '\a'\")"));
|
// "content_rowid='search_id', tokenize = \"unicode61 remove_diacritics 0 tokenchars '\a'\")"));
|
||||||
TRY_STATUS(db.exec(
|
// TRY_STATUS(db.exec(
|
||||||
"CREATE TRIGGER IF NOT EXISTS trigger_fts_delete BEFORE DELETE ON messages WHEN OLD.search_id IS NOT NULL"
|
// "CREATE TRIGGER IF NOT EXISTS trigger_fts_delete BEFORE DELETE ON messages WHEN OLD.search_id IS NOT NULL"
|
||||||
" BEGIN INSERT INTO messages_fts(messages_fts, rowid, text) VALUES(\'delete\', OLD.search_id, OLD.text); END"));
|
// " BEGIN INSERT INTO messages_fts(messages_fts, rowid, text) VALUES(\'delete\', OLD.search_id, OLD.text); END"));
|
||||||
TRY_STATUS(db.exec(
|
// TRY_STATUS(db.exec(
|
||||||
"CREATE TRIGGER IF NOT EXISTS trigger_fts_insert AFTER INSERT ON messages WHEN NEW.search_id IS NOT NULL"
|
// "CREATE TRIGGER IF NOT EXISTS trigger_fts_insert AFTER INSERT ON messages WHEN NEW.search_id IS NOT NULL"
|
||||||
" BEGIN INSERT INTO messages_fts(rowid, text) VALUES(NEW.search_id, NEW.text); END"));
|
// " BEGIN INSERT INTO messages_fts(rowid, text) VALUES(NEW.search_id, NEW.text); END"));
|
||||||
//TRY_STATUS(db.exec(
|
// TRY_STATUS(db.exec(
|
||||||
//"CREATE TRIGGER IF NOT EXISTS trigger_fts_update AFTER UPDATE ON messages WHEN NEW.search_id IS NOT NULL OR "
|
// "CREATE TRIGGER IF NOT EXISTS trigger_fts_update AFTER UPDATE ON messages WHEN NEW.search_id IS NOT NULL OR "
|
||||||
//"OLD.search_id IS NOT NULL"
|
// "OLD.search_id IS NOT NULL"
|
||||||
//" BEGIN "
|
// " BEGIN "
|
||||||
//"INSERT INTO messages_fts(messages_fts, rowid, text) VALUES(\'delete\', OLD.search_id, OLD.text); "
|
// "INSERT INTO messages_fts(messages_fts, rowid, text) VALUES(\'delete\', OLD.search_id, OLD.text); "
|
||||||
//"INSERT INTO messages_fts(rowid, text) VALUES(NEW.search_id, NEW.text); "
|
// "INSERT INTO messages_fts(rowid, text) VALUES(NEW.search_id, NEW.text); "
|
||||||
//" END"));
|
// " END"));
|
||||||
|
|
||||||
return Status::OK();
|
return Status::OK();
|
||||||
};
|
};
|
||||||
auto add_call_index = [&db]() {
|
auto add_call_index = [&db]() {
|
||||||
for (int i = static_cast<int>(SearchMessagesFilter::Call) - 1;
|
// for (int i = static_cast<int>(SearchMessagesFilter::Call) - 1;
|
||||||
i < static_cast<int>(SearchMessagesFilter::MissedCall); i++) {
|
// i < static_cast<int>(SearchMessagesFilter::MissedCall); i++) {
|
||||||
TRY_STATUS(db.exec(PSLICE() << "CREATE INDEX IF NOT EXISTS full_message_index_" << i
|
// TRY_STATUS(db.exec(PSLICE() << "CREATE INDEX IF NOT EXISTS full_message_index_" << i
|
||||||
<< " ON messages (unique_message_id) WHERE (index_mask & " << (1 << i) << ") != 0"));
|
// << " ON messages (unique_message_id) WHERE (index_mask & " << (1 << i) << ") != 0"));
|
||||||
}
|
// }
|
||||||
return Status::OK();
|
return Status::OK();
|
||||||
};
|
};
|
||||||
auto add_notification_id_index = [&db]() {
|
auto add_notification_id_index = [&db]() {
|
||||||
@ -197,11 +196,11 @@ class MessagesDbImpl : public MessagesDbSyncInterface {
|
|||||||
TRY_RESULT(get_messages_from_notification_id_stmt,
|
TRY_RESULT(get_messages_from_notification_id_stmt,
|
||||||
db_.get_statement("SELECT data, message_id FROM messages WHERE dialog_id = ?1 "
|
db_.get_statement("SELECT data, message_id FROM messages WHERE dialog_id = ?1 "
|
||||||
"AND notification_id < ?2 ORDER BY notification_id DESC LIMIT ?3"));
|
"AND notification_id < ?2 ORDER BY notification_id DESC LIMIT ?3"));
|
||||||
TRY_RESULT(
|
// TRY_RESULT(
|
||||||
get_messages_fts_stmt,
|
// get_messages_fts_stmt,
|
||||||
db_.get_statement("SELECT dialog_id, data, search_id FROM messages WHERE search_id IN (SELECT rowid FROM "
|
// db_.get_statement("SELECT dialog_id, data, search_id FROM messages WHERE search_id IN (SELECT rowid FROM "
|
||||||
"messages_fts WHERE messages_fts MATCH ?1 AND rowid < ?2 ORDER BY rowid DESC LIMIT "
|
// "messages_fts WHERE messages_fts MATCH ?1 AND rowid < ?2 ORDER BY rowid DESC LIMIT "
|
||||||
"?3) ORDER BY search_id DESC"));
|
// "?3) ORDER BY search_id DESC"));
|
||||||
|
|
||||||
for (int32 i = 0; i < MESSAGES_DB_INDEX_COUNT; i++) {
|
for (int32 i = 0; i < MESSAGES_DB_INDEX_COUNT; i++) {
|
||||||
TRY_RESULT(get_messages_from_index_desc_stmt,
|
TRY_RESULT(get_messages_from_index_desc_stmt,
|
||||||
@ -245,7 +244,7 @@ class MessagesDbImpl : public MessagesDbSyncInterface {
|
|||||||
get_messages_stmt_.desc_stmt_ = std::move(get_messages_desc_stmt);
|
get_messages_stmt_.desc_stmt_ = std::move(get_messages_desc_stmt);
|
||||||
get_messages_from_notification_id_stmt_ = std::move(get_messages_from_notification_id_stmt);
|
get_messages_from_notification_id_stmt_ = std::move(get_messages_from_notification_id_stmt);
|
||||||
|
|
||||||
get_messages_fts_stmt_ = std::move(get_messages_fts_stmt);
|
// get_messages_fts_stmt_ = std::move(get_messages_fts_stmt);
|
||||||
|
|
||||||
// LOG(ERROR) << get_message_stmt_.explain().ok();
|
// LOG(ERROR) << get_message_stmt_.explain().ok();
|
||||||
// LOG(ERROR) << get_messages_from_notification_id_stmt.explain().ok();
|
// LOG(ERROR) << get_messages_from_notification_id_stmt.explain().ok();
|
||||||
@ -605,56 +604,58 @@ class MessagesDbImpl : public MessagesDbSyncInterface {
|
|||||||
}
|
}
|
||||||
|
|
||||||
Result<MessagesDbFtsResult> get_messages_fts(MessagesDbFtsQuery query) override {
|
Result<MessagesDbFtsResult> get_messages_fts(MessagesDbFtsQuery query) override {
|
||||||
SCOPE_EXIT {
|
// SCOPE_EXIT {
|
||||||
get_messages_fts_stmt_.reset();
|
// get_messages_fts_stmt_.reset();
|
||||||
};
|
// };
|
||||||
|
|
||||||
LOG(INFO) << tag("query", query.query) << query.dialog_id << tag("index_mask", query.index_mask)
|
// LOG(INFO) << tag("query", query.query) << query.dialog_id << tag("index_mask", query.index_mask)
|
||||||
<< tag("from_search_id", query.from_search_id) << tag("limit", query.limit);
|
// << tag("from_search_id", query.from_search_id) << tag("limit", query.limit);
|
||||||
string words = prepare_query(query.query);
|
// string words = prepare_query(query.query);
|
||||||
LOG(INFO) << tag("from", query.query) << tag("to", words);
|
// LOG(INFO) << tag("from", query.query) << tag("to", words);
|
||||||
|
//
|
||||||
// dialog_id kludge
|
// dialog_id kludge
|
||||||
if (query.dialog_id.is_valid()) {
|
// if (query.dialog_id.is_valid()) {
|
||||||
words += PSTRING() << " \"\a" << query.dialog_id.get() << "\"";
|
// words += PSTRING() << " \"\a" << query.dialog_id.get() << "\"";
|
||||||
}
|
// }
|
||||||
|
//
|
||||||
// index_mask kludge
|
// index_mask kludge
|
||||||
if (query.index_mask != 0) {
|
// if (query.index_mask != 0) {
|
||||||
int index_i = -1;
|
// int index_i = -1;
|
||||||
for (int i = 0; i < MESSAGES_DB_INDEX_COUNT; i++) {
|
// for (int i = 0; i < MESSAGES_DB_INDEX_COUNT; i++) {
|
||||||
if (query.index_mask == (1 << i)) {
|
// if (query.index_mask == (1 << i)) {
|
||||||
index_i = i;
|
// index_i = i;
|
||||||
break;
|
// break;
|
||||||
}
|
// }
|
||||||
}
|
// }
|
||||||
if (index_i == -1) {
|
// if (index_i == -1) {
|
||||||
return Status::Error("Union of index types is not supported");
|
// return Status::Error("Union of index types is not supported");
|
||||||
}
|
// }
|
||||||
words += PSTRING() << " \"\a\a" << index_i << "\"";
|
// words += PSTRING() << " \"\a\a" << index_i << "\"";
|
||||||
}
|
// }
|
||||||
|
//
|
||||||
auto &stmt = get_messages_fts_stmt_;
|
// auto &stmt = get_messages_fts_stmt_;
|
||||||
stmt.bind_string(1, words).ensure();
|
// stmt.bind_string(1, words).ensure();
|
||||||
if (query.from_search_id == 0) {
|
// if (query.from_search_id == 0) {
|
||||||
query.from_search_id = std::numeric_limits<int64>::max();
|
// query.from_search_id = std::numeric_limits<int64>::max();
|
||||||
}
|
// }
|
||||||
stmt.bind_int64(2, query.from_search_id).ensure();
|
// stmt.bind_int64(2, query.from_search_id).ensure();
|
||||||
stmt.bind_int32(3, query.limit).ensure();
|
// stmt.bind_int32(3, query.limit).ensure();
|
||||||
|
// MessagesDbFtsResult result;
|
||||||
|
// auto status = stmt.step();
|
||||||
|
// if (status.is_error()) {
|
||||||
|
// LOG(ERROR) << status;
|
||||||
|
// return std::move(result);
|
||||||
|
// }
|
||||||
|
// while (stmt.has_row()) {
|
||||||
|
// auto dialog_id = stmt.view_int64(0);
|
||||||
|
// auto data_slice = stmt.view_blob(1);
|
||||||
|
// auto search_id = stmt.view_int64(2);
|
||||||
|
// result.next_search_id = search_id;
|
||||||
|
// result.messages.push_back(MessagesDbMessage{DialogId(dialog_id), BufferSlice(data_slice)});
|
||||||
|
// stmt.step().ensure();
|
||||||
|
// }
|
||||||
|
|
||||||
MessagesDbFtsResult result;
|
MessagesDbFtsResult result;
|
||||||
auto status = stmt.step();
|
|
||||||
if (status.is_error()) {
|
|
||||||
LOG(ERROR) << status;
|
|
||||||
return std::move(result);
|
|
||||||
}
|
|
||||||
while (stmt.has_row()) {
|
|
||||||
auto dialog_id = stmt.view_int64(0);
|
|
||||||
auto data_slice = stmt.view_blob(1);
|
|
||||||
auto search_id = stmt.view_int64(2);
|
|
||||||
result.next_search_id = search_id;
|
|
||||||
result.messages.push_back(MessagesDbMessage{DialogId(dialog_id), BufferSlice(data_slice)});
|
|
||||||
stmt.step().ensure();
|
|
||||||
}
|
|
||||||
return std::move(result);
|
return std::move(result);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -750,7 +751,7 @@ class MessagesDbImpl : public MessagesDbSyncInterface {
|
|||||||
std::array<GetMessagesStmt, MESSAGES_DB_INDEX_COUNT> get_messages_from_index_stmts_;
|
std::array<GetMessagesStmt, MESSAGES_DB_INDEX_COUNT> get_messages_from_index_stmts_;
|
||||||
std::array<SqliteStatement, 2> get_calls_stmts_;
|
std::array<SqliteStatement, 2> get_calls_stmts_;
|
||||||
|
|
||||||
SqliteStatement get_messages_fts_stmt_;
|
// SqliteStatement get_messages_fts_stmt_;
|
||||||
|
|
||||||
Result<std::vector<BufferSlice>> get_messages_impl(GetMessagesStmt &stmt, DialogId dialog_id,
|
Result<std::vector<BufferSlice>> get_messages_impl(GetMessagesStmt &stmt, DialogId dialog_id,
|
||||||
MessageId from_message_id, int32 offset, int32 limit) {
|
MessageId from_message_id, int32 offset, int32 limit) {
|
||||||
|
Reference in New Issue
Block a user