ソースを参照

Expose sqlite3_get/set_auxdata to SquiLu scripts.

mingodad 9 年 前
コミット
19ae489091
1 ファイル変更50 行追加4 行削除
  1. 50 4
      SquiLu-ext/sq_sqlite3.cpp

+ 50 - 4
SquiLu-ext/sq_sqlite3.cpp

@@ -2263,10 +2263,54 @@ static SQRESULT sq_sqlite3_context_aggregate_count(HSQUIRRELVM v)
     return 1;
 }
 
-#if 0
-void *sqlite3_get_auxdata(sqlite3_context*, int);
-void sqlite3_set_auxdata(sqlite3_context*, int, void*, void (*)(void*));
-#endif
+struct sq_sqlite3_context_aux_data_st
+{
+    HSQUIRRELVM vm;
+    HSQOBJECT data;
+};
+
+static SQRESULT sq_sqlite3_context_get_aux_data(HSQUIRRELVM v)
+{
+    SQ_FUNC_VARS_NO_TOP(v);
+    GET_sqlite3_context_INSTANCE();
+    SQ_GET_INTEGER(v, 2, argn);
+    sq_sqlite3_context_aux_data_st *data = (sq_sqlite3_context_aux_data_st*)sqlite3_get_auxdata(self->ctx, argn);
+    if(data)
+    {
+        sq_pushobject(v, data->data);
+    }
+    else
+    {
+        sq_pushnull(v);
+    }
+    return 1;
+}
+
+static void sq_sqlite3_context_free_aux_data(void *aux_data)
+{
+    sq_sqlite3_context_aux_data_st *data = (sq_sqlite3_context_aux_data_st*)aux_data;
+    if(data)
+    {
+        sq_release(data->vm, &data->data);
+        sqlite3_free(data);
+    }
+}
+static SQRESULT sq_sqlite3_context_set_aux_data(HSQUIRRELVM v)
+{
+    SQ_FUNC_VARS_NO_TOP(v);
+    GET_sqlite3_context_INSTANCE();
+    SQ_GET_INTEGER(v, 2, argn);
+    sq_sqlite3_context_aux_data_st *data = (sq_sqlite3_context_aux_data_st*)sqlite3_malloc(sizeof(*data));
+    if(data)
+    {
+        data->vm = v;
+        sq_resetobject(&data->data);
+        sq_getstackobj(v, 3, &data->data);
+        sq_addref(v, &data->data);
+        sqlite3_set_auxdata(self->ctx, argn, data, sq_sqlite3_context_free_aux_data);
+    }
+    return 0;
+}
 
 static SQRESULT sq_sqlite3_context_result_blob(HSQUIRRELVM v)
 {
@@ -2356,6 +2400,8 @@ static SQRegFunction sq_sqlite3_context_methods[] =
     _DECL_FUNC(result_error,  2, _SC("xs")),
     _DECL_FUNC(result_subtype,  2, _SC("xi")),
     //_DECL_FUNC(value_subtype,  2, _SC("xi")),
+    _DECL_FUNC(get_aux_data,  2, _SC("xi")),
+    _DECL_FUNC(set_aux_data,  3, _SC("xi.")),
     _DECL_FUNC(_tostring,  -1, _SC("x")),
     {0,0}
 };