| 2 |      1 | /*
 | 
|  |      2 | ** 2001 September 15
 | 
|  |      3 | **
 | 
|  |      4 | ** The author disclaims copyright to this source code.  In place of
 | 
|  |      5 | ** a legal notice, here is a blessing:
 | 
|  |      6 | **
 | 
|  |      7 | **    May you do good and not evil.
 | 
|  |      8 | **    May you find forgiveness for yourself and forgive others.
 | 
|  |      9 | **    May you share freely, never taking more than you give.
 | 
|  |     10 | **
 | 
|  |     11 | *************************************************************************
 | 
|  |     12 | ** Main file for the SQLite library.  The routines in this file
 | 
|  |     13 | ** implement the programmer interface to the library.  Routines in
 | 
|  |     14 | ** other files are for internal use by SQLite and should not be
 | 
|  |     15 | ** accessed by users of the library.
 | 
|  |     16 | **
 | 
|  |     17 | ** $Id: legacy.cpp 1282 2008-11-13 09:31:33Z LarsPson $
 | 
|  |     18 | */
 | 
|  |     19 | 
 | 
|  |     20 | #include "sqliteInt.h"
 | 
|  |     21 | #include <ctype.h>
 | 
|  |     22 | 
 | 
|  |     23 | /*
 | 
|  |     24 | ** Execute SQL code.  Return one of the SQLITE_ success/failure
 | 
|  |     25 | ** codes.  Also write an error message into memory obtained from
 | 
|  |     26 | ** malloc() and make *pzErrMsg point to that message.
 | 
|  |     27 | **
 | 
|  |     28 | ** If the SQL is a query, then for each row in the query result
 | 
|  |     29 | ** the xCallback() function is called.  pArg becomes the first
 | 
|  |     30 | ** argument to xCallback().  If xCallback=NULL then no callback
 | 
|  |     31 | ** is invoked, even for queries.
 | 
|  |     32 | */
 | 
