legacy.c
上传用户:sunhongbo
上传日期:2022-01-25
资源大小:3010k
文件大小:4k
源码类别:

数据库系统

开发平台:

C/C++

  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.c,v 1.24 2008/03/21 18:01:14 drh Exp $
  18. */
  19. #include "sqliteInt.h"
  20. #include <ctype.h>
  21. /*
  22. ** Execute SQL code.  Return one of the SQLITE_ success/failure
  23. ** codes.  Also write an error message into memory obtained from
  24. ** malloc() and make *pzErrMsg point to that message.
  25. **
  26. ** If the SQL is a query, then for each row in the query result
  27. ** the xCallback() function is called.  pArg becomes the first
  28. ** argument to xCallback().  If xCallback=NULL then no callback
  29. ** is invoked, even for queries.
  30. */
  31. int sqlite3_exec(
  32.   sqlite3 *db,                /* The database on which the SQL executes */
  33.   const char *zSql,           /* The SQL to be executed */
  34.   sqlite3_callback xCallback, /* Invoke this callback routine */
  35.   void *pArg,                 /* First argument to xCallback() */
  36.   char **pzErrMsg             /* Write error messages here */
  37. ){
  38.   int rc = SQLITE_OK;
  39.   const char *zLeftover;
  40.   sqlite3_stmt *pStmt = 0;
  41.   char **azCols = 0;
  42.   int nRetry = 0;
  43.   int nCallback;
  44.   if( zSql==0 ) return SQLITE_OK;
  45.   sqlite3_mutex_enter(db->mutex);
  46.   while( (rc==SQLITE_OK || (rc==SQLITE_SCHEMA && (++nRetry)<2)) && zSql[0] ){
  47.     int nCol;
  48.     char **azVals = 0;
  49.     pStmt = 0;
  50.     rc = sqlite3_prepare(db, zSql, -1, &pStmt, &zLeftover);
  51.     assert( rc==SQLITE_OK || pStmt==0 );
  52.     if( rc!=SQLITE_OK ){
  53.       continue;
  54.     }
  55.     if( !pStmt ){
  56.       /* this happens for a comment or white-space */
  57.       zSql = zLeftover;
  58.       continue;
  59.     }
  60.     nCallback = 0;
  61.     nCol = sqlite3_column_count(pStmt);
  62.     while( 1 ){
  63.       int i;
  64.       rc = sqlite3_step(pStmt);
  65.       /* Invoke the callback function if required */
  66.       if( xCallback && (SQLITE_ROW==rc || 
  67.           (SQLITE_DONE==rc && !nCallback && db->flags&SQLITE_NullCallback)) ){
  68.         if( 0==nCallback ){
  69.           if( azCols==0 ){
  70.             azCols = sqlite3DbMallocZero(db, 2*nCol*sizeof(const char*) + 1);
  71.             if( azCols==0 ){
  72.               goto exec_out;
  73.             }
  74.           }
  75.           for(i=0; i<nCol; i++){
  76.             azCols[i] = (char *)sqlite3_column_name(pStmt, i);
  77.             if( !azCols[i] ){
  78.               db->mallocFailed = 1;
  79.               goto exec_out;
  80.             }
  81.           }
  82.           nCallback++;
  83.         }
  84.         if( rc==SQLITE_ROW ){
  85.           azVals = &azCols[nCol];
  86.           for(i=0; i<nCol; i++){
  87.             azVals[i] = (char *)sqlite3_column_text(pStmt, i);
  88.             if( !azVals[i] && sqlite3_column_type(pStmt, i)!=SQLITE_NULL ){
  89.               db->mallocFailed = 1;
  90.               goto exec_out;
  91.             }
  92.           }
  93.         }
  94.         if( xCallback(pArg, nCol, azVals, azCols) ){
  95.           rc = SQLITE_ABORT;
  96.           goto exec_out;
  97.         }
  98.       }
  99.       if( rc!=SQLITE_ROW ){
  100.         rc = sqlite3_finalize(pStmt);
  101.         pStmt = 0;
  102.         if( rc!=SQLITE_SCHEMA ){
  103.           nRetry = 0;
  104.           zSql = zLeftover;
  105.           while( isspace((unsigned char)zSql[0]) ) zSql++;
  106.         }
  107.         break;
  108.       }
  109.     }
  110.     sqlite3_free(azCols);
  111.     azCols = 0;
  112.   }
  113. exec_out:
  114.   if( pStmt ) sqlite3_finalize(pStmt);
  115.   if( azCols ) sqlite3_free(azCols);
  116.   rc = sqlite3ApiExit(db, rc);
  117.   if( rc!=SQLITE_OK && rc==sqlite3_errcode(db) && pzErrMsg ){
  118.     int nErrMsg = 1 + strlen(sqlite3_errmsg(db));
  119.     *pzErrMsg = sqlite3_malloc(nErrMsg);
  120.     if( *pzErrMsg ){
  121.       memcpy(*pzErrMsg, sqlite3_errmsg(db), nErrMsg);
  122.     }
  123.   }else if( pzErrMsg ){
  124.     *pzErrMsg = 0;
  125.   }
  126.   assert( (rc&db->errMask)==rc );
  127.   sqlite3_mutex_leave(db->mutex);
  128.   return rc;
  129. }