@@ -2,25 +2,64 @@ use rusqlite::Connection;
2
2
3
3
use lightning:: io;
4
4
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 < ( ) > {
6
8
assert ! ( from_version < to_version) ;
7
9
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
8
34
let sql = format ! (
9
35
"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
+ ) ;
15
55
io:: Error :: new ( io:: ErrorKind :: Other , msg)
16
56
} ) ?;
17
57
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
+ ) ;
24
63
io:: Error :: new ( io:: ErrorKind :: Other , msg)
25
64
} ) ?;
26
65
}
@@ -30,7 +69,7 @@ pub(super) fn migrate_schema(connection: &Connection, kv_table_name: &str, from_
30
69
#[ cfg( test) ]
31
70
mod tests {
32
71
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 } ;
34
73
35
74
use lightning:: util:: persist:: KVStore ;
36
75
@@ -42,7 +81,7 @@ mod tests {
42
81
fn rwrl_post_schema_1_migration ( ) {
43
82
let old_schema_version = 1 ;
44
83
45
- let mut temp_path = std :: env :: temp_dir ( ) ;
84
+ let mut temp_path = random_storage_path ( ) ;
46
85
temp_path. push ( "rwrl_post_schema_1_migration" ) ;
47
86
48
87
let db_file_name = "test_db" . to_string ( ) ;
@@ -61,18 +100,22 @@ mod tests {
61
100
let connection = Connection :: open ( db_file_path. clone ( ) ) . unwrap ( ) ;
62
101
63
102
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 ( ) ;
67
110
68
111
let sql = format ! (
69
112
"CREATE TABLE IF NOT EXISTS {} (
70
113
namespace TEXT NOT NULL,
71
114
key TEXT NOT NULL CHECK (key <> ''),
72
115
value BLOB, PRIMARY KEY ( namespace, key )
73
116
);" ,
74
- kv_table_name
75
- ) ;
117
+ kv_table_name
118
+ ) ;
76
119
77
120
connection. execute ( & sql, [ ] ) . unwrap ( ) ;
78
121
@@ -83,16 +126,18 @@ mod tests {
83
126
) ;
84
127
let mut stmt = connection. prepare_cached ( & sql) . unwrap ( ) ;
85
128
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 ( ) ;
92
135
93
136
// 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
+ ) ;
96
141
let mut stmt = connection. prepare_cached ( & sql) . unwrap ( ) ;
97
142
98
143
let res: Vec < u8 > = stmt
@@ -102,7 +147,8 @@ mod tests {
102
147
":key" : test_key,
103
148
} ,
104
149
|row| row. get ( 0 ) ,
105
- ) . unwrap ( ) ;
150
+ )
151
+ . unwrap ( ) ;
106
152
107
153
assert_eq ! ( res, test_data) ;
108
154
}
0 commit comments