1434
|
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: main.c,v 1.340 2006/05/24 12:43:27 drh Exp $
|
|
18 */
|
|
19 #include "sqliteInt.h"
|
|
20 #include "os.h"
|
|
21 #include <ctype.h>
|
|
22
|
|
23 /*
|
|
24 ** The following constant value is used by the SQLITE_BIGENDIAN and
|
|
25 ** SQLITE_LITTLEENDIAN macros.
|
|
26 */
|
|
27 const int sqlite3one = 1;
|
|
28
|
|
29 /*
|
|
30 ** The version of the library
|
|
31 */
|
|
32 const char sqlite3_version[] = SQLITE_VERSION;
|
|
33 const char *sqlite3_libversion(void){ return sqlite3_version; }
|
|
34 int sqlite3_libversion_number(void){ return SQLITE_VERSION_NUMBER; }
|
|
35
|
|
36 /*
|
|
37 ** This is the default collating function named "BINARY" which is always
|
|
38 ** available.
|
|
39 */
|
|
40 static int binCollFunc(
|
|
41 void *NotUsed,
|
|
42 int nKey1, const void *pKey1,
|
|
43 int nKey2, const void *pKey2
|
|
44 ){
|
|
45 int rc, n;
|
|
46 n = nKey1<nKey2 ? nKey1 : nKey2;
|
|
47 rc = memcmp(pKey1, pKey2, n);
|
|
48 if( rc==0 ){
|
|
49 rc = nKey1 - nKey2;
|
|
50 }
|
|
51 return rc;
|
|
52 }
|
|
53
|
|
54 /*
|
|
55 ** Another built-in collating sequence: NOCASE.
|
|
56 **
|
|
57 ** This collating sequence is intended to be used for "case independant
|
|
58 ** comparison". SQLite's knowledge of upper and lower case equivalents
|
|
59 ** extends only to the 26 characters used in the English language.
|
|
60 **
|
|
61 ** At the moment there is only a UTF-8 implementation.
|
|
62 */
|
|
63 static int nocaseCollatingFunc(
|
|
64 void *NotUsed,
|
|
65 int nKey1, const void *pKey1,
|
|
66 int nKey2, const void *pKey2
|
|
67 ){
|
|
68 int r = sqlite3StrNICmp(
|
|
69 (const char *)pKey1, (const char *)pKey2, (nKey1<nKey2)?nKey1:nKey2);
|
|
70 if( 0==r ){
|
|
71 r = nKey1-nKey2;
|
|
72 }
|
|
73 return r;
|
|
74 }
|
|
75
|
|
76 /*
|
|
77 ** Return the ROWID of the most recent insert
|
|
78 */
|
|
79 sqlite_int64 sqlite3_last_insert_rowid(sqlite3 *db){
|
|
80 return db->lastRowid;
|
|
81 }
|
|
82
|
|
83 /*
|
|
84 ** Return the number of changes in the most recent call to sqlite3_exec().
|
|
85 */
|
|
86 int sqlite3_changes(sqlite3 *db){
|
|
87 return db->nChange;
|
|
88 }
|
|
89
|
|
90 /*
|
|
91 ** Return the number of changes since the database handle was opened.
|
|
92 */
|
|
93 int sqlite3_total_changes(sqlite3 *db){
|
|
94 return db->nTotalChange;
|
|
95 }
|
|
96
|
|
97 /*
|
|
98 ** Close an existing SQLite database
|
|
99 */
|
|
100 int sqlite3_close(sqlite3 *db){
|
|
101 HashElem *i;
|
|
102 int j;
|
|
103
|
|
104 if( !db ){
|
|
105 return SQLITE_OK;
|
|
106 }
|
|
107 if( sqlite3SafetyCheck(db) ){
|
|
108 return SQLITE_MISUSE;
|
|
109 }
|
|
110
|
|
111 #ifdef SQLITE_SSE
|
|
112 {
|
|
113 extern void sqlite3SseCleanup(sqlite3*);
|
|
114 sqlite3SseCleanup(db);
|
|
115 }
|
|
116 #endif
|
|
117
|
|
118 /* If there are any outstanding VMs, return SQLITE_BUSY. */
|
|
119 if( db->pVdbe ){
|
|
120 sqlite3Error(db, SQLITE_BUSY,
|
|
121 "Unable to close due to unfinalised statements");
|
|
122 return SQLITE_BUSY;
|
|
123 }
|
|
124 assert( !sqlite3SafetyCheck(db) );
|
|
125
|
|
126 /* FIX ME: db->magic may be set to SQLITE_MAGIC_CLOSED if the database
|
|
127 ** cannot be opened for some reason. So this routine needs to run in
|
|
128 ** that case. But maybe there should be an extra magic value for the
|
|
129 ** "failed to open" state.
|
|
130 */
|
|
131 if( db->magic!=SQLITE_MAGIC_CLOSED && sqlite3SafetyOn(db) ){
|
|
132 /* printf("DID NOT CLOSE\n"); fflush(stdout); */
|
|
133 return SQLITE_ERROR;
|
|
134 }
|
|
135
|
|
136 for(j=0; j<db->nDb; j++){
|
|
137 struct Db *pDb = &db->aDb[j];
|
|
138 if( pDb->pBt ){
|
|
139 sqlite3BtreeClose(pDb->pBt);
|
|
140 pDb->pBt = 0;
|
|
141 if( j!=1 ){
|
|
142 pDb->pSchema = 0;
|
|
143 }
|
|
144 }
|
|
145 }
|
|
146 sqlite3ResetInternalSchema(db, 0);
|
|
147 assert( db->nDb<=2 );
|
|
148 assert( db->aDb==db->aDbStatic );
|
|
149 for(i=sqliteHashFirst(&db->aFunc); i; i=sqliteHashNext(i)){
|
|
150 FuncDef *pFunc, *pNext;
|
|
151 for(pFunc = (FuncDef*)sqliteHashData(i); pFunc; pFunc=pNext){
|
|
152 pNext = pFunc->pNext;
|
|
153 sqliteFree(pFunc);
|
|
154 }
|
|
155 }
|
|
156
|
|
157 for(i=sqliteHashFirst(&db->aCollSeq); i; i=sqliteHashNext(i)){
|
|
158 CollSeq *pColl = (CollSeq *)sqliteHashData(i);
|
|
159 sqliteFree(pColl);
|
|
160 }
|
|
161 sqlite3HashClear(&db->aCollSeq);
|
|
162
|
|
163 sqlite3HashClear(&db->aFunc);
|
|
164 sqlite3Error(db, SQLITE_OK, 0); /* Deallocates any cached error strings. */
|
|
165 if( db->pErr ){
|
|
166 sqlite3ValueFree(db->pErr);
|
|
167 }
|
|
168
|
|
169 db->magic = SQLITE_MAGIC_ERROR;
|
|
170
|
|
171 /* The temp-database schema is allocated differently from the other schema
|
|
172 ** objects (using sqliteMalloc() directly, instead of sqlite3BtreeSchema()).
|
|
173 ** So it needs to be freed here. Todo: Why not roll the temp schema into
|
|
174 ** the same sqliteMalloc() as the one that allocates the database
|
|
175 ** structure?
|
|
176 */
|
|
177 sqliteFree(db->aDb[1].pSchema);
|
|
178 sqliteFree(db);
|
|
179 sqlite3ReleaseThreadData();
|
|
180 return SQLITE_OK;
|
|
181 }
|
|
182
|
|
183 /*
|
|
184 ** Rollback all database files.
|
|
185 */
|
|
186 void sqlite3RollbackAll(sqlite3 *db){
|
|
187 int i;
|
|
188 int inTrans = 0;
|
|
189 for(i=0; i<db->nDb; i++){
|
|
190 if( db->aDb[i].pBt ){
|
|
191 if( sqlite3BtreeIsInTrans(db->aDb[i].pBt) ){
|
|
192 inTrans = 1;
|
|
193 }
|
|
194 sqlite3BtreeRollback(db->aDb[i].pBt);
|
|
195 db->aDb[i].inTrans = 0;
|
|
196 }
|
|
197 }
|
|
198 if( db->flags&SQLITE_InternChanges ){
|
|
199 sqlite3ResetInternalSchema(db, 0);
|
|
200 }
|
|
201
|
|
202 /* If one has been configured, invoke the rollback-hook callback */
|
|
203 if( db->xRollbackCallback && (inTrans || !db->autoCommit) ){
|
|
204 db->xRollbackCallback(db->pRollbackArg);
|
|
205 }
|
|
206 }
|
|
207
|
|
208 /*
|
|
209 ** Return a static string that describes the kind of error specified in the
|
|
210 ** argument.
|
|
211 */
|
|
212 const char *sqlite3ErrStr(int rc){
|
|
213 const char *z;
|
|
214 switch( rc ){
|
|
215 case SQLITE_ROW:
|
|
216 case SQLITE_DONE:
|
|
217 case SQLITE_OK: z = "not an error"; break;
|
|
218 case SQLITE_ERROR: z = "SQL logic error or missing database"; break;
|
|
219 case SQLITE_PERM: z = "access permission denied"; break;
|
|
220 case SQLITE_ABORT: z = "callback requested query abort"; break;
|
|
221 case SQLITE_BUSY: z = "database is locked"; break;
|
|
222 case SQLITE_LOCKED: z = "database table is locked"; break;
|
|
223 case SQLITE_NOMEM: z = "out of memory"; break;
|
|
224 case SQLITE_READONLY: z = "attempt to write a readonly database"; break;
|
|
225 case SQLITE_INTERRUPT: z = "interrupted"; break;
|
|
226 case SQLITE_IOERR: z = "disk I/O error"; break;
|
|
227 case SQLITE_CORRUPT: z = "database disk image is malformed"; break;
|
|
228 case SQLITE_FULL: z = "database or disk is full"; break;
|
|
229 case SQLITE_CANTOPEN: z = "unable to open database file"; break;
|
|
230 case SQLITE_PROTOCOL: z = "database locking protocol failure"; break;
|
|
231 case SQLITE_EMPTY: z = "table contains no data"; break;
|
|
232 case SQLITE_SCHEMA: z = "database schema has changed"; break;
|
|
233 case SQLITE_CONSTRAINT: z = "constraint failed"; break;
|
|
234 case SQLITE_MISMATCH: z = "datatype mismatch"; break;
|
|
235 case SQLITE_MISUSE: z = "library routine called out of sequence";break;
|
|
236 case SQLITE_NOLFS: z = "kernel lacks large file support"; break;
|
|
237 case SQLITE_AUTH: z = "authorization denied"; break;
|
|
238 case SQLITE_FORMAT: z = "auxiliary database format error"; break;
|
|
239 case SQLITE_RANGE: z = "bind or column index out of range"; break;
|
|
240 case SQLITE_NOTADB: z = "file is encrypted or is not a database";break;
|
|
241 default: z = "unknown error"; break;
|
|
242 }
|
|
243 return z;
|
|
244 }
|
|
245
|
|
246 /*
|
|
247 ** This routine implements a busy callback that sleeps and tries
|
|
248 ** again until a timeout value is reached. The timeout value is
|
|
249 ** an integer number of milliseconds passed in as the first
|
|
250 ** argument.
|
|
251 */
|
|
252 static int sqliteDefaultBusyCallback(
|
|
253 void *ptr, /* Database connection */
|
|
254 int count /* Number of times table has been busy */
|
|
255 ){
|
|
256 #if OS_WIN || (defined(HAVE_USLEEP) && HAVE_USLEEP)
|
|
257 static const u8 delays[] =
|
|
258 { 1, 2, 5, 10, 15, 20, 25, 25, 25, 50, 50, 100 };
|
|
259 static const u8 totals[] =
|
|
260 { 0, 1, 3, 8, 18, 33, 53, 78, 103, 128, 178, 228 };
|
|
261 # define NDELAY (sizeof(delays)/sizeof(delays[0]))
|
|
262 int timeout = ((sqlite3 *)ptr)->busyTimeout;
|
|
263 int delay, prior;
|
|
264
|
|
265 assert( count>=0 );
|
|
266 if( count < NDELAY ){
|
|
267 delay = delays[count];
|
|
268 prior = totals[count];
|
|
269 }else{
|
|
270 delay = delays[NDELAY-1];
|
|
271 prior = totals[NDELAY-1] + delay*(count-(NDELAY-1));
|
|
272 }
|
|
273 if( prior + delay > timeout ){
|
|
274 delay = timeout - prior;
|
|
275 if( delay<=0 ) return 0;
|
|
276 }
|
|
277 sqlite3OsSleep(delay);
|
|
278 return 1;
|
|
279 #else
|
|
280 int timeout = ((sqlite3 *)ptr)->busyTimeout;
|
|
281 if( (count+1)*1000 > timeout ){
|
|
282 return 0;
|
|
283 }
|
|
284 sqlite3OsSleep(1000);
|
|
285 return 1;
|
|
286 #endif
|
|
287 }
|
|
288
|
|
289 /*
|
|
290 ** Invoke the given busy handler.
|
|
291 **
|
|
292 ** This routine is called when an operation failed with a lock.
|
|
293 ** If this routine returns non-zero, the lock is retried. If it
|
|
294 ** returns 0, the operation aborts with an SQLITE_BUSY error.
|
|
295 */
|
|
296 int sqlite3InvokeBusyHandler(BusyHandler *p){
|
|
297 int rc;
|
|
298 if( p==0 || p->xFunc==0 || p->nBusy<0 ) return 0;
|
|
299 rc = p->xFunc(p->pArg, p->nBusy);
|
|
300 if( rc==0 ){
|
|
301 p->nBusy = -1;
|
|
302 }else{
|
|
303 p->nBusy++;
|
|
304 }
|
|
305 return rc;
|
|
306 }
|
|
307
|
|
308 /*
|
|
309 ** This routine sets the busy callback for an Sqlite database to the
|
|
310 ** given callback function with the given argument.
|
|
311 */
|
|
312 int sqlite3_busy_handler(
|
|
313 sqlite3 *db,
|
|
314 int (*xBusy)(void*,int),
|
|
315 void *pArg
|
|
316 ){
|
|
317 if( sqlite3SafetyCheck(db) ){
|
|
318 return SQLITE_MISUSE;
|
|
319 }
|
|
320 db->busyHandler.xFunc = xBusy;
|
|
321 db->busyHandler.pArg = pArg;
|
|
322 db->busyHandler.nBusy = 0;
|
|
323 return SQLITE_OK;
|
|
324 }
|
|
325
|
|
326 #ifndef SQLITE_OMIT_PROGRESS_CALLBACK
|
|
327 /*
|
|
328 ** This routine sets the progress callback for an Sqlite database to the
|
|
329 ** given callback function with the given argument. The progress callback will
|
|
330 ** be invoked every nOps opcodes.
|
|
331 */
|
|
332 void sqlite3_progress_handler(
|
|
333 sqlite3 *db,
|
|
334 int nOps,
|
|
335 int (*xProgress)(void*),
|
|
336 void *pArg
|
|
337 ){
|
|
338 if( !sqlite3SafetyCheck(db) ){
|
|
339 if( nOps>0 ){
|
|
340 db->xProgress = xProgress;
|
|
341 db->nProgressOps = nOps;
|
|
342 db->pProgressArg = pArg;
|
|
343 }else{
|
|
344 db->xProgress = 0;
|
|
345 db->nProgressOps = 0;
|
|
346 db->pProgressArg = 0;
|
|
347 }
|
|
348 }
|
|
349 }
|
|
350 #endif
|
|
351
|
|
352
|
|
353 /*
|
|
354 ** This routine installs a default busy handler that waits for the
|
|
355 ** specified number of milliseconds before returning 0.
|
|
356 */
|
|
357 int sqlite3_busy_timeout(sqlite3 *db, int ms){
|
|
358 if( ms>0 ){
|
|
359 db->busyTimeout = ms;
|
|
360 sqlite3_busy_handler(db, sqliteDefaultBusyCallback, (void*)db);
|
|
361 }else{
|
|
362 sqlite3_busy_handler(db, 0, 0);
|
|
363 }
|
|
364 return SQLITE_OK;
|
|
365 }
|
|
366
|
|
367 /*
|
|
368 ** Cause any pending operation to stop at its earliest opportunity.
|
|
369 */
|
|
370 void sqlite3_interrupt(sqlite3 *db){
|
|
371 if( !sqlite3SafetyCheck(db) ){
|
|
372 db->flags |= SQLITE_Interrupt;
|
|
373 }
|
|
374 }
|
|
375
|
|
376 /*
|
|
377 ** Windows systems should call this routine to free memory that
|
|
378 ** is returned in the in the errmsg parameter of sqlite3_open() when
|
|
379 ** SQLite is a DLL. For some reason, it does not work to call free()
|
|
380 ** directly.
|
|
381 **
|
|
382 ** Note that we need to call free() not sqliteFree() here.
|
|
383 */
|
|
384 void sqlite3_free(char *p){ free(p); }
|
|
385
|
|
386 /*
|
|
387 ** This function is exactly the same as sqlite3_create_function(), except
|
|
388 ** that it is designed to be called by internal code. The difference is
|
|
389 ** that if a malloc() fails in sqlite3_create_function(), an error code
|
|
390 ** is returned and the mallocFailed flag cleared.
|
|
391 */
|
|
392 int sqlite3CreateFunc(
|
|
393 sqlite3 *db,
|
|
394 const char *zFunctionName,
|
|
395 int nArg,
|
|
396 int enc,
|
|
397 void *pUserData,
|
|
398 void (*xFunc)(sqlite3_context*,int,sqlite3_value **),
|
|
399 void (*xStep)(sqlite3_context*,int,sqlite3_value **),
|
|
400 void (*xFinal)(sqlite3_context*)
|
|
401 ){
|
|
402 FuncDef *p;
|
|
403 int nName;
|
|
404
|
|
405 if( sqlite3SafetyCheck(db) ){
|
|
406 return SQLITE_MISUSE;
|
|
407 }
|
|
408 if( zFunctionName==0 ||
|
|
409 (xFunc && (xFinal || xStep)) ||
|
|
410 (!xFunc && (xFinal && !xStep)) ||
|
|
411 (!xFunc && (!xFinal && xStep)) ||
|
|
412 (nArg<-1 || nArg>127) ||
|
|
413 (255<(nName = strlen(zFunctionName))) ){
|
|
414 return SQLITE_ERROR;
|
|
415 }
|
|
416
|
|
417 #ifndef SQLITE_OMIT_UTF16
|
|
418 /* If SQLITE_UTF16 is specified as the encoding type, transform this
|
|
419 ** to one of SQLITE_UTF16LE or SQLITE_UTF16BE using the
|
|
420 ** SQLITE_UTF16NATIVE macro. SQLITE_UTF16 is not used internally.
|
|
421 **
|
|
422 ** If SQLITE_ANY is specified, add three versions of the function
|
|
423 ** to the hash table.
|
|
424 */
|
|
425 if( enc==SQLITE_UTF16 ){
|
|
426 enc = SQLITE_UTF16NATIVE;
|
|
427 }else if( enc==SQLITE_ANY ){
|
|
428 int rc;
|
|
429 rc = sqlite3CreateFunc(db, zFunctionName, nArg, SQLITE_UTF8,
|
|
430 pUserData, xFunc, xStep, xFinal);
|
|
431 if( rc!=SQLITE_OK ) return rc;
|
|
432 rc = sqlite3CreateFunc(db, zFunctionName, nArg, SQLITE_UTF16LE,
|
|
433 pUserData, xFunc, xStep, xFinal);
|
|
434 if( rc!=SQLITE_OK ) return rc;
|
|
435 enc = SQLITE_UTF16BE;
|
|
436 }
|
|
437 #else
|
|
438 enc = SQLITE_UTF8;
|
|
439 #endif
|
|
440
|
|
441 /* Check if an existing function is being overridden or deleted. If so,
|
|
442 ** and there are active VMs, then return SQLITE_BUSY. If a function
|
|
443 ** is being overridden/deleted but there are no active VMs, allow the
|
|
444 ** operation to continue but invalidate all precompiled statements.
|
|
445 */
|
|
446 p = sqlite3FindFunction(db, zFunctionName, nName, nArg, enc, 0);
|
|
447 if( p && p->iPrefEnc==enc && p->nArg==nArg ){
|
|
448 if( db->activeVdbeCnt ){
|
|
449 sqlite3Error(db, SQLITE_BUSY,
|
|
450 "Unable to delete/modify user-function due to active statements");
|
|
451 assert( !sqlite3MallocFailed() );
|
|
452 return SQLITE_BUSY;
|
|
453 }else{
|
|
454 sqlite3ExpirePreparedStatements(db);
|
|
455 }
|
|
456 }
|
|
457
|
|
458 p = sqlite3FindFunction(db, zFunctionName, nName, nArg, enc, 1);
|
|
459 if( p ){
|
|
460 p->flags = 0;
|
|
461 p->xFunc = xFunc;
|
|
462 p->xStep = xStep;
|
|
463 p->xFinalize = xFinal;
|
|
464 p->pUserData = pUserData;
|
|
465 }
|
|
466 return SQLITE_OK;
|
|
467 }
|
|
468
|
|
469 /*
|
|
470 ** Create new user functions.
|
|
471 */
|
|
472 int sqlite3_create_function(
|
|
473 sqlite3 *db,
|
|
474 const char *zFunctionName,
|
|
475 int nArg,
|
|
476 int enc,
|
|
477 void *p,
|
|
478 void (*xFunc)(sqlite3_context*,int,sqlite3_value **),
|
|
479 void (*xStep)(sqlite3_context*,int,sqlite3_value **),
|
|
480 void (*xFinal)(sqlite3_context*)
|
|
481 ){
|
|
482 int rc;
|
|
483 assert( !sqlite3MallocFailed() );
|
|
484 rc = sqlite3CreateFunc(db, zFunctionName, nArg, enc, p, xFunc, xStep, xFinal);
|
|
485
|
|
486 return sqlite3ApiExit(db, rc);
|
|
487 }
|
|
488
|
|
489 #ifndef SQLITE_OMIT_UTF16
|
|
490 int sqlite3_create_function16(
|
|
491 sqlite3 *db,
|
|
492 const void *zFunctionName,
|
|
493 int nArg,
|
|
494 int eTextRep,
|
|
495 void *p,
|
|
496 void (*xFunc)(sqlite3_context*,int,sqlite3_value**),
|
|
497 void (*xStep)(sqlite3_context*,int,sqlite3_value**),
|
|
498 void (*xFinal)(sqlite3_context*)
|
|
499 ){
|
|
500 int rc;
|
|
501 char *zFunc8;
|
|
502 assert( !sqlite3MallocFailed() );
|
|
503
|
|
504 zFunc8 = sqlite3utf16to8(zFunctionName, -1);
|
|
505 rc = sqlite3CreateFunc(db, zFunc8, nArg, eTextRep, p, xFunc, xStep, xFinal);
|
|
506 sqliteFree(zFunc8);
|
|
507
|
|
508 return sqlite3ApiExit(db, rc);
|
|
509 }
|
|
510 #endif
|
|
511
|
|
512 #ifndef SQLITE_OMIT_TRACE
|
|
513 /*
|
|
514 ** Register a trace function. The pArg from the previously registered trace
|
|
515 ** is returned.
|
|
516 **
|
|
517 ** A NULL trace function means that no tracing is executes. A non-NULL
|
|
518 ** trace is a pointer to a function that is invoked at the start of each
|
|
519 ** SQL statement.
|
|
520 */
|
|
521 void *sqlite3_trace(sqlite3 *db, void (*xTrace)(void*,const char*), void *pArg){
|
|
522 void *pOld = db->pTraceArg;
|
|
523 db->xTrace = xTrace;
|
|
524 db->pTraceArg = pArg;
|
|
525 return pOld;
|
|
526 }
|
|
527 /*
|
|
528 ** Register a profile function. The pArg from the previously registered
|
|
529 ** profile function is returned.
|
|
530 **
|
|
531 ** A NULL profile function means that no profiling is executes. A non-NULL
|
|
532 ** profile is a pointer to a function that is invoked at the conclusion of
|
|
533 ** each SQL statement that is run.
|
|
534 */
|
|
535 void *sqlite3_profile(
|
|
536 sqlite3 *db,
|
|
537 void (*xProfile)(void*,const char*,sqlite_uint64),
|
|
538 void *pArg
|
|
539 ){
|
|
540 void *pOld = db->pProfileArg;
|
|
541 db->xProfile = xProfile;
|
|
542 db->pProfileArg = pArg;
|
|
543 return pOld;
|
|
544 }
|
|
545 #endif /* SQLITE_OMIT_TRACE */
|
|
546
|
|
547 /*** EXPERIMENTAL ***
|
|
548 **
|
|
549 ** Register a function to be invoked when a transaction comments.
|
|
550 ** If the invoked function returns non-zero, then the commit becomes a
|
|
551 ** rollback.
|
|
552 */
|
|
553 void *sqlite3_commit_hook(
|
|
554 sqlite3 *db, /* Attach the hook to this database */
|
|
555 int (*xCallback)(void*), /* Function to invoke on each commit */
|
|
556 void *pArg /* Argument to the function */
|
|
557 ){
|
|
558 void *pOld = db->pCommitArg;
|
|
559 db->xCommitCallback = xCallback;
|
|
560 db->pCommitArg = pArg;
|
|
561 return pOld;
|
|
562 }
|
|
563
|
|
564 /*
|
|
565 ** Register a callback to be invoked each time a row is updated,
|
|
566 ** inserted or deleted using this database connection.
|
|
567 */
|
|
568 void *sqlite3_update_hook(
|
|
569 sqlite3 *db, /* Attach the hook to this database */
|
|
570 void (*xCallback)(void*,int,char const *,char const *,sqlite_int64),
|
|
571 void *pArg /* Argument to the function */
|
|
572 ){
|
|
573 void *pRet = db->pUpdateArg;
|
|
574 db->xUpdateCallback = xCallback;
|
|
575 db->pUpdateArg = pArg;
|
|
576 return pRet;
|
|
577 }
|
|
578
|
|
579 /*
|
|
580 ** Register a callback to be invoked each time a transaction is rolled
|
|
581 ** back by this database connection.
|
|
582 */
|
|
583 void *sqlite3_rollback_hook(
|
|
584 sqlite3 *db, /* Attach the hook to this database */
|
|
585 void (*xCallback)(void*), /* Callback function */
|
|
586 void *pArg /* Argument to the function */
|
|
587 ){
|
|
588 void *pRet = db->pRollbackArg;
|
|
589 db->xRollbackCallback = xCallback;
|
|
590 db->pRollbackArg = pArg;
|
|
591 return pRet;
|
|
592 }
|
|
593
|
|
594 /*
|
|
595 ** This routine is called to create a connection to a database BTree
|
|
596 ** driver. If zFilename is the name of a file, then that file is
|
|
597 ** opened and used. If zFilename is the magic name ":memory:" then
|
|
598 ** the database is stored in memory (and is thus forgotten as soon as
|
|
599 ** the connection is closed.) If zFilename is NULL then the database
|
|
600 ** is a "virtual" database for transient use only and is deleted as
|
|
601 ** soon as the connection is closed.
|
|
602 **
|
|
603 ** A virtual database can be either a disk file (that is automatically
|
|
604 ** deleted when the file is closed) or it an be held entirely in memory,
|
|
605 ** depending on the values of the TEMP_STORE compile-time macro and the
|
|
606 ** db->temp_store variable, according to the following chart:
|
|
607 **
|
|
608 ** TEMP_STORE db->temp_store Location of temporary database
|
|
609 ** ---------- -------------- ------------------------------
|
|
610 ** 0 any file
|
|
611 ** 1 1 file
|
|
612 ** 1 2 memory
|
|
613 ** 1 0 file
|
|
614 ** 2 1 file
|
|
615 ** 2 2 memory
|
|
616 ** 2 0 memory
|
|
617 ** 3 any memory
|
|
618 */
|
|
619 int sqlite3BtreeFactory(
|
|
620 const sqlite3 *db, /* Main database when opening aux otherwise 0 */
|
|
621 const char *zFilename, /* Name of the file containing the BTree database */
|
|
622 int omitJournal, /* if TRUE then do not journal this file */
|
|
623 int nCache, /* How many pages in the page cache */
|
|
624 Btree **ppBtree /* Pointer to new Btree object written here */
|
|
625 ){
|
|
626 int btree_flags = 0;
|
|
627 int rc;
|
|
628
|
|
629 assert( ppBtree != 0);
|
|
630 if( omitJournal ){
|
|
631 btree_flags |= BTREE_OMIT_JOURNAL;
|
|
632 }
|
|
633 if( db->flags & SQLITE_NoReadlock ){
|
|
634 btree_flags |= BTREE_NO_READLOCK;
|
|
635 }
|
|
636 if( zFilename==0 ){
|
|
637 #if TEMP_STORE==0
|
|
638 /* Do nothing */
|
|
639 #endif
|
|
640 #ifndef SQLITE_OMIT_MEMORYDB
|
|
641 #if TEMP_STORE==1
|
|
642 if( db->temp_store==2 ) zFilename = ":memory:";
|
|
643 #endif
|
|
644 #if TEMP_STORE==2
|
|
645 if( db->temp_store!=1 ) zFilename = ":memory:";
|
|
646 #endif
|
|
647 #if TEMP_STORE==3
|
|
648 zFilename = ":memory:";
|
|
649 #endif
|
|
650 #endif /* SQLITE_OMIT_MEMORYDB */
|
|
651 }
|
|
652
|
|
653 rc = sqlite3BtreeOpen(zFilename, (sqlite3 *)db, ppBtree, btree_flags);
|
|
654 if( rc==SQLITE_OK ){
|
|
655 sqlite3BtreeSetBusyHandler(*ppBtree, (void*)&db->busyHandler);
|
|
656 sqlite3BtreeSetCacheSize(*ppBtree, nCache);
|
|
657 }
|
|
658 return rc;
|
|
659 }
|
|
660
|
|
661 /*
|
|
662 ** Return UTF-8 encoded English language explanation of the most recent
|
|
663 ** error.
|
|
664 */
|
|
665 const char *sqlite3_errmsg(sqlite3 *db){
|
|
666 const char *z;
|
|
667 if( !db || sqlite3MallocFailed() ){
|
|
668 return sqlite3ErrStr(SQLITE_NOMEM);
|
|
669 }
|
|
670 if( sqlite3SafetyCheck(db) || db->errCode==SQLITE_MISUSE ){
|
|
671 return sqlite3ErrStr(SQLITE_MISUSE);
|
|
672 }
|
|
673 z = (char*)sqlite3_value_text(db->pErr);
|
|
674 if( z==0 ){
|
|
675 z = sqlite3ErrStr(db->errCode);
|
|
676 }
|
|
677 return z;
|
|
678 }
|
|
679
|
|
680 #ifndef SQLITE_OMIT_UTF16
|
|
681 /*
|
|
682 ** Return UTF-16 encoded English language explanation of the most recent
|
|
683 ** error.
|
|
684 */
|
|
685 const void *sqlite3_errmsg16(sqlite3 *db){
|
|
686 /* Because all the characters in the string are in the unicode
|
|
687 ** range 0x00-0xFF, if we pad the big-endian string with a
|
|
688 ** zero byte, we can obtain the little-endian string with
|
|
689 ** &big_endian[1].
|
|
690 */
|
|
691 static const char outOfMemBe[] = {
|
|
692 0, 'o', 0, 'u', 0, 't', 0, ' ',
|
|
693 0, 'o', 0, 'f', 0, ' ',
|
|
694 0, 'm', 0, 'e', 0, 'm', 0, 'o', 0, 'r', 0, 'y', 0, 0, 0
|
|
695 };
|
|
696 static const char misuseBe [] = {
|
|
697 0, 'l', 0, 'i', 0, 'b', 0, 'r', 0, 'a', 0, 'r', 0, 'y', 0, ' ',
|
|
698 0, 'r', 0, 'o', 0, 'u', 0, 't', 0, 'i', 0, 'n', 0, 'e', 0, ' ',
|
|
699 0, 'c', 0, 'a', 0, 'l', 0, 'l', 0, 'e', 0, 'd', 0, ' ',
|
|
700 0, 'o', 0, 'u', 0, 't', 0, ' ',
|
|
701 0, 'o', 0, 'f', 0, ' ',
|
|
702 0, 's', 0, 'e', 0, 'q', 0, 'u', 0, 'e', 0, 'n', 0, 'c', 0, 'e', 0, 0, 0
|
|
703 };
|
|
704
|
|
705 const void *z;
|
|
706 if( sqlite3MallocFailed() ){
|
|
707 return (void *)(&outOfMemBe[SQLITE_UTF16NATIVE==SQLITE_UTF16LE?1:0]);
|
|
708 }
|
|
709 if( sqlite3SafetyCheck(db) || db->errCode==SQLITE_MISUSE ){
|
|
710 return (void *)(&misuseBe[SQLITE_UTF16NATIVE==SQLITE_UTF16LE?1:0]);
|
|
711 }
|
|
712 z = sqlite3_value_text16(db->pErr);
|
|
713 if( z==0 ){
|
|
714 sqlite3ValueSetStr(db->pErr, -1, sqlite3ErrStr(db->errCode),
|
|
715 SQLITE_UTF8, SQLITE_STATIC);
|
|
716 z = sqlite3_value_text16(db->pErr);
|
|
717 }
|
|
718 sqlite3ApiExit(0, 0);
|
|
719 return z;
|
|
720 }
|
|
721 #endif /* SQLITE_OMIT_UTF16 */
|
|
722
|
|
723 /*
|
|
724 ** Return the most recent error code generated by an SQLite routine. If NULL is
|
|
725 ** passed to this function, we assume a malloc() failed during sqlite3_open().
|
|
726 */
|
|
727 int sqlite3_errcode(sqlite3 *db){
|
|
728 if( !db || sqlite3MallocFailed() ){
|
|
729 return SQLITE_NOMEM;
|
|
730 }
|
|
731 if( sqlite3SafetyCheck(db) ){
|
|
732 return SQLITE_MISUSE;
|
|
733 }
|
|
734 return db->errCode;
|
|
735 }
|
|
736
|
|
737 /*
|
|
738 ** Create a new collating function for database "db". The name is zName
|
|
739 ** and the encoding is enc.
|
|
740 */
|
|
741 static int createCollation(
|
|
742 sqlite3* db,
|
|
743 const char *zName,
|
|
744 int enc,
|
|
745 void* pCtx,
|
|
746 int(*xCompare)(void*,int,const void*,int,const void*)
|
|
747 ){
|
|
748 CollSeq *pColl;
|
|
749 int enc2;
|
|
750
|
|
751 if( sqlite3SafetyCheck(db) ){
|
|
752 return SQLITE_MISUSE;
|
|
753 }
|
|
754
|
|
755 /* If SQLITE_UTF16 is specified as the encoding type, transform this
|
|
756 ** to one of SQLITE_UTF16LE or SQLITE_UTF16BE using the
|
|
757 ** SQLITE_UTF16NATIVE macro. SQLITE_UTF16 is not used internally.
|
|
758 */
|
|
759 enc2 = enc & ~SQLITE_UTF16_ALIGNED;
|
|
760 if( enc2==SQLITE_UTF16 ){
|
|
761 enc2 = SQLITE_UTF16NATIVE;
|
|
762 }
|
|
763
|
|
764 if( (enc2&~3)!=0 ){
|
|
765 sqlite3Error(db, SQLITE_ERROR, "unknown encoding");
|
|
766 return SQLITE_ERROR;
|
|
767 }
|
|
768
|
|
769 /* Check if this call is removing or replacing an existing collation
|
|
770 ** sequence. If so, and there are active VMs, return busy. If there
|
|
771 ** are no active VMs, invalidate any pre-compiled statements.
|
|
772 */
|
|
773 pColl = sqlite3FindCollSeq(db, (u8)enc2, zName, strlen(zName), 0);
|
|
774 if( pColl && pColl->xCmp ){
|
|
775 if( db->activeVdbeCnt ){
|
|
776 sqlite3Error(db, SQLITE_BUSY,
|
|
777 "Unable to delete/modify collation sequence due to active statements");
|
|
778 return SQLITE_BUSY;
|
|
779 }
|
|
780 sqlite3ExpirePreparedStatements(db);
|
|
781 }
|
|
782
|
|
783 pColl = sqlite3FindCollSeq(db, (u8)enc2, zName, strlen(zName), 1);
|
|
784 if( pColl ){
|
|
785 pColl->xCmp = xCompare;
|
|
786 pColl->pUser = pCtx;
|
|
787 pColl->enc = enc2 | (enc & SQLITE_UTF16_ALIGNED);
|
|
788 }
|
|
789 sqlite3Error(db, SQLITE_OK, 0);
|
|
790 return SQLITE_OK;
|
|
791 }
|
|
792
|
|
793
|
|
794 /*
|
|
795 ** This routine does the work of opening a database on behalf of
|
|
796 ** sqlite3_open() and sqlite3_open16(). The database filename "zFilename"
|
|
797 ** is UTF-8 encoded.
|
|
798 */
|
|
799 static int openDatabase(
|
|
800 const char *zFilename, /* Database filename UTF-8 encoded */
|
|
801 sqlite3 **ppDb /* OUT: Returned database handle */
|
|
802 ){
|
|
803 sqlite3 *db;
|
|
804 int rc;
|
|
805 CollSeq *pColl;
|
|
806
|
|
807 assert( !sqlite3MallocFailed() );
|
|
808
|
|
809 /* Allocate the sqlite data structure */
|
|
810 db = sqliteMalloc( sizeof(sqlite3) );
|
|
811 if( db==0 ) goto opendb_out;
|
|
812 db->priorNewRowid = 0;
|
|
813 db->magic = SQLITE_MAGIC_BUSY;
|
|
814 db->nDb = 2;
|
|
815 db->aDb = db->aDbStatic;
|
|
816 db->autoCommit = 1;
|
|
817 db->flags |= SQLITE_ShortColNames;
|
|
818 sqlite3HashInit(&db->aFunc, SQLITE_HASH_STRING, 0);
|
|
819 sqlite3HashInit(&db->aCollSeq, SQLITE_HASH_STRING, 0);
|
|
820
|
|
821 /* Add the default collation sequence BINARY. BINARY works for both UTF-8
|
|
822 ** and UTF-16, so add a version for each to avoid any unnecessary
|
|
823 ** conversions. The only error that can occur here is a malloc() failure.
|
|
824 */
|
|
825 if( createCollation(db, "BINARY", SQLITE_UTF8, 0, binCollFunc) ||
|
|
826 createCollation(db, "BINARY", SQLITE_UTF16BE, 0, binCollFunc) ||
|
|
827 createCollation(db, "BINARY", SQLITE_UTF16LE, 0, binCollFunc) ||
|
|
828 (db->pDfltColl = sqlite3FindCollSeq(db, SQLITE_UTF8, "BINARY", 6, 0))==0
|
|
829 ){
|
|
830 assert( sqlite3MallocFailed() );
|
|
831 db->magic = SQLITE_MAGIC_CLOSED;
|
|
832 goto opendb_out;
|
|
833 }
|
|
834
|
|
835 /* Also add a UTF-8 case-insensitive collation sequence. */
|
|
836 createCollation(db, "NOCASE", SQLITE_UTF8, 0, nocaseCollatingFunc);
|
|
837
|
|
838 /* Set flags on the built-in collating sequences */
|
|
839 db->pDfltColl->type = SQLITE_COLL_BINARY;
|
|
840 pColl = sqlite3FindCollSeq(db, SQLITE_UTF8, "NOCASE", 6, 0);
|
|
841 if( pColl ){
|
|
842 pColl->type = SQLITE_COLL_NOCASE;
|
|
843 }
|
|
844
|
|
845 /* Open the backend database driver */
|
|
846 rc = sqlite3BtreeFactory(db, zFilename, 0, MAX_PAGES, &db->aDb[0].pBt);
|
|
847 if( rc!=SQLITE_OK ){
|
|
848 sqlite3Error(db, rc, 0);
|
|
849 db->magic = SQLITE_MAGIC_CLOSED;
|
|
850 goto opendb_out;
|
|
851 }
|
|
852 db->aDb[0].pSchema = sqlite3SchemaGet(db->aDb[0].pBt);
|
|
853 db->aDb[1].pSchema = sqlite3SchemaGet(0);
|
|
854
|
|
855
|
|
856 /* The default safety_level for the main database is 'full'; for the temp
|
|
857 ** database it is 'NONE'. This matches the pager layer defaults.
|
|
858 */
|
|
859 db->aDb[0].zName = "main";
|
|
860 db->aDb[0].safety_level = 3;
|
|
861 #ifndef SQLITE_OMIT_TEMPDB
|
|
862 db->aDb[1].zName = "temp";
|
|
863 db->aDb[1].safety_level = 1;
|
|
864 #endif
|
|
865
|
|
866 /* Register all built-in functions, but do not attempt to read the
|
|
867 ** database schema yet. This is delayed until the first time the database
|
|
868 ** is accessed.
|
|
869 */
|
|
870 if( !sqlite3MallocFailed() ){
|
|
871 sqlite3RegisterBuiltinFunctions(db);
|
|
872 sqlite3Error(db, SQLITE_OK, 0);
|
|
873 }
|
|
874 db->magic = SQLITE_MAGIC_OPEN;
|
|
875
|
|
876 opendb_out:
|
|
877 if( SQLITE_NOMEM==(rc = sqlite3_errcode(db)) ){
|
|
878 sqlite3_close(db);
|
|
879 db = 0;
|
|
880 }
|
|
881 *ppDb = db;
|
|
882 return sqlite3ApiExit(0, rc);
|
|
883 }
|
|
884
|
|
885 /*
|
|
886 ** Open a new database handle.
|
|
887 */
|
|
888 int sqlite3_open(
|
|
889 const char *zFilename,
|
|
890 sqlite3 **ppDb
|
|
891 ){
|
|
892 return openDatabase(zFilename, ppDb);
|
|
893 }
|
|
894
|
|
895 #ifndef SQLITE_OMIT_UTF16
|
|
896 /*
|
|
897 ** Open a new database handle.
|
|
898 */
|
|
899 int sqlite3_open16(
|
|
900 const void *zFilename,
|
|
901 sqlite3 **ppDb
|
|
902 ){
|
|
903 char const *zFilename8; /* zFilename encoded in UTF-8 instead of UTF-16 */
|
|
904 int rc = SQLITE_OK;
|
|
905 sqlite3_value *pVal;
|
|
906
|
|
907 assert( zFilename );
|
|
908 assert( ppDb );
|
|
909 *ppDb = 0;
|
|
910 pVal = sqlite3ValueNew();
|
|
911 sqlite3ValueSetStr(pVal, -1, zFilename, SQLITE_UTF16NATIVE, SQLITE_STATIC);
|
|
912 zFilename8 = sqlite3ValueText(pVal, SQLITE_UTF8);
|
|
913 if( zFilename8 ){
|
|
914 rc = openDatabase(zFilename8, ppDb);
|
|
915 if( rc==SQLITE_OK && *ppDb ){
|
|
916 rc = sqlite3_exec(*ppDb, "PRAGMA encoding = 'UTF-16'", 0, 0, 0);
|
|
917 if( rc!=SQLITE_OK ){
|
|
918 sqlite3_close(*ppDb);
|
|
919 *ppDb = 0;
|
|
920 }
|
|
921 }
|
|
922 }
|
|
923 sqlite3ValueFree(pVal);
|
|
924
|
|
925 return sqlite3ApiExit(0, rc);
|
|
926 }
|
|
927 #endif /* SQLITE_OMIT_UTF16 */
|
|
928
|
|
929 /*
|
|
930 ** The following routine destroys a virtual machine that is created by
|
|
931 ** the sqlite3_compile() routine. The integer returned is an SQLITE_
|
|
932 ** success/failure code that describes the result of executing the virtual
|
|
933 ** machine.
|
|
934 **
|
|
935 ** This routine sets the error code and string returned by
|
|
936 ** sqlite3_errcode(), sqlite3_errmsg() and sqlite3_errmsg16().
|
|
937 */
|
|
938 int sqlite3_finalize(sqlite3_stmt *pStmt){
|
|
939 int rc;
|
|
940 if( pStmt==0 ){
|
|
941 rc = SQLITE_OK;
|
|
942 }else{
|
|
943 rc = sqlite3VdbeFinalize((Vdbe*)pStmt);
|
|
944 }
|
|
945 return rc;
|
|
946 }
|
|
947
|
|
948 /*
|
|
949 ** Terminate the current execution of an SQL statement and reset it
|
|
950 ** back to its starting state so that it can be reused. A success code from
|
|
951 ** the prior execution is returned.
|
|
952 **
|
|
953 ** This routine sets the error code and string returned by
|
|
954 ** sqlite3_errcode(), sqlite3_errmsg() and sqlite3_errmsg16().
|
|
955 */
|
|
956 int sqlite3_reset(sqlite3_stmt *pStmt){
|
|
957 int rc;
|
|
958 if( pStmt==0 ){
|
|
959 rc = SQLITE_OK;
|
|
960 }else{
|
|
961 rc = sqlite3VdbeReset((Vdbe*)pStmt);
|
|
962 sqlite3VdbeMakeReady((Vdbe*)pStmt, -1, 0, 0, 0);
|
|
963 }
|
|
964 return rc;
|
|
965 }
|
|
966
|
|
967 /*
|
|
968 ** Register a new collation sequence with the database handle db.
|
|
969 */
|
|
970 int sqlite3_create_collation(
|
|
971 sqlite3* db,
|
|
972 const char *zName,
|
|
973 int enc,
|
|
974 void* pCtx,
|
|
975 int(*xCompare)(void*,int,const void*,int,const void*)
|
|
976 ){
|
|
977 int rc;
|
|
978 assert( !sqlite3MallocFailed() );
|
|
979 rc = createCollation(db, zName, enc, pCtx, xCompare);
|
|
980 return sqlite3ApiExit(db, rc);
|
|
981 }
|
|
982
|
|
983 #ifndef SQLITE_OMIT_UTF16
|
|
984 /*
|
|
985 ** Register a new collation sequence with the database handle db.
|
|
986 */
|
|
987 int sqlite3_create_collation16(
|
|
988 sqlite3* db,
|
|
989 const char *zName,
|
|
990 int enc,
|
|
991 void* pCtx,
|
|
992 int(*xCompare)(void*,int,const void*,int,const void*)
|
|
993 ){
|
|
994 int rc = SQLITE_OK;
|
|
995 char *zName8;
|
|
996 assert( !sqlite3MallocFailed() );
|
|
997 zName8 = sqlite3utf16to8(zName, -1);
|
|
998 if( zName8 ){
|
|
999 rc = createCollation(db, zName8, enc, pCtx, xCompare);
|
|
1000 sqliteFree(zName8);
|
|
1001 }
|
|
1002 return sqlite3ApiExit(db, rc);
|
|
1003 }
|
|
1004 #endif /* SQLITE_OMIT_UTF16 */
|
|
1005
|
|
1006 /*
|
|
1007 ** Register a collation sequence factory callback with the database handle
|
|
1008 ** db. Replace any previously installed collation sequence factory.
|
|
1009 */
|
|
1010 int sqlite3_collation_needed(
|
|
1011 sqlite3 *db,
|
|
1012 void *pCollNeededArg,
|
|
1013 void(*xCollNeeded)(void*,sqlite3*,int eTextRep,const char*)
|
|
1014 ){
|
|
1015 if( sqlite3SafetyCheck(db) ){
|
|
1016 return SQLITE_MISUSE;
|
|
1017 }
|
|
1018 db->xCollNeeded = xCollNeeded;
|
|
1019 db->xCollNeeded16 = 0;
|
|
1020 db->pCollNeededArg = pCollNeededArg;
|
|
1021 return SQLITE_OK;
|
|
1022 }
|
|
1023
|
|
1024 #ifndef SQLITE_OMIT_UTF16
|
|
1025 /*
|
|
1026 ** Register a collation sequence factory callback with the database handle
|
|
1027 ** db. Replace any previously installed collation sequence factory.
|
|
1028 */
|
|
1029 int sqlite3_collation_needed16(
|
|
1030 sqlite3 *db,
|
|
1031 void *pCollNeededArg,
|
|
1032 void(*xCollNeeded16)(void*,sqlite3*,int eTextRep,const void*)
|
|
1033 ){
|
|
1034 if( sqlite3SafetyCheck(db) ){
|
|
1035 return SQLITE_MISUSE;
|
|
1036 }
|
|
1037 db->xCollNeeded = 0;
|
|
1038 db->xCollNeeded16 = xCollNeeded16;
|
|
1039 db->pCollNeededArg = pCollNeededArg;
|
|
1040 return SQLITE_OK;
|
|
1041 }
|
|
1042 #endif /* SQLITE_OMIT_UTF16 */
|
|
1043
|
|
1044 #ifndef SQLITE_OMIT_GLOBALRECOVER
|
|
1045 /*
|
|
1046 ** This function is now an anachronism. It used to be used to recover from a
|
|
1047 ** malloc() failure, but SQLite now does this automatically.
|
|
1048 */
|
|
1049 int sqlite3_global_recover(){
|
|
1050 return SQLITE_OK;
|
|
1051 }
|
|
1052 #endif
|
|
1053
|
|
1054 /*
|
|
1055 ** Test to see whether or not the database connection is in autocommit
|
|
1056 ** mode. Return TRUE if it is and FALSE if not. Autocommit mode is on
|
|
1057 ** by default. Autocommit is disabled by a BEGIN statement and reenabled
|
|
1058 ** by the next COMMIT or ROLLBACK.
|
|
1059 **
|
|
1060 ******* THIS IS AN EXPERIMENTAL API AND IS SUBJECT TO CHANGE ******
|
|
1061 */
|
|
1062 int sqlite3_get_autocommit(sqlite3 *db){
|
|
1063 return db->autoCommit;
|
|
1064 }
|
|
1065
|
|
1066 #ifdef SQLITE_DEBUG
|
|
1067 /*
|
|
1068 ** The following routine is subtituted for constant SQLITE_CORRUPT in
|
|
1069 ** debugging builds. This provides a way to set a breakpoint for when
|
|
1070 ** corruption is first detected.
|
|
1071 */
|
|
1072 int sqlite3Corrupt(void){
|
|
1073 return SQLITE_CORRUPT;
|
|
1074 }
|
|
1075 #endif
|
|
1076
|
|
1077
|
|
1078 #ifndef SQLITE_OMIT_SHARED_CACHE
|
|
1079 /*
|
|
1080 ** Enable or disable the shared pager and schema features for the
|
|
1081 ** current thread.
|
|
1082 **
|
|
1083 ** This routine should only be called when there are no open
|
|
1084 ** database connections.
|
|
1085 */
|
|
1086 int sqlite3_enable_shared_cache(int enable){
|
|
1087 ThreadData *pTd = sqlite3ThreadData();
|
|
1088 if( pTd ){
|
|
1089 /* It is only legal to call sqlite3_enable_shared_cache() when there
|
|
1090 ** are no currently open b-trees that were opened by the calling thread.
|
|
1091 ** This condition is only easy to detect if the shared-cache were
|
|
1092 ** previously enabled (and is being disabled).
|
|
1093 */
|
|
1094 if( pTd->pBtree && !enable ){
|
|
1095 assert( pTd->useSharedData );
|
|
1096 return SQLITE_MISUSE;
|
|
1097 }
|
|
1098
|
|
1099 pTd->useSharedData = enable;
|
|
1100 sqlite3ReleaseThreadData();
|
|
1101 }
|
|
1102 return sqlite3ApiExit(0, SQLITE_OK);
|
|
1103 }
|
|
1104 #endif
|
|
1105
|
|
1106 /*
|
|
1107 ** This is a convenience routine that makes sure that all thread-specific
|
|
1108 ** data for this thread has been deallocated.
|
|
1109 */
|
|
1110 void sqlite3_thread_cleanup(void){
|
|
1111 ThreadData *pTd = sqlite3OsThreadSpecificData(0);
|
|
1112 if( pTd ){
|
|
1113 memset(pTd, 0, sizeof(*pTd));
|
|
1114 sqlite3OsThreadSpecificData(-1);
|
|
1115 }
|
|
1116 }
|
|
1117
|
|
1118 /*
|
|
1119 ** Return meta information about a specific column of a database table.
|
|
1120 ** See comment in sqlite3.h (sqlite.h.in) for details.
|
|
1121 */
|
|
1122 #ifdef SQLITE_ENABLE_COLUMN_METADATA
|
|
1123 int sqlite3_table_column_metadata(
|
|
1124 sqlite3 *db, /* Connection handle */
|
|
1125 const char *zDbName, /* Database name or NULL */
|
|
1126 const char *zTableName, /* Table name */
|
|
1127 const char *zColumnName, /* Column name */
|
|
1128 char const **pzDataType, /* OUTPUT: Declared data type */
|
|
1129 char const **pzCollSeq, /* OUTPUT: Collation sequence name */
|
|
1130 int *pNotNull, /* OUTPUT: True if NOT NULL constraint exists */
|
|
1131 int *pPrimaryKey, /* OUTPUT: True if column part of PK */
|
|
1132 int *pAutoinc /* OUTPUT: True if colums is auto-increment */
|
|
1133 ){
|
|
1134 int rc;
|
|
1135 char *zErrMsg = 0;
|
|
1136 Table *pTab = 0;
|
|
1137 Column *pCol = 0;
|
|
1138 int iCol;
|
|
1139
|
|
1140 char const *zDataType = 0;
|
|
1141 char const *zCollSeq = 0;
|
|
1142 int notnull = 0;
|
|
1143 int primarykey = 0;
|
|
1144 int autoinc = 0;
|
|
1145
|
|
1146 /* Ensure the database schema has been loaded */
|
|
1147 if( sqlite3SafetyOn(db) ){
|
|
1148 return SQLITE_MISUSE;
|
|
1149 }
|
|
1150 rc = sqlite3Init(db, &zErrMsg);
|
|
1151 if( SQLITE_OK!=rc ){
|
|
1152 goto error_out;
|
|
1153 }
|
|
1154
|
|
1155 /* Locate the table in question */
|
|
1156 pTab = sqlite3FindTable(db, zTableName, zDbName);
|
|
1157 if( !pTab || pTab->pSelect ){
|
|
1158 pTab = 0;
|
|
1159 goto error_out;
|
|
1160 }
|
|
1161
|
|
1162 /* Find the column for which info is requested */
|
|
1163 if( sqlite3IsRowid(zColumnName) ){
|
|
1164 iCol = pTab->iPKey;
|
|
1165 if( iCol>=0 ){
|
|
1166 pCol = &pTab->aCol[iCol];
|
|
1167 }
|
|
1168 }else{
|
|
1169 for(iCol=0; iCol<pTab->nCol; iCol++){
|
|
1170 pCol = &pTab->aCol[iCol];
|
|
1171 if( 0==sqlite3StrICmp(pCol->zName, zColumnName) ){
|
|
1172 break;
|
|
1173 }
|
|
1174 }
|
|
1175 if( iCol==pTab->nCol ){
|
|
1176 pTab = 0;
|
|
1177 goto error_out;
|
|
1178 }
|
|
1179 }
|
|
1180
|
|
1181 /* The following block stores the meta information that will be returned
|
|
1182 ** to the caller in local variables zDataType, zCollSeq, notnull, primarykey
|
|
1183 ** and autoinc. At this point there are two possibilities:
|
|
1184 **
|
|
1185 ** 1. The specified column name was rowid", "oid" or "_rowid_"
|
|
1186 ** and there is no explicitly declared IPK column.
|
|
1187 **
|
|
1188 ** 2. The table is not a view and the column name identified an
|
|
1189 ** explicitly declared column. Copy meta information from *pCol.
|
|
1190 */
|
|
1191 if( pCol ){
|
|
1192 zDataType = pCol->zType;
|
|
1193 zCollSeq = pCol->zColl;
|
|
1194 notnull = (pCol->notNull?1:0);
|
|
1195 primarykey = (pCol->isPrimKey?1:0);
|
|
1196 autoinc = ((pTab->iPKey==iCol && pTab->autoInc)?1:0);
|
|
1197 }else{
|
|
1198 zDataType = "INTEGER";
|
|
1199 primarykey = 1;
|
|
1200 }
|
|
1201 if( !zCollSeq ){
|
|
1202 zCollSeq = "BINARY";
|
|
1203 }
|
|
1204
|
|
1205 error_out:
|
|
1206 if( sqlite3SafetyOff(db) ){
|
|
1207 rc = SQLITE_MISUSE;
|
|
1208 }
|
|
1209
|
|
1210 /* Whether the function call succeeded or failed, set the output parameters
|
|
1211 ** to whatever their local counterparts contain. If an error did occur,
|
|
1212 ** this has the effect of zeroing all output parameters.
|
|
1213 */
|
|
1214 if( pzDataType ) *pzDataType = zDataType;
|
|
1215 if( pzCollSeq ) *pzCollSeq = zCollSeq;
|
|
1216 if( pNotNull ) *pNotNull = notnull;
|
|
1217 if( pPrimaryKey ) *pPrimaryKey = primarykey;
|
|
1218 if( pAutoinc ) *pAutoinc = autoinc;
|
|
1219
|
|
1220 if( SQLITE_OK==rc && !pTab ){
|
|
1221 sqlite3SetString(&zErrMsg, "no such table column: ", zTableName, ".",
|
|
1222 zColumnName, 0);
|
|
1223 rc = SQLITE_ERROR;
|
|
1224 }
|
|
1225 sqlite3Error(db, rc, (zErrMsg?"%s":0), zErrMsg);
|
|
1226 sqliteFree(zErrMsg);
|
|
1227 return sqlite3ApiExit(db, rc);
|
|
1228 }
|
|
1229 #endif
|