Igor Tandetnik uttered:

Christian Smith
<[EMAIL PROTECTED]> wrote:
Igor Tandetnik uttered:
You want to enable sharing. Pass FILE_SHARE_READ | FILE_SHARE_WRITE
as the third parameter.


Surely not FILE_SHARE_WRITE! You don't want other processes writing
the database while you're copying it.

The file is already opened by another process for read/write, you must specify FILE_SHARE_WRITE otherwise you won't be able to open it. You have to impose a locking mechanism separate from that provided by the OS. Hence BEGIN IMMEDIATE command which guarantees that no writes will occur via SQLite.


But the OP didn't want to use SQLite in the copying program (for whatever reason). Without SQLite to arbitrate locking, using FILE_SHARE_WRITE won't help any as the file can still be updated regardless while we're copying. If the file is already open with SQLite, then we're stuck with it I suppose.

The OP's best bet, then, is to lock the file an a way compatible with SQLite. The easiest way to do this is to use the Win95 compatible LockFile similar to the function getReadLock in the os_win.c source. Use the following code to read lock the file in a SQLite compatible way:

#define PENDING_BYTE 0x40000000 /* First byte past the 1GB boundary */
#define SHARED_FIRST (PENDING_BYTE+2)
#define SHARED_SIZE 510

static int getReadLock( HANDLE fhandle )
{
  int lk = random();
  int sharedLockByte = (lk & 0x7fffffff)%(SHARED_SIZE - 1);
  return res = LockFile( fhandle, SHARED_FIRST+sharedLockByte, 0, 1, 0);
}

Note, this function will fail (return 0) if the file is already locked for writing, as the entire region from SHARED_FIRST to SHARED_FIRST+SHARED_SIZE is locked. The function will also fail on NT if the SQLite library already has a read lock on the file. If you want a more complete function that is more capable on NT, look at the getReadLock() in os_win.c.

If closing the handle does not clear the lock, you'll need to record the sharedLockByte value and unlock the file first. MSDN is unclear whether this is the case (no surprises there!)



Igor Tandetnik

--
    /"\
    \ /    ASCII RIBBON CAMPAIGN - AGAINST HTML MAIL
     X                           - AGAINST MS ATTACHMENTS
    / \

Reply via email to