@@ -73,6 +73,17 @@ NODE_MODULE_INIT(/* exports, context */) {
7373	exports->Set (context, InternalizedFromLatin1 (isolate, " Backup" Backup::Init (isolate, data)).FromJust ();
7474	exports->Set (context, InternalizedFromLatin1 (isolate, " setErrorConstructor" v8::FunctionTemplate::New (isolate, Addon::JS_setErrorConstructor, data)->GetFunction (context).ToLocalChecked ()).FromJust ();
7575
76+ 	//  Export SQLITE_SCANSTAT_* constants
77+ 	exports->Set (context, InternalizedFromLatin1 (isolate, " SQLITE_SCANSTAT_NLOOP" v8::Int32::New (isolate, SQLITE_SCANSTAT_NLOOP)).FromJust ();
78+ 	exports->Set (context, InternalizedFromLatin1 (isolate, " SQLITE_SCANSTAT_NVISIT" v8::Int32::New (isolate, SQLITE_SCANSTAT_NVISIT)).FromJust ();
79+ 	exports->Set (context, InternalizedFromLatin1 (isolate, " SQLITE_SCANSTAT_EST" v8::Int32::New (isolate, SQLITE_SCANSTAT_EST)).FromJust ();
80+ 	exports->Set (context, InternalizedFromLatin1 (isolate, " SQLITE_SCANSTAT_NAME" v8::Int32::New (isolate, SQLITE_SCANSTAT_NAME)).FromJust ();
81+ 	exports->Set (context, InternalizedFromLatin1 (isolate, " SQLITE_SCANSTAT_EXPLAIN" v8::Int32::New (isolate, SQLITE_SCANSTAT_EXPLAIN)).FromJust ();
82+ 	exports->Set (context, InternalizedFromLatin1 (isolate, " SQLITE_SCANSTAT_SELECTID" v8::Int32::New (isolate, SQLITE_SCANSTAT_SELECTID)).FromJust ();
83+ 	exports->Set (context, InternalizedFromLatin1 (isolate, " SQLITE_SCANSTAT_PARENTID" v8::Int32::New (isolate, SQLITE_SCANSTAT_PARENTID)).FromJust ();
84+ 	exports->Set (context, InternalizedFromLatin1 (isolate, " SQLITE_SCANSTAT_NCYCLE" v8::Int32::New (isolate, SQLITE_SCANSTAT_NCYCLE)).FromJust ();
85+ 	exports->Set (context, InternalizedFromLatin1 (isolate, " SQLITE_SCANSTAT_COMPLEX" v8::Int32::New (isolate, SQLITE_SCANSTAT_COMPLEX)).FromJust ();
86+ 
7687	//  Store addon instance data.
7788	addon->Statement .Reset (isolate, exports->Get (context, InternalizedFromLatin1 (isolate, " Statement" ToLocalChecked ().As <v8::Function>());
7889	addon->StatementIterator .Reset (isolate, exports->Get (context, InternalizedFromLatin1 (isolate, " StatementIterator" ToLocalChecked ().As <v8::Function>());
@@ -773,6 +784,7 @@ v8::Local <v8 :: Function> Statement::Init (v8::Isolate * isolate, v8::Local <v8
773784                SetPrototypeMethod (isolate, data, t, " raw" 
774785                SetPrototypeMethod (isolate, data, t, " safeIntegers" 
775786                SetPrototypeMethod (isolate, data, t, " columns" 
787+                 SetPrototypeMethod (isolate, data, t, " scanStatusV2" 
776788                SetPrototypeGetter (isolate, data, t, " busy" 
777789                return  t->GetFunction ( isolate -> GetCurrentContext  ( ) ).ToLocalChecked ();
778790}
@@ -1083,9 +1095,59 @@ void Statement::JS_columns (v8::FunctionCallbackInfo <v8 :: Value> const & info)
10831095
10841096                info.GetReturnValue ().Set (columns);
10851097}
1086- #line  321 "./src/objects/statement.lzz"
1098+ #line  322 "./src/objects/statement.lzz"
1099+ void  Statement::JS_scanStatusV2  (v8::FunctionCallbackInfo <v8 :: Value> const  & info)
1100+ #line  322 "./src/objects/statement.lzz"
1101+                                                      {
1102+                 Statement* stmt = node :: ObjectWrap :: Unwrap <Statement>(info.This ());
1103+                 if  (!stmt->db ->GetState ()->open ) return  ThrowTypeError (" The database connection is not open" 
1104+                 if  (!stmt->alive ) return  ThrowTypeError (" The statement has been finalized and can no longer be used" 
1105+ 
1106+                 int  idx; if  (info.Length () < (0  + 1 ) || !info[0 ]->IsInt32 ()) return  ThrowTypeError (" Expected " " first" "  argument to be " " a 32-bit signed integer" 0 ].As <v8::Int32>()->Value ());;
1107+                 int  iScanStatusOp; if  (info.Length () < (1  + 1 ) || !info[1 ]->IsInt32 ()) return  ThrowTypeError (" Expected " " second" "  argument to be " " a 32-bit signed integer" 1 ].As <v8::Int32>()->Value ());;
1108+                 int  flags; if  (info.Length () < (2  + 1 ) || !info[2 ]->IsInt32 ()) return  ThrowTypeError (" Expected " " third" "  argument to be " " a 32-bit signed integer" 2 ].As <v8::Int32>()->Value ());;
1109+ 
1110+                 v8::Isolate* isolate = info.GetIsolate ();;
1111+ 
1112+                 //  Based on iScanStatusOp, we know what type of output to expect
1113+                 int  rc;
1114+                 if  (iScanStatusOp == 0  || iScanStatusOp == 1  || iScanStatusOp == 5  || iScanStatusOp == 6  || iScanStatusOp == 7 ) {
1115+                         //  NLOOP, NVISIT, SELECTID, PARENTID, NCYCLE - return sqlite3_int64
1116+                         sqlite3_int64 iOut;
1117+                         rc = sqlite3_stmt_scanstatus_v2 (stmt->handle , idx, iScanStatusOp, flags, (void *)&iOut);
1118+                         if  (rc == 0 ) {
1119+                                 info.GetReturnValue ().Set (stmt->safe_ints 
1120+                                         ? v8::BigInt::New (isolate, iOut).As <v8::Value>()
1121+                                         : v8::Number::New (isolate, (double )iOut).As <v8::Value>());
1122+                                 return ;
1123+                         }
1124+                 } else  if  (iScanStatusOp == 2 ) {
1125+                         //  EST - return double
1126+                         double  dOut;
1127+                         rc = sqlite3_stmt_scanstatus_v2 (stmt->handle , idx, iScanStatusOp, flags, (void *)&dOut);
1128+                         if  (rc == 0 ) {
1129+                                 info.GetReturnValue ().Set (v8::Number::New (isolate, dOut));
1130+                                 return ;
1131+                         }
1132+                 } else  if  (iScanStatusOp == 3  || iScanStatusOp == 4 ) {
1133+                         //  NAME, EXPLAIN - return const char*
1134+                         const  char * zOut;
1135+                         rc = sqlite3_stmt_scanstatus_v2 (stmt->handle , idx, iScanStatusOp, flags, (void *)&zOut);
1136+                         if  (rc == 0  && zOut != NULL ) {
1137+                                 info.GetReturnValue ().Set (StringFromUtf8 (isolate, zOut, -1 ));
1138+                                 return ;
1139+                         } else  if  (rc == 0 ) {
1140+                                 info.GetReturnValue ().Set (v8::Null (isolate));
1141+                                 return ;
1142+                         }
1143+                 }
1144+ 
1145+                 //  Error or invalid operation - return undefined
1146+                 info.GetReturnValue ().Set (v8::Undefined (isolate));
1147+ }
1148+ #line  370 "./src/objects/statement.lzz"
10871149void  Statement::JS_busy  (v8::Local <v8 :: Name> _, v8::PropertyCallbackInfo <v8 :: Value> const  & info)
1088- #line  321  "./src/objects/statement.lzz"
1150+ #line  370  "./src/objects/statement.lzz"
10891151                             {
10901152                Statement* stmt = node :: ObjectWrap :: Unwrap <Statement>(info.This ());
10911153                info.GetReturnValue ().Set (stmt->alive  && stmt->locked );
0 commit comments