@@ -78,6 +78,10 @@ pub fn run_migrations(conn: &Connection) -> Result<()> {
7878 migrate_v15 ( conn) ?;
7979 }
8080
81+ if current_version < 16 {
82+ migrate_v16 ( conn) ?;
83+ }
84+
8185 Ok ( ( ) )
8286}
8387
@@ -704,14 +708,6 @@ fn migrate_v15(conn: &Connection) -> Result<()> {
704708 let tx = conn. unchecked_transaction ( ) ?;
705709 tx. execute_batch (
706710 "
707- -- These tables are disposable read-model caches. Recreate them when
708- -- v15 is replayed by rollback/recovery tooling, while keeping the
709- -- ledger and profile table creation strict.
710- DROP TABLE IF EXISTS usage_rollup_state;
711- DROP TABLE IF EXISTS usage_operation_rollups;
712- DROP TABLE IF EXISTS usage_profile_rollups;
713- DROP TABLE IF EXISTS usage_daily_rollups;
714-
715711 CREATE TABLE user_profiles (
716712 profile_id TEXT PRIMARY KEY,
717713 profile_kind TEXT NOT NULL DEFAULT 'local'
@@ -806,9 +802,34 @@ fn migrate_v15(conn: &Connection) -> Result<()> {
806802 ON llm_usage_events(source_installation_id, source_event_id)
807803 WHERE source_installation_id IS NOT NULL AND source_event_id IS NOT NULL;
808804
809- -- Rebuildable usage read-model cache. The append-only ledger above is
810- -- the only fact source; these rows are refreshed lazily from it and
811- -- may be deleted/rebuilt at any time.
805+ INSERT INTO _schema_version (version) VALUES (15);
806+ " ,
807+ ) ?;
808+ tx. commit ( ) ?;
809+ tracing:: info!( "Database migrated to version 15" ) ;
810+ Ok ( ( ) )
811+ }
812+
813+ fn migrate_v16 ( conn : & Connection ) -> Result < ( ) > {
814+ let tx = conn. unchecked_transaction ( ) ?;
815+ reset_usage_rollup_tables ( & tx) ?;
816+ tx. execute ( "INSERT INTO _schema_version (version) VALUES (16)" , [ ] ) ?;
817+ tx. commit ( ) ?;
818+ tracing:: info!( "Database migrated to version 16" ) ;
819+ Ok ( ( ) )
820+ }
821+
822+ fn reset_usage_rollup_tables ( conn : & Connection ) -> Result < ( ) > {
823+ conn. execute_batch (
824+ "
825+ -- These tables are disposable read-model caches. Schema v16 repairs
826+ -- installations that reached v15 before the rollup optimization was
827+ -- added. The append-only ledger remains the only fact source.
828+ DROP TABLE IF EXISTS usage_rollup_state;
829+ DROP TABLE IF EXISTS usage_operation_rollups;
830+ DROP TABLE IF EXISTS usage_profile_rollups;
831+ DROP TABLE IF EXISTS usage_daily_rollups;
832+
812833 CREATE TABLE usage_rollup_state (
813834 profile_id TEXT PRIMARY KEY,
814835 last_event_rowid INTEGER NOT NULL DEFAULT 0,
@@ -849,12 +870,8 @@ fn migrate_v15(conn: &Connection) -> Result<()> {
849870 PRIMARY KEY (profile_id, local_date),
850871 FOREIGN KEY (profile_id) REFERENCES user_profiles(profile_id) ON DELETE CASCADE
851872 ) WITHOUT ROWID;
852-
853- INSERT INTO _schema_version (version) VALUES (15);
854873 " ,
855874 ) ?;
856- tx. commit ( ) ?;
857- tracing:: info!( "Database migrated to version 15" ) ;
858875 Ok ( ( ) )
859876}
860877
0 commit comments