@@ -255,6 +255,9 @@ Fsqlite3_execute(emacs_env *env, ptrdiff_t nargs, emacs_value args[], void *data
255
255
sqlite3 * sdb = env -> get_user_ptr (env , args [0 ]);
256
256
ptrdiff_t size ;
257
257
char * query = retrieve_string (env , args [1 ], & size );
258
+ emacs_value Qnil = env -> intern (env , "nil" );
259
+ emacs_value retval = Qnil ;
260
+ const char * errmsg = NULL ;
258
261
259
262
sqlite3_stmt * stmt = NULL ;
260
263
int ret = sqlite3_prepare_v2 (sdb , query , size , & stmt , NULL );
@@ -263,12 +266,11 @@ Fsqlite3_execute(emacs_env *env, ptrdiff_t nargs, emacs_value args[], void *data
263
266
sqlite3_finalize (stmt );
264
267
}
265
268
266
- free (query );
267
- return env -> intern (env , "nil" );
269
+ goto exit ;
268
270
}
269
271
270
272
emacs_value Qcons = env -> intern (env , "cons" );
271
- emacs_value fields = env -> intern ( env , "nil" ) ;
273
+ emacs_value fields = Qnil ;
272
274
int count = sqlite3_column_count (stmt );
273
275
for (int i = 0 ; i < count ; ++ i ) {
274
276
const char * name = sqlite3_column_name (stmt , i );
@@ -291,7 +293,8 @@ Fsqlite3_execute(emacs_env *env, ptrdiff_t nargs, emacs_value args[], void *data
291
293
result -> stmt = stmt ;
292
294
result -> fields = fields ;
293
295
result -> eof = false;
294
- return env -> make_user_ptr (env , el_sqlite3_resultset_free , result );
296
+ retval = env -> make_user_ptr (env , el_sqlite3_resultset_free , result );
297
+ goto exit ;
295
298
}
296
299
297
300
while ((ret = sqlite3_step (stmt )) == SQLITE_ROW ) {
@@ -302,11 +305,16 @@ Fsqlite3_execute(emacs_env *env, ptrdiff_t nargs, emacs_value args[], void *data
302
305
}
303
306
304
307
sqlite3_finalize (stmt );
305
- if (ret != SQLITE_OK && ret != SQLITE_DONE ) {
306
- return env -> intern (env , "nil" );
308
+
309
+ exit :
310
+ free (query );
311
+
312
+ if (errmsg != NULL ) {
313
+ emacs_value errstr = env -> make_string (env , errmsg , strlen (errmsg ));
314
+ env -> non_local_exit_signal (env , env -> intern (env , "error" ), errstr );
307
315
}
308
316
309
- return env -> intern ( env , "nil" ) ;
317
+ return retval ;
310
318
}
311
319
312
320
static emacs_value
0 commit comments