update db-move to support migration version 14
This commit is contained in:
parent
e50f392288
commit
8458f63316
2 changed files with 40 additions and 36 deletions
|
@ -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, ®istered)
|
||||||
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
|
||||||
}
|
}
|
||||||
|
|
|
@ -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)
|
||||||
);
|
);
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue