/* ** Returns 1 if data is ready, or 0 if not. */ static int next2(Tcl_Interp interp, tclvar_cursor pCur, Tcl_Obj pObj) { Tcl_Obj p; if (pObj != null) { if (null == pCur.pList2) { p = TCL.Tcl_NewStringObj("array names", -1); TCL.Tcl_IncrRefCount(p); TCL.Tcl_ListObjAppendElement(null, p, pObj); TCL.Tcl_EvalObjEx(interp, p, TCL.TCL_EVAL_GLOBAL); TCL.Tcl_DecrRefCount(ref p); pCur.pList2 = TCL.Tcl_GetObjResult(interp); TCL.Tcl_IncrRefCount(pCur.pList2); Debug.Assert(pCur.i2 == 0); } else { int n = 0; pCur.i2++; TCL.Tcl_ListObjLength(null, pCur.pList2, out n); if (pCur.i2 >= n) { TCL.Tcl_DecrRefCount(ref pCur.pList2); pCur.pList2 = null; pCur.i2 = 0; return(0); } } } return(1); }
/* The xDisconnect and xDestroy methods are also the same */ /* ** Open a new tclvar cursor. */ static int tclvarOpen(sqlite3_vtab pVTab, out sqlite3_vtab_cursor ppCursor) { //tclvar_cursor pCur; //pCur = sqlite3MallocZero(sizeof(tclvar_cursor)); //*ppCursor = pCur.base; ppCursor = new tclvar_cursor(); return(SQLITE_OK); }
/* ** Close a tclvar cursor. */ static int tclvarClose(ref sqlite3_vtab_cursor cur) { tclvar_cursor pCur = (tclvar_cursor )cur; if (pCur.pList1 != null) { TCL.Tcl_DecrRefCount(ref pCur.pList1); } if (pCur.pList2 != null) { TCL.Tcl_DecrRefCount(ref pCur.pList2); } cur = null;//sqlite3_free(pCur); return(SQLITE_OK); }
static int tclvarNext(sqlite3_vtab_cursor cur) { Tcl_Obj pObj = null; int n = 0; int ok = 0; tclvar_cursor pCur = (tclvar_cursor )cur; Tcl_Interp interp = ((tclvar_vtab )(cur.pVtab)).interp; TCL.Tcl_ListObjLength(null, pCur.pList1, out n); while (0 == ok && pCur.i1 < n) { TCL.Tcl_ListObjIndex(null, pCur.pList1, pCur.i1, out pObj); ok = next2(interp, pCur, pObj); if (0 == ok) { pCur.i1++; } } return(0); }
static int tclvarFilter( sqlite3_vtab_cursor pVtabCursor, int idxNum, string idxStr, int argc, sqlite3_value[] argv ) { tclvar_cursor pCur = (tclvar_cursor )pVtabCursor; Tcl_Interp interp = ((tclvar_vtab )(pVtabCursor.pVtab)).interp; Tcl_Obj p = TCL.Tcl_NewStringObj("info vars", -1); TCL.Tcl_IncrRefCount(p); Debug.Assert(argc == 0 || argc == 1); if (argc == 1) { Tcl_Obj pArg = TCL.Tcl_NewStringObj((string)sqlite3_value_text(argv[0]), -1); TCL.Tcl_ListObjAppendElement(null, p, pArg); } TCL.Tcl_EvalObjEx(interp, p, TCL.TCL_EVAL_GLOBAL); if (pCur.pList1 != null) { TCL.Tcl_DecrRefCount(ref pCur.pList1); } if (pCur.pList2 != null) { TCL.Tcl_DecrRefCount(ref pCur.pList2); pCur.pList2 = null; } pCur.i1 = 0; pCur.i2 = 0; pCur.pList1 = TCL.Tcl_GetObjResult(interp); TCL.Tcl_IncrRefCount(pCur.pList1); Debug.Assert(pCur.i1 == 0 && pCur.i2 == 0 && pCur.pList2 == null); TCL.Tcl_DecrRefCount(ref p); return(tclvarNext(pVtabCursor)); }
static int tclvarColumn(sqlite3_vtab_cursor cur, sqlite3_context ctx, int i) { Tcl_Obj p1 = null; Tcl_Obj p2 = null; string z1; string z2 = ""; tclvar_cursor pCur = (tclvar_cursor)cur; Tcl_Interp interp = ((tclvar_vtab )cur.pVtab).interp; TCL.Tcl_ListObjIndex(interp, pCur.pList1, pCur.i1, out p1); TCL.Tcl_ListObjIndex(interp, pCur.pList2, pCur.i2, out p2); z1 = TCL.Tcl_GetString(p1); if (p2 != null) { z2 = TCL.Tcl_GetString(p2); } switch (i) { case 0: { sqlite3_result_text(ctx, z1, -1, SQLITE_TRANSIENT); break; } case 1: { sqlite3_result_text(ctx, z2, -1, SQLITE_TRANSIENT); break; } case 2: { Tcl_Obj pVal = TCL.Tcl_GetVar2Ex(interp, z1, z2 == "" ? null : z2, (TCL.VarFlag)TCL.TCL_GLOBAL_ONLY); sqlite3_result_text(ctx, TCL.Tcl_GetString(pVal), -1, SQLITE_TRANSIENT); break; } } return(SQLITE_OK); }
/* The xDisconnect and xDestroy methods are also the same */ /* ** Open a new tclvar cursor. */ static int tclvarOpen( sqlite3_vtab pVTab, out sqlite3_vtab_cursor ppCursor ) { //tclvar_cursor pCur; //pCur = sqlite3MallocZero(sizeof(tclvar_cursor)); //*ppCursor = pCur.base; ppCursor = new tclvar_cursor(); return SQLITE_OK; }
/* ** Returns 1 if data is ready, or 0 if not. */ static int next2(Tcl_Interp interp, tclvar_cursor pCur, Tcl_Obj pObj){ Tcl_Obj p; if( pObj != null){ if( null==pCur.pList2 ){ p = TCL.Tcl_NewStringObj("array names", -1); TCL.Tcl_IncrRefCount(p); TCL.Tcl_ListObjAppendElement(null, p, pObj); TCL.Tcl_EvalObjEx(interp, p, TCL.TCL_EVAL_GLOBAL); TCL.Tcl_DecrRefCount(ref p); pCur.pList2 = TCL.Tcl_GetObjResult(interp); TCL.Tcl_IncrRefCount(pCur.pList2); Debug.Assert( pCur.i2 == 0 ); } else { int n = 0; pCur.i2++; TCL.Tcl_ListObjLength(null, pCur.pList2, out n); if( pCur.i2>=n ){ TCL.Tcl_DecrRefCount(ref pCur.pList2); pCur.pList2 = null; pCur.i2 = 0; return 0; } } } return 1; }
static int tclvarEof(sqlite3_vtab_cursor cur) { tclvar_cursor pCur = (tclvar_cursor)cur; return(pCur.pList2 != null ? 0 : 1); }