mirror of
https://github.com/simplex-chat/simplex-chat.git
synced 2026-10-26 23:21:00 +00:00
directory: move all storage to the database, optimize performance (#6287)
* core: add custom indexed columns to groups and contacts * directory: use database (TODO search/listing) * triggers to maintain current member count * update simplexmq, fix tests, use summary from GroupInfo * fix all directory tests * remove acceptance fields from group reg * enable all tests * clean up * postgres migrations, fixes * query plans * use function in postgres triggers, improve sqlite query * fix export/import * update schema * prevent admins from promoting groups when approving * update listing every 5 minutes
This commit is contained in:
1 parent
53d6d057c6
commit
015d5de364
40 files changed
+1897
-1054
No files matched your search
@@ -1,8 +1,7 @@
|
||||
CREATE TABLE migrations(
|
||||
name TEXT NOT NULL,
|
||||
name TEXT NOT NULL PRIMARY KEY,
|
||||
ts TEXT NOT NULL,
|
||||
down TEXT,
|
||||
PRIMARY KEY(name)
|
||||
down TEXT
|
||||
);
|
||||
CREATE TABLE contact_profiles(
|
||||
-- remote user profile
|
||||
@@ -156,7 +155,8 @@ CREATE TABLE groups(
|
||||
welcome_shared_msg_id BLOB,
|
||||
request_shared_msg_id BLOB,
|
||||
conn_link_prepared_connection INTEGER NOT NULL DEFAULT 0,
|
||||
via_group_link_uri BLOB, -- received
|
||||
via_group_link_uri BLOB,
|
||||
summary_current_members_count INTEGER NOT NULL DEFAULT 0, -- received
|
||||
FOREIGN KEY(user_id, local_display_name)
|
||||
REFERENCES display_names(user_id, local_display_name)
|
||||
ON DELETE CASCADE
|
||||
@@ -724,6 +724,10 @@ CREATE TABLE delivery_jobs(
|
||||
created_at TEXT NOT NULL DEFAULT(datetime('now')),
|
||||
updated_at TEXT NOT NULL DEFAULT(datetime('now'))
|
||||
);
|
||||
CREATE TABLE group_member_status_predicates(
|
||||
member_status TEXT NOT NULL PRIMARY KEY,
|
||||
current_member INTEGER NOT NULL DEFAULT 0
|
||||
);
|
||||
CREATE INDEX contact_profiles_index ON contact_profiles(
|
||||
display_name,
|
||||
full_name
|
||||
@@ -1184,3 +1188,38 @@ CREATE INDEX idx_delivery_jobs_next ON delivery_jobs(
|
||||
job_status
|
||||
);
|
||||
CREATE INDEX idx_delivery_jobs_created_at ON delivery_jobs(created_at);
|
||||
CREATE INDEX idx_groups_summary_current_members_count ON groups(
|
||||
summary_current_members_count
|
||||
);
|
||||
CREATE TRIGGER on_group_members_insert_update_summary
|
||||
AFTER INSERT ON group_members
|
||||
FOR EACH ROW
|
||||
WHEN EXISTS (SELECT 1 FROM group_member_status_predicates WHERE member_status = NEW.member_status AND current_member = 1)
|
||||
BEGIN
|
||||
UPDATE groups
|
||||
SET summary_current_members_count = summary_current_members_count + 1
|
||||
WHERE group_id = NEW.group_id;
|
||||
END;
|
||||
CREATE TRIGGER on_group_members_delete_update_summary
|
||||
AFTER DELETE ON group_members
|
||||
FOR EACH ROW
|
||||
WHEN EXISTS (SELECT 1 FROM group_member_status_predicates WHERE member_status = OLD.member_status AND current_member = 1)
|
||||
BEGIN
|
||||
UPDATE groups
|
||||
SET summary_current_members_count = summary_current_members_count - 1
|
||||
WHERE group_id = OLD.group_id;
|
||||
END;
|
||||
CREATE TRIGGER on_group_members_update_update_summary
|
||||
AFTER UPDATE ON group_members
|
||||
FOR EACH ROW
|
||||
WHEN EXISTS (SELECT 1 FROM group_member_status_predicates WHERE member_status = OLD.member_status AND current_member = 1)
|
||||
!= EXISTS (SELECT 1 FROM group_member_status_predicates WHERE member_status = NEW.member_status AND current_member = 1)
|
||||
BEGIN
|
||||
UPDATE groups
|
||||
SET summary_current_members_count = summary_current_members_count +
|
||||
(
|
||||
CASE WHEN EXISTS (SELECT 1 FROM group_member_status_predicates WHERE member_status = NEW.member_status AND current_member = 1)
|
||||
THEN 1 ELSE -1 END
|
||||
)
|
||||
WHERE group_id = NEW.group_id;
|
||||
END;
|
||||
Reference in new issue
Block a user