|  |     33 | EXPORT_C int sqlite3_exec(
 | 
|  |     34 |   sqlite3 *db,                /* The database on which the SQL executes */
 | 
|  |     35 |   const char *zSql,           /* The SQL to be executed */
 | 
|  |     36 |   sqlite3_callback xCallback, /* Invoke this callback routine */
 | 
|  |     37 |   void *pArg,                 /* First argument to xCallback() */
 | 
|  |     38 |   char **pzErrMsg             /* Write error messages here */
 | 
|  |     39 | ){
 | 
|  |     40 |   int rc = SQLITE_OK;
 | 
|  |     41 |   const char *zLeftover;
 | 
|  |     42 |   sqlite3_stmt *pStmt = 0;
 | 
|  |     43 |   char **azCols = 0;
 | 
|  |     44 | 
 | 
|  |     45 |   int nRetry = 0;
 | 
|  |     46 |   int nCallback;
 | 
|  |     47 | 
 | 
|  |     48 |   if( zSql==0 ) return SQLITE_OK;
 | 
|  |     49 | 
 | 
|  |     50 |   sqlite3_mutex_enter(db->mutex);
 | 
|  |     51 |   while( (rc==SQLITE_OK || (rc==SQLITE_SCHEMA && (++nRetry)<2)) && zSql[0] ){
 | 
|  |     52 |     int nCol;
 | 
|  |     53 |     char **azVals = 0;
 | 
|  |     54 | 
 | 
|  |     55 |     pStmt = 0;
 | 
|  |     56 |     rc = sqlite3_prepare(db, zSql, -1, &pStmt, &zLeftover);
 | 
|  |     57 |     assert( rc==SQLITE_OK || pStmt==0 );
 | 
|  |     58 |     if( rc!=SQLITE_OK ){
 | 
|  |     59 |       continue;
 | 
|  |     60 |     }
 | 
|  |     61 |     if( !pStmt ){
 | 
|  |     62 |       /* this happens for a comment or white-space */
 | 
|  |     63 |       zSql = zLeftover;
 | 
|  |     64 |       continue;
 | 
|  |     65 |     }
 | 
|  |     66 | 
 | 
|  |     67 |     nCallback = 0;
 | 
|  |     68 | 
 | 
|  |     69 |     nCol = sqlite3_column_count(pStmt);
 | 
|  |     70 |     azCols = (char**)sqlite3DbMallocZero(db, 2*nCol*sizeof(const char *) + 1);
 | 
|  |     71 |     if( azCols==0 ){
 | 
|  |     72 |       goto exec_out;
 | 
|  |     73 |     }
 | 
|  |     74 | 
 | 
|  |     75 |     while( 1 ){
 | 
|  |     76 |       int i;
 | 
|  |     77 |       rc = sqlite3_step(pStmt);
 | 
|  |     78 | 
 | 
|  |     79 |       /* Invoke the callback function if required */
 | 
|  |     80 |       if( xCallback && (SQLITE_ROW==rc || 
 | 
|  |     81 |           (SQLITE_DONE==rc && !nCallback && db->flags&SQLITE_NullCallback)) ){
 | 
|  |     82 |         if( 0==nCallback ){
 | 
|  |     83 |           for(i=0; i<nCol; i++){
 | 
|  |     84 |             azCols[i] = (char *)sqlite3_column_name(pStmt, i);
 | 
|  |     85 |           }
 | 
|  |     86 |           nCallback++;
 | 
|  |     87 |         }
 | 
|  |     88 |         if( rc==SQLITE_ROW ){
 | 
|  |     89 |           azVals = &azCols[nCol];
 | 
|  |     90 |           for(i=0; i<nCol; i++){
 | 
|  |     91 |             azVals[i] = (char *)sqlite3_column_text(pStmt, i);
 | 
|  |     92 |           }
 | 
|  |     93 |         }
 | 
|  |     94 |         if( xCallback(pArg, nCol, azVals, azCols) ){
 | 
|  |     95 |           rc = SQLITE_ABORT;
 | 
|  |     96 |           goto exec_out;
 | 
|  |     97 |         }
 | 
|  |     98 |       }
 | 
|  |     99 | 
 | 
|  |    100 |       if( rc!=SQLITE_ROW ){
 | 
|  |    101 |         rc = sqlite3_finalize(pStmt);
 | 
|  |    102 |         pStmt = 0;
 | 
|  |    103 |         if( rc!=SQLITE_SCHEMA ){
 | 
|  |    104 |           nRetry = 0;
 | 
|  |    105 |           zSql = zLeftover;
 | 
|  |    106 |           while( isspace((unsigned char)zSql[0]) ) zSql++;
 | 
|  |    107 |         }
 | 
|  |    108 |         break;
 | 
|  |    109 |       }
 | 
|  |    110 |     }
 | 
|  |    111 | 
 | 
|  |    112 |     sqlite3_free(azCols);
 | 
|  |    113 |     azCols = 0;
 | 
|  |    114 |   }
 | 
|  |    115 | 
 | 
|  |    116 | exec_out:
 | 
|  |    117 |   if( pStmt ) sqlite3_finalize(pStmt);
 | 
|  |    118 |   if( azCols ) sqlite3_free(azCols);
 | 
|  |    119 | 
 | 
|  |    120 |   rc = sqlite3ApiExit(db, rc);
 | 
|  |    121 |   if( rc!=SQLITE_OK && rc==sqlite3_errcode(db) && pzErrMsg ){
 | 
|  |    122 |     int nErrMsg = 1 + strlen(sqlite3_errmsg(db));
 | 
|  |    123 |     *pzErrMsg = (char*)sqlite3_malloc(nErrMsg);
 | 
|  |    124 |     if( *pzErrMsg ){
 | 
|  |    125 |       memcpy(*pzErrMsg, sqlite3_errmsg(db), nErrMsg);
 | 
|  |    126 |     }
 | 
|  |    127 |   }else if( pzErrMsg ){
 | 
|  |    128 |     *pzErrMsg = 0;
 | 
|  |    129 |   }
 | 
|  |    130 | 
 | 
|  |    131 |   assert( (rc&db->errMask)==rc );
 | 
|  |    132 |   sqlite3_mutex_leave(db->mutex);
 | 
|  |    133 |   return rc;
 | 
|  |    134 | }
 |