@@ -7,7 +7,7 @@ const connect = new Promise((resolve, reject) => {
77 if ( error ) {
88 reject ( error ) ;
99 } else {
10- console . log ( 'i have hereby connected :)' )
10+ console . log ( 'i have hereby connected :)' ) ;
1111 result . exec ( schema , ( execError ) => {
1212 if ( execError ) {
1313 reject ( execError ) ;
@@ -19,18 +19,20 @@ const connect = new Promise((resolve, reject) => {
1919 } ) ;
2020} ) ;
2121
22- const query = ( method ) => async ( ...args ) => {
23- const db = await connect ;
24- return new Promise ( ( resolve , reject ) => {
25- db [ method ] ( ...args , ( error , result ) => {
26- if ( error ) {
27- reject ( error ) ;
28- } else {
29- resolve ( result ) ;
30- }
22+ const query =
23+ ( method ) =>
24+ async ( ...args ) => {
25+ const db = await connect ;
26+ return new Promise ( ( resolve , reject ) => {
27+ db [ method ] ( ...args , ( error , result ) => {
28+ if ( error ) {
29+ reject ( error ) ;
30+ } else {
31+ resolve ( result ) ;
32+ }
33+ } ) ;
3134 } ) ;
32- } ) ;
33- }
35+ } ;
3436
3537const run = query ( 'run' ) ;
3638const get = query ( 'get' ) ;
@@ -50,7 +52,7 @@ export const getSetting = async (name) => {
5052 }
5153
5254 return null ;
53- }
55+ } ;
5456
5557export const getSettings = async ( names ) => {
5658 // TODO: There must be a way to get node-sqlite3 to accept parameters for an
@@ -59,30 +61,47 @@ export const getSettings = async (names) => {
5961 // enforcing elsewhere in business logic, and this exact bit of code will
6062 // likely like to weird bugs in the future, but for now it's maybe better to
6163 // be safe!
62- if ( ! names . every ( name => name . match ( / ^ [ a - z 0 - 9 - _ .\ /] + $ / i) ) ) {
64+ if ( ! names . every ( ( name ) => name . match ( / ^ [ a - z 0 - 9 - _ ./ ] + $ / i) ) ) {
6365 throw new Error ( 'Names contain unexpected characters' ) ;
6466 }
6567
6668 const rows = await all ( `
6769 select name, value
6870 from settings
69- where name in (${ names . map ( n => `'${ n } '` ) . join ( ',' ) } )
71+ where name in (${ names . map ( ( n ) => `'${ n } '` ) . join ( ',' ) } )
7072 ` ) ;
7173
7274 return Object . fromEntries ( rows . map ( ( { name, value } ) => [ name , JSON . parse ( value ) ] ) ) ;
73- }
75+ } ;
7476
75- export const setSetting = async ( name , value ) => {
76- const serializedValue = JSON . stringify ( value ) ;
77+ export const setSettings = async ( obj ) => {
78+ // TODO: See caveat in getSettings
79+ if ( ! Object . keys ( obj ) . every ( ( name ) => name . match ( / ^ [ a - z 0 - 9 - _ ./ ] + $ / i) ) ) {
80+ throw new Error ( 'Names contain unexpected characters' ) ;
81+ }
82+
83+ const values = Object . entries ( obj ) . map (
84+ ( [ name , value ] ) =>
85+ // TODO: Escape this properly
86+ `('${ name } ', '${ JSON . stringify ( value ) . replace ( "'" , "\\'" ) } ')` ,
87+ ) ;
7788
89+ await run ( `
90+ insert into settings
91+ (name, value)
92+ values ${ values . join ( ',' ) }
93+ on conflict (name) do update set value = excluded.value
94+ ` ) ;
95+ } ;
96+
97+ export const setSetting = async ( name , value ) => {
7898 return run (
7999 `
80100 insert into settings (name, value)
81101 values (?, ?)
82- on conflict (name) do update set value = ?
102+ on conflict (name) do update set value = excluded.value
83103 ` ,
84104 name ,
85- serializedValue ,
86- serializedValue
105+ JSON . stringify ( value ) ,
87106 ) ;
88107} ;
0 commit comments