198d30677Sdanielk1977 /*
298d30677Sdanielk1977 ** 2001 September 15
398d30677Sdanielk1977 **
498d30677Sdanielk1977 ** The author disclaims copyright to this source code. In place of
598d30677Sdanielk1977 ** a legal notice, here is a blessing:
698d30677Sdanielk1977 **
798d30677Sdanielk1977 ** May you do good and not evil.
898d30677Sdanielk1977 ** May you find forgiveness for yourself and forgive others.
998d30677Sdanielk1977 ** May you share freely, never taking more than you give.
1098d30677Sdanielk1977 **
1198d30677Sdanielk1977 *************************************************************************
1298d30677Sdanielk1977 ** Main file for the SQLite library. The routines in this file
1398d30677Sdanielk1977 ** implement the programmer interface to the library. Routines in
1498d30677Sdanielk1977 ** other files are for internal use by SQLite and should not be
1598d30677Sdanielk1977 ** accessed by users of the library.
1698d30677Sdanielk1977 */
1798d30677Sdanielk1977
1898d30677Sdanielk1977 #include "sqliteInt.h"
1998d30677Sdanielk1977
2098d30677Sdanielk1977 /*
2198d30677Sdanielk1977 ** Execute SQL code. Return one of the SQLITE_ success/failure
2298d30677Sdanielk1977 ** codes. Also write an error message into memory obtained from
2398d30677Sdanielk1977 ** malloc() and make *pzErrMsg point to that message.
2498d30677Sdanielk1977 **
2598d30677Sdanielk1977 ** If the SQL is a query, then for each row in the query result
2698d30677Sdanielk1977 ** the xCallback() function is called. pArg becomes the first
2798d30677Sdanielk1977 ** argument to xCallback(). If xCallback=NULL then no callback
2898d30677Sdanielk1977 ** is invoked, even for queries.
2998d30677Sdanielk1977 */
sqlite3_exec(sqlite3 * db,const char * zSql,sqlite3_callback xCallback,void * pArg,char ** pzErrMsg)3098d30677Sdanielk1977 int sqlite3_exec(
319bb575fdSdrh sqlite3 *db, /* The database on which the SQL executes */
3298d30677Sdanielk1977 const char *zSql, /* The SQL to be executed */
3312057d54Sdrh sqlite3_callback xCallback, /* Invoke this callback routine */
3498d30677Sdanielk1977 void *pArg, /* First argument to xCallback() */
3598d30677Sdanielk1977 char **pzErrMsg /* Write error messages here */
3698d30677Sdanielk1977 ){
3776aeb34fSdrh int rc = SQLITE_OK; /* Return code */
3876aeb34fSdrh const char *zLeftover; /* Tail of unprocessed SQL */
3976aeb34fSdrh sqlite3_stmt *pStmt = 0; /* The current SQL statement */
4076aeb34fSdrh char **azCols = 0; /* Names of result columns */
4176aeb34fSdrh int callbackIsInit; /* True if callback data is initialized */
4298d30677Sdanielk1977
43413c3d36Sdrh if( !sqlite3SafetyCheckOk(db) ) return SQLITE_MISUSE_BKPT;
4435c6190cSdrh if( zSql==0 ) zSql = "";
45a1644fd8Sdanielk1977
46a1644fd8Sdanielk1977 sqlite3_mutex_enter(db->mutex);
4713f40da3Sdrh sqlite3Error(db, SQLITE_OK);
4860625313Sdrh while( rc==SQLITE_OK && zSql[0] ){
49*f2305414Sdrh int nCol = 0;
5098d30677Sdanielk1977 char **azVals = 0;
5198d30677Sdanielk1977
5298d30677Sdanielk1977 pStmt = 0;
5360625313Sdrh rc = sqlite3_prepare_v2(db, zSql, -1, &pStmt, &zLeftover);
5443617e9aSdrh assert( rc==SQLITE_OK || pStmt==0 );
5598d30677Sdanielk1977 if( rc!=SQLITE_OK ){
5698d30677Sdanielk1977 continue;
5798d30677Sdanielk1977 }
5898d30677Sdanielk1977 if( !pStmt ){
5998d30677Sdanielk1977 /* this happens for a comment or white-space */
6098d30677Sdanielk1977 zSql = zLeftover;
6198d30677Sdanielk1977 continue;
6298d30677Sdanielk1977 }
6376aeb34fSdrh callbackIsInit = 0;
6498d30677Sdanielk1977
6598d30677Sdanielk1977 while( 1 ){
6698d30677Sdanielk1977 int i;
6798d30677Sdanielk1977 rc = sqlite3_step(pStmt);
6898d30677Sdanielk1977
6998d30677Sdanielk1977 /* Invoke the callback function if required */
7098d30677Sdanielk1977 if( xCallback && (SQLITE_ROW==rc ||
7176aeb34fSdrh (SQLITE_DONE==rc && !callbackIsInit
7276aeb34fSdrh && db->flags&SQLITE_NullCallback)) ){
7376aeb34fSdrh if( !callbackIsInit ){
74*f2305414Sdrh nCol = sqlite3_column_count(pStmt);
755c258dc1Sdrh azCols = sqlite3DbMallocRaw(db, (2*nCol+1)*sizeof(const char*));
763b6f734bSdrh if( azCols==0 ){
773b6f734bSdrh goto exec_out;
783b6f734bSdrh }
7998d30677Sdanielk1977 for(i=0; i<nCol; i++){
8098d30677Sdanielk1977 azCols[i] = (char *)sqlite3_column_name(pStmt, i);
81701bb3b4Sdrh /* sqlite3VdbeSetColName() installs column names as UTF8
82701bb3b4Sdrh ** strings so there is no way for sqlite3_column_name() to fail. */
83701bb3b4Sdrh assert( azCols[i]!=0 );
8498d30677Sdanielk1977 }
8576aeb34fSdrh callbackIsInit = 1;
8698d30677Sdanielk1977 }
8798d30677Sdanielk1977 if( rc==SQLITE_ROW ){
8898d30677Sdanielk1977 azVals = &azCols[nCol];
8998d30677Sdanielk1977 for(i=0; i<nCol; i++){
904f26d6c4Sdrh azVals[i] = (char *)sqlite3_column_text(pStmt, i);
91a7a8e14bSdanielk1977 if( !azVals[i] && sqlite3_column_type(pStmt, i)!=SQLITE_NULL ){
924a642b60Sdrh sqlite3OomFault(db);
93a7a8e14bSdanielk1977 goto exec_out;
94a7a8e14bSdanielk1977 }
9598d30677Sdanielk1977 }
965c258dc1Sdrh azVals[i] = 0;
9798d30677Sdanielk1977 }
9898d30677Sdanielk1977 if( xCallback(pArg, nCol, azVals, azCols) ){
99ddb17caeSdrh /* EVIDENCE-OF: R-38229-40159 If the callback function to
100ddb17caeSdrh ** sqlite3_exec() returns non-zero, then sqlite3_exec() will
101ddb17caeSdrh ** return SQLITE_ABORT. */
10298d30677Sdanielk1977 rc = SQLITE_ABORT;
103238746a6Sdanielk1977 sqlite3VdbeFinalize((Vdbe *)pStmt);
104f50bebf0Sdrh pStmt = 0;
10513f40da3Sdrh sqlite3Error(db, SQLITE_ABORT);
10698d30677Sdanielk1977 goto exec_out;
10798d30677Sdanielk1977 }
10898d30677Sdanielk1977 }
10998d30677Sdanielk1977
11098d30677Sdanielk1977 if( rc!=SQLITE_ROW ){
111238746a6Sdanielk1977 rc = sqlite3VdbeFinalize((Vdbe *)pStmt);
11298d30677Sdanielk1977 pStmt = 0;
11398d30677Sdanielk1977 zSql = zLeftover;
11478ca0e7eSdanielk1977 while( sqlite3Isspace(zSql[0]) ) zSql++;
11598d30677Sdanielk1977 break;
11698d30677Sdanielk1977 }
11798d30677Sdanielk1977 }
11898d30677Sdanielk1977
119633e6d57Sdrh sqlite3DbFree(db, azCols);
12098d30677Sdanielk1977 azCols = 0;
12198d30677Sdanielk1977 }
12298d30677Sdanielk1977
12398d30677Sdanielk1977 exec_out:
124238746a6Sdanielk1977 if( pStmt ) sqlite3VdbeFinalize((Vdbe *)pStmt);
125633e6d57Sdrh sqlite3DbFree(db, azCols);
12698d30677Sdanielk1977
127f3a65f7eSdrh rc = sqlite3ApiExit(db, rc);
12809e60541Sdrh if( rc!=SQLITE_OK && pzErrMsg ){
1296e11b162Sdrh *pzErrMsg = sqlite3DbStrDup(0, sqlite3_errmsg(db));
1306e11b162Sdrh if( *pzErrMsg==0 ){
131fad3039cSmistachkin rc = SQLITE_NOMEM_BKPT;
13213f40da3Sdrh sqlite3Error(db, SQLITE_NOMEM);
13398d30677Sdanielk1977 }
13498d30677Sdanielk1977 }else if( pzErrMsg ){
13598d30677Sdanielk1977 *pzErrMsg = 0;
13698d30677Sdanielk1977 }
13798d30677Sdanielk1977
1384ac285a1Sdrh assert( (rc&db->errMask)==rc );
139a1644fd8Sdanielk1977 sqlite3_mutex_leave(db->mutex);
14098d30677Sdanielk1977 return rc;
14198d30677Sdanielk1977 }
142