diff options
author | drh <drh@noemail.net> | 2004-02-11 02:18:05 +0000 |
---|---|---|
committer | drh <drh@noemail.net> | 2004-02-11 02:18:05 +0000 |
commit | 9eb9e26b82e5b973f81f4429f9e1978a058391e9 (patch) | |
tree | bd231ee2932b3b70fb119f0f50ace9e96a5bcfd5 /src | |
parent | d86a39c866ae671fffe3edbffce0e28e4904a72a (diff) | |
download | sqlite-9eb9e26b82e5b973f81f4429f9e1978a058391e9.tar.gz sqlite-9eb9e26b82e5b973f81f4429f9e1978a058391e9.zip |
Pass all (relevant) regression tests when using the codec. (CVS 1223)
FossilOrigin-Name: 5200e9edc5fdba0285a3cb1cd808cbf66d7a349e
Diffstat (limited to 'src')
-rw-r--r-- | src/btree_rb.c | 5 | ||||
-rw-r--r-- | src/pager.c | 51 | ||||
-rw-r--r-- | src/pager.h | 4 | ||||
-rw-r--r-- | src/shell.c | 10 | ||||
-rw-r--r-- | src/tclsqlite.c | 14 |
5 files changed, 43 insertions, 41 deletions
diff --git a/src/btree_rb.c b/src/btree_rb.c index fc5101386..3d8288773 100644 --- a/src/btree_rb.c +++ b/src/btree_rb.c @@ -9,7 +9,7 @@ ** May you share freely, never taking more than you give. ** ************************************************************************* -** $Id: btree_rb.c,v 1.21 2004/02/10 02:57:59 drh Exp $ +** $Id: btree_rb.c,v 1.22 2004/02/11 02:18:06 drh Exp $ ** ** This file implements an in-core database using Red-Black balanced ** binary trees. @@ -1425,8 +1425,7 @@ static int memRbtreeCursorDump(RbtCursor* pCur, int* aRes) static struct Pager *memRbtreePager(Rbtree* tree) { - assert(!"Cannot call sqliteRbtreePager"); - return SQLITE_OK; + return 0; } /* diff --git a/src/pager.c b/src/pager.c index 6cf4b200a..990f41253 100644 --- a/src/pager.c +++ b/src/pager.c @@ -18,7 +18,7 @@ ** file simultaneously, or one process from reading the database while ** another is writing. ** -** @(#) $Id: pager.c,v 1.98 2004/02/10 23:51:06 drh Exp $ +** @(#) $Id: pager.c,v 1.99 2004/02/11 02:18:07 drh Exp $ */ #include "os.h" /* Must be first to enable large file support */ #include "sqliteInt.h" @@ -117,6 +117,16 @@ struct PgHdr { /* Pager.nExtra bytes of local data follow the page data */ }; + +/* +** A macro used for invoking the codec if there is one +*/ +#ifdef SQLITE_HAS_CODEC +# define CODEC(P,D,N,X) if( P->xCodec ){ P->xCodec(P->pCodecArg,D,N,X); } +#else +# define CODEC(P,D,N,X) +#endif + /* ** Convert a pointer to a PgHdr into a pointer to its data ** and back again. @@ -158,7 +168,7 @@ struct Pager { int nRef; /* Number of in-memory pages with PgHdr.nRef>0 */ int mxPage; /* Maximum number of pages to hold in cache */ int nHit, nMiss, nOvfl; /* Cache hits, missing, and LRU overflows */ - void (*xCodec)(void*,void*,int); /* Routine for en/decoding on-disk data */ + void (*xCodec)(void*,void*,Pgno,int); /* Routine for en/decoding data */ void *pCodecArg; /* First argument to xCodec() */ u8 journalOpen; /* True if journal file descriptors is valid */ u8 journalStarted; /* True if header of journal is synced */ @@ -562,9 +572,7 @@ static int pager_playback_one_page(Pager *pPager, OsFile *jfd, int format){ memset(PGHDR_TO_EXTRA(pPg), 0, pPager->nExtra); pPg->dirty = 0; pPg->needSync = 0; - if( pPager->xCodec ){ - pPager->xCodec(pPager->pCodecArg, PGHDR_TO_DATA(pPg), 3); - } + CODEC(pPager, PGHDR_TO_DATA(pPg), pPg->pgno, 3); } return rc; } @@ -724,10 +732,9 @@ static int pager_playback(Pager *pPager, int useJournalSize){ if( (int)pPg->pgno <= pPager->origDbSize ){ sqliteOsSeek(&pPager->fd, SQLITE_PAGE_SIZE*(off_t)(pPg->pgno-1)); rc = sqliteOsRead(&pPager->fd, zBuf, SQLITE_PAGE_SIZE); + TRACE2("REFETCH %d\n", pPg->pgno); + CODEC(pPager, zBuf, pPg->pgno, 2); if( rc ) break; - if( pPager->xCodec ){ - pPager->xCodec(pPager->pCodecArg, zBuf, 2); - } }else{ memset(zBuf, 0, SQLITE_PAGE_SIZE); } @@ -1247,13 +1254,10 @@ static int pager_write_pagelist(PgHdr *pList){ while( pList ){ assert( pList->dirty ); sqliteOsSeek(&pPager->fd, (pList->pgno-1)*(off_t)SQLITE_PAGE_SIZE); - if( pPager->xCodec ){ - pPager->xCodec(pPager->pCodecArg, PGHDR_TO_DATA(pList), 6); - } + CODEC(pPager, PGHDR_TO_DATA(pList), pList->pgno, 6); + TRACE2("STORE %d\n", pList->pgno); rc = sqliteOsWrite(&pPager->fd, PGHDR_TO_DATA(pList), SQLITE_PAGE_SIZE); - if( pPager->xCodec ){ - pPager->xCodec(pPager->pCodecArg, PGHDR_TO_DATA(pList), 0); - } + CODEC(pPager, PGHDR_TO_DATA(pList), pList->pgno, 0); if( rc ) return rc; pList->dirty = 0; pList = pList->pDirty; @@ -1514,6 +1518,8 @@ int sqlitepager_get(Pager *pPager, Pgno pgno, void **ppPage){ int rc; sqliteOsSeek(&pPager->fd, (pgno-1)*(off_t)SQLITE_PAGE_SIZE); rc = sqliteOsRead(&pPager->fd, PGHDR_TO_DATA(pPg), SQLITE_PAGE_SIZE); + TRACE2("FETCH %d\n", pPg->pgno); + CODEC(pPager, PGHDR_TO_DATA(pPg), pPg->pgno, 3); if( rc!=SQLITE_OK ){ off_t fileSize; if( sqliteOsFileSize(&pPager->fd,&fileSize)!=SQLITE_OK @@ -1523,8 +1529,6 @@ int sqlitepager_get(Pager *pPager, Pgno pgno, void **ppPage){ }else{ memset(PGHDR_TO_DATA(pPg), 0, SQLITE_PAGE_SIZE); } - }else if( pPager->xCodec ){ - pPager->xCodec(pPager->pCodecArg, PGHDR_TO_DATA(pPg), 3); } } }else{ @@ -1803,13 +1807,10 @@ int sqlitepager_write(void *pData){ szPg = SQLITE_PAGE_SIZE+4; } store32bits(pPg->pgno, pPg, -4); - if( pPager->xCodec ){ - pPager->xCodec(pPager->pCodecArg, pData, 3); - } + CODEC(pPager, pData, pPg->pgno, 7); rc = sqliteOsWrite(&pPager->jfd, &((char*)pData)[-4], szPg); - if( pPager->xCodec ){ - pPager->xCodec(pPager->pCodecArg, pData, 0); - } + TRACE3("JOURNAL %d %d\n", pPg->pgno, pPg->needSync); + CODEC(pPager, pData, pPg->pgno, 0); if( journal_format>=JOURNAL_FORMAT_3 ){ *(u32*)PGHDR_TO_EXTRA(pPg) = saved; } @@ -1827,7 +1828,6 @@ int sqlitepager_write(void *pData){ pPager->aInCkpt[pPg->pgno/8] |= 1<<(pPg->pgno&7); page_add_to_ckpt_list(pPg); } - TRACE3("JOURNAL %d %d\n", pPg->pgno, pPg->needSync); }else{ pPg->needSync = !pPager->journalStarted && !pPager->noSync; TRACE3("APPEND %d %d\n", pPg->pgno, pPg->needSync); @@ -1845,7 +1845,10 @@ int sqlitepager_write(void *pData){ if( pPager->ckptInUse && !pPg->inCkpt && (int)pPg->pgno<=pPager->ckptSize ){ assert( pPg->inJournal || (int)pPg->pgno>pPager->origDbSize ); store32bits(pPg->pgno, pPg, -4); + CODEC(pPager, pData, pPg->pgno, 7); rc = sqliteOsWrite(&pPager->cpfd, &((char*)pData)[-4], SQLITE_PAGE_SIZE+4); + TRACE2("CKPT-JOURNAL %d\n", pPg->pgno); + CODEC(pPager, pData, pPg->pgno, 0); if( rc!=SQLITE_OK ){ sqlitepager_rollback(pPager); pPager->errMask |= PAGER_ERR_FULL; @@ -2192,7 +2195,7 @@ const char *sqlitepager_filename(Pager *pPager){ */ void sqlitepager_set_codec( Pager *pPager, - void (*xCodec)(void*,void*,int), + void (*xCodec)(void*,void*,Pgno,int), void *pCodecArg ){ pPager->xCodec = xCodec; diff --git a/src/pager.h b/src/pager.h index 9abe1fa29..09bc7aede 100644 --- a/src/pager.h +++ b/src/pager.h @@ -13,7 +13,7 @@ ** subsystem. The page cache subsystem reads and writes a file a page ** at a time and provides a journal for rollback. ** -** @(#) $Id: pager.h,v 1.25 2004/02/10 01:54:28 drh Exp $ +** @(#) $Id: pager.h,v 1.26 2004/02/11 02:18:07 drh Exp $ */ /* @@ -98,7 +98,7 @@ int *sqlitepager_stats(Pager*); void sqlitepager_set_safety_level(Pager*,int); const char *sqlitepager_filename(Pager*); int sqlitepager_rename(Pager*, const char *zNewName); -void sqlitepager_set_codec(Pager*,void(*)(void*,void*,int),void*); +void sqlitepager_set_codec(Pager*,void(*)(void*,void*,Pgno,int),void*); #ifdef SQLITE_TEST void sqlitepager_refdump(Pager*); diff --git a/src/shell.c b/src/shell.c index bbc3391a9..e73b6a3a8 100644 --- a/src/shell.c +++ b/src/shell.c @@ -12,7 +12,7 @@ ** This file contains code to implement the "sqlite" command line ** utility for accessing SQLite databases. ** -** $Id: shell.c,v 1.85 2004/02/10 02:57:59 drh Exp $ +** $Id: shell.c,v 1.86 2004/02/11 02:18:07 drh Exp $ */ #include <stdlib.h> #include <string.h> @@ -490,7 +490,7 @@ static char zHelp[] = ".prompt MAIN CONTINUE Replace the standard prompts\n" ".quit Exit this program\n" ".read FILENAME Execute SQL in FILENAME\n" -#ifdef SQLITE_HAS_CRYPTO +#ifdef SQLITE_HAS_CODEC ".rekey OLD NEW NEW Change the encryption key\n" #endif ".schema ?TABLE? Show the CREATE statements\n" @@ -511,7 +511,7 @@ static void process_input(struct callback_data *p, FILE *in); static void open_db(struct callback_data *p){ if( p->db==0 ){ char *zErrMsg = 0; -#ifdef SQLITE_HAS_CRYPTO +#ifdef SQLITE_HAS_CODEC if( p->zKey && p->zKey[0] ){ int n = strlen(p->zKey); p->db = sqlite_open_encrypted(p->zDbFilename, p->zKey, n, &zErrMsg); @@ -786,7 +786,7 @@ static int do_meta_command(char *zLine, struct callback_data *p){ } }else -#ifdef SQLITE_HAS_CRYPTO +#ifdef SQLITE_HAS_CODEC if( c=='r' && strncmp(azArg[0],"rekey", n)==0 && nArg==4 ){ char *zOld = p->zKey; if( zOld==0 ) zOld = ""; @@ -1170,7 +1170,7 @@ static const char zOptions[] = " -[no]header turn headers on or off\n" " -column set output mode to 'column'\n" " -html set output mode to HTML\n" -#ifdef SQLITE_HAS_CRYPTO +#ifdef SQLITE_HAS_CODEC " -key KEY encryption key\n" #endif " -line set output mode to 'line'\n" diff --git a/src/tclsqlite.c b/src/tclsqlite.c index 6fb3c3add..39f3514ce 100644 --- a/src/tclsqlite.c +++ b/src/tclsqlite.c @@ -11,7 +11,7 @@ ************************************************************************* ** A TCL Interface to SQLite ** -** $Id: tclsqlite.c,v 1.55 2004/02/01 01:22:52 drh Exp $ +** $Id: tclsqlite.c,v 1.56 2004/02/11 02:18:07 drh Exp $ */ #ifndef NO_TCL /* Omit this whole file if TCL is unavailable */ @@ -900,7 +900,7 @@ static int DbObjCmd(void *cd, Tcl_Interp *interp, int objc,Tcl_Obj *const*objv){ return TCL_ERROR; } pKey = Tcl_GetByteArrayFromObj(objv[2], &nKey); -#ifdef SQLITE_HAS_CRYPTO +#ifdef SQLITE_HAS_CODEC rc = sqlite_rekey(pDb->db, pKey, nKey); if( rc ){ Tcl_AppendResult(interp, sqlite_error_string(rc), 0); @@ -1016,8 +1016,8 @@ static int DbMain(void *cd, Tcl_Interp *interp, int objc,Tcl_Obj *const*objv){ Tcl_AppendResult(interp,sqlite_version,0); return TCL_OK; } - if( strcmp(zArg,"-has-crypto")==0 ){ -#ifdef SQLITE_HAS_CRYPTO + if( strcmp(zArg,"-has-codec")==0 ){ +#ifdef SQLITE_HAS_CODEC Tcl_AppendResult(interp,"1",0); #else Tcl_AppendResult(interp,"0",0); @@ -1042,8 +1042,8 @@ static int DbMain(void *cd, Tcl_Interp *interp, int objc,Tcl_Obj *const*objv){ } if( objc!=3 && objc!=4 ){ Tcl_WrongNumArgs(interp, 1, objv, -#ifdef SQLITE_HAS_CRYPTO - "HANDLE FILENAME ?-key CRYPTOKEY?" +#ifdef SQLITE_HAS_CODEC + "HANDLE FILENAME ?-key CODEC-KEY?" #else "HANDLE FILENAME ?MODE?" #endif @@ -1063,7 +1063,7 @@ static int DbMain(void *cd, Tcl_Interp *interp, int objc,Tcl_Obj *const*objv){ } memset(p, 0, sizeof(*p)); zFile = Tcl_GetStringFromObj(objv[2], 0); -#ifdef SQLITE_HAS_CRYPTO +#ifdef SQLITE_HAS_CODEC if( nKey>0 ){ p->db = sqlite_open_encrypted(zFile, pKey, nKey, &zErrMsg); }else |