Annotation of embedaddon/sqlite3/src/legacy.c, revision 1.1.1.1

1.1       misho       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: 
                     18: #include "sqliteInt.h"
                     19: 
                     20: /*
                     21: ** Execute SQL code.  Return one of the SQLITE_ success/failure
                     22: ** codes.  Also write an error message into memory obtained from
                     23: ** malloc() and make *pzErrMsg point to that message.
                     24: **
                     25: ** If the SQL is a query, then for each row in the query result
                     26: ** the xCallback() function is called.  pArg becomes the first
                     27: ** argument to xCallback().  If xCallback=NULL then no callback
                     28: ** is invoked, even for queries.
                     29: */
                     30: int sqlite3_exec(
                     31:   sqlite3 *db,                /* The database on which the SQL executes */
                     32:   const char *zSql,           /* The SQL to be executed */
                     33:   sqlite3_callback xCallback, /* Invoke this callback routine */
                     34:   void *pArg,                 /* First argument to xCallback() */
                     35:   char **pzErrMsg             /* Write error messages here */
                     36: ){
                     37:   int rc = SQLITE_OK;         /* Return code */
                     38:   const char *zLeftover;      /* Tail of unprocessed SQL */
                     39:   sqlite3_stmt *pStmt = 0;    /* The current SQL statement */
                     40:   char **azCols = 0;          /* Names of result columns */
                     41:   int nRetry = 0;             /* Number of retry attempts */
                     42:   int callbackIsInit;         /* True if callback data is initialized */
                     43: 
                     44:   if( !sqlite3SafetyCheckOk(db) ) return SQLITE_MISUSE_BKPT;
                     45:   if( zSql==0 ) zSql = "";
                     46: 
                     47:   sqlite3_mutex_enter(db->mutex);
                     48:   sqlite3Error(db, SQLITE_OK, 0);
                     49:   while( (rc==SQLITE_OK || (rc==SQLITE_SCHEMA && (++nRetry)<2)) && zSql[0] ){
                     50:     int nCol;
                     51:     char **azVals = 0;
                     52: 
                     53:     pStmt = 0;
                     54:     rc = sqlite3_prepare(db, zSql, -1, &pStmt, &zLeftover);
                     55:     assert( rc==SQLITE_OK || pStmt==0 );
                     56:     if( rc!=SQLITE_OK ){
                     57:       continue;
                     58:     }
                     59:     if( !pStmt ){
                     60:       /* this happens for a comment or white-space */
                     61:       zSql = zLeftover;
                     62:       continue;
                     63:     }
                     64: 
                     65:     callbackIsInit = 0;
                     66:     nCol = sqlite3_column_count(pStmt);
                     67: 
                     68:     while( 1 ){
                     69:       int i;
                     70:       rc = sqlite3_step(pStmt);
                     71: 
                     72:       /* Invoke the callback function if required */
                     73:       if( xCallback && (SQLITE_ROW==rc || 
                     74:           (SQLITE_DONE==rc && !callbackIsInit
                     75:                            && db->flags&SQLITE_NullCallback)) ){
                     76:         if( !callbackIsInit ){
                     77:           azCols = sqlite3DbMallocZero(db, 2*nCol*sizeof(const char*) + 1);
                     78:           if( azCols==0 ){
                     79:             goto exec_out;
                     80:           }
                     81:           for(i=0; i<nCol; i++){
                     82:             azCols[i] = (char *)sqlite3_column_name(pStmt, i);
                     83:             /* sqlite3VdbeSetColName() installs column names as UTF8
                     84:             ** strings so there is no way for sqlite3_column_name() to fail. */
                     85:             assert( azCols[i]!=0 );
                     86:           }
                     87:           callbackIsInit = 1;
                     88:         }
                     89:         if( rc==SQLITE_ROW ){
                     90:           azVals = &azCols[nCol];
                     91:           for(i=0; i<nCol; i++){
                     92:             azVals[i] = (char *)sqlite3_column_text(pStmt, i);
                     93:             if( !azVals[i] && sqlite3_column_type(pStmt, i)!=SQLITE_NULL ){
                     94:               db->mallocFailed = 1;
                     95:               goto exec_out;
                     96:             }
                     97:           }
                     98:         }
                     99:         if( xCallback(pArg, nCol, azVals, azCols) ){
                    100:           rc = SQLITE_ABORT;
                    101:           sqlite3VdbeFinalize((Vdbe *)pStmt);
                    102:           pStmt = 0;
                    103:           sqlite3Error(db, SQLITE_ABORT, 0);
                    104:           goto exec_out;
                    105:         }
                    106:       }
                    107: 
                    108:       if( rc!=SQLITE_ROW ){
                    109:         rc = sqlite3VdbeFinalize((Vdbe *)pStmt);
                    110:         pStmt = 0;
                    111:         if( rc!=SQLITE_SCHEMA ){
                    112:           nRetry = 0;
                    113:           zSql = zLeftover;
                    114:           while( sqlite3Isspace(zSql[0]) ) zSql++;
                    115:         }
                    116:         break;
                    117:       }
                    118:     }
                    119: 
                    120:     sqlite3DbFree(db, azCols);
                    121:     azCols = 0;
                    122:   }
                    123: 
                    124: exec_out:
                    125:   if( pStmt ) sqlite3VdbeFinalize((Vdbe *)pStmt);
                    126:   sqlite3DbFree(db, azCols);
                    127: 
                    128:   rc = sqlite3ApiExit(db, rc);
                    129:   if( rc!=SQLITE_OK && ALWAYS(rc==sqlite3_errcode(db)) && pzErrMsg ){
                    130:     int nErrMsg = 1 + sqlite3Strlen30(sqlite3_errmsg(db));
                    131:     *pzErrMsg = sqlite3Malloc(nErrMsg);
                    132:     if( *pzErrMsg ){
                    133:       memcpy(*pzErrMsg, sqlite3_errmsg(db), nErrMsg);
                    134:     }else{
                    135:       rc = SQLITE_NOMEM;
                    136:       sqlite3Error(db, SQLITE_NOMEM, 0);
                    137:     }
                    138:   }else if( pzErrMsg ){
                    139:     *pzErrMsg = 0;
                    140:   }
                    141: 
                    142:   assert( (rc&db->errMask)==rc );
                    143:   sqlite3_mutex_leave(db->mutex);
                    144:   return rc;
                    145: }

FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>