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 ** This file contains the sqlite3_get_table() and sqlite3_free_table() 13 ** interface routines. These are just wrappers around the main 14 ** interface routine of sqlite3_exec(). 15 ** 16 ** These routines are in a separate files so that they will not be linked 17 ** if they are not used. 18 */ 19 #include <stdlib.h> 20 #include <string.h> 21 #include "sqliteInt.h" 22 23 /* 24 ** This structure is used to pass data from sqlite3_get_table() through 25 ** to the callback function is uses to build the result. 26 */ 27 typedef struct TabResult { 28 char **azResult; 29 char *zErrMsg; 30 int nResult; 31 int nAlloc; 32 int nRow; 33 int nColumn; 34 int nData; 35 int rc; 36 } TabResult; 37 38 /* 39 ** This routine is called once for each row in the result table. Its job 40 ** is to fill in the TabResult structure appropriately, allocating new 41 ** memory as necessary. 42 */ 43 static int sqlite3_get_table_cb(void *pArg, int nCol, char **argv, char **colv){ 44 TabResult *p = (TabResult*)pArg; 45 int need; 46 int i; 47 char *z; 48 49 /* Make sure there is enough space in p->azResult to hold everything 50 ** we need to remember from this invocation of the callback. 51 */ 52 if( p->nRow==0 && argv!=0 ){ 53 need = nCol*2; 54 }else{ 55 need = nCol; 56 } 57 if( p->nData + need >= p->nAlloc ){ 58 char **azNew; 59 p->nAlloc = p->nAlloc*2 + need + 1; 60 azNew = realloc( p->azResult, sizeof(char*)*p->nAlloc ); 61 if( azNew==0 ) goto malloc_failed; 62 p->azResult = azNew; 63 } 64 65 /* If this is the first row, then generate an extra row containing 66 ** the names of all columns. 67 */ 68 if( p->nRow==0 ){ 69 p->nColumn = nCol; 70 for(i=0; i<nCol; i++){ 71 if( colv[i]==0 ){ 72 z = 0; 73 }else{ 74 z = malloc( strlen(colv[i])+1 ); 75 if( z==0 ) goto malloc_failed; 76 strcpy(z, colv[i]); 77 } 78 p->azResult[p->nData++] = z; 79 } 80 }else if( p->nColumn!=nCol ){ 81 sqlite3SetString(&p->zErrMsg, 82 "sqlite3_get_table() called with two or more incompatible queries", 83 (char*)0); 84 p->rc = SQLITE_ERROR; 85 return 1; 86 } 87 88 /* Copy over the row data 89 */ 90 if( argv!=0 ){ 91 for(i=0; i<nCol; i++){ 92 if( argv[i]==0 ){ 93 z = 0; 94 }else{ 95 z = malloc( strlen(argv[i])+1 ); 96 if( z==0 ) goto malloc_failed; 97 strcpy(z, argv[i]); 98 } 99 p->azResult[p->nData++] = z; 100 } 101 p->nRow++; 102 } 103 return 0; 104 105 malloc_failed: 106 p->rc = SQLITE_NOMEM; 107 return 1; 108 } 109 110 /* 111 ** Query the database. But instead of invoking a callback for each row, 112 ** malloc() for space to hold the result and return the entire results 113 ** at the conclusion of the call. 114 ** 115 ** The result that is written to ***pazResult is held in memory obtained 116 ** from malloc(). But the caller cannot free this memory directly. 117 ** Instead, the entire table should be passed to sqlite3_free_table() when 118 ** the calling procedure is finished using it. 119 */ 120 int sqlite3_get_table( 121 sqlite3 *db, /* The database on which the SQL executes */ 122 const char *zSql, /* The SQL to be executed */ 123 char ***pazResult, /* Write the result table here */ 124 int *pnRow, /* Write the number of rows in the result here */ 125 int *pnColumn, /* Write the number of columns of result here */ 126 char **pzErrMsg /* Write error messages here */ 127 ){ 128 int rc; 129 TabResult res; 130 if( pazResult==0 ){ return SQLITE_ERROR; } 131 *pazResult = 0; 132 if( pnColumn ) *pnColumn = 0; 133 if( pnRow ) *pnRow = 0; 134 res.zErrMsg = 0; 135 res.nResult = 0; 136 res.nRow = 0; 137 res.nColumn = 0; 138 res.nData = 1; 139 res.nAlloc = 20; 140 res.rc = SQLITE_OK; 141 res.azResult = malloc( sizeof(char*)*res.nAlloc ); 142 if( res.azResult==0 ) return SQLITE_NOMEM; 143 res.azResult[0] = 0; 144 rc = sqlite3_exec(db, zSql, sqlite3_get_table_cb, &res, pzErrMsg); 145 if( res.azResult ){ 146 res.azResult[0] = (char*)res.nData; 147 } 148 if( rc==SQLITE_ABORT ){ 149 sqlite3_free_table(&res.azResult[1]); 150 if( res.zErrMsg ){ 151 if( pzErrMsg ){ 152 free(*pzErrMsg); 153 *pzErrMsg = sqlite3_mprintf("%s",res.zErrMsg); 154 } 155 sqliteFree(res.zErrMsg); 156 } 157 db->errCode = res.rc; 158 return res.rc; 159 } 160 sqliteFree(res.zErrMsg); 161 if( rc!=SQLITE_OK ){ 162 sqlite3_free_table(&res.azResult[1]); 163 return rc; 164 } 165 if( res.nAlloc>res.nData ){ 166 char **azNew; 167 azNew = realloc( res.azResult, sizeof(char*)*(res.nData+1) ); 168 if( azNew==0 ){ 169 sqlite3_free_table(&res.azResult[1]); 170 return SQLITE_NOMEM; 171 } 172 res.nAlloc = res.nData+1; 173 res.azResult = azNew; 174 } 175 *pazResult = &res.azResult[1]; 176 if( pnColumn ) *pnColumn = res.nColumn; 177 if( pnRow ) *pnRow = res.nRow; 178 return rc; 179 } 180 181 /* 182 ** This routine frees the space the sqlite3_get_table() malloced. 183 */ 184 void sqlite3_free_table( 185 char **azResult /* Result returned from from sqlite3_get_table() */ 186 ){ 187 if( azResult ){ 188 int i, n; 189 azResult--; 190 if( azResult==0 ) return; 191 n = (int)azResult[0]; 192 for(i=1; i<n; i++){ if( azResult[i] ) free(azResult[i]); } 193 free(azResult); 194 } 195 } 196