Annotation of embedaddon/sqlite3/src/legacy.c, revision 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>