At the beginning of main.c after the includes:

int ppdbuffersize = 10 * 1024;
void *ppdbuffer;

Also in main.c at the end of sqlite3_close before the return statement:

free(ppdbuffer);

Also in main.c  at the beginning of openDatabase, after the declarations:

  ppdbuffer = malloc(ppdbuffersize);


Now I know that this has some problems if you open more that one database at a time or maybe if you are multithreading. But remember, we had a very specific purpose in mind. For a more general purpose approach, I'd probably either keep a reference count for the buffer and free it when I hit 0, or keep a separate buffer for each database.


Joey.


At 04:06 PM 9/10/2004, you wrote:
Joey,

You are going to have to excuse my ignorance of c++, but I am a bit
confused as far as the ppdbuffersize and ppdbuffer.  Is there additional
code I would need to add elsewhere for these variables, and if so, would
you mind including those as well??

I'm very sorry if this is really stupid, but I'm stuck in a C#.Net world
and don't have to deal with this stuff.

Thanks!

Bob

-----Original Message-----
From: Joey Blankenship [mailto:[EMAIL PROTECTED]
Sent: Friday, September 10, 2004 2:48 PM
To: [EMAIL PROTECTED]
Subject: RE: [sqlite] Encrypting data stored in database

I'm including the routines that we modified.  I hate to send the whole
file
around the entire list.  The ppdbuffer and ppdbuffersize are set
initially
when the database is opened and closed.  The current implementation may
not
be threadsafe, but we are single threaded.


extern int ppdbuffersize; extern void *ppdbuffer;

int sqlite3OsRead(OsFile *id, void *pBuf, int amt){
   DWORD got;
   int i;

   assert( id->isOpen );
   SimulateIOError(SQLITE_IOERR);
   TRACE3("READ %d lock=%d\n", id->h, id->locktype);
   if( !ReadFile(id->h, pBuf, amt, &got, 0) ){
     got = 0;
   }

   // PPD - XOR the buffer with a pattern so the disk file contents are
not
in plain text
   for (i = 0; i < got/4; i++)
   {
     *((DWORD *)((DWORD *)pBuf + i)) = (*((DWORD *)((DWORD *)pBuf +
i)))^0xA5A5A5A5;
   }

   // XOR the buffer with a pattern - any leftover bytes
   for (i = 0; i < got%4; i++)
   {
     *((BYTE *)((BYTE *)pBuf + i)) = (*((BYTE *)((BYTE *)pBuf +
i)))^0xA5;
   }


if( got==(DWORD)amt ){ return SQLITE_OK; }else{ return SQLITE_IOERR; } }

int sqlite3OsWrite(OsFile *id, const void *pBuf, int amt){
   int rc;
   DWORD wrote;
   int i;

   if (ppdbuffersize < amt)
   {
     ppdbuffersize = amt + 1024;
     ppdbuffer = realloc(ppdbuffer, ppdbuffersize);
   }

   // PPD - XOR the buffer with a pattern so the disk file contents are
not
in plain text
   for (i = 0; i < amt/4; i++)
   {
     *((DWORD *)((DWORD *)ppdbuffer + i)) = (*((DWORD *)((DWORD *)pBuf +

i)))^0xA5A5A5A5;
   }

   // XOR the buffer with a pattern - any leftover bytes
   for (i = 0; i < amt%4; i++)
   {
     *((BYTE *)((BYTE *)ppdbuffer + i)) = (*((BYTE *)((BYTE *)pBuf +
i)))^0xA5;
   }

   pBuf = ppdbuffer;

   assert( id->isOpen );
   SimulateIOError(SQLITE_IOERR);
   TRACE3("WRITE %d lock=%d\n", id->h, id->locktype);
   while( amt>0 && (rc = WriteFile(id->h, pBuf, amt, &wrote, 0))!=0 &&
wrote>0 ){
     amt -= wrote;
     pBuf = &((char*)pBuf)[wrote];
   }

   if( !rc || amt>(int)wrote ){
     return SQLITE_FULL;
   }
   return SQLITE_OK;
}


At 03:03 PM 9/10/2004, you wrote: >Joey, > >Would you mind sharing the modifications you made to the os_win.c file? >I would be interested in using such a modification, unfortunately, c++ >isn't my strongest language. > >Thanks! > >Bob



Reply via email to