update db-move to support migration version 14

This commit is contained in:
finn 2022-04-25 17:21:52 -07:00
parent e50f392288
commit 8458f63316
2 changed files with 40 additions and 36 deletions

View file

@ -17,6 +17,8 @@ import (
"gitlab.com/signald/signald-go/cmd/signaldctl/common" "gitlab.com/signald/signald-go/cmd/signaldctl/common"
) )
const expectedMigrationVersion = "14"
var ( var (
sqlitePath string sqlitePath string
postgresURL string postgresURL string
@ -25,7 +27,7 @@ var (
Short: "move a signald database from sqlite to postgres", Short: "move a signald database from sqlite to postgres",
Long: `move a signald sqlite database into a postgres database. Long: `move a signald sqlite database into a postgres database.
If sqlite-path is not specified, the default (~/.config/signald/signald.db) will be used. If sqlite-path is not specified, the default (~/.config/signald/signald.db) will be used.
Please note that signald must NOT be running while this command runs. Please note that signald must NOT be running while this command runs.
After the data is moved, the sqlite file will be deleted`, After the data is moved, the sqlite file will be deleted`,
@ -166,7 +168,7 @@ var (
func verifyMigration(source *sql.DB) error { func verifyMigration(source *sql.DB) error {
// Lower bound of the database state. // Lower bound of the database state.
rows, err := source.Query("SELECT * FROM flyway_schema_history WHERE version = 12") rows, err := source.Query("SELECT version FROM flyway_schema_history ORDER BY installed_rank DESC LIMIT 1")
if err != nil { if err != nil {
return err return err
} }
@ -176,16 +178,16 @@ func verifyMigration(source *sql.DB) error {
return errors.New("source database is not up to date! Please update signald and start it to move the sqlite database to an acceptable format") return errors.New("source database is not up to date! Please update signald and start it to move the sqlite database to an acceptable format")
} }
// Upper bound of the database state var version string
rows, err = source.Query("SELECT * FROM flyway_schema_history WHERE version = 13") err = rows.Scan(&version)
if err != nil { if err != nil {
return err return err
} }
defer rows.Close()
if rows.Next() { if version != expectedMigrationVersion {
return errors.New("source database is too new! Please update signaldctl to the latest version") return fmt.Errorf("source database must be on migration %s (found %s instead)", expectedMigrationVersion, version)
} }
return nil return nil
} }
@ -235,7 +237,7 @@ func moveAccounts(source *sql.DB, dest *sql.DB) error {
} }
func moveRecipients(source *sql.DB, dest *sql.DB) error { func moveRecipients(source *sql.DB, dest *sql.DB) error {
rows, err := source.Query("SELECT rowid, account_uuid, uuid, e164 FROM recipients") rows, err := source.Query("SELECT rowid, account_uuid, uuid, e164, registered FROM recipients")
if err != nil { if err != nil {
return err return err
} }
@ -247,8 +249,9 @@ func moveRecipients(source *sql.DB, dest *sql.DB) error {
accountUUID uuid.UUID accountUUID uuid.UUID
recipientUUID uuid.NullUUID recipientUUID uuid.NullUUID
e164 sql.NullString e164 sql.NullString
registered bool
) )
err = rows.Scan(&rowID, &accountUUID, &recipientUUID, &e164) err = rows.Scan(&rowID, &accountUUID, &recipientUUID, &e164, &registered)
if err != nil { if err != nil {
return err return err
} }
@ -259,7 +262,7 @@ func moveRecipients(source *sql.DB, dest *sql.DB) error {
e164.String = "" e164.String = ""
} }
_, err = dest.Exec("INSERT INTO signald_recipients (rowid, account_uuid, uuid, e164) VALUES ($1, $2, $3, $4)", rowID, accountUUID, recipientUUID, e164) _, err = dest.Exec("INSERT INTO signald_recipients (rowid, account_uuid, uuid, e164, registered) VALUES ($1, $2, $3, $4, $5)", rowID, accountUUID, recipientUUID, e164, registered)
if err != nil { if err != nil {
return err return err
} }

View file

@ -17,7 +17,7 @@ var (
server_delivered_timestamp BIGINT, server_delivered_timestamp BIGINT,
server_uuid UUID server_uuid UUID
); );
CREATE TABLE signald_servers ( CREATE TABLE signald_servers (
server_uuid UUID PRIMARY KEY, server_uuid UUID PRIMARY KEY,
service_url TEXT NOT NULL, service_url TEXT NOT NULL,
@ -35,7 +35,7 @@ var (
cds_mrenclave VARCHAR(64), cds_mrenclave VARCHAR(64),
ias_ca BYTEA ias_ca BYTEA
); );
INSERT INTO signald_servers VALUES INSERT INTO signald_servers VALUES
( (
'6e2eb5a8-5706-45d0-8377-127a816411a4', -- server_uuid '6e2eb5a8-5706-45d0-8377-127a816411a4', -- server_uuid
@ -89,79 +89,80 @@ var (
-- ias_ca -- ias_ca
E'\\x00000002000000141e139877c131235200356d48d741b9e8538d4a290000078101000369617300000164adeb7976000000000005582e3530390000054f3082054b308203b3a003020102020900d107765d32a3b094300d06092a864886f70d01010b0500307e310b3009060355040613025553310b300906035504080c0243413114301206035504070c0b53616e746120436c617261311a3018060355040a0c11496e74656c20436f72706f726174696f6e3130302e06035504030c27496e74656c20534758204174746573746174696f6e205265706f7274205369676e696e672043413020170d3136313131343135333733315a180f32303439313233313233353935395a307e310b3009060355040613025553310b300906035504080c0243413114301206035504070c0b53616e746120436c617261311a3018060355040a0c11496e74656c20436f72706f726174696f6e3130302e06035504030c27496e74656c20534758204174746573746174696f6e205265706f7274205369676e696e67204341308201a2300d06092a864886f70d01010105000382018f003082018a02820181009f3c647eb5773cbb512d2732c0d7415ebb55a0fa9ede2e649199e6821db910d53177370977466a6a5e4786ccd2ddebd4149d6a2f6325529dd10cc98737b0779c1a07e29c47a1ae004948476c489f45a5a15d7ac8ecc6acc645adb43d87679df59c093bc5a2e9696c5478541b979e754b573914be55d32ff4c09ddf27219934cd990527b3f92ed78fbf29246abecb71240ef39c2d7107b447545a7ffb10eb060a68a98580219e36910952683892d6a5e2a80803193e407531404e36b315623799aa825074409754a2dfe8f5afd5fe631e1fc2af3808906f28a790d9dd9fe060939b125790c5805d037df56a99531b96de69de33ed226cc1207d1042b5c9ab7f404fc711c0fe4769fb9578b1dc0ec469ea1a25e0ff9914886ef2699b235bb4847dd6ff40b606e6170793c2fb98b314587f9cfd257362dfeab10b3bd2d97673a1a4bd44c453aaf47fc1f2d3d0f384f74a06f89c089f0da6cdb7fceee8c9821a8e54f25c0416d18c46839a5f8012fbdd3dc74d256279adc2c0d55aff6f0622425d1b0203010001a381c93081c630600603551d1f045930573055a053a051864f687474703a2f2f7472757374656473657276696365732e696e74656c2e636f6d2f636f6e74656e742f43524c2f5347582f4174746573746174696f6e5265706f72745369676e696e6743412e63726c301d0603551d0e0416041478437b76a67ebcd0af7e4237eb357c3b8701513c301f0603551d2304183016801478437b76a67ebcd0af7e4237eb357c3b8701513c300e0603551d0f0101ff04040302010630120603551d130101ff040830060101ff020100300d06092a864886f70d01010b05000382018100785f2d60c5c80af42a797610213915da82c9b29e89e0902a25a6c75b16091c68ab204aae711889492c7e1e320911455a8fc13442312e77a63994d99795c8ea4576823cea8ad1e191cfa862fab8a932d3d9b0535a0702d0555f74e520e30330f33480e7adc9d7c81e20703142bf00c528a80b463381fd602a82c7035281aae59562ccb5334ea8903e650b010681f5ce8eb62eac9c414988243aec92f25bf13cdff7ebcc298ee51bba5a3538b66b26cbc45a51de003cad306531ad7cf5d4ef0f8805d1b9133d24135ab3c4641a2f8808349d7333295e0e76ee4bc5227232628efa80d79d92ab4e3d1120f3fb5ad119cd8d544aa1d4a6865e6b57beac5771307e2e3cb9070da47b4bfc8869e01413ea093541de8a792811b74636c5e91452cf0cee59f2fb404acd0bc584cb9c835404734c0e7ec6605cdfcf2ff439b6d4719f702f0e0c3fa04fdb12a6cb2ad1ab1c9af1f8f4c3a08edd72a32b0bb5d0ad256ffd159a683b2a5a1f1d11fa62532f03d754caef0da5735a1e5a884c7e89d91218c9d7008515e5f5992ccc471f3b1bc1aaec24a2997e6ad3' E'\\x00000002000000141e139877c131235200356d48d741b9e8538d4a290000078101000369617300000164adeb7976000000000005582e3530390000054f3082054b308203b3a003020102020900d107765d32a3b094300d06092a864886f70d01010b0500307e310b3009060355040613025553310b300906035504080c0243413114301206035504070c0b53616e746120436c617261311a3018060355040a0c11496e74656c20436f72706f726174696f6e3130302e06035504030c27496e74656c20534758204174746573746174696f6e205265706f7274205369676e696e672043413020170d3136313131343135333733315a180f32303439313233313233353935395a307e310b3009060355040613025553310b300906035504080c0243413114301206035504070c0b53616e746120436c617261311a3018060355040a0c11496e74656c20436f72706f726174696f6e3130302e06035504030c27496e74656c20534758204174746573746174696f6e205265706f7274205369676e696e67204341308201a2300d06092a864886f70d01010105000382018f003082018a02820181009f3c647eb5773cbb512d2732c0d7415ebb55a0fa9ede2e649199e6821db910d53177370977466a6a5e4786ccd2ddebd4149d6a2f6325529dd10cc98737b0779c1a07e29c47a1ae004948476c489f45a5a15d7ac8ecc6acc645adb43d87679df59c093bc5a2e9696c5478541b979e754b573914be55d32ff4c09ddf27219934cd990527b3f92ed78fbf29246abecb71240ef39c2d7107b447545a7ffb10eb060a68a98580219e36910952683892d6a5e2a80803193e407531404e36b315623799aa825074409754a2dfe8f5afd5fe631e1fc2af3808906f28a790d9dd9fe060939b125790c5805d037df56a99531b96de69de33ed226cc1207d1042b5c9ab7f404fc711c0fe4769fb9578b1dc0ec469ea1a25e0ff9914886ef2699b235bb4847dd6ff40b606e6170793c2fb98b314587f9cfd257362dfeab10b3bd2d97673a1a4bd44c453aaf47fc1f2d3d0f384f74a06f89c089f0da6cdb7fceee8c9821a8e54f25c0416d18c46839a5f8012fbdd3dc74d256279adc2c0d55aff6f0622425d1b0203010001a381c93081c630600603551d1f045930573055a053a051864f687474703a2f2f7472757374656473657276696365732e696e74656c2e636f6d2f636f6e74656e742f43524c2f5347582f4174746573746174696f6e5265706f72745369676e696e6743412e63726c301d0603551d0e0416041478437b76a67ebcd0af7e4237eb357c3b8701513c301f0603551d2304183016801478437b76a67ebcd0af7e4237eb357c3b8701513c300e0603551d0f0101ff04040302010630120603551d130101ff040830060101ff020100300d06092a864886f70d01010b05000382018100785f2d60c5c80af42a797610213915da82c9b29e89e0902a25a6c75b16091c68ab204aae711889492c7e1e320911455a8fc13442312e77a63994d99795c8ea4576823cea8ad1e191cfa862fab8a932d3d9b0535a0702d0555f74e520e30330f33480e7adc9d7c81e20703142bf00c528a80b463381fd602a82c7035281aae59562ccb5334ea8903e650b010681f5ce8eb62eac9c414988243aec92f25bf13cdff7ebcc298ee51bba5a3538b66b26cbc45a51de003cad306531ad7cf5d4ef0f8805d1b9133d24135ab3c4641a2f8808349d7333295e0e76ee4bc5227232628efa80d79d92ab4e3d1120f3fb5ad119cd8d544aa1d4a6865e6b57beac5771307e2e3cb9070da47b4bfc8869e01413ea093541de8a792811b74636c5e91452cf0cee59f2fb404acd0bc584cb9c835404734c0e7ec6605cdfcf2ff439b6d4719f702f0e0c3fa04fdb12a6cb2ad1ab1c9af1f8f4c3a08edd72a32b0bb5d0ad256ffd159a683b2a5a1f1d11fa62532f03d754caef0da5735a1e5a884c7e89d91218c9d7008515e5f5992ccc471f3b1bc1aaec24a2997e6ad3'
); );
CREATE TABLE signald_accounts ( CREATE TABLE signald_accounts (
uuid UUID NOT NULL, uuid UUID NOT NULL,
e164 TEXT NOT NULL, e164 TEXT NOT NULL,
filename TEXT NOT NULL, filename TEXT NOT NULL,
server UUID NOT NULL REFERENCES signald_servers(server_uuid) ON DELETE CASCADE, server UUID NOT NULL REFERENCES signald_servers(server_uuid) ON DELETE CASCADE,
PRIMARY KEY (uuid, e164, filename, server), PRIMARY KEY (uuid, e164, filename, server),
UNIQUE (e164), UNIQUE (e164),
UNIQUE (filename), UNIQUE (filename),
UNIQUE (uuid) UNIQUE (uuid)
); );
CREATE TABLE signald_recipients ( CREATE TABLE signald_recipients (
rowid SERIAL PRIMARY KEY, rowid SERIAL PRIMARY KEY,
account_uuid UUID NOT NULL REFERENCES signald_accounts(uuid) ON DELETE CASCADE, account_uuid UUID NOT NULL REFERENCES signald_accounts(uuid) ON DELETE CASCADE,
uuid UUID, uuid UUID,
e164 TEXT, e164 TEXT,
registered BOOLEAN DEFAULT true,
UNIQUE (account_uuid, e164, uuid) UNIQUE (account_uuid, e164, uuid)
); );
CREATE TABLE signald_prekeys ( CREATE TABLE signald_prekeys (
account_uuid UUID NOT NULL REFERENCES signald_accounts(uuid) ON DELETE CASCADE, account_uuid UUID NOT NULL REFERENCES signald_accounts(uuid) ON DELETE CASCADE,
id INTEGER NOT NULL, id INTEGER NOT NULL,
record BYTEA NOT NULL, record BYTEA NOT NULL,
PRIMARY KEY (account_uuid, id) PRIMARY KEY (account_uuid, id)
); );
CREATE TABLE signald_sessions ( CREATE TABLE signald_sessions (
account_uuid UUID NOT NULL REFERENCES signald_accounts(uuid) ON DELETE CASCADE, account_uuid UUID NOT NULL REFERENCES signald_accounts(uuid) ON DELETE CASCADE,
recipient INTEGER NOT NULL REFERENCES signald_recipients(rowid) ON DELETE CASCADE, recipient INTEGER NOT NULL REFERENCES signald_recipients(rowid) ON DELETE CASCADE,
device_id INTEGER, device_id INTEGER,
record BYTEA NOT NULL, record BYTEA NOT NULL,
PRIMARY KEY (account_uuid, recipient, device_id) PRIMARY KEY (account_uuid, recipient, device_id)
); );
CREATE TABLE signald_signed_prekeys ( CREATE TABLE signald_signed_prekeys (
account_uuid UUID NOT NULL REFERENCES signald_accounts(uuid) ON DELETE CASCADE, account_uuid UUID NOT NULL REFERENCES signald_accounts(uuid) ON DELETE CASCADE,
id INTEGER NOT NULL, id INTEGER NOT NULL,
record BYTEA NOT NULL, record BYTEA NOT NULL,
PRIMARY KEY (account_uuid, id) PRIMARY KEY (account_uuid, id)
); );
CREATE TABLE signald_identity_keys ( CREATE TABLE signald_identity_keys (
account_uuid UUID NOT NULL REFERENCES signald_accounts(uuid) ON DELETE CASCADE, account_uuid UUID NOT NULL REFERENCES signald_accounts(uuid) ON DELETE CASCADE,
recipient INTEGER NOT NULL, recipient INTEGER NOT NULL,
identity_key BYTEA NOT NULL, identity_key BYTEA NOT NULL,
trust_level TEXT NOT NULL, trust_level TEXT NOT NULL,
added TIMESTAMP WITHOUT TIME ZONE DEFAULT CURRENT_TIMESTAMP, added TIMESTAMP WITHOUT TIME ZONE DEFAULT CURRENT_TIMESTAMP,
PRIMARY KEY (account_uuid, recipient, identity_key) PRIMARY KEY (account_uuid, recipient, identity_key)
); );
CREATE TABLE signald_account_data ( CREATE TABLE signald_account_data (
account_uuid UUID NOT NULL REFERENCES signald_accounts(uuid) ON DELETE CASCADE, account_uuid UUID NOT NULL REFERENCES signald_accounts(uuid) ON DELETE CASCADE,
key TEXT NOT NULL, key TEXT NOT NULL,
value BYTEA NOT NULL, value BYTEA NOT NULL,
PRIMARY KEY (account_uuid, key) PRIMARY KEY (account_uuid, key)
); );
CREATE TABLE signald_pending_account_data ( CREATE TABLE signald_pending_account_data (
username TEXT, username TEXT,
key TEXT NOT NULL, key TEXT NOT NULL,
value BYTEA NOT NULL, value BYTEA NOT NULL,
PRIMARY KEY (username, key) PRIMARY KEY (username, key)
); );
CREATE TABLE signald_sender_keys ( CREATE TABLE signald_sender_keys (
account_uuid UUID NOT NULL REFERENCES signald_accounts(uuid) ON DELETE CASCADE, account_uuid UUID NOT NULL REFERENCES signald_accounts(uuid) ON DELETE CASCADE,
address TEXT NOT NULL, address TEXT NOT NULL,
@ -169,19 +170,19 @@ var (
distribution_id UUID NOT NULL, distribution_id UUID NOT NULL,
record BYTEA NOT NULL, record BYTEA NOT NULL,
created_at TIMESTAMP WITHOUT TIME ZONE NOT NULL, created_at TIMESTAMP WITHOUT TIME ZONE NOT NULL,
PRIMARY KEY (account_uuid, address, device, distribution_id) PRIMARY KEY (account_uuid, address, device, distribution_id)
); );
CREATE TABLE signald_sender_key_shared ( CREATE TABLE signald_sender_key_shared (
account_uuid UUID NOT NULL REFERENCES signald_accounts(uuid) ON DELETE CASCADE, account_uuid UUID NOT NULL REFERENCES signald_accounts(uuid) ON DELETE CASCADE,
distribution_id UUID NOT NULL, distribution_id UUID NOT NULL,
address TEXT NOT NULL, address TEXT NOT NULL,
device INTEGER NOT NULL, device INTEGER NOT NULL,
PRIMARY KEY (account_uuid, address, device) PRIMARY KEY (account_uuid, address, device)
); );
CREATE TABLE signald_groups ( CREATE TABLE signald_groups (
rowid SERIAL PRIMARY KEY, rowid SERIAL PRIMARY KEY,
account_uuid UUID NOT NULL REFERENCES signald_accounts(uuid) ON DELETE CASCADE, account_uuid UUID NOT NULL REFERENCES signald_accounts(uuid) ON DELETE CASCADE,
@ -191,15 +192,15 @@ var (
last_avatar_fetch INTEGER, last_avatar_fetch INTEGER,
distribution_id UUID, distribution_id UUID,
group_info BYTEA, group_info BYTEA,
UNIQUE (account_uuid, group_id) UNIQUE (account_uuid, group_id)
); );
CREATE TABLE signald_group_credentials ( CREATE TABLE signald_group_credentials (
account_uuid UUID NOT NULL REFERENCES signald_accounts(uuid) ON DELETE CASCADE, account_uuid UUID NOT NULL REFERENCES signald_accounts(uuid) ON DELETE CASCADE,
date BIGINT NOT NULL, date BIGINT NOT NULL,
credential BYTEA NOT NULL, credential BYTEA NOT NULL,
PRIMARY KEY (account_uuid, date) PRIMARY KEY (account_uuid, date)
); );