| Index: gears/third_party/sqlite_google/src/btree.c |
| =================================================================== |
| --- gears/third_party/sqlite_google/src/btree.c (revision 1753) |
| +++ gears/third_party/sqlite_google/src/btree.c (working copy) |
| @@ -29,6 +29,12 @@ |
| */ |
| static const char zPoisonHeader[] = "SQLite poison 3"; |
| +/* |
| +** The user cookie position in the database meta information |
| +** (see prepare.c#215), incremented by one, because first position is actually |
| +** the number of free pages in Btree (see vdbe.c#2521) |
| +*/ |
| +static const int kUserCookie = 6; |
| /* |
| ** Set this global variable to 1 to enable tracing using the TRACE |
| @@ -6422,3 +6428,32 @@ |
| } |
| #endif |
| + |
| +int sqlite3_get_user_version(sqlite3 *sqlite, int *user_version) { |
| + Btree *bt; |
| + |
| + if( sqlite == NULL ) return SQLITE_ERROR; |
| + if( sqlite->nDb<1 ) return SQLITE_ERROR; |
| + |
| + /* Grab main database. */ |
| + bt = sqlite->aDb[0].pBt; |
| + /* Because sqlite3BtreeGetMeta sets a table read lock, it is safe to use |
| + ** without explicit read transaction. Besides, it is very unlikely we will |
| + ** ever call this outside of a transaction. |
| + */ |
| + return sqlite3BtreeGetMeta(bt, kUserCookie, (u32 *)user_version); |
| +} |
| + |
| +int sqlite3_set_user_version(sqlite3 *sqlite, int user_version) { |
| + Btree *bt; |
| + |
| + if( sqlite == NULL ) return SQLITE_ERROR; |
| + if( sqlite->nDb<1 ) return SQLITE_ERROR; |
| + |
| + bt = sqlite->aDb[0].pBt; |
| + |
| + /* If called outside of a transaction, report misuse. */ |
| + if( bt->inTrans != TRANS_WRITE ) return SQLITE_MISUSE; |
| + |
| + return sqlite3BtreeUpdateMeta(bt, kUserCookie, (u32)user_version); |
| +} |