Skip to content

Commit 260e8ee

Browse files
committed
f Account for renamed namespaces
1 parent 56d7566 commit 260e8ee

File tree

4 files changed

+223
-107
lines changed

4 files changed

+223
-107
lines changed

lightning-persister/Cargo.toml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -32,3 +32,4 @@ criterion = { version = "0.4", optional = true, default-features = false }
3232
lightning = { version = "0.0.117-alpha2", path = "../lightning", features = ["_test_utils"] }
3333
bitcoin = { version = "0.29.0", default-features = false }
3434
rusqlite = { version = "0.28.0", default-features = false, features = ["bundled"]}
35+
rand = "0.8.5"

lightning-persister/src/sqlite_store/migrations.rs

Lines changed: 74 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -2,25 +2,64 @@ use rusqlite::Connection;
22

33
use 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)]
3170
mod 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

Comments
 (0)