aboutsummaryrefslogtreecommitdiff
path: root/ext/misc/cksumvfs.c
diff options
context:
space:
mode:
Diffstat (limited to 'ext/misc/cksumvfs.c')
-rw-r--r--ext/misc/cksumvfs.c28
1 files changed, 23 insertions, 5 deletions
diff --git a/ext/misc/cksumvfs.c b/ext/misc/cksumvfs.c
index dc2d35076..76a86ba41 100644
--- a/ext/misc/cksumvfs.c
+++ b/ext/misc/cksumvfs.c
@@ -176,7 +176,7 @@ typedef struct CksmFile CksmFile;
/*
** Useful datatype abbreviations
*/
-#if !defined(SQLITE_CORE)
+#if !defined(SQLITE_AMALGAMATION)
typedef unsigned char u8;
typedef unsigned int u32;
#endif
@@ -395,7 +395,9 @@ static int cksmRead(
pFile = ORIGFILE(pFile);
rc = pFile->pMethods->xRead(pFile, zBuf, iAmt, iOfst);
if( rc==SQLITE_OK ){
- if( iOfst==0 && iAmt>=100 && memcmp(zBuf,"SQLite format 3",16)==0 ){
+ if( iOfst==0 && iAmt>=100 && (
+ memcmp(zBuf,"SQLite format 3",16)==0 || memcmp(zBuf,"ZV-",3)==0
+ )){
u8 *d = (u8*)zBuf;
char hasCorrectReserveSize = (d[20]==8);
cksmSetFlags(p, hasCorrectReserveSize);
@@ -434,7 +436,9 @@ static int cksmWrite(
){
CksmFile *p = (CksmFile *)pFile;
pFile = ORIGFILE(pFile);
- if( iOfst==0 && iAmt>=100 && memcmp(zBuf,"SQLite format 3",16)==0 ){
+ if( iOfst==0 && iAmt>=100 && (
+ memcmp(zBuf,"SQLite format 3",16)==0 || memcmp(zBuf,"ZV-",3)==0
+ )){
u8 *d = (u8*)zBuf;
char hasCorrectReserveSize = (d[20]==8);
cksmSetFlags(p, hasCorrectReserveSize);
@@ -604,13 +608,20 @@ static int cksmFetch(
return SQLITE_OK;
}
pFile = ORIGFILE(pFile);
- return pFile->pMethods->xFetch(pFile, iOfst, iAmt, pp);
+ if( pFile->pMethods->iVersion>2 && pFile->pMethods->xFetch ){
+ return pFile->pMethods->xFetch(pFile, iOfst, iAmt, pp);
+ }
+ *pp = 0;
+ return SQLITE_OK;
}
/* Release a memory-mapped page */
static int cksmUnfetch(sqlite3_file *pFile, sqlite3_int64 iOfst, void *pPage){
pFile = ORIGFILE(pFile);
- return pFile->pMethods->xUnfetch(pFile, iOfst, pPage);
+ if( pFile->pMethods->iVersion>2 && pFile->pMethods->xUnfetch ){
+ return pFile->pMethods->xUnfetch(pFile, iOfst, pPage);
+ }
+ return SQLITE_OK;
}
/*
@@ -763,6 +774,13 @@ int sqlite3_register_cksumvfs(const char *NotUsed){
(void)NotUsed;
return cksmRegisterVfs();
}
+int sqlite3_unregister_cksumvfs(void){
+ if( sqlite3_vfs_find("cksmvfs") ){
+ sqlite3_vfs_unregister(&cksm_vfs);
+ sqlite3_cancel_auto_extension((void(*)(void))cksmRegisterFunc);
+ }
+ return SQLITE_OK;
+}
#endif /* defined(SQLITE_CKSUMVFS_STATIC */
#if !defined(SQLITE_CKSUMVFS_STATIC)