2021-03-20 18:03:47 +01:00
use rusqlite ::{ Connection , Error , params } ;
pub struct KeyValueTable < ' a > {
db : Connection ,
table_name : & ' a str ,
}
impl < ' a > KeyValueTable < ' a > {
pub fn new ( db_path : & str , table_name : & ' a str ) -> Result < KeyValueTable < ' a > , Error > {
let db = Connection ::open ( db_path ) ? ;
db . execute ( & format! ( " CREATE TABLE IF NOT EXISTS {} (key TEXT PRIMARY KEY, value BLOB) " , table_name ) , [ ] ) ? ;
Ok ( KeyValueTable { db , table_name } )
}
pub fn set ( & self , key : & str , value : & [ u8 ] ) -> Result < usize , Error > {
2021-08-18 16:09:52 +02:00
self . db . execute ( & format! ( " INSERT INTO {} (key, value) VALUES (?1, ?2) " , self . table_name ) , params! [ key , value ] )
2021-03-20 18:03:47 +01:00
}
pub fn get ( & self , key : & str ) -> Result < Vec < u8 > , Error > {
let mut stmt = self . db . prepare ( & format! ( " SELECT value FROM {} WHERE key= \" {} \" " , self . table_name , key ) ) ? ;
let mut rows = stmt . query ( [ ] ) ? ;
match rows . next ( ) ? {
Some ( row ) = > Ok ( row . get ( 0 ) ? ) ,
None = > Err ( rusqlite ::Error ::QueryReturnedNoRows )
}
}
2021-05-26 12:35:12 +02:00
pub fn del ( & self , key : & str ) -> Result < usize , Error > {
self . db . execute ( & format! ( " DELETE FROM {} WHERE key= \" {} \" " , self . table_name , key ) , [ ] )
}
2021-03-20 18:03:47 +01:00
pub fn update ( & self , key : & str , value : & [ u8 ] ) -> Result < usize , Error > {
self . db . execute ( & format! ( " UPDATE {} SET value=? WHERE key= \" {} \" " , self . table_name , key ) , params! [ value ] )
}
2021-05-25 21:59:16 +02:00
pub fn upsert ( & self , key : & str , value : & [ u8 ] ) -> Result < usize , Error > {
2021-05-13 20:28:45 +02:00
self . db . execute ( & format! ( " INSERT INTO {} (key, value) VALUES(?1, ?2) ON CONFLICT(key) DO UPDATE SET value=?3 " , self . table_name ) , params! [ key , value , value ] )
2021-05-25 21:59:16 +02:00
}
2021-03-20 18:03:47 +01:00
}