@@ -2,25 +2,64 @@ use rusqlite::Connection;
22
33use lightning:: io;
44
5- pub ( super ) fn migrate_schema ( connection : & Connection , kv_table_name : & str , from_version : u16 , to_version : u16 ) -> io:: Result < ( ) > {
5+ pub ( super ) fn migrate_schema (
6+ connection : & mut Connection , kv_table_name : & str , from_version : u16 , to_version : u16 ,
7+ ) -> io:: Result < ( ) > {
68 assert ! ( from_version < to_version) ;
79 if from_version == 1 && to_version == 2 {
10+ let tx = connection. transaction ( ) . map_err ( |e| {
11+ let msg = format ! (
12+ "Failed to migrate table {} from user_version {} to {}: {}" ,
13+ kv_table_name, from_version, to_version, e
14+ ) ;
15+ io:: Error :: new ( io:: ErrorKind :: Other , msg)
16+ } ) ?;
17+
18+ // Rename 'namespace' column to 'primary_namespace'
19+ let sql = format ! (
20+ "ALTER TABLE {}
21+ RENAME COLUMN namespace TO primary_namespace;" ,
22+ kv_table_name
23+ ) ;
24+
25+ tx. execute ( & sql, [ ] ) . map_err ( |e| {
26+ let msg = format ! (
27+ "Failed to migrate table {} from user_version {} to {}: {}" ,
28+ kv_table_name, from_version, to_version, e
29+ ) ;
30+ io:: Error :: new ( io:: ErrorKind :: Other , msg)
31+ } ) ?;
32+
33+ // Add new 'secondary_namespace' column
834 let sql = format ! (
935 "ALTER TABLE {}
10- ADD sub_namespace TEXT DEFAULT \" \" NOT NULL;" ,
11- kv_table_name) ;
12- connection . execute ( & sql, [ ] ) . map_err ( |e| {
13- let msg = format ! ( "Failed to migrate table {} from user_version {} to {}: {}" ,
14- kv_table_name, from_version, to_version, e) ;
36+ ADD secondary_namespace TEXT DEFAULT \" \" NOT NULL;" ,
37+ kv_table_name
38+ ) ;
39+
40+ tx. execute ( & sql, [ ] ) . map_err ( |e| {
41+ let msg = format ! (
42+ "Failed to migrate table {} from user_version {} to {}: {}" ,
43+ kv_table_name, from_version, to_version, e
44+ ) ;
45+ io:: Error :: new ( io:: ErrorKind :: Other , msg)
46+ } ) ?;
47+
48+ // Update user_version
49+ tx. pragma ( Some ( rusqlite:: DatabaseName :: Main ) , "user_version" , to_version, |_| Ok ( ( ) ) )
50+ . map_err ( |e| {
51+ let msg = format ! (
52+ "Failed to upgrade user_version from {} to {}: {}" ,
53+ from_version, to_version, e
54+ ) ;
1555 io:: Error :: new ( io:: ErrorKind :: Other , msg)
1656 } ) ?;
1757
18- connection. pragma ( Some ( rusqlite:: DatabaseName :: Main ) ,
19- "user_version" , to_version, |_| {
20- Ok ( ( ) )
21- } ) . map_err ( |e| {
22- let msg = format ! ( "Failed to upgrade user_version from {} to {}: {}" ,
23- from_version, to_version, e) ;
58+ tx. commit ( ) . map_err ( |e| {
59+ let msg = format ! (
60+ "Failed to migrate table {} from user_version {} to {}: {}" ,
61+ kv_table_name, from_version, to_version, e
62+ ) ;
2463 io:: Error :: new ( io:: ErrorKind :: Other , msg)
2564 } ) ?;
2665 }
@@ -30,7 +69,7 @@ pub(super) fn migrate_schema(connection: &Connection, kv_table_name: &str, from_
3069#[ cfg( test) ]
3170mod tests {
3271 use crate :: sqlite_store:: SqliteStore ;
33- use crate :: test_utils:: do_read_write_remove_list_persist;
72+ use crate :: test_utils:: { do_read_write_remove_list_persist, random_storage_path } ;
3473
3574 use lightning:: util:: persist:: KVStore ;
3675
@@ -42,7 +81,7 @@ mod tests {
4281 fn rwrl_post_schema_1_migration ( ) {
4382 let old_schema_version = 1 ;
4483
45- let mut temp_path = std :: env :: temp_dir ( ) ;
84+ let mut temp_path = random_storage_path ( ) ;
4685 temp_path. push ( "rwrl_post_schema_1_migration" ) ;
4786
4887 let db_file_name = "test_db" . to_string ( ) ;
@@ -61,18 +100,22 @@ mod tests {
61100 let connection = Connection :: open ( db_file_path. clone ( ) ) . unwrap ( ) ;
62101
63102 connection
64- . pragma ( Some ( rusqlite:: DatabaseName :: Main ) , "user_version" , old_schema_version, |_| {
65- Ok ( ( ) )
66- } ) . unwrap ( ) ;
103+ . pragma (
104+ Some ( rusqlite:: DatabaseName :: Main ) ,
105+ "user_version" ,
106+ old_schema_version,
107+ |_| Ok ( ( ) ) ,
108+ )
109+ . unwrap ( ) ;
67110
68111 let sql = format ! (
69112 "CREATE TABLE IF NOT EXISTS {} (
70113 namespace TEXT NOT NULL,
71114 key TEXT NOT NULL CHECK (key <> ''),
72115 value BLOB, PRIMARY KEY ( namespace, key )
73116 );" ,
74- kv_table_name
75- ) ;
117+ kv_table_name
118+ ) ;
76119
77120 connection. execute ( & sql, [ ] ) . unwrap ( ) ;
78121
@@ -83,16 +126,18 @@ mod tests {
83126 ) ;
84127 let mut stmt = connection. prepare_cached ( & sql) . unwrap ( ) ;
85128
86- stmt. execute (
87- named_params ! {
88- ":namespace ": test_namespace ,
89- ":key ": test_key ,
90- ":value" : test_data ,
91- } ) . unwrap ( ) ;
129+ stmt. execute ( named_params ! {
130+ ":namespace" : test_namespace ,
131+ ":key ": test_key ,
132+ ":value ": test_data ,
133+ } )
134+ . unwrap ( ) ;
92135
93136 // We read the just written data back to assert it happened.
94- let sql = format ! ( "SELECT value FROM {} WHERE namespace=:namespace AND key=:key;" ,
95- kv_table_name) ;
137+ let sql = format ! (
138+ "SELECT value FROM {} WHERE namespace=:namespace AND key=:key;" ,
139+ kv_table_name
140+ ) ;
96141 let mut stmt = connection. prepare_cached ( & sql) . unwrap ( ) ;
97142
98143 let res: Vec < u8 > = stmt
@@ -102,7 +147,8 @@ mod tests {
102147 ":key" : test_key,
103148 } ,
104149 |row| row. get ( 0 ) ,
105- ) . unwrap ( ) ;
150+ )
151+ . unwrap ( ) ;
106152
107153 assert_eq ! ( res, test_data) ;
108154 }
0 commit comments