public static int sqlite3_exec( sqlite3 db, /* The database on which the SQL executes */ string zSql, /* The SQL to be executed */ sqlite3_callback xCallback, /* Invoke this callback routine */ object pArg, /* First argument to xCallback() */ int NoErrors ) { string Errors = ""; return sqlite3_exec(db, zSql, xCallback, pArg, ref Errors); }
public static int sqlite3_exec( sqlite3 db, /* The database on which the SQL executes */ string zSql, /* The SQL to be executed */ sqlite3_callback xCallback, /* Invoke this callback routine */ object pArg, /* First argument to xCallback() */ ref string pzErrMsg /* Write error messages here */ ) { int rc = SQLITE_OK; /* Return code */ string zLeftover = ""; /* Tail of unprocessed SQL */ sqlite3_stmt pStmt = null; /* The current SQL statement */ string[] azCols = null; /* Names of result columns */ int nRetry = 0; /* Number of retry attempts */ int callbackIsInit; /* True if callback data is initialized */ if (!sqlite3SafetyCheckOk(db)) return SQLITE_MISUSE_BKPT(); if (zSql == null) zSql = ""; sqlite3_mutex_enter(db.mutex); sqlite3Error(db, SQLITE_OK, 0); while ((rc == SQLITE_OK || (rc == SQLITE_SCHEMA && (++nRetry) < 2)) && zSql != "") { int nCol; string[] azVals = null; pStmt = null; rc = sqlite3_prepare(db, zSql, -1, ref pStmt, ref zLeftover); Debug.Assert(rc == SQLITE_OK || pStmt == null); if (rc != SQLITE_OK) { continue; } if (pStmt == null) { /* this happens for a comment or white-space */ zSql = zLeftover; continue; } callbackIsInit = 0; nCol = sqlite3_column_count(pStmt); while (true) { int i; rc = sqlite3_step(pStmt); /* Invoke the callback function if required */ if (xCallback != null && (SQLITE_ROW == rc || (SQLITE_DONE == rc && callbackIsInit == 0 && (db.flags & SQLITE_NullCallback) != 0))) { if (0 == callbackIsInit) { azCols = new string[nCol];//sqlite3DbMallocZero(db, 2*nCol*sizeof(const char*) + 1); //if ( azCols == null ) //{ // goto exec_out; //} for (i = 0; i < nCol; i++) { azCols[i] = sqlite3_column_name(pStmt, i); /* sqlite3VdbeSetColName() installs column names as UTF8 ** strings so there is no way for sqlite3_column_name() to fail. */ Debug.Assert(azCols[i] != null); } callbackIsInit = 1; } if (rc == SQLITE_ROW) { azVals = new string[nCol];// azCols[nCol]; for (i = 0; i < nCol; i++) { azVals[i] = sqlite3_column_text(pStmt, i); if (azVals[i] == null && sqlite3_column_type(pStmt, i) != SQLITE_NULL) { //db.mallocFailed = 1; //goto exec_out; } } } if (xCallback(pArg, nCol, azVals, azCols) != 0) { rc = SQLITE_ABORT; sqlite3VdbeFinalize(ref pStmt); pStmt = null; sqlite3Error(db, SQLITE_ABORT, 0); goto exec_out; } } if (rc != SQLITE_ROW) { rc = sqlite3VdbeFinalize(ref pStmt); pStmt = null; if (rc != SQLITE_SCHEMA) { nRetry = 0; if ((zSql = zLeftover) != "") { int zindex = 0; while (zindex < zSql.Length && sqlite3Isspace(zSql[zindex])) zindex++; if (zindex != 0) zSql = zindex < zSql.Length ? zSql.Substring(zindex) : ""; } } break; } } sqlite3DbFree(db, ref azCols); azCols = null; } exec_out: if (pStmt != null) sqlite3VdbeFinalize(ref pStmt); sqlite3DbFree(db, ref azCols); rc = sqlite3ApiExit(db, rc); if (rc != SQLITE_OK && ALWAYS(rc == sqlite3_errcode(db)) && pzErrMsg != null) { //int nErrMsg = 1 + sqlite3Strlen30(sqlite3_errmsg(db)); //pzErrMsg = sqlite3Malloc(nErrMsg); //if (pzErrMsg) //{ // memcpy(pzErrMsg, sqlite3_errmsg(db), nErrMsg); //}else{ //rc = SQLITE_NOMEM; //sqlite3Error(db, SQLITE_NOMEM, 0); //} pzErrMsg = sqlite3_errmsg(db); } else if (pzErrMsg != "") { pzErrMsg = ""; } Debug.Assert((rc & db.errMask) == rc); sqlite3_mutex_leave(db.mutex); return rc; }
public static int exec(sqlite3 db, /* The database on which the SQL executes */ string zSql, /* The SQL to be executed */ sqlite3_callback xCallback, /* Invoke this callback routine */ object pArg, /* First argument to xCallback() */ ref string pzErrMsg /* Write error messages here */) { return sqlite3_exec(db, zSql, xCallback, pArg, ref pzErrMsg); }