Преглед на файлове

Add new function to retrieve the database from a statement.

mingodad преди 13 години
родител
ревизия
803ba8449a
променени са 1 файла, в които са добавени 27 реда и са изтрити 0 реда
  1. 27 0
      ext/sq_sqlite3.cpp

+ 27 - 0
ext/sq_sqlite3.cpp

@@ -265,6 +265,18 @@ static SQRESULT sq_sqlite3_stmt_constructor(HSQUIRRELVM v)
 	return _rc_;
 }
 
+static SQRESULT sq_sqlite3_stmt_get_db(HSQUIRRELVM v){
+	SQ_FUNC_VARS_NO_TOP(v);
+	GET_sqlite3_stmt_INSTANCE();
+	sqlite3 *db = sqlite3_db_handle(self);
+	sq_pushuserpointer(v, db);
+	if(sq_getonregistrytable(v) == SQ_OK){
+	    sq_getweakrefval(v, -1);
+	}
+	else return sq_throwerror(v, _SC("could not retrive database, maybe it was already closed"));
+	return 1;
+}
+
 static SQRESULT sq_sqlite3_stmt_finalize(HSQUIRRELVM v){
 	SQ_FUNC_VARS_NO_TOP(v);
 	GET_sqlite3_stmt_INSTANCE();
@@ -900,6 +912,7 @@ static SQRegFunction sq_sqlite3_stmt_methods[] =
 {
 	_DECL_FUNC(constructor,  -2, _SC("xxs s|n|b|o")),
 
+	_DECL_FUNC(get_db,  1, _SC("x")),
 	_DECL_FUNC(finalize,  1, _SC("x")),
 	_DECL_FUNC(prepare,  -2, _SC("xs s|n|b|o")),
 	_DECL_FUNC(get_sql,  1, _SC("x")),
@@ -979,6 +992,13 @@ static SQRESULT sq_sqlite3_close_release(HSQUIRRELVM v, sq_sqlite3_sdb *sdb){
 	if(sdb){
         if(sqlite3_close_v2(sdb->db) == SQLITE_OK){
             rc = SQ_OK;
+
+            //remove waekref from registrytable
+            sq_pushregistrytable(sdb->v);
+            sq_pushuserpointer(sdb->v, sdb->db);
+            sq_deleteslot(sdb->v, -2, SQFalse);
+            sq_poptop(sdb->v);
+
 	if(sdb->func){
         sq_sqlite3_sdb_func *func, *func_next;
         func = sdb->func;
@@ -1036,6 +1056,12 @@ static SQRESULT sq_sqlite3_constructor(HSQUIRRELVM v)
 
     sq_setinstanceup(v, 1, sdb);
     sq_setreleasehook(v,1, sq_sqlite3_releasehook);
+
+    //save a weakref to allow statement return it's db
+    sq_pushuserpointer(v, sdb->db);
+    sq_weakref(v, 1);
+    sq_setonregistrytable(v);
+
     return 1;
 }
 
@@ -1900,6 +1926,7 @@ extern "C" {
         INT_CONST(v,SQLITE_OPEN_SUBLATIN_NA_LIKE);
 
         INT_CONST(v,SQLITE_OK);
+        INT_CONST(v,SQLITE_INTERRUPT);
 
         //push sqlite3_NULL as a member
         sq_pushstring(v, nullName,-1);