@@ -26,9 +26,30 @@ export interface JsNativeDatabaseLike {
2626 exec ( sql : string ) : Promise < NativeExecResult > ;
2727 query ( sql : string , params ?: NativeBindParam [ ] | null ) : Promise < NativeQueryResult > ;
2828 run ( sql : string , params ?: NativeBindParam [ ] | null ) : Promise < NativeRunResult > ;
29+ takeLastKvError ?( ) : string | null ;
2930 close ( ) : Promise < void > ;
3031}
3132
33+ function shouldAttachNativeKvError ( message : string ) : boolean {
34+ return / i \/ o e r r o r | u n a b l e t o o p e n d a t a b a s e f i l e / i. test ( message ) ;
35+ }
36+
37+ function enrichNativeDatabaseError (
38+ database : JsNativeDatabaseLike ,
39+ error : unknown ,
40+ ) : never {
41+ const kvError = database . takeLastKvError ?.( ) ;
42+ if (
43+ error instanceof Error &&
44+ kvError &&
45+ shouldAttachNativeKvError ( error . message ) &&
46+ ! error . message . includes ( kvError )
47+ ) {
48+ error . message = `${ error . message } (native sqlite kv error: ${ kvError } )` ;
49+ }
50+ throw error ;
51+ }
52+
3253function toNativeBinding ( arg : unknown ) : NativeBindParam {
3354 if ( arg === null || arg === undefined ) {
3455 return { kind : "null" } ;
@@ -126,7 +147,12 @@ export function wrapJsNativeDatabase(
126147 sql : string ,
127148 callback ?: ( row : unknown [ ] , columns : string [ ] ) => void ,
128149 ) : Promise < void > {
129- const result = await database . exec ( sql ) ;
150+ let result : NativeExecResult ;
151+ try {
152+ result = await database . exec ( sql ) ;
153+ } catch ( error ) {
154+ enrichNativeDatabaseError ( database , error ) ;
155+ }
130156 if ( ! callback ) {
131157 return ;
132158 }
@@ -135,10 +161,18 @@ export function wrapJsNativeDatabase(
135161 }
136162 } ,
137163 async run ( sql : string , params ?: SqliteBindings ) : Promise < void > {
138- await database . run ( sql , toNativeBindings ( sql , params ) ) ;
164+ try {
165+ await database . run ( sql , toNativeBindings ( sql , params ) ) ;
166+ } catch ( error ) {
167+ enrichNativeDatabaseError ( database , error ) ;
168+ }
139169 } ,
140170 async query ( sql : string , params ?: SqliteBindings ) {
141- return await database . query ( sql , toNativeBindings ( sql , params ) ) ;
171+ try {
172+ return await database . query ( sql , toNativeBindings ( sql , params ) ) ;
173+ } catch ( error ) {
174+ enrichNativeDatabaseError ( database , error ) ;
175+ }
142176 } ,
143177 async close ( ) : Promise < void > {
144178 await database . close ( ) ;
0 commit comments