|
|
|
@ -41,16 +41,6 @@
|
|
|
|
|
# include <winbase.h>
|
|
|
|
|
#endif
|
|
|
|
|
|
|
|
|
|
#if OS_MAC
|
|
|
|
|
# include <extras.h>
|
|
|
|
|
# include <path2fss.h>
|
|
|
|
|
# include <TextUtils.h>
|
|
|
|
|
# include <FinderRegistry.h>
|
|
|
|
|
# include <Folders.h>
|
|
|
|
|
# include <Timer.h>
|
|
|
|
|
# include <OSUtils.h>
|
|
|
|
|
#endif
|
|
|
|
|
|
|
|
|
|
/*
|
|
|
|
|
** The DJGPP compiler environment looks mostly like Unix, but it
|
|
|
|
|
** lacks the fcntl() system call. So redefine fcntl() to be something
|
|
|
|
@ -74,10 +64,6 @@
|
|
|
|
|
#if OS_WIN && defined(THREADSAFE) && THREADSAFE
|
|
|
|
|
# define SQLITE_W32_THREADS 1
|
|
|
|
|
#endif
|
|
|
|
|
#if OS_MAC && defined(THREADSAFE) && THREADSAFE
|
|
|
|
|
# include <Multiprocessing.h>
|
|
|
|
|
# define SQLITE_MACOS_MULTITASKING 1
|
|
|
|
|
#endif
|
|
|
|
|
|
|
|
|
|
/*
|
|
|
|
|
** Macros for performance tracing. Normally turned off
|
|
|
|
@ -393,9 +379,6 @@ int sqliteOsDelete(const char *zFilename){
|
|
|
|
|
#endif
|
|
|
|
|
#if OS_WIN
|
|
|
|
|
DeleteFile(zFilename);
|
|
|
|
|
#endif
|
|
|
|
|
#if OS_MAC
|
|
|
|
|
unlink(zFilename);
|
|
|
|
|
#endif
|
|
|
|
|
return SQLITE_OK;
|
|
|
|
|
}
|
|
|
|
@ -410,9 +393,6 @@ int sqliteOsFileExists(const char *zFilename){
|
|
|
|
|
#if OS_WIN
|
|
|
|
|
return GetFileAttributes(zFilename) != 0xffffffff;
|
|
|
|
|
#endif
|
|
|
|
|
#if OS_MAC
|
|
|
|
|
return access(zFilename, 0)==0;
|
|
|
|
|
#endif
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
@ -434,10 +414,6 @@ int sqliteOsFileRename(const char *zOldName, const char *zNewName){
|
|
|
|
|
}
|
|
|
|
|
return SQLITE_OK;
|
|
|
|
|
#endif
|
|
|
|
|
#if OS_MAC
|
|
|
|
|
/**** FIX ME ***/
|
|
|
|
|
return SQLITE_ERROR;
|
|
|
|
|
#endif
|
|
|
|
|
}
|
|
|
|
|
#endif /* NOT USED */
|
|
|
|
|
|
|
|
|
@ -519,56 +495,6 @@ int sqliteOsOpenReadWrite(
|
|
|
|
|
OpenCounter(+1);
|
|
|
|
|
return SQLITE_OK;
|
|
|
|
|
#endif
|
|
|
|
|
#if OS_MAC
|
|
|
|
|
FSSpec fsSpec;
|
|
|
|
|
# ifdef _LARGE_FILE
|
|
|
|
|
HFSUniStr255 dfName;
|
|
|
|
|
FSRef fsRef;
|
|
|
|
|
if( __path2fss(zFilename, &fsSpec) != noErr ){
|
|
|
|
|
if( HCreate(fsSpec.vRefNum, fsSpec.parID, fsSpec.name, 'SQLI', cDocumentFile) != noErr )
|
|
|
|
|
return SQLITE_CANTOPEN;
|
|
|
|
|
}
|
|
|
|
|
if( FSpMakeFSRef(&fsSpec, &fsRef) != noErr )
|
|
|
|
|
return SQLITE_CANTOPEN;
|
|
|
|
|
FSGetDataForkName(&dfName);
|
|
|
|
|
if( FSOpenFork(&fsRef, dfName.length, dfName.unicode,
|
|
|
|
|
fsRdWrShPerm, &(id->refNum)) != noErr ){
|
|
|
|
|
if( FSOpenFork(&fsRef, dfName.length, dfName.unicode,
|
|
|
|
|
fsRdWrPerm, &(id->refNum)) != noErr ){
|
|
|
|
|
if (FSOpenFork(&fsRef, dfName.length, dfName.unicode,
|
|
|
|
|
fsRdPerm, &(id->refNum)) != noErr )
|
|
|
|
|
return SQLITE_CANTOPEN;
|
|
|
|
|
else
|
|
|
|
|
*pReadonly = 1;
|
|
|
|
|
} else
|
|
|
|
|
*pReadonly = 0;
|
|
|
|
|
} else
|
|
|
|
|
*pReadonly = 0;
|
|
|
|
|
# else
|
|
|
|
|
__path2fss(zFilename, &fsSpec);
|
|
|
|
|
if( !sqliteOsFileExists(zFilename) ){
|
|
|
|
|
if( HCreate(fsSpec.vRefNum, fsSpec.parID, fsSpec.name, 'SQLI', cDocumentFile) != noErr )
|
|
|
|
|
return SQLITE_CANTOPEN;
|
|
|
|
|
}
|
|
|
|
|
if( HOpenDF(fsSpec.vRefNum, fsSpec.parID, fsSpec.name, fsRdWrShPerm, &(id->refNum)) != noErr ){
|
|
|
|
|
if( HOpenDF(fsSpec.vRefNum, fsSpec.parID, fsSpec.name, fsRdWrPerm, &(id->refNum)) != noErr ){
|
|
|
|
|
if( HOpenDF(fsSpec.vRefNum, fsSpec.parID, fsSpec.name, fsRdPerm, &(id->refNum)) != noErr )
|
|
|
|
|
return SQLITE_CANTOPEN;
|
|
|
|
|
else
|
|
|
|
|
*pReadonly = 1;
|
|
|
|
|
} else
|
|
|
|
|
*pReadonly = 0;
|
|
|
|
|
} else
|
|
|
|
|
*pReadonly = 0;
|
|
|
|
|
# endif
|
|
|
|
|
if( HOpenRF(fsSpec.vRefNum, fsSpec.parID, fsSpec.name, fsRdWrShPerm, &(id->refNumRF)) != noErr){
|
|
|
|
|
id->refNumRF = -1;
|
|
|
|
|
}
|
|
|
|
|
id->locked = 0;
|
|
|
|
|
id->delOnClose = 0;
|
|
|
|
|
OpenCounter(+1);
|
|
|
|
|
return SQLITE_OK;
|
|
|
|
|
#endif
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
@ -639,35 +565,6 @@ int sqliteOsOpenExclusive(const char *zFilename, OsFile *id, int delFlag){
|
|
|
|
|
OpenCounter(+1);
|
|
|
|
|
return SQLITE_OK;
|
|
|
|
|
#endif
|
|
|
|
|
#if OS_MAC
|
|
|
|
|
FSSpec fsSpec;
|
|
|
|
|
# ifdef _LARGE_FILE
|
|
|
|
|
HFSUniStr255 dfName;
|
|
|
|
|
FSRef fsRef;
|
|
|
|
|
__path2fss(zFilename, &fsSpec);
|
|
|
|
|
if( HCreate(fsSpec.vRefNum, fsSpec.parID, fsSpec.name, 'SQLI', cDocumentFile) != noErr )
|
|
|
|
|
return SQLITE_CANTOPEN;
|
|
|
|
|
if( FSpMakeFSRef(&fsSpec, &fsRef) != noErr )
|
|
|
|
|
return SQLITE_CANTOPEN;
|
|
|
|
|
FSGetDataForkName(&dfName);
|
|
|
|
|
if( FSOpenFork(&fsRef, dfName.length, dfName.unicode,
|
|
|
|
|
fsRdWrPerm, &(id->refNum)) != noErr )
|
|
|
|
|
return SQLITE_CANTOPEN;
|
|
|
|
|
# else
|
|
|
|
|
__path2fss(zFilename, &fsSpec);
|
|
|
|
|
if( HCreate(fsSpec.vRefNum, fsSpec.parID, fsSpec.name, 'SQLI', cDocumentFile) != noErr )
|
|
|
|
|
return SQLITE_CANTOPEN;
|
|
|
|
|
if( HOpenDF(fsSpec.vRefNum, fsSpec.parID, fsSpec.name, fsRdWrPerm, &(id->refNum)) != noErr )
|
|
|
|
|
return SQLITE_CANTOPEN;
|
|
|
|
|
# endif
|
|
|
|
|
id->refNumRF = -1;
|
|
|
|
|
id->locked = 0;
|
|
|
|
|
id->delOnClose = delFlag;
|
|
|
|
|
if (delFlag)
|
|
|
|
|
id->pathToDel = sqliteOsFullPathname(zFilename);
|
|
|
|
|
OpenCounter(+1);
|
|
|
|
|
return SQLITE_OK;
|
|
|
|
|
#endif
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/*
|
|
|
|
@ -714,32 +611,6 @@ int sqliteOsOpenReadOnly(const char *zFilename, OsFile *id){
|
|
|
|
|
OpenCounter(+1);
|
|
|
|
|
return SQLITE_OK;
|
|
|
|
|
#endif
|
|
|
|
|
#if OS_MAC
|
|
|
|
|
FSSpec fsSpec;
|
|
|
|
|
# ifdef _LARGE_FILE
|
|
|
|
|
HFSUniStr255 dfName;
|
|
|
|
|
FSRef fsRef;
|
|
|
|
|
if( __path2fss(zFilename, &fsSpec) != noErr )
|
|
|
|
|
return SQLITE_CANTOPEN;
|
|
|
|
|
if( FSpMakeFSRef(&fsSpec, &fsRef) != noErr )
|
|
|
|
|
return SQLITE_CANTOPEN;
|
|
|
|
|
FSGetDataForkName(&dfName);
|
|
|
|
|
if( FSOpenFork(&fsRef, dfName.length, dfName.unicode,
|
|
|
|
|
fsRdPerm, &(id->refNum)) != noErr )
|
|
|
|
|
return SQLITE_CANTOPEN;
|
|
|
|
|
# else
|
|
|
|
|
__path2fss(zFilename, &fsSpec);
|
|
|
|
|
if( HOpenDF(fsSpec.vRefNum, fsSpec.parID, fsSpec.name, fsRdPerm, &(id->refNum)) != noErr )
|
|
|
|
|
return SQLITE_CANTOPEN;
|
|
|
|
|
# endif
|
|
|
|
|
if( HOpenRF(fsSpec.vRefNum, fsSpec.parID, fsSpec.name, fsRdWrShPerm, &(id->refNumRF)) != noErr){
|
|
|
|
|
id->refNumRF = -1;
|
|
|
|
|
}
|
|
|
|
|
id->locked = 0;
|
|
|
|
|
id->delOnClose = 0;
|
|
|
|
|
OpenCounter(+1);
|
|
|
|
|
return SQLITE_OK;
|
|
|
|
|
#endif
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/*
|
|
|
|
@ -850,55 +721,6 @@ int sqliteOsTempFileName(char *zBuf){
|
|
|
|
|
zBuf[j] = 0;
|
|
|
|
|
if( !sqliteOsFileExists(zBuf) ) break;
|
|
|
|
|
}
|
|
|
|
|
#endif
|
|
|
|
|
#if OS_MAC
|
|
|
|
|
static char zChars[] =
|
|
|
|
|
"abcdefghijklmnopqrstuvwxyz"
|
|
|
|
|
"ABCDEFGHIJKLMNOPQRSTUVWXYZ"
|
|
|
|
|
"0123456789";
|
|
|
|
|
int i, j;
|
|
|
|
|
char *zDir;
|
|
|
|
|
char zTempPath[SQLITE_TEMPNAME_SIZE];
|
|
|
|
|
char zdirName[32];
|
|
|
|
|
CInfoPBRec infoRec;
|
|
|
|
|
Str31 dirName;
|
|
|
|
|
memset(&infoRec, 0, sizeof(infoRec));
|
|
|
|
|
memset(zTempPath, 0, SQLITE_TEMPNAME_SIZE);
|
|
|
|
|
if( sqlite_temp_directory!=0 ){
|
|
|
|
|
zDir = sqlite_temp_directory;
|
|
|
|
|
}else if( FindFolder(kOnSystemDisk, kTemporaryFolderType, kCreateFolder,
|
|
|
|
|
&(infoRec.dirInfo.ioVRefNum), &(infoRec.dirInfo.ioDrParID)) == noErr ){
|
|
|
|
|
infoRec.dirInfo.ioNamePtr = dirName;
|
|
|
|
|
do{
|
|
|
|
|
infoRec.dirInfo.ioFDirIndex = -1;
|
|
|
|
|
infoRec.dirInfo.ioDrDirID = infoRec.dirInfo.ioDrParID;
|
|
|
|
|
if( PBGetCatInfoSync(&infoRec) == noErr ){
|
|
|
|
|
CopyPascalStringToC(dirName, zdirName);
|
|
|
|
|
i = strlen(zdirName);
|
|
|
|
|
memmove(&(zTempPath[i+1]), zTempPath, strlen(zTempPath));
|
|
|
|
|
strcpy(zTempPath, zdirName);
|
|
|
|
|
zTempPath[i] = ':';
|
|
|
|
|
}else{
|
|
|
|
|
*zTempPath = 0;
|
|
|
|
|
break;
|
|
|
|
|
}
|
|
|
|
|
} while( infoRec.dirInfo.ioDrDirID != fsRtDirID );
|
|
|
|
|
zDir = zTempPath;
|
|
|
|
|
}
|
|
|
|
|
if( zDir[0]==0 ){
|
|
|
|
|
getcwd(zTempPath, SQLITE_TEMPNAME_SIZE-24);
|
|
|
|
|
zDir = zTempPath;
|
|
|
|
|
}
|
|
|
|
|
for(;;){
|
|
|
|
|
sprintf(zBuf, "%s"TEMP_FILE_PREFIX, zDir);
|
|
|
|
|
j = strlen(zBuf);
|
|
|
|
|
sqliteRandomness(15, &zBuf[j]);
|
|
|
|
|
for(i=0; i<15; i++, j++){
|
|
|
|
|
zBuf[j] = (char)zChars[ ((unsigned char)zBuf[j])%(sizeof(zChars)-1) ];
|
|
|
|
|
}
|
|
|
|
|
zBuf[j] = 0;
|
|
|
|
|
if( !sqliteOsFileExists(zBuf) ) break;
|
|
|
|
|
}
|
|
|
|
|
#endif
|
|
|
|
|
return SQLITE_OK;
|
|
|
|
|
}
|
|
|
|
@ -944,21 +766,6 @@ int sqliteOsClose(OsFile *id){
|
|
|
|
|
OpenCounter(-1);
|
|
|
|
|
return SQLITE_OK;
|
|
|
|
|
#endif
|
|
|
|
|
#if OS_MAC
|
|
|
|
|
if( id->refNumRF!=-1 )
|
|
|
|
|
FSClose(id->refNumRF);
|
|
|
|
|
# ifdef _LARGE_FILE
|
|
|
|
|
FSCloseFork(id->refNum);
|
|
|
|
|
# else
|
|
|
|
|
FSClose(id->refNum);
|
|
|
|
|
# endif
|
|
|
|
|
if( id->delOnClose ){
|
|
|
|
|
unlink(id->pathToDel);
|
|
|
|
|
sqliteFree(id->pathToDel);
|
|
|
|
|
}
|
|
|
|
|
OpenCounter(-1);
|
|
|
|
|
return SQLITE_OK;
|
|
|
|
|
#endif
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/*
|
|
|
|
@ -995,22 +802,6 @@ int sqliteOsRead(OsFile *id, void *pBuf, int amt){
|
|
|
|
|
return SQLITE_IOERR;
|
|
|
|
|
}
|
|
|
|
|
#endif
|
|
|
|
|
#if OS_MAC
|
|
|
|
|
int got;
|
|
|
|
|
SimulateIOError(SQLITE_IOERR);
|
|
|
|
|
TRACE2("READ %d\n", last_page);
|
|
|
|
|
# ifdef _LARGE_FILE
|
|
|
|
|
FSReadFork(id->refNum, fsAtMark, 0, (ByteCount)amt, pBuf, (ByteCount*)&got);
|
|
|
|
|
# else
|
|
|
|
|
got = amt;
|
|
|
|
|
FSRead(id->refNum, &got, pBuf);
|
|
|
|
|
# endif
|
|
|
|
|
if( got==amt ){
|
|
|
|
|
return SQLITE_OK;
|
|
|
|
|
}else{
|
|
|
|
|
return SQLITE_IOERR;
|
|
|
|
|
}
|
|
|
|
|
#endif
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/*
|
|
|
|
@ -1048,29 +839,6 @@ int sqliteOsWrite(OsFile *id, const void *pBuf, int amt){
|
|
|
|
|
}
|
|
|
|
|
return SQLITE_OK;
|
|
|
|
|
#endif
|
|
|
|
|
#if OS_MAC
|
|
|
|
|
OSErr oserr;
|
|
|
|
|
int wrote = 0;
|
|
|
|
|
SimulateIOError(SQLITE_IOERR);
|
|
|
|
|
TRACE2("WRITE %d\n", last_page);
|
|
|
|
|
while( amt>0 ){
|
|
|
|
|
# ifdef _LARGE_FILE
|
|
|
|
|
oserr = FSWriteFork(id->refNum, fsAtMark, 0,
|
|
|
|
|
(ByteCount)amt, pBuf, (ByteCount*)&wrote);
|
|
|
|
|
# else
|
|
|
|
|
wrote = amt;
|
|
|
|
|
oserr = FSWrite(id->refNum, &wrote, pBuf);
|
|
|
|
|
# endif
|
|
|
|
|
if( wrote == 0 || oserr != noErr)
|
|
|
|
|
break;
|
|
|
|
|
amt -= wrote;
|
|
|
|
|
pBuf = &((char*)pBuf)[wrote];
|
|
|
|
|
}
|
|
|
|
|
if( oserr != noErr || amt>wrote ){
|
|
|
|
|
return SQLITE_FULL;
|
|
|
|
|
}
|
|
|
|
|
return SQLITE_OK;
|
|
|
|
|
#endif
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/*
|
|
|
|
@ -1092,28 +860,6 @@ int sqliteOsSeek(OsFile *id, off_t offset){
|
|
|
|
|
}
|
|
|
|
|
return SQLITE_OK;
|
|
|
|
|
#endif
|
|
|
|
|
#if OS_MAC
|
|
|
|
|
{
|
|
|
|
|
off_t curSize;
|
|
|
|
|
if( sqliteOsFileSize(id, &curSize) != SQLITE_OK ){
|
|
|
|
|
return SQLITE_IOERR;
|
|
|
|
|
}
|
|
|
|
|
if( offset >= curSize ){
|
|
|
|
|
if( sqliteOsTruncate(id, offset+1) != SQLITE_OK ){
|
|
|
|
|
return SQLITE_IOERR;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
# ifdef _LARGE_FILE
|
|
|
|
|
if( FSSetForkPosition(id->refNum, fsFromStart, offset) != noErr ){
|
|
|
|
|
# else
|
|
|
|
|
if( SetFPos(id->refNum, fsFromStart, offset) != noErr ){
|
|
|
|
|
# endif
|
|
|
|
|
return SQLITE_IOERR;
|
|
|
|
|
}else{
|
|
|
|
|
return SQLITE_OK;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
#endif
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/*
|
|
|
|
@ -1150,20 +896,6 @@ int sqliteOsSync(OsFile *id){
|
|
|
|
|
return SQLITE_IOERR;
|
|
|
|
|
}
|
|
|
|
|
#endif
|
|
|
|
|
#if OS_MAC
|
|
|
|
|
# ifdef _LARGE_FILE
|
|
|
|
|
if( FSFlushFork(id->refNum) != noErr ){
|
|
|
|
|
# else
|
|
|
|
|
ParamBlockRec params;
|
|
|
|
|
memset(¶ms, 0, sizeof(ParamBlockRec));
|
|
|
|
|
params.ioParam.ioRefNum = id->refNum;
|
|
|
|
|
if( PBFlushFileSync(¶ms) != noErr ){
|
|
|
|
|
# endif
|
|
|
|
|
return SQLITE_IOERR;
|
|
|
|
|
}else{
|
|
|
|
|
return SQLITE_OK;
|
|
|
|
|
}
|
|
|
|
|
#endif
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/*
|
|
|
|
@ -1182,17 +914,6 @@ int sqliteOsTruncate(OsFile *id, off_t nByte){
|
|
|
|
|
}
|
|
|
|
|
return SQLITE_OK;
|
|
|
|
|
#endif
|
|
|
|
|
#if OS_MAC
|
|
|
|
|
# ifdef _LARGE_FILE
|
|
|
|
|
if( FSSetForkSize(id->refNum, fsFromStart, nByte) != noErr){
|
|
|
|
|
# else
|
|
|
|
|
if( SetEOF(id->refNum, nByte) != noErr ){
|
|
|
|
|
# endif
|
|
|
|
|
return SQLITE_IOERR;
|
|
|
|
|
}else{
|
|
|
|
|
return SQLITE_OK;
|
|
|
|
|
}
|
|
|
|
|
#endif
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/*
|
|
|
|
@ -1215,17 +936,6 @@ int sqliteOsFileSize(OsFile *id, off_t *pSize){
|
|
|
|
|
*pSize = (((off_t)upperBits)<<32) + lowerBits;
|
|
|
|
|
return SQLITE_OK;
|
|
|
|
|
#endif
|
|
|
|
|
#if OS_MAC
|
|
|
|
|
# ifdef _LARGE_FILE
|
|
|
|
|
if( FSGetForkSize(id->refNum, pSize) != noErr){
|
|
|
|
|
# else
|
|
|
|
|
if( GetEOF(id->refNum, pSize) != noErr ){
|
|
|
|
|
# endif
|
|
|
|
|
return SQLITE_IOERR;
|
|
|
|
|
}else{
|
|
|
|
|
return SQLITE_OK;
|
|
|
|
|
}
|
|
|
|
|
#endif
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
#if OS_WIN
|
|
|
|
@ -1298,11 +1008,7 @@ int isNT(void){
|
|
|
|
|
** the first byte in the range of bytes used for locking.
|
|
|
|
|
*/
|
|
|
|
|
#define N_LOCKBYTE 10239
|
|
|
|
|
#if OS_MAC
|
|
|
|
|
# define FIRST_LOCKBYTE (0x000fffff - N_LOCKBYTE)
|
|
|
|
|
#else
|
|
|
|
|
# define FIRST_LOCKBYTE (0xffffffff - N_LOCKBYTE)
|
|
|
|
|
#endif
|
|
|
|
|
#define FIRST_LOCKBYTE (0xffffffff - N_LOCKBYTE)
|
|
|
|
|
|
|
|
|
|
/*
|
|
|
|
|
** Change the status of the lock on the file "id" to be a readlock.
|
|
|
|
@ -1383,46 +1089,6 @@ int sqliteOsReadLock(OsFile *id){
|
|
|
|
|
}
|
|
|
|
|
return rc;
|
|
|
|
|
#endif
|
|
|
|
|
#if OS_MAC
|
|
|
|
|
int rc;
|
|
|
|
|
if( id->locked>0 || id->refNumRF == -1 ){
|
|
|
|
|
rc = SQLITE_OK;
|
|
|
|
|
}else{
|
|
|
|
|
int lk;
|
|
|
|
|
OSErr res;
|
|
|
|
|
int cnt = 5;
|
|
|
|
|
ParamBlockRec params;
|
|
|
|
|
sqliteRandomness(sizeof(lk), &lk);
|
|
|
|
|
lk = (lk & 0x7fffffff)%N_LOCKBYTE + 1;
|
|
|
|
|
memset(¶ms, 0, sizeof(params));
|
|
|
|
|
params.ioParam.ioRefNum = id->refNumRF;
|
|
|
|
|
params.ioParam.ioPosMode = fsFromStart;
|
|
|
|
|
params.ioParam.ioPosOffset = FIRST_LOCKBYTE;
|
|
|
|
|
params.ioParam.ioReqCount = 1;
|
|
|
|
|
while( cnt-->0 && (res = PBLockRangeSync(¶ms))!=noErr ){
|
|
|
|
|
UInt32 finalTicks;
|
|
|
|
|
Delay(1, &finalTicks); /* 1/60 sec */
|
|
|
|
|
}
|
|
|
|
|
if( res == noErr ){
|
|
|
|
|
params.ioParam.ioPosOffset = FIRST_LOCKBYTE+1;
|
|
|
|
|
params.ioParam.ioReqCount = N_LOCKBYTE;
|
|
|
|
|
PBUnlockRangeSync(¶ms);
|
|
|
|
|
params.ioParam.ioPosOffset = FIRST_LOCKBYTE+lk;
|
|
|
|
|
params.ioParam.ioReqCount = 1;
|
|
|
|
|
res = PBLockRangeSync(¶ms);
|
|
|
|
|
params.ioParam.ioPosOffset = FIRST_LOCKBYTE;
|
|
|
|
|
params.ioParam.ioReqCount = 1;
|
|
|
|
|
PBUnlockRangeSync(¶ms);
|
|
|
|
|
}
|
|
|
|
|
if( res == noErr ){
|
|
|
|
|
id->locked = lk;
|
|
|
|
|
rc = SQLITE_OK;
|
|
|
|
|
}else{
|
|
|
|
|
rc = SQLITE_BUSY;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
return rc;
|
|
|
|
|
#endif
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/*
|
|
|
|
@ -1492,47 +1158,6 @@ int sqliteOsWriteLock(OsFile *id){
|
|
|
|
|
}
|
|
|
|
|
return rc;
|
|
|
|
|
#endif
|
|
|
|
|
#if OS_MAC
|
|
|
|
|
int rc;
|
|
|
|
|
if( id->locked<0 || id->refNumRF == -1 ){
|
|
|
|
|
rc = SQLITE_OK;
|
|
|
|
|
}else{
|
|
|
|
|
OSErr res;
|
|
|
|
|
int cnt = 5;
|
|
|
|
|
ParamBlockRec params;
|
|
|
|
|
memset(¶ms, 0, sizeof(params));
|
|
|
|
|
params.ioParam.ioRefNum = id->refNumRF;
|
|
|
|
|
params.ioParam.ioPosMode = fsFromStart;
|
|
|
|
|
params.ioParam.ioPosOffset = FIRST_LOCKBYTE;
|
|
|
|
|
params.ioParam.ioReqCount = 1;
|
|
|
|
|
while( cnt-->0 && (res = PBLockRangeSync(¶ms))!=noErr ){
|
|
|
|
|
UInt32 finalTicks;
|
|
|
|
|
Delay(1, &finalTicks); /* 1/60 sec */
|
|
|
|
|
}
|
|
|
|
|
if( res == noErr ){
|
|
|
|
|
params.ioParam.ioPosOffset = FIRST_LOCKBYTE + id->locked;
|
|
|
|
|
params.ioParam.ioReqCount = 1;
|
|
|
|
|
if( id->locked==0
|
|
|
|
|
|| PBUnlockRangeSync(¶ms)==noErr ){
|
|
|
|
|
params.ioParam.ioPosOffset = FIRST_LOCKBYTE+1;
|
|
|
|
|
params.ioParam.ioReqCount = N_LOCKBYTE;
|
|
|
|
|
res = PBLockRangeSync(¶ms);
|
|
|
|
|
}else{
|
|
|
|
|
res = afpRangeNotLocked;
|
|
|
|
|
}
|
|
|
|
|
params.ioParam.ioPosOffset = FIRST_LOCKBYTE;
|
|
|
|
|
params.ioParam.ioReqCount = 1;
|
|
|
|
|
PBUnlockRangeSync(¶ms);
|
|
|
|
|
}
|
|
|
|
|
if( res == noErr ){
|
|
|
|
|
id->locked = -1;
|
|
|
|
|
rc = SQLITE_OK;
|
|
|
|
|
}else{
|
|
|
|
|
rc = SQLITE_BUSY;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
return rc;
|
|
|
|
|
#endif
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/*
|
|
|
|
@ -1601,29 +1226,6 @@ int sqliteOsUnlock(OsFile *id){
|
|
|
|
|
}
|
|
|
|
|
return rc;
|
|
|
|
|
#endif
|
|
|
|
|
#if OS_MAC
|
|
|
|
|
int rc;
|
|
|
|
|
ParamBlockRec params;
|
|
|
|
|
memset(¶ms, 0, sizeof(params));
|
|
|
|
|
params.ioParam.ioRefNum = id->refNumRF;
|
|
|
|
|
params.ioParam.ioPosMode = fsFromStart;
|
|
|
|
|
if( id->locked==0 || id->refNumRF == -1 ){
|
|
|
|
|
rc = SQLITE_OK;
|
|
|
|
|
}else if( id->locked<0 ){
|
|
|
|
|
params.ioParam.ioPosOffset = FIRST_LOCKBYTE+1;
|
|
|
|
|
params.ioParam.ioReqCount = N_LOCKBYTE;
|
|
|
|
|
PBUnlockRangeSync(¶ms);
|
|
|
|
|
rc = SQLITE_OK;
|
|
|
|
|
id->locked = 0;
|
|
|
|
|
}else{
|
|
|
|
|
params.ioParam.ioPosOffset = FIRST_LOCKBYTE+id->locked;
|
|
|
|
|
params.ioParam.ioReqCount = 1;
|
|
|
|
|
PBUnlockRangeSync(¶ms);
|
|
|
|
|
rc = SQLITE_OK;
|
|
|
|
|
id->locked = 0;
|
|
|
|
|
}
|
|
|
|
|
return rc;
|
|
|
|
|
#endif
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/*
|
|
|
|
@ -1655,14 +1257,6 @@ int sqliteOsRandomSeed(char *zBuf){
|
|
|
|
|
#endif
|
|
|
|
|
#if OS_WIN && !defined(SQLITE_TEST)
|
|
|
|
|
GetSystemTime((LPSYSTEMTIME)zBuf);
|
|
|
|
|
#endif
|
|
|
|
|
#if OS_MAC
|
|
|
|
|
{
|
|
|
|
|
int pid;
|
|
|
|
|
Microseconds((UnsignedWide*)zBuf);
|
|
|
|
|
pid = getpid();
|
|
|
|
|
memcpy(&zBuf[sizeof(UnsignedWide)], &pid, sizeof(pid));
|
|
|
|
|
}
|
|
|
|
|
#endif
|
|
|
|
|
return SQLITE_OK;
|
|
|
|
|
}
|
|
|
|
@ -1684,12 +1278,6 @@ int sqliteOsSleep(int ms){
|
|
|
|
|
Sleep(ms);
|
|
|
|
|
return ms;
|
|
|
|
|
#endif
|
|
|
|
|
#if OS_MAC
|
|
|
|
|
UInt32 finalTicks;
|
|
|
|
|
UInt32 ticks = (((UInt32)ms+16)*3)/50; /* 1/60 sec per tick */
|
|
|
|
|
Delay(ticks, &finalTicks);
|
|
|
|
|
return (int)((ticks*50)/3);
|
|
|
|
|
#endif
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/*
|
|
|
|
@ -1789,22 +1377,6 @@ char *sqliteOsFullPathname(const char *zRelative){
|
|
|
|
|
GetFullPathName(zRelative, nByte, zFull, &zNotUsed);
|
|
|
|
|
return zFull;
|
|
|
|
|
#endif
|
|
|
|
|
#if OS_MAC
|
|
|
|
|
char *zFull = 0;
|
|
|
|
|
if( zRelative[0]==':' ){
|
|
|
|
|
char zBuf[_MAX_PATH+1];
|
|
|
|
|
sqliteSetString(&zFull, getcwd(zBuf, sizeof(zBuf)), &(zRelative[1]),
|
|
|
|
|
(char*)0);
|
|
|
|
|
}else{
|
|
|
|
|
if( strchr(zRelative, ':') ){
|
|
|
|
|
sqliteSetString(&zFull, zRelative, (char*)0);
|
|
|
|
|
}else{
|
|
|
|
|
char zBuf[_MAX_PATH+1];
|
|
|
|
|
sqliteSetString(&zFull, getcwd(zBuf, sizeof(zBuf)), zRelative, (char*)0);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
return zFull;
|
|
|
|
|
#endif
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/*
|
|
|
|
|