@@ -1129,6 +1129,34 @@ exqlite_set_log_hook(ErlNifEnv* env, int argc, const ERL_NIF_TERM argv[])
11291129 return make_atom (env , "ok" );
11301130}
11311131
1132+ ///
1133+ /// @brief Interrupt a long-running query.
1134+ ///
1135+ static ERL_NIF_TERM
1136+ exqlite_interrupt (ErlNifEnv * env , int argc , const ERL_NIF_TERM argv [])
1137+ {
1138+ assert (env );
1139+
1140+ connection_t * conn = NULL ;
1141+
1142+ if (argc != 1 ) {
1143+ return enif_make_badarg (env );
1144+ }
1145+
1146+ if (!enif_get_resource (env , argv [0 ], connection_type , (void * * )& conn )) {
1147+ return make_error_tuple (env , "invalid_connection" );
1148+ }
1149+
1150+ // DB is already closed, nothing to do here
1151+ if (conn -> db == NULL ) {
1152+ return make_atom (env , "ok" );
1153+ }
1154+
1155+ sqlite3_interrupt (conn -> db );
1156+
1157+ return make_atom (env , "ok" );
1158+ }
1159+
11321160//
11331161// Most of our nif functions are going to be IO bounded
11341162//
@@ -1151,6 +1179,7 @@ static ErlNifFunc nif_funcs[] = {
11511179 {"enable_load_extension" , 2 , exqlite_enable_load_extension , ERL_NIF_DIRTY_JOB_IO_BOUND },
11521180 {"set_update_hook" , 2 , exqlite_set_update_hook , ERL_NIF_DIRTY_JOB_IO_BOUND },
11531181 {"set_log_hook" , 1 , exqlite_set_log_hook , ERL_NIF_DIRTY_JOB_IO_BOUND },
1182+ {"interrupt" , 1 , exqlite_interrupt , ERL_NIF_DIRTY_JOB_IO_BOUND },
11541183};
11551184
11561185ERL_NIF_INIT (Elixir .Exqlite .Sqlite3NIF , nif_funcs , on_load , NULL , NULL , on_unload )
0 commit comments