mirror of
https://github.com/mautrix/whatsapp.git
synced 2025-03-14 14:15:38 +00:00
legacymigrate: add draft legacy database migration
This commit is contained in:
parent
8a5c46d201
commit
c78f2ba1dc
3 changed files with 223 additions and 0 deletions
33
cmd/mautrix-whatsapp/legacymigrate.go
Normal file
33
cmd/mautrix-whatsapp/legacymigrate.go
Normal file
|
@ -0,0 +1,33 @@
|
|||
package main
|
||||
|
||||
import (
|
||||
_ "embed"
|
||||
|
||||
up "go.mau.fi/util/configupgrade"
|
||||
"maunium.net/go/mautrix/bridgev2/bridgeconfig"
|
||||
)
|
||||
|
||||
const legacyMigrateRenameTables = `
|
||||
ALTER TABLE backfill_queue RENAME TO backfill_queue_old;
|
||||
ALTER TABLE backfill_state RENAME TO backfill_state_old;
|
||||
ALTER TABLE disappearing_message RENAME TO disappearing_message_old;
|
||||
ALTER TABLE history_sync_message RENAME TO history_sync_message_old;
|
||||
ALTER TABLE history_sync_conversation RENAME TO history_sync_conversation_old;
|
||||
ALTER TABLE media_backfill_requests RENAME TO media_backfill_requests_old;
|
||||
ALTER TABLE poll_option_id RENAME TO poll_option_id_old;
|
||||
ALTER TABLE user_portal RENAME TO user_portal_old;
|
||||
ALTER TABLE portal RENAME TO portal_old;
|
||||
ALTER TABLE puppet RENAME TO puppet_old;
|
||||
ALTER TABLE message RENAME TO message_old;
|
||||
ALTER TABLE reaction RENAME TO reaction_old;
|
||||
ALTER TABLE "user" RENAME TO user_old;
|
||||
`
|
||||
|
||||
//go:embed legacymigrate.sql
|
||||
var legacyMigrateCopyData string
|
||||
|
||||
func migrateLegacyConfig(helper up.Helper) {
|
||||
helper.Set(up.Str, "maunium.net/go/mautrix-whatsapp", "encryption", "pickle_key")
|
||||
bridgeconfig.CopyToOtherLocation(helper, up.Str, []string{"bridge", "displayname_template"}, []string{"network", "displayname_template"})
|
||||
// TODO other fields
|
||||
}
|
181
cmd/mautrix-whatsapp/legacymigrate.sql
Normal file
181
cmd/mautrix-whatsapp/legacymigrate.sql
Normal file
|
@ -0,0 +1,181 @@
|
|||
INSERT INTO "user" (bridge_id, mxid, management_room, access_token)
|
||||
SELECT '', mxid, management_room, ''
|
||||
FROM user_old;
|
||||
|
||||
UPDATE "user" SET access_token=COALESCE((SELECT access_token FROM puppet_old WHERE custom_mxid="user".mxid AND access_token<>'' LIMIT 1), '');
|
||||
|
||||
INSERT INTO user_login (bridge_id, user_mxid, id, remote_name, space_room, metadata, remote_profile)
|
||||
SELECT
|
||||
'', -- bridge_id
|
||||
mxid, -- user_mxid
|
||||
username || '@s.whatsapp.net', -- id
|
||||
'+' || username, -- remote_name
|
||||
space_room,
|
||||
-- only: postgres
|
||||
jsonb_build_object
|
||||
-- only: sqlite (line commented)
|
||||
-- json_object
|
||||
(
|
||||
'wa_device_id', device,
|
||||
'phone_last_seen', phone_last_seen,
|
||||
'phone_last_pinged', phone_last_pinged,
|
||||
'timezone', timezone
|
||||
) -- metadata
|
||||
FROM user_old
|
||||
WHERE username<>'' AND device<>0;
|
||||
|
||||
INSERT INTO ghost (
|
||||
bridge_id, id, name, avatar_id, avatar_hash, avatar_mxc,
|
||||
name_set, avatar_set, contact_info_set, is_bot, identifiers, metadata
|
||||
)
|
||||
SELECT
|
||||
'', -- bridge_id
|
||||
username, -- id
|
||||
COALESCE(displayname, ''), -- name
|
||||
COALESCE(avatar, ''), -- avatar_id
|
||||
'', -- avatar_hash
|
||||
COALESCE(avatar_url, ''), -- avatar_mxc
|
||||
name_set,
|
||||
avatar_set,
|
||||
contact_info_set,
|
||||
false, -- is_bot
|
||||
'[]', -- identifiers
|
||||
-- only: postgres
|
||||
jsonb_build_object
|
||||
-- only: sqlite (line commented)
|
||||
-- json_object
|
||||
(
|
||||
'last_sync', last_sync,
|
||||
'avatar_fetch_attempted', CASE WHEN avatar<>'' THEN json('true') ELSE json('false') END
|
||||
-- TODO name quality
|
||||
) -- metadata
|
||||
FROM puppet_old;
|
||||
|
||||
INSERT INTO portal (
|
||||
bridge_id, id, receiver, mxid, parent_id, parent_receiver, relay_bridge_id, relay_login_id, other_user_id,
|
||||
name, topic, avatar_id, avatar_hash, avatar_mxc, name_set, avatar_set, topic_set,
|
||||
name_is_custom, in_space, room_type, disappear_type, disappear_timer, metadata
|
||||
)
|
||||
SELECT
|
||||
'', -- bridge_id
|
||||
jid, -- id
|
||||
CASE WHEN receiver LIKE '%@s.whatsapp.net' THEN receiver ELSE '' END, -- receiver
|
||||
mxid,
|
||||
parent_group, -- parent_id
|
||||
'', -- parent_receiver
|
||||
CASE WHEN relay_user_id<>'' THEN '' END, -- relay_bridge_id
|
||||
(SELECT id FROM user_login WHERE user_mxid=relay_user_id), -- relay_login_id
|
||||
CASE WHEN jid LIKE '%@s.whatsapp.net' THEN replace(jid, '@s.whatsapp.net', '') ELSE '' END, -- other_user_id
|
||||
name,
|
||||
topic,
|
||||
avatar, -- avatar_id
|
||||
'', -- avatar_hash
|
||||
COALESCE(avatar_url, ''), -- avatar_mxc
|
||||
name_set,
|
||||
avatar_set,
|
||||
topic_set,
|
||||
jid NOT LIKE '%@s.whatsapp.net', -- name_is_custom
|
||||
in_space,
|
||||
CASE
|
||||
WHEN is_parent THEN 'space'
|
||||
WHEN jid LIKE '%@s.whatsapp.net' THEN 'dm'
|
||||
ELSE ''
|
||||
END, -- room_type
|
||||
CASE WHEN expiration_time>0 THEN 'after_read' END, -- disappear_type
|
||||
CASE WHEN expiration_time > 0 THEN expiration_time * 1000000000 END, -- disappear_timer TODO check multiplier
|
||||
'{}' -- metadata
|
||||
FROM portal_old;
|
||||
|
||||
INSERT INTO user_portal (bridge_id, user_mxid, login_id, portal_id, portal_receiver, in_space, preferred, last_read)
|
||||
SELECT
|
||||
'', -- bridge_id
|
||||
user_mxid,
|
||||
(SELECT id FROM user_login WHERE user_login.user_mxid=user_portal_old.user_mxid), -- login_id
|
||||
portal_jid, -- portal_id
|
||||
CASE WHEN portal_receiver LIKE '%@s.whatsapp.net' THEN portal_receiver ELSE '' END, -- portal_receiver
|
||||
in_space,
|
||||
false, -- preferred
|
||||
last_read_ts * 1000000000 -- last_read TODO check multiplier
|
||||
FROM user_portal_old;
|
||||
|
||||
INSERT INTO message (
|
||||
bridge_id, id, part_id, mxid, room_id, room_receiver, sender_id, sender_mxid, timestamp, edit_count, metadata
|
||||
)
|
||||
SELECT
|
||||
'', -- bridge_id
|
||||
jid, -- id FIXME requires prefix
|
||||
'', -- part_id
|
||||
mxid,
|
||||
chat_jid, -- room_id
|
||||
CASE WHEN chat_receiver LIKE '%@s.whatsapp.net' THEN chat_receiver ELSE '' END, -- room_receiver
|
||||
sender, -- sender_id
|
||||
sender_mxid, -- sender_mxid
|
||||
timestamp * 1000000000, -- timestamp TODO check multiplier
|
||||
0, -- edit_count
|
||||
'{}' -- metadata
|
||||
FROM message_old;
|
||||
|
||||
INSERT INTO reaction (
|
||||
bridge_id, message_id, message_part_id, sender_id, emoji_id, room_id, room_receiver, mxid, timestamp, emoji, metadata
|
||||
)
|
||||
SELECT
|
||||
'', -- bridge_id
|
||||
target_jid, -- message_id FIXME requires prefix
|
||||
'', -- message_part_id
|
||||
sender, -- sender_id
|
||||
'', -- emoji_id
|
||||
chat_jid, -- room_id
|
||||
CASE WHEN chat_receiver LIKE '%@s.whatsapp.net' THEN chat_receiver ELSE '' END, -- room_receiver
|
||||
mxid,
|
||||
0, -- timestamp
|
||||
'', -- emoji
|
||||
'{}' -- metadata
|
||||
FROM reaction_old;
|
||||
|
||||
INSERT INTO disappearing_message (bridge_id, mx_room, mxid, type, timer, disappear_at)
|
||||
SELECT
|
||||
'', -- bridge_id
|
||||
room_id,
|
||||
event_id,
|
||||
'after_read',
|
||||
expire_in * 1000000000, -- timer TODO check multiplier
|
||||
expire_at * 1000000000 -- disappear_at TODO check multiplier
|
||||
FROM disappearing_message_old;
|
||||
|
||||
INSERT INTO backfill_task (
|
||||
bridge_id, portal_id, portal_receiver, user_login_id, batch_count, is_done,
|
||||
cursor, oldest_message_id, dispatched_at, completed_at, next_dispatch_min_ts
|
||||
)
|
||||
SELECT
|
||||
'', -- bridge_id
|
||||
portal_jid, -- portal_id
|
||||
CASE WHEN portal_receiver LIKE '%@s.whatsapp.net' THEN portal_receiver ELSE '' END, -- portal_receiver
|
||||
(SELECT id FROM user_login WHERE user_login.user_mxid=backfill_queue_old.user_mxid), -- user_login_id
|
||||
COUNT(*), -- batch_count
|
||||
COUNT(*) == COUNT(completed_at), -- is_done
|
||||
'', -- cursor
|
||||
'', -- oldest_message_id
|
||||
-- only: postgres
|
||||
EXTRACT(EPOCH FROM MAX(dispatch_time)) * 1000000000, -- dispatched_at
|
||||
-- only: sqlite (line commented)
|
||||
-- unixepoch(MAX(dispatch_time)) * 1000000000,
|
||||
NULL, -- completed_at
|
||||
1 -- next_dispatch_min_ts
|
||||
FROM backfill_queue_old
|
||||
WHERE type IN (0, 200)
|
||||
GROUP BY user_mxid, portal_jid, portal_receiver;
|
||||
|
||||
DROP TABLE backfill_queue_old;
|
||||
DROP TABLE backfill_state_old;
|
||||
DROP TABLE disappearing_message_old;
|
||||
-- TODO migrate these tables
|
||||
-- DROP TABLE history_sync_message_old;
|
||||
-- DROP TABLE history_sync_conversation_old;
|
||||
-- DROP TABLE media_backfill_requests_old;
|
||||
-- DROP TABLE poll_option_id_old;
|
||||
DROP TABLE user_portal_old;
|
||||
DROP TABLE reaction_old;
|
||||
DROP TABLE message_old;
|
||||
DROP TABLE puppet_old;
|
||||
DROP TABLE portal_old;
|
||||
DROP TABLE user_old;
|
|
@ -24,6 +24,15 @@ var m = mxmain.BridgeMain{
|
|||
}
|
||||
|
||||
func main() {
|
||||
m.PostInit = func() {
|
||||
m.CheckLegacyDB(
|
||||
57,
|
||||
"v0.8.6",
|
||||
"v0.11.0",
|
||||
m.LegacyMigrateSimple(legacyMigrateRenameTables, legacyMigrateCopyData, 16),
|
||||
true,
|
||||
)
|
||||
}
|
||||
m.InitVersion(Tag, Commit, BuildTime)
|
||||
m.Run()
|
||||
}
|
||||
|
|
Loading…
Add table
Reference in a new issue