From 5e15e6eac89d38028d3c797985d32376172eec8f Mon Sep 17 00:00:00 2001 From: shum Date: Wed, 3 Jun 2026 15:04:56 +0000 Subject: [PATCH] chat: migration adds simplex_name to contacts, groups, connections Nullable TEXT column on all three tables, with partial indexes on contacts(user_id, simplex_name) and groups(user_id, simplex_name) for the upcoming connectPlanName lookup. connections.simplex_name is the transient carrier from APIConnect -> XInfo handler, where the value is copied to contacts.simplex_name at delayed create. No reads or writes yet - column threading lands in subsequent commits. --- simplex-chat.cabal | 2 ++ src/Simplex/Chat/Store/Postgres/Migrations.hs | 4 ++- .../Migrations/M20260603_simplex_name.hs | 34 +++++++++++++++++++ .../Store/Postgres/Migrations/chat_schema.sql | 17 ++++++++-- src/Simplex/Chat/Store/SQLite/Migrations.hs | 4 ++- .../Migrations/M20260603_simplex_name.hs | 33 ++++++++++++++++++ .../Store/SQLite/Migrations/chat_schema.sql | 17 +++++++++- 7 files changed, 105 insertions(+), 6 deletions(-) create mode 100644 src/Simplex/Chat/Store/Postgres/Migrations/M20260603_simplex_name.hs create mode 100644 src/Simplex/Chat/Store/SQLite/Migrations/M20260603_simplex_name.hs diff --git a/simplex-chat.cabal b/simplex-chat.cabal index 2fa70c0dbd..33295929e2 100644 --- a/simplex-chat.cabal +++ b/simplex-chat.cabal @@ -137,6 +137,7 @@ library Simplex.Chat.Store.Postgres.Migrations.M20260529_delivery_job_senders Simplex.Chat.Store.Postgres.Migrations.M20260530_client_services Simplex.Chat.Store.Postgres.Migrations.M20260531_member_removed_at + Simplex.Chat.Store.Postgres.Migrations.M20260603_simplex_name else exposed-modules: Simplex.Chat.Archive @@ -296,6 +297,7 @@ library Simplex.Chat.Store.SQLite.Migrations.M20260529_delivery_job_senders Simplex.Chat.Store.SQLite.Migrations.M20260530_client_services Simplex.Chat.Store.SQLite.Migrations.M20260531_member_removed_at + Simplex.Chat.Store.SQLite.Migrations.M20260603_simplex_name other-modules: Paths_simplex_chat hs-source-dirs: diff --git a/src/Simplex/Chat/Store/Postgres/Migrations.hs b/src/Simplex/Chat/Store/Postgres/Migrations.hs index 7b5fa52b9c..319fb93717 100644 --- a/src/Simplex/Chat/Store/Postgres/Migrations.hs +++ b/src/Simplex/Chat/Store/Postgres/Migrations.hs @@ -35,6 +35,7 @@ import Simplex.Chat.Store.Postgres.Migrations.M20260515_public_group_access import Simplex.Chat.Store.Postgres.Migrations.M20260529_delivery_job_senders import Simplex.Chat.Store.Postgres.Migrations.M20260530_client_services import Simplex.Chat.Store.Postgres.Migrations.M20260531_member_removed_at +import Simplex.Chat.Store.Postgres.Migrations.M20260603_simplex_name import Simplex.Messaging.Agent.Store.Shared (Migration (..)) schemaMigrations :: [(String, Text, Maybe Text)] @@ -69,7 +70,8 @@ schemaMigrations = ("20260515_public_group_access", m20260515_public_group_access, Just down_m20260515_public_group_access), ("20260529_delivery_job_senders", m20260529_delivery_job_senders, Just down_m20260529_delivery_job_senders), ("20260530_client_services", m20260530_client_services, Just down_m20260530_client_services), - ("20260531_member_removed_at", m20260531_member_removed_at, Just down_m20260531_member_removed_at) + ("20260531_member_removed_at", m20260531_member_removed_at, Just down_m20260531_member_removed_at), + ("20260603_simplex_name", m20260603_simplex_name, Just down_m20260603_simplex_name) ] -- | The list of migrations in ascending order by date diff --git a/src/Simplex/Chat/Store/Postgres/Migrations/M20260603_simplex_name.hs b/src/Simplex/Chat/Store/Postgres/Migrations/M20260603_simplex_name.hs new file mode 100644 index 0000000000..b01c32c643 --- /dev/null +++ b/src/Simplex/Chat/Store/Postgres/Migrations/M20260603_simplex_name.hs @@ -0,0 +1,34 @@ +{-# LANGUAGE OverloadedStrings #-} +{-# LANGUAGE QuasiQuotes #-} + +module Simplex.Chat.Store.Postgres.Migrations.M20260603_simplex_name where + +import Data.Text (Text) +import Text.RawString.QQ (r) + +m20260603_simplex_name :: Text +m20260603_simplex_name = + [r| +ALTER TABLE contacts ADD COLUMN simplex_name TEXT; +ALTER TABLE groups ADD COLUMN simplex_name TEXT; +ALTER TABLE connections ADD COLUMN simplex_name TEXT; + +CREATE INDEX idx_contacts_simplex_name + ON contacts(user_id, simplex_name) + WHERE simplex_name IS NOT NULL; + +CREATE INDEX idx_groups_simplex_name + ON groups(user_id, simplex_name) + WHERE simplex_name IS NOT NULL; +|] + +down_m20260603_simplex_name :: Text +down_m20260603_simplex_name = + [r| +DROP INDEX idx_groups_simplex_name; +DROP INDEX idx_contacts_simplex_name; + +ALTER TABLE connections DROP COLUMN simplex_name; +ALTER TABLE groups DROP COLUMN simplex_name; +ALTER TABLE contacts DROP COLUMN simplex_name; +|] diff --git a/src/Simplex/Chat/Store/Postgres/Migrations/chat_schema.sql b/src/Simplex/Chat/Store/Postgres/Migrations/chat_schema.sql index 0ff86c8981..758c26b2e1 100644 --- a/src/Simplex/Chat/Store/Postgres/Migrations/chat_schema.sql +++ b/src/Simplex/Chat/Store/Postgres/Migrations/chat_schema.sql @@ -482,7 +482,8 @@ CREATE TABLE test_chat_schema.connections ( short_link_inv bytea, via_short_link_contact bytea, via_contact_uri bytea, - relay_test smallint DEFAULT 0 NOT NULL + relay_test smallint DEFAULT 0 NOT NULL, + simplex_name text ); @@ -612,7 +613,8 @@ CREATE TABLE test_chat_schema.contacts ( grp_direct_inv_from_group_id bigint, grp_direct_inv_from_group_member_id bigint, grp_direct_inv_from_member_conn_id bigint, - grp_direct_inv_started_connection smallint DEFAULT 0 NOT NULL + grp_direct_inv_started_connection smallint DEFAULT 0 NOT NULL, + simplex_name text ); @@ -969,7 +971,8 @@ CREATE TABLE test_chat_schema.groups ( relay_request_retries bigint DEFAULT 0 NOT NULL, relay_request_delay bigint DEFAULT 0 NOT NULL, relay_request_execute_at timestamp with time zone DEFAULT '1970-01-01 01:00:00+01'::timestamp with time zone NOT NULL, - relay_inactive_at timestamp with time zone + relay_inactive_at timestamp with time zone, + simplex_name text ); @@ -2190,6 +2193,10 @@ CREATE INDEX idx_contacts_grp_direct_inv_from_member_conn_id ON test_chat_schema +CREATE INDEX idx_contacts_simplex_name ON test_chat_schema.contacts USING btree (user_id, simplex_name) WHERE (simplex_name IS NOT NULL); + + + CREATE INDEX idx_contacts_xcontact_id ON test_chat_schema.contacts USING btree (xcontact_id); @@ -2366,6 +2373,10 @@ CREATE INDEX idx_groups_relay_request_group_link ON test_chat_schema.groups USIN +CREATE INDEX idx_groups_simplex_name ON test_chat_schema.groups USING btree (user_id, simplex_name) WHERE (simplex_name IS NOT NULL); + + + CREATE INDEX idx_groups_summary_current_members_count ON test_chat_schema.groups USING btree (summary_current_members_count); diff --git a/src/Simplex/Chat/Store/SQLite/Migrations.hs b/src/Simplex/Chat/Store/SQLite/Migrations.hs index 58eed42e95..15f0ffb474 100644 --- a/src/Simplex/Chat/Store/SQLite/Migrations.hs +++ b/src/Simplex/Chat/Store/SQLite/Migrations.hs @@ -158,6 +158,7 @@ import Simplex.Chat.Store.SQLite.Migrations.M20260515_public_group_access import Simplex.Chat.Store.SQLite.Migrations.M20260529_delivery_job_senders import Simplex.Chat.Store.SQLite.Migrations.M20260530_client_services import Simplex.Chat.Store.SQLite.Migrations.M20260531_member_removed_at +import Simplex.Chat.Store.SQLite.Migrations.M20260603_simplex_name import Simplex.Messaging.Agent.Store.Shared (Migration (..)) schemaMigrations :: [(String, Query, Maybe Query)] @@ -315,7 +316,8 @@ schemaMigrations = ("20260515_public_group_access", m20260515_public_group_access, Just down_m20260515_public_group_access), ("20260529_delivery_job_senders", m20260529_delivery_job_senders, Just down_m20260529_delivery_job_senders), ("20260530_client_services", m20260530_client_services, Just down_m20260530_client_services), - ("20260531_member_removed_at", m20260531_member_removed_at, Just down_m20260531_member_removed_at) + ("20260531_member_removed_at", m20260531_member_removed_at, Just down_m20260531_member_removed_at), + ("20260603_simplex_name", m20260603_simplex_name, Just down_m20260603_simplex_name) ] -- | The list of migrations in ascending order by date diff --git a/src/Simplex/Chat/Store/SQLite/Migrations/M20260603_simplex_name.hs b/src/Simplex/Chat/Store/SQLite/Migrations/M20260603_simplex_name.hs new file mode 100644 index 0000000000..1f7b159194 --- /dev/null +++ b/src/Simplex/Chat/Store/SQLite/Migrations/M20260603_simplex_name.hs @@ -0,0 +1,33 @@ +{-# LANGUAGE QuasiQuotes #-} + +module Simplex.Chat.Store.SQLite.Migrations.M20260603_simplex_name where + +import Database.SQLite.Simple (Query) +import Database.SQLite.Simple.QQ (sql) + +m20260603_simplex_name :: Query +m20260603_simplex_name = + [sql| +ALTER TABLE contacts ADD COLUMN simplex_name TEXT; +ALTER TABLE groups ADD COLUMN simplex_name TEXT; +ALTER TABLE connections ADD COLUMN simplex_name TEXT; + +CREATE INDEX idx_contacts_simplex_name + ON contacts(user_id, simplex_name) + WHERE simplex_name IS NOT NULL; + +CREATE INDEX idx_groups_simplex_name + ON groups(user_id, simplex_name) + WHERE simplex_name IS NOT NULL; +|] + +down_m20260603_simplex_name :: Query +down_m20260603_simplex_name = + [sql| +DROP INDEX idx_groups_simplex_name; +DROP INDEX idx_contacts_simplex_name; + +ALTER TABLE connections DROP COLUMN simplex_name; +ALTER TABLE groups DROP COLUMN simplex_name; +ALTER TABLE contacts DROP COLUMN simplex_name; +|] diff --git a/src/Simplex/Chat/Store/SQLite/Migrations/chat_schema.sql b/src/Simplex/Chat/Store/SQLite/Migrations/chat_schema.sql index 97dab10ac7..134fd65592 100644 --- a/src/Simplex/Chat/Store/SQLite/Migrations/chat_schema.sql +++ b/src/Simplex/Chat/Store/SQLite/Migrations/chat_schema.sql @@ -92,6 +92,7 @@ CREATE TABLE contacts( grp_direct_inv_from_group_member_id INTEGER REFERENCES group_members(group_member_id) ON DELETE SET NULL, grp_direct_inv_from_member_conn_id INTEGER REFERENCES connections(connection_id) ON DELETE SET NULL, grp_direct_inv_started_connection INTEGER NOT NULL DEFAULT 0, + simplex_name TEXT, FOREIGN KEY(user_id, local_display_name) REFERENCES display_names(user_id, local_display_name) ON DELETE CASCADE @@ -182,7 +183,8 @@ CREATE TABLE groups( relay_request_retries INTEGER NOT NULL DEFAULT 0, relay_request_delay INTEGER NOT NULL DEFAULT 0, relay_request_execute_at TEXT NOT NULL DEFAULT '1970-01-01 00:00:00', - relay_inactive_at TEXT, -- received + relay_inactive_at TEXT, + simplex_name TEXT, -- received FOREIGN KEY(user_id, local_display_name) REFERENCES display_names(user_id, local_display_name) ON DELETE CASCADE @@ -351,6 +353,7 @@ CREATE TABLE connections( via_short_link_contact BLOB, via_contact_uri BLOB, relay_test INTEGER NOT NULL DEFAULT 0, + simplex_name TEXT, FOREIGN KEY(snd_file_id, connection_id) REFERENCES snd_files(file_id, connection_id) ON DELETE CASCADE @@ -1307,6 +1310,18 @@ ON groups( relay_request_group_link ) WHERE relay_request_group_link IS NOT NULL; +CREATE INDEX idx_contacts_simplex_name +ON contacts( + user_id, + simplex_name +) +WHERE simplex_name IS NOT NULL; +CREATE INDEX idx_groups_simplex_name +ON groups( + user_id, + simplex_name +) +WHERE simplex_name IS NOT NULL; CREATE TRIGGER on_group_members_insert_update_summary AFTER INSERT ON group_members FOR EACH ROW