-- Make a copy of finished games in a separate archive database. pragma busy_timeout=10000; attach database 'db' as live; attach database 'archive.db' as archive; -- List finished (and rated) games in live that are not in archive. create temporary view candidates as select game_id from live.rated_games_view where game_id not in (select game_id from archive.games) ; create table if not exists archive.users ( user_id integer primary key, name text unique collate nocase ); create table if not exists archive.players ( game_id integer, role text, user_id integer, primary key (game_id, role) ) without rowid; create table if not exists archive.games ( game_id integer primary key, title_id text, scenario text, options text, player_count integer, ctime datetime, mtime datetime, moves integer, result text ); create table if not exists archive.game_state ( game_id integer primary key, state text ); create table if not exists archive.game_replay ( game_id integer, replay_id integer, role text, action text, arguments json, primary key (game_id, replay_id) ) without rowid; create table if not exists archive.game_chat ( game_id integer, chat_id integer, user_id integer, time datetime, message text, primary key (game_id, chat_id) ) without rowid; drop trigger if exists archive.trigger_delete; create trigger archive.trigger_delete after delete on archive.games begin delete from players where game_id = old.game_id; delete from game_state where game_id = old.game_id; delete from game_replay where game_id = old.game_id; delete from game_chat where game_id = old.game_id; end; begin immediate; select 'ARCHIVING ' || count(*) || ' GAMES' from candidates; insert or ignore into archive.users (user_id, name) select user_id, name from live.users; insert into archive.players (game_id, role, user_id) select game_id, role, user_id from candidates join live.players using(game_id); insert into archive.game_state (game_id, state) select game_id, state from candidates join live.game_state using(game_id); insert into archive.game_replay (game_id, replay_id, role, action, arguments) select game_id, replay_id, role, action, arguments from candidates join live.game_replay using(game_id); insert into archive.game_chat (game_id, chat_id, user_id, time, message) select game_id, chat_id, user_id, time, message from candidates join live.game_chat using(game_id); insert into archive.games (game_id, title_id, scenario, options, player_count, ctime, mtime, moves, result) select game_id, title_id, scenario, options, player_count, ctime, mtime, moves, result from candidates join live.games using(game_id); commit;