annotate sqlite/main.c @ 1621:fae6e0cfcc77 trunk

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