File tree Expand file tree Collapse file tree 5 files changed +40
-1
lines changed Expand file tree Collapse file tree 5 files changed +40
-1
lines changed Original file line number Diff line number Diff line change @@ -39,6 +39,7 @@ const {
3939 statementIsReader,
4040 statementGet,
4141 statementRun,
42+ statementInterrupt,
4243 statementRowsSync,
4344 statementColumns,
4445 statementSafeIntegers,
@@ -384,6 +385,13 @@ class Statement {
384385 }
385386 }
386387
388+ /**
389+ * Interrupts the statement.
390+ */
391+ interrupt ( ) {
392+ statementInterrupt . call ( this . stmt ) ;
393+ }
394+
387395 /**
388396 * Returns the columns in the result set returned by this prepared statement.
389397 */
Original file line number Diff line number Diff line change @@ -328,6 +328,21 @@ test.serial("Database.interrupt()", async (t) => {
328328 } ) ;
329329} ) ;
330330
331+
332+ test . serial ( "Statement.interrupt()" , async ( t ) => {
333+ const db = t . context . db ;
334+ const stmt = await db . prepare ( "WITH RECURSIVE infinite_loop(n) AS (SELECT 1 UNION ALL SELECT n + 1 FROM infinite_loop) SELECT * FROM infinite_loop;" ) ;
335+ const fut = stmt . all ( ) ;
336+ stmt . interrupt ( ) ;
337+ await t . throwsAsync ( async ( ) => {
338+ await fut ;
339+ } , {
340+ instanceOf : t . context . errorType ,
341+ message : 'interrupted' ,
342+ code : 'SQLITE_INTERRUPT'
343+ } ) ;
344+ } ) ;
345+
331346test . serial ( "Concurrent writes over same connection" , async ( t ) => {
332347 const db = t . context . db ;
333348 await db . exec ( `
Original file line number Diff line number Diff line change @@ -52,6 +52,7 @@ const {
5252 statementIsReader,
5353 statementGet,
5454 statementRun,
55+ statementInterrupt,
5556 statementRowsAsync,
5657 statementColumns,
5758 statementSafeIntegers,
@@ -386,6 +387,13 @@ class Statement {
386387 }
387388 }
388389
390+ /**
391+ * Interrupts the statement.
392+ */
393+ interrupt ( ) {
394+ statementInterrupt . call ( this . stmt ) ;
395+ }
396+
389397 /**
390398 * Returns the columns in the result set returned by this prepared statement.
391399 */
Original file line number Diff line number Diff line change @@ -52,6 +52,7 @@ fn main(mut cx: ModuleContext) -> NeonResult<()> {
5252 cx. export_function ( "statementRaw" , Statement :: js_raw) ?;
5353 cx. export_function ( "statementIsReader" , Statement :: js_is_reader) ?;
5454 cx. export_function ( "statementRun" , Statement :: js_run) ?;
55+ cx. export_function ( "statementInterrupt" , Statement :: js_interrupt) ?;
5556 cx. export_function ( "statementGet" , Statement :: js_get) ?;
5657 cx. export_function ( "statementRowsSync" , Statement :: js_rows_sync) ?;
5758 cx. export_function ( "statementRowsAsync" , Statement :: js_rows_async) ?;
Original file line number Diff line number Diff line change 11use neon:: types:: buffer:: TypedArray ;
22use neon:: types:: JsPromise ;
33use neon:: { prelude:: * , types:: JsBigInt } ;
4- use tokio:: time:: Instant ;
54use std:: cell:: RefCell ;
65use std:: sync:: Arc ;
76use tokio:: sync:: Mutex ;
7+ use tokio:: time:: Instant ;
88
99use crate :: errors:: throw_libsql_error;
1010use crate :: runtime;
@@ -119,6 +119,13 @@ impl Statement {
119119 Ok ( info. upcast ( ) )
120120 }
121121
122+ pub fn js_interrupt ( mut cx : FunctionContext ) -> JsResult < JsNull > {
123+ let stmt: Handle < ' _ , JsBox < Statement > > = cx. this ( ) ?;
124+ let mut raw_stmt = stmt. stmt . blocking_lock ( ) ;
125+ raw_stmt. interrupt ( ) ;
126+ Ok ( cx. null ( ) )
127+ }
128+
122129 pub fn js_get ( mut cx : FunctionContext ) -> JsResult < JsValue > {
123130 let stmt: Handle < ' _ , JsBox < Statement > > = cx. this ( ) ?;
124131 let params = cx. argument :: < JsValue > ( 0 ) ?;
You can’t perform that action at this time.
0 commit comments