summaryrefslogtreecommitdiff
path: root/migrations/20240928012031_channel_stored_sequence.sql
diff options
context:
space:
mode:
authorOwen Jacobson <owen@grimoire.ca>2024-09-27 21:25:15 -0400
committerOwen Jacobson <owen@grimoire.ca>2024-09-28 01:00:12 -0400
commit08c3a6e77a3f61ffc9643a5e1f840df9078d0b36 (patch)
tree9a5a373cdac46bc08524e0a173bceb15a70d2fba /migrations/20240928012031_channel_stored_sequence.sql
parentc7720ffd94da86782df062d84f88b2687d317384 (diff)
Assign sequence numbers from a counter, not by scanning messages
Diffstat (limited to 'migrations/20240928012031_channel_stored_sequence.sql')
-rw-r--r--migrations/20240928012031_channel_stored_sequence.sql60
1 files changed, 60 insertions, 0 deletions
diff --git a/migrations/20240928012031_channel_stored_sequence.sql b/migrations/20240928012031_channel_stored_sequence.sql
new file mode 100644
index 0000000..badd88d
--- /dev/null
+++ b/migrations/20240928012031_channel_stored_sequence.sql
@@ -0,0 +1,60 @@
+alter table channel
+rename to old_channel;
+
+-- Add new columns
+create table channel (
+ id text
+ not null
+ primary key,
+ name text
+ not null
+ unique,
+ created_at text
+ not null,
+ last_sequence bigint
+ not null
+);
+
+-- Transfer data from original table
+insert into channel
+select
+ channel.id,
+ channel.name,
+ channel.created_at,
+ coalesce(
+ max(message.sequence),
+ 0
+ ) as last_sequence
+from old_channel as channel
+ left join message on channel.id = message.channel
+group by channel.id, channel.name;
+
+-- Fix up `message` foreign keys
+alter table message
+rename to old_message;
+
+create table message (
+ id text
+ not null
+ primary key,
+ sequence bigint
+ not null,
+ channel text
+ not null
+ references channel (id),
+ sender text
+ not null
+ references login (id),
+ body text
+ not null,
+ sent_at text
+ not null,
+ unique (channel, sequence)
+);
+
+insert into message
+select * from old_message;
+
+-- Bury the bodies respectfully
+drop table old_message;
+drop table old_channel;