modernc.org/cc@v1.0.1/v2/testdata/_sqlite/src/legacy.c (about)

     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 callbackIsInit;         /* True if callback data is initialized */
    42  
    43    if( !sqlite3SafetyCheckOk(db) ) return SQLITE_MISUSE_BKPT;
    44    if( zSql==0 ) zSql = "";
    45  
    46    sqlite3_mutex_enter(db->mutex);
    47    sqlite3Error(db, SQLITE_OK);
    48    while( rc==SQLITE_OK && zSql[0] ){
    49      int nCol;
    50      char **azVals = 0;
    51  
    52      pStmt = 0;
    53      rc = sqlite3_prepare_v2(db, zSql, -1, &pStmt, &zLeftover);
    54      assert( rc==SQLITE_OK || pStmt==0 );
    55      if( rc!=SQLITE_OK ){
    56        continue;
    57      }
    58      if( !pStmt ){
    59        /* this happens for a comment or white-space */
    60        zSql = zLeftover;
    61        continue;
    62      }
    63  
    64      callbackIsInit = 0;
    65      nCol = sqlite3_column_count(pStmt);
    66  
    67      while( 1 ){
    68        int i;
    69        rc = sqlite3_step(pStmt);
    70  
    71        /* Invoke the callback function if required */
    72        if( xCallback && (SQLITE_ROW==rc || 
    73            (SQLITE_DONE==rc && !callbackIsInit
    74                             && db->flags&SQLITE_NullCallback)) ){
    75          if( !callbackIsInit ){
    76            azCols = sqlite3DbMallocRaw(db, (2*nCol+1)*sizeof(const char*));
    77            if( azCols==0 ){
    78              goto exec_out;
    79            }
    80            for(i=0; i<nCol; i++){
    81              azCols[i] = (char *)sqlite3_column_name(pStmt, i);
    82              /* sqlite3VdbeSetColName() installs column names as UTF8
    83              ** strings so there is no way for sqlite3_column_name() to fail. */
    84              assert( azCols[i]!=0 );
    85            }
    86            callbackIsInit = 1;
    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              if( !azVals[i] && sqlite3_column_type(pStmt, i)!=SQLITE_NULL ){
    93                sqlite3OomFault(db);
    94                goto exec_out;
    95              }
    96            }
    97            azVals[i] = 0;
    98          }
    99          if( xCallback(pArg, nCol, azVals, azCols) ){
   100            /* EVIDENCE-OF: R-38229-40159 If the callback function to
   101            ** sqlite3_exec() returns non-zero, then sqlite3_exec() will
   102            ** return SQLITE_ABORT. */
   103            rc = SQLITE_ABORT;
   104            sqlite3VdbeFinalize((Vdbe *)pStmt);
   105            pStmt = 0;
   106            sqlite3Error(db, SQLITE_ABORT);
   107            goto exec_out;
   108          }
   109        }
   110  
   111        if( rc!=SQLITE_ROW ){
   112          rc = sqlite3VdbeFinalize((Vdbe *)pStmt);
   113          pStmt = 0;
   114          zSql = zLeftover;
   115          while( sqlite3Isspace(zSql[0]) ) zSql++;
   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 && pzErrMsg ){
   130      *pzErrMsg = sqlite3DbStrDup(0, sqlite3_errmsg(db));
   131      if( *pzErrMsg==0 ){
   132        rc = SQLITE_NOMEM_BKPT;
   133        sqlite3Error(db, SQLITE_NOMEM);
   134      }
   135    }else if( pzErrMsg ){
   136      *pzErrMsg = 0;
   137    }
   138  
   139    assert( (rc&db->errMask)==rc );
   140    sqlite3_mutex_leave(db->mutex);
   141    return rc;
   142  }