Ver Fonte

Fix and expose 2 functions to unencode a string lenght encoded like stream.

mingodad há 13 anos atrás
pai
commit
b6e78a1b13
1 ficheiros alterados com 33 adições e 8 exclusões
  1. 33 8
      ext/sq_sqlite3.cpp

+ 33 - 8
ext/sq_sqlite3.cpp

@@ -834,19 +834,41 @@ static SQRESULT sle2vec(HSQUIRRELVM v, const unsigned char *sle,
     if(!*next || *next[0] != ']'){
         return sq_throwerror(v, "Invalid end of vector !");
     }
-    *next++;
+    (*next)++;
     return 0;
 }
 
-static SQRESULT sle2vecOfvec(HSQUIRRELVM v)
+static SQRESULT sq_sle2vecOfvec(HSQUIRRELVM v)
 {
     SQ_FUNC_VARS(v);
-    SQ_GET_STRING(v, 2, sle);
-    SQ_OPT_INTEGER(v, 3, start, 0);
+	SQBlob *blob = NULL;
+    const SQChar *sle;
+    SQInteger sle_size;
+
+    SQObjectType ptype = sq_gettype(v, 2);
+    switch(ptype){
+        case OT_STRING:
+            sq_getstr_and_size(v, 2, &sle, &sle_size);
+            break;
+        case OT_INSTANCE:
+            if(SQ_FAILED(sq_getinstanceup(v,2,(SQUserPointer*)&blob,(SQUserPointer)SQBlob::SQBlob_TAG)))
+                return sq_throwerror(v,_SC("invalid type tag"));
+            if(!blob || !blob->IsValid())
+                return sq_throwerror(v,_SC("the blob is invalid"));
+            sle = (const SQChar*)blob->GetBuf();
+            sle_size = blob->Len();
+        break;
+        default:
+            return sq_throwerror(v,_SC("invalid parameter 1 of type %s"), sq_gettypename(v, 2));
+    }
+    if(sq_gettype(v, 3) != OT_ARRAY)
+        return sq_throwerror(v,_SC("invalid parameter 2 of type %s"), sq_gettypename(v, 3));
+
+    SQ_OPT_INTEGER(v, 4, start, 0);
+    sq_push(v, 3);
 
     int rc, data_count = 1;
 
-    sq_newarray(v, 0);
     const unsigned char *next;
     if(sle[0] != '[') {
         return sq_throwerror(v, "Invalid encoded vector !");
@@ -870,7 +892,7 @@ static SQRESULT sle2vecOfvec(HSQUIRRELVM v)
     if(!next || *next != ']'){
         return sq_throwerror(v, "Invalid end of vector !");
     }
-    //sq_pushinteger(v, ++next - sle);
+    sq_pushinteger(v, ((const SQChar*)(++next)) - sle);
     return 1;
 }
 
@@ -929,7 +951,7 @@ static int sleSize2buf(slebuf_t sle, size_t size){
     return 0;
 }
 
-static SQRESULT sq_sqlite3_stmt_get_sle_size(HSQUIRRELVM v){
+static SQRESULT sq_get_sle_size(HSQUIRRELVM v){
     SQ_FUNC_VARS_NO_TOP(v);
     slebuf_t slebuf;
     SQ_GET_INTEGER(v, 2, size);
@@ -996,7 +1018,6 @@ static SQRegFunction sq_sqlite3_stmt_methods[] =
 {
 	_DECL_FUNC(constructor,  -2, _SC("xxs s|n|b|o"), SQFalse),
 
-	_DECL_FUNC(get_sle_size,  2, _SC(".i"), SQTrue),
 	_DECL_FUNC(stmt_ptr,  1, _SC("x"), SQFalse),
 	_DECL_FUNC(get_db,  1, _SC("x"), SQFalse),
 	_DECL_FUNC(finalize,  1, _SC("x"), SQFalse),
@@ -1998,6 +2019,10 @@ extern "C" {
 
 SQRESULT sqext_register_SQLite3(HSQUIRRELVM v)
 {
+    sq_insertfunc(v, _SC("sle2vecOfvec"), sq_sle2vecOfvec, -2, _SC(". s|x a i"), SQTrue);
+    sq_insertfunc(v, _SC("get_sle_size"), sq_get_sle_size, -2, _SC(".i"), SQTrue);
+
+
     HSQOBJECT sqlite3_NULL;
     sq_pushregistrytable(v);
     sq_pushstring(v, sqlite3_NULL_Name,-1);