aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authordrh <drh@noemail.net>2004-02-11 02:18:05 +0000
committerdrh <drh@noemail.net>2004-02-11 02:18:05 +0000
commit9eb9e26b82e5b973f81f4429f9e1978a058391e9 (patch)
treebd231ee2932b3b70fb119f0f50ace9e96a5bcfd5 /src
parentd86a39c866ae671fffe3edbffce0e28e4904a72a (diff)
downloadsqlite-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.c5
-rw-r--r--src/pager.c51
-rw-r--r--src/pager.h4
-rw-r--r--src/shell.c10
-rw-r--r--src/tclsqlite.c14
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