@@ -3,6 +3,7 @@ use crate::utils::check_namespace_key_validity;
3
3
4
4
use lightning:: util:: persist:: KVStore ;
5
5
use lightning:: util:: string:: PrintableString ;
6
+ use lightning:: io;
6
7
7
8
use rusqlite:: { named_params, Connection } ;
8
9
@@ -35,41 +36,49 @@ impl SqliteStore {
35
36
/// given `db_file_name` (or the default to [`DEFAULT_SQLITE_DB_FILE_NAME`] if set to `None`).
36
37
///
37
38
/// Similarly, the given `kv_table_name` will be used or default to [`DEFAULT_KV_TABLE_NAME`].
38
- pub fn new ( data_dir : PathBuf , db_file_name : Option < String > , kv_table_name : Option < String > ) -> Self {
39
+ pub fn new ( data_dir : PathBuf , db_file_name : Option < String > , kv_table_name : Option < String > ) -> io :: Result < Self > {
39
40
let db_file_name = db_file_name. unwrap_or ( DEFAULT_SQLITE_DB_FILE_NAME . to_string ( ) ) ;
40
41
let kv_table_name = kv_table_name. unwrap_or ( DEFAULT_KV_TABLE_NAME . to_string ( ) ) ;
41
42
42
- fs:: create_dir_all ( data_dir. clone ( ) ) . unwrap_or_else ( |_| {
43
- panic ! ( "Failed to create database destination directory: {}" , data_dir. display( ) )
44
- } ) ;
43
+ fs:: create_dir_all ( data_dir. clone ( ) ) . map_err ( |e| {
44
+ let msg = format ! ( "Failed to create database destination directory {}: {}" ,
45
+ data_dir. display( ) , e) ;
46
+ io:: Error :: new ( io:: ErrorKind :: Other , msg)
47
+ } ) ?;
45
48
let mut db_file_path = data_dir. clone ( ) ;
46
49
db_file_path. push ( db_file_name) ;
47
50
48
- let connection = Connection :: open ( db_file_path. clone ( ) ) . unwrap_or_else ( |_| {
49
- panic ! ( "Failed to open/create database file: {}" , db_file_path. display( ) )
50
- } ) ;
51
+ let connection = Connection :: open ( db_file_path. clone ( ) ) . map_err ( |e| {
52
+ let msg = format ! ( "Failed to open/create database file {}: {}" ,
53
+ db_file_path. display( ) , e) ;
54
+ io:: Error :: new ( io:: ErrorKind :: Other , msg)
55
+ } ) ?;
51
56
52
- connection
53
- . pragma ( Some ( rusqlite :: DatabaseName :: Main ) , "user_version" , SCHEMA_USER_VERSION , |_| {
57
+ connection. pragma ( Some ( rusqlite :: DatabaseName :: Main ) ,
58
+ "user_version" , SCHEMA_USER_VERSION , |_| {
54
59
Ok ( ( ) )
55
- } )
56
- . unwrap_or_else ( |_| panic ! ( "Failed to set PRAGMA user_version" ) ) ;
60
+ } ) . map_err ( |e| {
61
+ let msg = format ! ( "Failed to set PRAGMA user_version: {}" , e) ;
62
+ io:: Error :: new ( io:: ErrorKind :: Other , msg)
63
+ } ) ?;
57
64
58
65
let sql = format ! (
59
66
"CREATE TABLE IF NOT EXISTS {} (
60
67
namespace TEXT NOT NULL,
61
68
sub_namespace TEXT DEFAULT \" \" NOT NULL,
62
69
key TEXT NOT NULL CHECK (key <> ''),
63
70
value BLOB, PRIMARY KEY ( namespace, sub_namespace, key )
64
- );" ,
71
+ );" ,
65
72
kv_table_name
66
73
) ;
67
- connection
68
- . execute ( & sql, [ ] )
69
- . unwrap_or_else ( |_| panic ! ( "Failed to create table: {}" , kv_table_name) ) ;
74
+
75
+ connection. execute ( & sql, [ ] ) . map_err ( |e| {
76
+ let msg = format ! ( "Failed to create table {}: {}" , kv_table_name, e) ;
77
+ io:: Error :: new ( io:: ErrorKind :: Other , msg)
78
+ } ) ?;
70
79
71
80
let connection = Arc :: new ( Mutex :: new ( connection) ) ;
72
- Self { connection, data_dir, kv_table_name }
81
+ Ok ( Self { connection, data_dir, kv_table_name } )
73
82
}
74
83
75
84
/// Returns the data directory.
@@ -231,16 +240,16 @@ mod tests {
231
240
fn read_write_remove_list_persist ( ) {
232
241
let mut temp_path = std:: env:: temp_dir ( ) ;
233
242
temp_path. push ( "read_write_remove_list_persist" ) ;
234
- let store = SqliteStore :: new ( temp_path, Some ( "test_db" . to_string ( ) ) , Some ( "test_table" . to_string ( ) ) ) ;
243
+ let store = SqliteStore :: new ( temp_path, Some ( "test_db" . to_string ( ) ) , Some ( "test_table" . to_string ( ) ) ) . unwrap ( ) ;
235
244
do_read_write_remove_list_persist ( & store) ;
236
245
}
237
246
238
247
#[ test]
239
248
fn test_sqlite_store ( ) {
240
249
let mut temp_path = std:: env:: temp_dir ( ) ;
241
250
temp_path. push ( "test_sqlite_store" ) ;
242
- let store_0 = SqliteStore :: new ( temp_path. clone ( ) , Some ( "test_db_0" . to_string ( ) ) , Some ( "test_table" . to_string ( ) ) ) ;
243
- let store_1 = SqliteStore :: new ( temp_path, Some ( "test_db_1" . to_string ( ) ) , Some ( "test_table" . to_string ( ) ) ) ;
251
+ let store_0 = SqliteStore :: new ( temp_path. clone ( ) , Some ( "test_db_0" . to_string ( ) ) , Some ( "test_table" . to_string ( ) ) ) . unwrap ( ) ;
252
+ let store_1 = SqliteStore :: new ( temp_path, Some ( "test_db_1" . to_string ( ) ) , Some ( "test_table" . to_string ( ) ) ) . unwrap ( ) ;
244
253
do_test_store ( & store_0, & store_1)
245
254
}
246
255
}
@@ -252,8 +261,8 @@ pub mod bench {
252
261
253
262
/// Bench!
254
263
pub fn bench_sends ( bench : & mut Criterion ) {
255
- let store_a = super :: SqliteStore :: new ( "bench_sqlite_store_a" . into ( ) , None , None ) ;
256
- let store_b = super :: SqliteStore :: new ( "bench_sqlite_store_b" . into ( ) , None , None ) ;
264
+ let store_a = super :: SqliteStore :: new ( "bench_sqlite_store_a" . into ( ) , None , None ) . unwrap ( ) ;
265
+ let store_b = super :: SqliteStore :: new ( "bench_sqlite_store_b" . into ( ) , None , None ) . unwrap ( ) ;
257
266
lightning:: ln:: channelmanager:: bench:: bench_two_sends (
258
267
bench, "bench_sqlite_persisted_sends" , store_a, store_b) ;
259
268
}
0 commit comments