@@ -6,7 +6,7 @@ export * from './sqlite-constants.js';
66const MAX_INT64 = 0x7fffffffffffffffn ;
77const MIN_INT64 = - 0x8000000000000000n ;
88
9- const AsyncFunction = Object . getPrototypeOf ( async function ( ) { } ) . constructor ;
9+ const AsyncFunction = Object . getPrototypeOf ( async function ( ) { } ) . constructor ;
1010
1111export class SQLiteError extends Error {
1212 constructor ( message , code ) {
@@ -248,7 +248,7 @@ export function Factory(Module) {
248248 return check ( fname , result , mapStmtToDB . get ( stmt ) ) ;
249249 } ;
250250 } ) ( ) ;
251-
251+
252252 sqlite3 . close = ( function ( ) {
253253 const fname = 'sqlite3_close' ;
254254 const f = Module . cwrap ( fname , ...decl ( 'n:n' ) , { async } ) ;
@@ -388,7 +388,7 @@ export function Factory(Module) {
388388
389389 sqlite3 . create_function = function ( db , zFunctionName , nArg , eTextRep , pApp , xFunc , xStep , xFinal ) {
390390 verifyDatabase ( db ) ;
391-
391+
392392 // Convert SQLite callback arguments to JavaScript-friendly arguments.
393393 function adapt ( f ) {
394394 return f instanceof AsyncFunction ?
@@ -640,7 +640,7 @@ export function Factory(Module) {
640640 const result = Module . set_authorizer ( db , adapt ( xAuth ) , pApp ) ;
641641 return check ( 'sqlite3_set_authorizer' , result , db ) ;
642642 } ; ;
643-
643+
644644 sqlite3 . sql = ( function ( ) {
645645 const fname = 'sqlite3_sql' ;
646646 const f = Module . cwrap ( fname , ...decl ( 'n:s' ) ) ;
@@ -673,7 +673,7 @@ export function Factory(Module) {
673673 onFinally . push ( ( ) => Module . _sqlite3_free ( pzHead ) ) ;
674674 Module . HEAPU8 . set ( utf8 , pzHead ) ;
675675 Module . HEAPU8 [ pzEnd - 1 ] = 0 ;
676-
676+
677677 // Use extra space for the statement handle and SQL tail pointer.
678678 const pStmt = pzHead + allocSize - 8 ;
679679 const pzTail = pzHead + allocSize - 4 ;
@@ -687,7 +687,7 @@ export function Factory(Module) {
687687 stmt = 0 ;
688688 }
689689 onFinally . push ( maybeFinalize ) ;
690-
690+
691691 // Loop over statements.
692692 Module . setValue ( pzTail , pzHead , '*' ) ;
693693 do {
@@ -710,7 +710,7 @@ export function Factory(Module) {
710710 if ( rc !== SQLite . SQLITE_OK ) {
711711 check ( 'sqlite3_prepare_v3' , rc , db ) ;
712712 }
713-
713+
714714 stmt = Module . getValue ( pStmt , '*' ) ;
715715 if ( stmt ) {
716716 mapStmtToDB . set ( stmt , db ) ;
@@ -752,7 +752,7 @@ export function Factory(Module) {
752752 iUpdateType ,
753753 Module . UTF8ToString ( dbName ) ,
754754 Module . UTF8ToString ( tblName ) ,
755- cvt32x2ToBigInt ( lo32 , hi32 )
755+ cvt32x2ToBigInt ( lo32 , hi32 )
756756 ] ;
757757 } ;
758758 function adapt ( f ) {
@@ -762,7 +762,39 @@ export function Factory(Module) {
762762 }
763763
764764 Module . update_hook ( db , adapt ( xUpdateHook ) ) ;
765- } ; ;
765+ } ;
766+
767+ sqlite3 . trace = function ( db , mTrace , xTrace ) {
768+ verifyDatabase ( db )
769+
770+ function cvtArgs ( opCode , _pP , pX ) {
771+ // NOTE: only SQLITE_TRACE_STMT is currently implemented
772+ switch ( opCode ) {
773+ case SQLite . SQLITE_TRACE_STMT :
774+ return [
775+ opCode ,
776+ "SQLITE_TRACE_STMT" ,
777+ Module . UTF8ToString ( pX )
778+ ]
779+ default :
780+ // TODO: implement other variants
781+ return [
782+ opCode ,
783+ "UNSUPPORTED_OP" ,
784+ null
785+ ]
786+ }
787+ }
788+
789+ function adapt ( f ) {
790+ return f instanceof AsyncFunction ?
791+ ( async ( opCode , pP , pX ) => f ( ...cvtArgs ( opCode , pP , pX ) ) ) :
792+ ( ( opCode , pP , pX ) => f ( ...cvtArgs ( opCode , pP , pX ) ) )
793+ }
794+
795+ Module . trace ( db , mTrace , adapt ( xTrace ) )
796+ }
797+
766798
767799 sqlite3 . value = function ( pValue ) {
768800 const type = sqlite3 . value_type ( pValue ) ;
@@ -876,7 +908,7 @@ export function Factory(Module) {
876908 await Promise . all ( Module . retryOps ) ;
877909 Module . retryOps = [ ] ;
878910 }
879-
911+
880912 rc = await f ( ) ;
881913
882914 // Retry on failure with new pending retry operations.
0 commit comments