mirror of
https://github.com/sqlite/sqlite.git
synced 2025-11-11 01:42:22 +03:00
Initial work on a Win32 VFS with NOP locking.
FossilOrigin-Name: 549abe3f89b55b05a05f267865a5dd84b8cd335d
This commit is contained in:
260
src/os_win.c
260
src/os_win.c
@@ -290,6 +290,17 @@ struct winFile {
|
||||
#endif
|
||||
};
|
||||
|
||||
/*
|
||||
** The winVfsAppData structure is used for the pAppData member for all of the
|
||||
** Win32 VFS variants.
|
||||
*/
|
||||
typedef struct winVfsAppData winVfsAppData;
|
||||
struct winVfsAppData {
|
||||
const sqlite3_io_methods *pMethod; /* The file I/O methods to use. */
|
||||
void *pAppData; /* The extra pAppData, if any. */
|
||||
BOOL bNoLock; /* Non-zero if locking is disabled. */
|
||||
};
|
||||
|
||||
/*
|
||||
** Allowed values for winFile.ctrlFlags
|
||||
*/
|
||||
@@ -2611,7 +2622,12 @@ static int winClose(sqlite3_file *id){
|
||||
}while( rc==0 && ++cnt < MX_CLOSE_ATTEMPT && (sqlite3_win32_sleep(100), 1) );
|
||||
#if SQLITE_OS_WINCE
|
||||
#define WINCE_DELETION_ATTEMPTS 3
|
||||
winceDestroyLock(pFile);
|
||||
{
|
||||
winVfsAppData *pAppData = (winVfsAppData*)pFile->pVfs->pAppData;
|
||||
if( pAppData==NULL || !pAppData->bNoLock ){
|
||||
winceDestroyLock(pFile);
|
||||
}
|
||||
}
|
||||
if( pFile->zDeleteOnClose ){
|
||||
int cnt = 0;
|
||||
while(
|
||||
@@ -3343,6 +3359,44 @@ static int winUnlock(sqlite3_file *id, int locktype){
|
||||
return rc;
|
||||
}
|
||||
|
||||
/******************************************************************************
|
||||
****************************** No-op Locking **********************************
|
||||
**
|
||||
** Of the various locking implementations available, this is by far the
|
||||
** simplest: locking is ignored. No attempt is made to lock the database
|
||||
** file for reading or writing.
|
||||
**
|
||||
** This locking mode is appropriate for use on read-only databases
|
||||
** (ex: databases that are burned into CD-ROM, for example.) It can
|
||||
** also be used if the application employs some external mechanism to
|
||||
** prevent simultaneous access of the same database by two or more
|
||||
** database connections. But there is a serious risk of database
|
||||
** corruption if this locking mode is used in situations where multiple
|
||||
** database connections are accessing the same database file at the same
|
||||
** time and one or more of those connections are writing.
|
||||
*/
|
||||
|
||||
static int winNolockLock(sqlite3_file *id, int locktype){
|
||||
UNUSED_PARAMETER(id);
|
||||
UNUSED_PARAMETER(locktype);
|
||||
return SQLITE_OK;
|
||||
}
|
||||
|
||||
static int winNolockCheckReservedLock(sqlite3_file *id, int *pResOut){
|
||||
UNUSED_PARAMETER(id);
|
||||
UNUSED_PARAMETER(pResOut);
|
||||
return SQLITE_OK;
|
||||
}
|
||||
|
||||
static int winNolockUnlock(sqlite3_file *id, int locktype){
|
||||
UNUSED_PARAMETER(id);
|
||||
UNUSED_PARAMETER(locktype);
|
||||
return SQLITE_OK;
|
||||
}
|
||||
|
||||
/******************* End of the no-op lock implementation *********************
|
||||
******************************************************************************/
|
||||
|
||||
/*
|
||||
** If *pArg is initially negative then this is a query. Set *pArg to
|
||||
** 1 or 0 depending on whether or not bit mask of pFile->ctrlFlags is set.
|
||||
@@ -4407,6 +4461,44 @@ static const sqlite3_io_methods winIoMethod = {
|
||||
winUnfetch /* xUnfetch */
|
||||
};
|
||||
|
||||
/*
|
||||
** This vector defines all the methods that can operate on an
|
||||
** sqlite3_file for win32 without performing any locking.
|
||||
*/
|
||||
static const sqlite3_io_methods winIoNolockMethod = {
|
||||
3, /* iVersion */
|
||||
winClose, /* xClose */
|
||||
winRead, /* xRead */
|
||||
winWrite, /* xWrite */
|
||||
winTruncate, /* xTruncate */
|
||||
winSync, /* xSync */
|
||||
winFileSize, /* xFileSize */
|
||||
winNolockLock, /* xLock */
|
||||
winNolockUnlock, /* xUnlock */
|
||||
winNolockCheckReservedLock, /* xCheckReservedLock */
|
||||
winFileControl, /* xFileControl */
|
||||
winSectorSize, /* xSectorSize */
|
||||
winDeviceCharacteristics, /* xDeviceCharacteristics */
|
||||
winShmMap, /* xShmMap */
|
||||
winShmLock, /* xShmLock */
|
||||
winShmBarrier, /* xShmBarrier */
|
||||
winShmUnmap, /* xShmUnmap */
|
||||
winFetch, /* xFetch */
|
||||
winUnfetch /* xUnfetch */
|
||||
};
|
||||
|
||||
static winVfsAppData winAppData = {
|
||||
&winIoMethod, /* pMethod */
|
||||
0, /* pAppData */
|
||||
0 /* bNoLock */
|
||||
};
|
||||
|
||||
static winVfsAppData winNolockAppData = {
|
||||
&winIoNolockMethod, /* pMethod */
|
||||
0, /* pAppData */
|
||||
1 /* bNoLock */
|
||||
};
|
||||
|
||||
/****************************************************************************
|
||||
**************************** sqlite3_vfs methods ****************************
|
||||
**
|
||||
@@ -4739,7 +4831,7 @@ static int winIsDir(const void *zConverted){
|
||||
** Open a file.
|
||||
*/
|
||||
static int winOpen(
|
||||
sqlite3_vfs *pVfs, /* Used to get maximum path name length */
|
||||
sqlite3_vfs *pVfs, /* Used to get maximum path length and AppData */
|
||||
const char *zName, /* Name of the file (UTF-8) */
|
||||
sqlite3_file *id, /* Write the SQLite file handle here */
|
||||
int flags, /* Open mode flags */
|
||||
@@ -4754,6 +4846,7 @@ static int winOpen(
|
||||
#if SQLITE_OS_WINCE
|
||||
int isTemp = 0;
|
||||
#endif
|
||||
winVfsAppData *pAppData;
|
||||
winFile *pFile = (winFile*)id;
|
||||
void *zConverted; /* Filename in OS encoding */
|
||||
const char *zUtf8Name = zName; /* Filename in UTF-8 encoding */
|
||||
@@ -4975,15 +5068,20 @@ static int winOpen(
|
||||
"rc=%s\n", h, zUtf8Name, dwDesiredAccess, pOutFlags, pOutFlags ?
|
||||
*pOutFlags : 0, (h==INVALID_HANDLE_VALUE) ? "failed" : "ok"));
|
||||
|
||||
pAppData = (winVfsAppData*)pVfs->pAppData;
|
||||
|
||||
#if SQLITE_OS_WINCE
|
||||
if( isReadWrite && eType==SQLITE_OPEN_MAIN_DB
|
||||
&& (rc = winceCreateLock(zName, pFile))!=SQLITE_OK
|
||||
){
|
||||
osCloseHandle(h);
|
||||
sqlite3_free(zConverted);
|
||||
sqlite3_free(zTmpname);
|
||||
OSTRACE(("OPEN-CE-LOCK name=%s, rc=%s\n", zName, sqlite3ErrName(rc)));
|
||||
return rc;
|
||||
{
|
||||
if( isReadWrite && eType==SQLITE_OPEN_MAIN_DB
|
||||
&& ((pAppData==NULL) || !pAppData->bNoLock)
|
||||
&& (rc = winceCreateLock(zName, pFile))!=SQLITE_OK
|
||||
){
|
||||
osCloseHandle(h);
|
||||
sqlite3_free(zConverted);
|
||||
sqlite3_free(zTmpname);
|
||||
OSTRACE(("OPEN-CE-LOCK name=%s, rc=%s\n", zName, sqlite3ErrName(rc)));
|
||||
return rc;
|
||||
}
|
||||
}
|
||||
if( isTemp ){
|
||||
pFile->zDeleteOnClose = zConverted;
|
||||
@@ -4994,7 +5092,7 @@ static int winOpen(
|
||||
}
|
||||
|
||||
sqlite3_free(zTmpname);
|
||||
pFile->pMethod = &winIoMethod;
|
||||
pFile->pMethod = pAppData ? pAppData->pMethod : &winIoMethod;
|
||||
pFile->pVfs = pVfs;
|
||||
pFile->h = h;
|
||||
if( isReadonly ){
|
||||
@@ -5717,53 +5815,103 @@ static int winGetLastError(sqlite3_vfs *pVfs, int nBuf, char *zBuf){
|
||||
*/
|
||||
int sqlite3_os_init(void){
|
||||
static sqlite3_vfs winVfs = {
|
||||
3, /* iVersion */
|
||||
sizeof(winFile), /* szOsFile */
|
||||
3, /* iVersion */
|
||||
sizeof(winFile), /* szOsFile */
|
||||
SQLITE_WIN32_MAX_PATH_BYTES, /* mxPathname */
|
||||
0, /* pNext */
|
||||
"win32", /* zName */
|
||||
0, /* pAppData */
|
||||
winOpen, /* xOpen */
|
||||
winDelete, /* xDelete */
|
||||
winAccess, /* xAccess */
|
||||
winFullPathname, /* xFullPathname */
|
||||
winDlOpen, /* xDlOpen */
|
||||
winDlError, /* xDlError */
|
||||
winDlSym, /* xDlSym */
|
||||
winDlClose, /* xDlClose */
|
||||
winRandomness, /* xRandomness */
|
||||
winSleep, /* xSleep */
|
||||
winCurrentTime, /* xCurrentTime */
|
||||
winGetLastError, /* xGetLastError */
|
||||
winCurrentTimeInt64, /* xCurrentTimeInt64 */
|
||||
winSetSystemCall, /* xSetSystemCall */
|
||||
winGetSystemCall, /* xGetSystemCall */
|
||||
winNextSystemCall, /* xNextSystemCall */
|
||||
0, /* pNext */
|
||||
"win32", /* zName */
|
||||
&winAppData, /* pAppData */
|
||||
winOpen, /* xOpen */
|
||||
winDelete, /* xDelete */
|
||||
winAccess, /* xAccess */
|
||||
winFullPathname, /* xFullPathname */
|
||||
winDlOpen, /* xDlOpen */
|
||||
winDlError, /* xDlError */
|
||||
winDlSym, /* xDlSym */
|
||||
winDlClose, /* xDlClose */
|
||||
winRandomness, /* xRandomness */
|
||||
winSleep, /* xSleep */
|
||||
winCurrentTime, /* xCurrentTime */
|
||||
winGetLastError, /* xGetLastError */
|
||||
winCurrentTimeInt64, /* xCurrentTimeInt64 */
|
||||
winSetSystemCall, /* xSetSystemCall */
|
||||
winGetSystemCall, /* xGetSystemCall */
|
||||
winNextSystemCall, /* xNextSystemCall */
|
||||
};
|
||||
#if defined(SQLITE_WIN32_HAS_WIDE)
|
||||
static sqlite3_vfs winLongPathVfs = {
|
||||
3, /* iVersion */
|
||||
sizeof(winFile), /* szOsFile */
|
||||
3, /* iVersion */
|
||||
sizeof(winFile), /* szOsFile */
|
||||
SQLITE_WINNT_MAX_PATH_BYTES, /* mxPathname */
|
||||
0, /* pNext */
|
||||
"win32-longpath", /* zName */
|
||||
0, /* pAppData */
|
||||
winOpen, /* xOpen */
|
||||
winDelete, /* xDelete */
|
||||
winAccess, /* xAccess */
|
||||
winFullPathname, /* xFullPathname */
|
||||
winDlOpen, /* xDlOpen */
|
||||
winDlError, /* xDlError */
|
||||
winDlSym, /* xDlSym */
|
||||
winDlClose, /* xDlClose */
|
||||
winRandomness, /* xRandomness */
|
||||
winSleep, /* xSleep */
|
||||
winCurrentTime, /* xCurrentTime */
|
||||
winGetLastError, /* xGetLastError */
|
||||
winCurrentTimeInt64, /* xCurrentTimeInt64 */
|
||||
winSetSystemCall, /* xSetSystemCall */
|
||||
winGetSystemCall, /* xGetSystemCall */
|
||||
winNextSystemCall, /* xNextSystemCall */
|
||||
0, /* pNext */
|
||||
"win32-longpath", /* zName */
|
||||
&winAppData, /* pAppData */
|
||||
winOpen, /* xOpen */
|
||||
winDelete, /* xDelete */
|
||||
winAccess, /* xAccess */
|
||||
winFullPathname, /* xFullPathname */
|
||||
winDlOpen, /* xDlOpen */
|
||||
winDlError, /* xDlError */
|
||||
winDlSym, /* xDlSym */
|
||||
winDlClose, /* xDlClose */
|
||||
winRandomness, /* xRandomness */
|
||||
winSleep, /* xSleep */
|
||||
winCurrentTime, /* xCurrentTime */
|
||||
winGetLastError, /* xGetLastError */
|
||||
winCurrentTimeInt64, /* xCurrentTimeInt64 */
|
||||
winSetSystemCall, /* xSetSystemCall */
|
||||
winGetSystemCall, /* xGetSystemCall */
|
||||
winNextSystemCall, /* xNextSystemCall */
|
||||
};
|
||||
#endif
|
||||
static sqlite3_vfs winNolockVfs = {
|
||||
3, /* iVersion */
|
||||
sizeof(winFile), /* szOsFile */
|
||||
SQLITE_WIN32_MAX_PATH_BYTES, /* mxPathname */
|
||||
0, /* pNext */
|
||||
"win32-none", /* zName */
|
||||
&winNolockAppData, /* pAppData */
|
||||
winOpen, /* xOpen */
|
||||
winDelete, /* xDelete */
|
||||
winAccess, /* xAccess */
|
||||
winFullPathname, /* xFullPathname */
|
||||
winDlOpen, /* xDlOpen */
|
||||
winDlError, /* xDlError */
|
||||
winDlSym, /* xDlSym */
|
||||
winDlClose, /* xDlClose */
|
||||
winRandomness, /* xRandomness */
|
||||
winSleep, /* xSleep */
|
||||
winCurrentTime, /* xCurrentTime */
|
||||
winGetLastError, /* xGetLastError */
|
||||
winCurrentTimeInt64, /* xCurrentTimeInt64 */
|
||||
winSetSystemCall, /* xSetSystemCall */
|
||||
winGetSystemCall, /* xGetSystemCall */
|
||||
winNextSystemCall, /* xNextSystemCall */
|
||||
};
|
||||
#if defined(SQLITE_WIN32_HAS_WIDE)
|
||||
static sqlite3_vfs winLongPathNolockVfs = {
|
||||
3, /* iVersion */
|
||||
sizeof(winFile), /* szOsFile */
|
||||
SQLITE_WINNT_MAX_PATH_BYTES, /* mxPathname */
|
||||
0, /* pNext */
|
||||
"win32-longpath-none", /* zName */
|
||||
&winNolockAppData, /* pAppData */
|
||||
winOpen, /* xOpen */
|
||||
winDelete, /* xDelete */
|
||||
winAccess, /* xAccess */
|
||||
winFullPathname, /* xFullPathname */
|
||||
winDlOpen, /* xDlOpen */
|
||||
winDlError, /* xDlError */
|
||||
winDlSym, /* xDlSym */
|
||||
winDlClose, /* xDlClose */
|
||||
winRandomness, /* xRandomness */
|
||||
winSleep, /* xSleep */
|
||||
winCurrentTime, /* xCurrentTime */
|
||||
winGetLastError, /* xGetLastError */
|
||||
winCurrentTimeInt64, /* xCurrentTimeInt64 */
|
||||
winSetSystemCall, /* xSetSystemCall */
|
||||
winGetSystemCall, /* xGetSystemCall */
|
||||
winNextSystemCall, /* xNextSystemCall */
|
||||
};
|
||||
#endif
|
||||
|
||||
@@ -5787,6 +5935,12 @@ int sqlite3_os_init(void){
|
||||
sqlite3_vfs_register(&winLongPathVfs, 0);
|
||||
#endif
|
||||
|
||||
sqlite3_vfs_register(&winNolockVfs, 0);
|
||||
|
||||
#if defined(SQLITE_WIN32_HAS_WIDE)
|
||||
sqlite3_vfs_register(&winLongPathNolockVfs, 0);
|
||||
#endif
|
||||
|
||||
return SQLITE_OK;
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user