#define OTA_STATE_COOKIE 7
#define OTA_STAGE_OAL 1
-#define OTA_STAGE_COPY 2
#define OTA_STAGE_CKPT 3
#define OTA_STAGE_DONE 4
sqlite3_ckpt *pCkpt; /* Incr-checkpoint handle */
ota_file *pTargetFd; /* File handle open on target db */
const char *zVfsName; /* Name of automatically created ota vfs */
- unsigned int iCookie;
};
struct ota_vfs {
sqlite3_file *pReal; /* Underlying file handle */
ota_vfs *pOtaVfs; /* Pointer to the ota_vfs object */
sqlite3ota *pOta; /* Pointer to ota object (ota target only) */
+ int openFlags; /* Flags this file was opened with */
+ unsigned int iCookie; /* Cookie value for main db files */
int nShm; /* Number of entries in apShm[] array */
char **apShm; /* Array of mmap'd *-shm regions */
return p->rc;
}
+static void otaSqlTrace(void *pCtx, const char *zSql){
+ /* printf("SQL: %s\n", zSql); */
+}
+
/*
** Open the database handle and attach the OTA database as "ota". If an
** error occurs, leave an error code and message in the OTA handle.
if( p->rc ){
p->zErrmsg = sqlite3_mprintf("%s", sqlite3_errmsg(p->db));
}else{
+ otaMPrintfExec(p, "ATTACH %Q AS ota", p->zOta);
+ /* sqlite3_trace(p->db, otaSqlTrace, 0); */
+
/* Mark the database file just opened as an OTA target database. If
** this call returns SQLITE_NOTFOUND, then the OTA vfs is not in use.
** This is an error. */
- p->rc = sqlite3_file_control(p->db, "main", SQLITE_FCNTL_OTA, (void*)p);
- if( p->rc==SQLITE_NOTFOUND ){
- p->rc = SQLITE_ERROR;
- p->zErrmsg = sqlite3_mprintf("ota vfs not found");
- }else{
- otaMPrintfExec(p, "ATTACH %Q AS ota", p->zOta);
+ if( p->rc==SQLITE_OK ){
+ p->rc = sqlite3_file_control(p->db, "main", SQLITE_FCNTL_OTA, (void*)p);
+ if( p->rc==SQLITE_NOTFOUND ){
+ p->rc = SQLITE_ERROR;
+ p->zErrmsg = sqlite3_mprintf("ota vfs not found");
+ }
}
}
}
OTA_STATE_ROW, p->nStep,
OTA_STATE_PROGRESS, p->nProgress,
OTA_STATE_CKPT,
- OTA_STATE_COOKIE, (sqlite3_int64)p->iCookie
+ OTA_STATE_COOKIE, (sqlite3_int64)p->pTargetFd->iCookie
)
);
assert( pInsert==0 || rc==SQLITE_OK );
static OtaState *otaLoadState(sqlite3ota *p){
const char *zSelect = "SELECT k, v FROM ota.ota_state";
OtaState *pRet = 0;
- sqlite3_stmt *pStmt;
+ sqlite3_stmt *pStmt = 0;
int rc;
int rc2;
case OTA_STATE_STAGE:
pRet->eStage = sqlite3_column_int(pStmt, 1);
if( pRet->eStage!=OTA_STAGE_OAL
- && pRet->eStage!=OTA_STAGE_COPY
&& pRet->eStage!=OTA_STAGE_CKPT
){
p->rc = SQLITE_CORRUPT;
** committed in rollback mode) currently stored on page 1 of the
** database file. */
if( pRet->eStage==OTA_STAGE_OAL
- && p->iCookie!=(unsigned int)sqlite3_column_int64(pStmt, 1)
+ && p->pTargetFd->iCookie!=(unsigned int)sqlite3_column_int64(pStmt, 1)
){
rc = SQLITE_BUSY;
p->zErrmsg = sqlite3_mprintf("database modified during ota update");
){
ota_file *p = (ota_file*)pFile;
int rc = p->pReal->pMethods->xRead(p->pReal, zBuf, iAmt, iOfst);
- if( rc==SQLITE_OK && p->pOta && iOfst==0 ){
- unsigned char *pBuf = (unsigned char*)zBuf;
- assert( iAmt>=100 );
- p->pOta->iCookie = otaGetU32(&pBuf[24]);
+ if( rc==SQLITE_OK && iOfst==0 && (p->openFlags & SQLITE_OPEN_MAIN_DB) ){
+ p->iCookie = otaGetU32((unsigned char*)&zBuf[24]);
}
return rc;
}
){
ota_file *p = (ota_file*)pFile;
int rc = p->pReal->pMethods->xWrite(p->pReal, zBuf, iAmt, iOfst);
- if( rc==SQLITE_OK && p->pOta && iOfst==0 ){
- unsigned char *pBuf = (unsigned char*)zBuf;
- assert( iAmt>=100 );
- p->pOta->iCookie = otaGetU32(&pBuf[24]);
+ if( rc==SQLITE_OK && iOfst==0 && (p->openFlags & SQLITE_OPEN_MAIN_DB) ){
+ p->iCookie = otaGetU32((unsigned char*)&zBuf[24]);
}
return rc;
}
int rc = SQLITE_OK;
#ifdef SQLITE_AMALGAMATION
- assert( WAL_WRITE_CKPT==1 );
+ assert( WAL_CKPT_LOCK==1 );
#endif
if( p->pOta && p->pOta->eStage==OTA_STAGE_OAL ){
- /* Magic number 1 is the WAL_WRITE_CKPT lock. Preventing SQLite from
+ /* Magic number 1 is the WAL_CKPT_LOCK lock. Preventing SQLite from
** taking this lock also prevents any checkpoints from occurring.
** todo: really, it's not clear why this might occur, as
** wal_autocheckpoint ought to be turned off. */
if( pNew==0 ){
rc = SQLITE_NOMEM;
}else{
+ memset(pNew, 0, szRegion);
p->apShm[iRegion] = pNew;
}
}
memset(pFd, 0, sizeof(ota_file));
pFd->pReal = (sqlite3_file*)&pFd[1];
pFd->pOtaVfs = pOtaVfs;
+ pFd->openFlags = flags;
if( zName ){
if( flags & SQLITE_OPEN_MAIN_DB ){
/* A main database has just been opened. The following block sets
-C Add\sdocumentation\sand\stest\scases\sfor\ssqlite3ota_create_vfs().\sAlso\scode\sto\sdetect\serrors\sin\szipvfs/ota\ssetup.
-D 2015-02-10T17:08:17.934
+C Further\stweaks\sto\swork\swith\szipvfs.
+D 2015-02-10T20:00:38.125
F Makefile.arm-wince-mingw32ce-gcc d6df77f1f48d690bd73162294bbba7f59507c72f
F Makefile.in 6b9e7677829aa94b9f30949656e27312aefb9a46
F Makefile.linux-gcc 91d710bdc4998cb015f39edf3cb314ec4f4d7e23
F ext/ota/ota8.test cd70e63a0c29c45c0906692827deafa34638feda
F ext/ota/ota9.test d3eee95dd836824d07a22e5efcdb7bf6e869358b
F ext/ota/otafault.test 508ba87c83d632670ac0f94371a465d4bb4d49dd
-F ext/ota/sqlite3ota.c c73855939e124005f5c91fb50987297d50a81405
+F ext/ota/sqlite3ota.c 1f96966839c57e6a6f4ca8e8a771b23fbf79b8f6
F ext/ota/sqlite3ota.h 1cc7201086fe65a36957740381485a24738c4077
F ext/rtree/README 6315c0d73ebf0ec40dedb5aa0e942bc8b54e3761
F ext/rtree/rtree.c 14e6239434d4e3f65d3e90320713f26aa24e167f
F install-sh 9d4de14ab9fb0facae2f48780b874848cbf2f895 x
F ltmain.sh 3ff0879076df340d2e23ae905484d8c15d5fdea8
F magic.txt 8273bf49ba3b0c8559cb2774495390c31fd61c60
-F main.mk 1de9f345052b7cf631e3323b42bd35064cdfcf0a
+F main.mk 57c115aba023c1988564edb80ac87c3e07472b05
F mkopcodec.awk c2ff431854d702cdd2d779c9c0d1f58fa16fa4ea
F mkopcodeh.awk c6b3fa301db6ef7ac916b14c60868aeaec1337b5
F mkso.sh fd21c06b063bb16a5d25deea1752c2da6ac3ed83
F tool/mkpragmatab.tcl 94f196c9961e0ca3513e29f57125a3197808be2d
F tool/mkspeedsql.tcl a1a334d288f7adfe6e996f2e712becf076745c97
F tool/mksqlite3c-noext.tcl 9ef48e1748dce7b844f67e2450ff9dfeb0fb4ab5
-F tool/mksqlite3c.tcl 6b8e572a90eb4e0086e3ba90d88b76c085919863
+F tool/mksqlite3c.tcl d8b0b0cc5f0e912058c9300f052769c62404d2d9
F tool/mksqlite3h.tcl ba24038056f51fde07c0079c41885ab85e2cff12
F tool/mksqlite3internalh.tcl eb994013e833359137eb53a55acdad0b5ae1049b
F tool/mkvsix.tcl 52a4c613707ac34ae9c226e5ccc69cb948556105
F tool/warnings-clang.sh f6aa929dc20ef1f856af04a730772f59283631d4
F tool/warnings.sh 0abfd78ceb09b7f7c27c688c8e3fe93268a13b32
F tool/win/sqlite.vsix deb315d026cc8400325c5863eef847784a219a2f
-P 96443ecb6909141aa621a16e628455857d036482
-R 5e91280662dadb1373699ffdcf091961
+P e729668168f00325459bc2e9b515aa95e57f2754
+R 245c10d0f1613c672374bc7bdeb81ab9
U dan
-Z 228647d512212dceaeb5d71668e39aca
+Z 8b6e26dd39381b8c315cf4c234f64cec