Index: third_party/sqlite/sqlite-src-3080704/src/legacy.c |
diff --git a/third_party/sqlite/sqlite-src-3080704/src/legacy.c b/third_party/sqlite/sqlite-src-3080704/src/legacy.c |
new file mode 100644 |
index 0000000000000000000000000000000000000000..a10006e55847d4f78cd2912db44d5de48ab9129a |
--- /dev/null |
+++ b/third_party/sqlite/sqlite-src-3080704/src/legacy.c |
@@ -0,0 +1,144 @@ |
+/* |
+** 2001 September 15 |
+** |
+** The author disclaims copyright to this source code. In place of |
+** a legal notice, here is a blessing: |
+** |
+** May you do good and not evil. |
+** May you find forgiveness for yourself and forgive others. |
+** May you share freely, never taking more than you give. |
+** |
+************************************************************************* |
+** Main file for the SQLite library. The routines in this file |
+** implement the programmer interface to the library. Routines in |
+** other files are for internal use by SQLite and should not be |
+** accessed by users of the library. |
+*/ |
+ |
+#include "sqliteInt.h" |
+ |
+/* |
+** Execute SQL code. Return one of the SQLITE_ success/failure |
+** codes. Also write an error message into memory obtained from |
+** malloc() and make *pzErrMsg point to that message. |
+** |
+** If the SQL is a query, then for each row in the query result |
+** the xCallback() function is called. pArg becomes the first |
+** argument to xCallback(). If xCallback=NULL then no callback |
+** is invoked, even for queries. |
+*/ |
+int sqlite3_exec( |
+ sqlite3 *db, /* The database on which the SQL executes */ |
+ const char *zSql, /* The SQL to be executed */ |
+ sqlite3_callback xCallback, /* Invoke this callback routine */ |
+ void *pArg, /* First argument to xCallback() */ |
+ char **pzErrMsg /* Write error messages here */ |
+){ |
+ int rc = SQLITE_OK; /* Return code */ |
+ const char *zLeftover; /* Tail of unprocessed SQL */ |
+ sqlite3_stmt *pStmt = 0; /* The current SQL statement */ |
+ char **azCols = 0; /* Names of result columns */ |
+ int callbackIsInit; /* True if callback data is initialized */ |
+ |
+ if( !sqlite3SafetyCheckOk(db) ) return SQLITE_MISUSE_BKPT; |
+ if( zSql==0 ) zSql = ""; |
+ |
+ sqlite3_mutex_enter(db->mutex); |
+ sqlite3Error(db, SQLITE_OK); |
+ while( rc==SQLITE_OK && zSql[0] ){ |
+ int nCol; |
+ char **azVals = 0; |
+ |
+ pStmt = 0; |
+ rc = sqlite3_prepare_v2(db, zSql, -1, &pStmt, &zLeftover); |
+ assert( rc==SQLITE_OK || pStmt==0 ); |
+ if( rc!=SQLITE_OK ){ |
+ continue; |
+ } |
+ if( !pStmt ){ |
+ /* this happens for a comment or white-space */ |
+ zSql = zLeftover; |
+ continue; |
+ } |
+ |
+ callbackIsInit = 0; |
+ nCol = sqlite3_column_count(pStmt); |
+ |
+ while( 1 ){ |
+ int i; |
+ rc = sqlite3_step(pStmt); |
+ |
+ /* Invoke the callback function if required */ |
+ if( xCallback && (SQLITE_ROW==rc || |
+ (SQLITE_DONE==rc && !callbackIsInit |
+ && db->flags&SQLITE_NullCallback)) ){ |
+ if( !callbackIsInit ){ |
+ azCols = sqlite3DbMallocZero(db, 2*nCol*sizeof(const char*) + 1); |
+ if( azCols==0 ){ |
+ goto exec_out; |
+ } |
+ for(i=0; i<nCol; i++){ |
+ azCols[i] = (char *)sqlite3_column_name(pStmt, i); |
+ /* sqlite3VdbeSetColName() installs column names as UTF8 |
+ ** strings so there is no way for sqlite3_column_name() to fail. */ |
+ assert( azCols[i]!=0 ); |
+ } |
+ callbackIsInit = 1; |
+ } |
+ if( rc==SQLITE_ROW ){ |
+ azVals = &azCols[nCol]; |
+ for(i=0; i<nCol; i++){ |
+ azVals[i] = (char *)sqlite3_column_text(pStmt, i); |
+ if( !azVals[i] && sqlite3_column_type(pStmt, i)!=SQLITE_NULL ){ |
+ db->mallocFailed = 1; |
+ goto exec_out; |
+ } |
+ } |
+ } |
+ if( xCallback(pArg, nCol, azVals, azCols) ){ |
+ /* EVIDENCE-OF: R-38229-40159 If the callback function to |
+ ** sqlite3_exec() returns non-zero, then sqlite3_exec() will |
+ ** return SQLITE_ABORT. */ |
+ rc = SQLITE_ABORT; |
+ sqlite3VdbeFinalize((Vdbe *)pStmt); |
+ pStmt = 0; |
+ sqlite3Error(db, SQLITE_ABORT); |
+ goto exec_out; |
+ } |
+ } |
+ |
+ if( rc!=SQLITE_ROW ){ |
+ rc = sqlite3VdbeFinalize((Vdbe *)pStmt); |
+ pStmt = 0; |
+ zSql = zLeftover; |
+ while( sqlite3Isspace(zSql[0]) ) zSql++; |
+ break; |
+ } |
+ } |
+ |
+ sqlite3DbFree(db, azCols); |
+ azCols = 0; |
+ } |
+ |
+exec_out: |
+ if( pStmt ) sqlite3VdbeFinalize((Vdbe *)pStmt); |
+ sqlite3DbFree(db, azCols); |
+ |
+ rc = sqlite3ApiExit(db, rc); |
+ if( rc!=SQLITE_OK && pzErrMsg ){ |
+ 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); |
+ } |
+ }else if( pzErrMsg ){ |
+ *pzErrMsg = 0; |
+ } |
+ |
+ assert( (rc&db->errMask)==rc ); |
+ sqlite3_mutex_leave(db->mutex); |
+ return rc; |
+} |