Improve the os_test.c module. (CVS 1657)

FossilOrigin-Name: ecdb93d3c92e34f7d85aa2fd703880669397b216
This commit is contained in:
danielk1977
2004-06-22 12:18:32 +00:00
parent efad99959b
commit 8a6c550d94
8 changed files with 120 additions and 62 deletions
+1 -1
View File
@@ -359,7 +359,7 @@ testfixture$(EXE): $(TOP)/src/tclsqlite.c libsqlite3.a $(TESTSRC)
libsqlite3.a $(LIBTCL) $(THREADLIB)
testfixturex: $(TOP)/src/tclsqlite.c libsqlite3.a $(TESTSRC)
$(TCCX) $(TCL_FLAGS) -DOS_TEST=1 -DTCLSH=1 -DSQLITE_TEST=1 -o testfixture$(EXE) \
$(TCCX) $(TCL_FLAGS) -DOS_TEST=1 -DTCLSH=1 -DSQLITE_TEST=1 -o testfixturex \
$(TESTSRC) $(TOP)/src/tclsqlite.c \
libsqlite3.a $(LIBTCL) $(THREADLIB)
+12 -12
View File
@@ -1,5 +1,5 @@
C Patch\saround\scompilers\sthat\sdo\snot\ssupport\s"long\slong\sint".\s(CVS\s1656)
D 2004-06-22T12:13:55
C Improve\sthe\sos_test.c\smodule.\s(CVS\s1657)
D 2004-06-22T12:18:32
F Makefile.in 0a3d7aaefa50717bd550b0cf568a51072c4c103c
F Makefile.linux-gcc a9e5a0d309fa7c38e7c14d3ecf7690879d3a5457
F README f1de682fbbd94899d50aca13d387d1b3fd3be2dd
@@ -17,7 +17,7 @@ F doc/lemon.html f0f682f50210928c07e562621c3b7e8ab912a538
F doc/report1.txt a031aaf37b185e4fa540223cb516d3bccec7eeac
F install-sh 9d4de14ab9fb0facae2f48780b874848cbf2f895
F ltmain.sh f6b283068efa69f06eb8aa1fe4bddfdbdeb35826
F main.mk 0692293db19dc8206d88abe9c24e11fa22a2ab95
F main.mk e0dcbccbec3295c7b59d6d5578cf48304b99c887
F mkdll.sh 68d34a961a1fdfa15ef27fc4f4740be583112124
F publish.sh 5bc5e493fa1773a3c0d9712182de0f5abd494903
F spec.template a38492f1c1dd349fc24cb0565e08afc53045304b
@@ -28,7 +28,7 @@ F src/attach.c 05102e2e8ac43ce639d07b47a99c7772a62420e6
F src/auth.c 60db23b98bb94c8b0178180faaf49dc116674217
F src/btree.c 0cf8a52a57a7eb13d50719114ee1fa353e89d7d3
F src/btree.h 32f96abef464cf8765b23ca669acfe90d191fcc5
F src/build.c ee7548a4dfc446d4312c217d74badbd2898a7eef
F src/build.c baed8f54ea9fb785cb798dc6600b07697b8595d4
F src/date.c b3e8b2bef1e3f2ce24e5b057203036defb18c3f1
F src/delete.c e81545e546f6bc87d7508a93a09ca70695265af3
F src/encode.c a876af473d1d636faa3dca51c7571f2e007eea37
@@ -44,13 +44,13 @@ F src/os.h 2f5ea879b784bc82aac8022a3e8fe00b73c83d67
F src/os_common.h ba1b7306e16e2091718f2c48db0fe6c1d7a31bb8
F src/os_mac.c 3d31e26be1411acfb7961033098631b4f3486fdf
F src/os_mac.h 51d2445f47e182ed32d3bd6937f81070c6fd9bd4
F src/os_test.c 616d6845ef7015c31d283ece85e8a7700f7986c7
F src/os_test.h 6665b2ace17a76ecee68bc463343340d3cd5c1cc
F src/os_test.c 0c6490723681649c11852adf701f00e09a981d1e
F src/os_test.h c47bad966c6f6f9bb4448abfc03c18884bc0ca9f
F src/os_unix.c 39e73ed02fc992a6bfc52200ea26704633412cc0
F src/os_unix.h 00c1f82b526ab2fb7ee5ddd555ea4ed68363c93a
F src/os_win.c 84549f6cc815237533c5d0eb3697352b03478d96
F src/os_win.h babd4e912967c6b09088cfe38a45e8005a07ba44
F src/pager.c d9d3f577319ebac6670d3f44eca46060b78ee6b2
F src/pager.c 5fac95a8fef916a4c5915ccc3b8dc72312681880
F src/pager.h bc58d32a9dee464f7268fb68652c130a4216e438
F src/parse.y 097438674976355a10cf177bd97326c548820b86
F src/pragma.c 0750e1c360647dbe0a991f16133b0fe5e42e5039
@@ -62,7 +62,7 @@ F src/sqlite.h.in 1f400a561fca3b1df73677d2d97046425d47cae4
F src/sqliteInt.h dd796b6abc6d50505fe33c54f0143d7000681a41
F src/table.c af14284fa36c8d41f6829e3f2819dce07d3e2de2
F src/tclsqlite.c 8d093146332b2f0cbf2a8ebe8597d481619308a3
F src/test1.c ee426e026ad9223483e7a84bb68849fc6e9f542e
F src/test1.c 9a9d9069c1c390c8be81038f77aed976bb58844c
F src/test2.c dafd8bd314a554bf376c6d3a8c83fd69219f5a40
F src/test3.c 7247090d15a5a43823079b6fd8dad1ed3cccdedf
F src/test4.c a921a69821fd30209589228e64f94e9f715b6fe2
@@ -227,7 +227,7 @@ F www/tclsqlite.tcl 19191cf2a1010eaeff74c51d83fd5f5a4d899075
F www/vdbe.tcl 59288db1ac5c0616296b26dce071c36cb611dfe9
F www/version3.tcl af528563442e3039928f9018327a18157e53a44f
F www/whentouse.tcl a8335bce47cc2fddb07f19052cb0cb4d9129a8e4
P d16b863849d1aa887fe403e25153b1e9df6b837e
R 85dc3ae43867f14feba3557419001a96
U drh
Z bbfe7d28a769302b653c6e45868a429e
P d98b1502e2947d24ab9f4a5d2e5b9a95dde92faf
R 6110d7f21fe73b602543dea11b1b80ca
U danielk1977
Z 5ef671e5847eb9235ebe6c8ce5485e34
+1 -1
View File
@@ -1 +1 @@
d98b1502e2947d24ab9f4a5d2e5b9a95dde92faf
ecdb93d3c92e34f7d85aa2fd703880669397b216
+3 -3
View File
@@ -23,7 +23,7 @@
** ROLLBACK
** PRAGMA
**
** $Id: build.c,v 1.230 2004/06/21 18:14:46 drh Exp $
** $Id: build.c,v 1.231 2004/06/22 12:18:32 danielk1977 Exp $
*/
#include "sqliteInt.h"
#include <ctype.h>
@@ -965,16 +965,16 @@ CollSeq *sqlite3FindCollSeq(
** If the collation sequence
*/
static void callCollNeeded(sqlite *db, const char *zName, int nName){
char const *zExternal = 0;
assert( !db->xCollNeeded || !db->xCollNeeded16 );
if( nName<0 ) nName = strlen(zName);
if( db->xCollNeeded ){
zExternal = sqliteStrNDup(zName, nName);
char *zExternal = sqliteStrNDup(zName, nName);
if( !zExternal ) return;
db->xCollNeeded(db->pCollNeededArg, db, (int)db->enc, zExternal);
sqliteFree(zExternal);
}
if( db->xCollNeeded16 ){
char const *zExternal;
sqlite3_value *pTmp = sqlite3GetTransientValue(db);
sqlite3ValueSetStr(pTmp, -1, zName, SQLITE_UTF8, SQLITE_STATIC);
zExternal = sqlite3ValueText(pTmp, SQLITE_UTF16NATIVE);
+74 -40
View File
@@ -95,27 +95,52 @@ static int crashseed(){
return i;
}
static OsTestFile *pAllFiles = 0;
/*
** Initialise the os_test.c specific fields of pFile.
*/
static void initFile(OsFile *pFile){
static void initFile(OsFile *id){
OsTestFile *pFile = (OsTestFile *)sqliteMalloc(sizeof(OsTestFile));
pFile->nMaxWrite = 0;
pFile->nBlk = 0;
pFile->apBlk = 0;
*id = pFile;
pFile->pNext = pAllFiles;
pAllFiles = pFile;
}
/*
** Undo the work done by initFile. Delete the OsTestFile structure
** and unlink the structure from the pAllFiles list.
*/
static void closeFile(OsFile *id){
OsTestFile *pFile = *id;
if( pFile==pAllFiles ){
pAllFiles = pFile->pNext;
}else{
OsTestFile *p;
for(p=pAllFiles; p->pNext!=pFile; p=p->pNext ){
assert( p );
}
p->pNext = pFile->pNext;
}
sqliteFree(pFile);
*id = 0;
}
/*
** Return the current seek offset from the start of the file. This
** is unix-only code.
*/
static off_t osTell(OsFile *pFile){
static off_t osTell(OsTestFile *pFile){
return lseek(pFile->fd.h, 0, SEEK_CUR);
}
/*
** Load block 'blk' into the cache of pFile.
*/
static int cacheBlock(OsFile *pFile, int blk){
static int cacheBlock(OsTestFile *pFile, int blk){
if( blk>=pFile->nBlk ){
int n = ((pFile->nBlk * 2) + 100 + blk);
pFile->apBlk = (u8 **)sqliteRealloc(pFile->apBlk, n * sizeof(u8*));
@@ -153,7 +178,7 @@ static int cacheBlock(OsFile *pFile, int blk){
** Write the cache of pFile to disk. If crash is non-zero, randomly
** skip blocks when writing. The cache is deleted before returning.
*/
static int writeCache2(OsFile *pFile, int crash){
static int writeCache2(OsTestFile *pFile, int crash){
int i;
int nMax = pFile->nMaxWrite;
off_t offset;
@@ -197,13 +222,17 @@ static int writeCache2(OsFile *pFile, int crash){
/*
** Write the cache to disk.
*/
static int writeCache(OsFile *pFile){
if( crashseed() ){
/* FIX ME: writeCache2() should be called on all open files
** here. */
writeCache2(pFile, 1);
static int writeCache(OsTestFile *pFile){
int cs = crashseed();
if( cs==1 ){
/* FIX ME: writeCache2() should be called on all open files here. */
OsTestFile *pFile;
for(pFile=pAllFiles; pFile; pFile=pFile->pNext){
writeCache2(pFile, 1);
}
exit(-1);
}else{
if( cs>0 ) sqlite3SetCrashseed(cs-1);
return writeCache2(pFile, 0);
}
}
@@ -212,9 +241,12 @@ static int writeCache(OsFile *pFile){
** Close the file.
*/
int sqlite3OsClose(OsFile *id){
if( !id->fd.isOpen ) return SQLITE_OK;
writeCache(id);
sqlite3RealClose(&id->fd);
if( !(*id) ) return SQLITE_OK;
if( (*id)->fd.isOpen ){
writeCache(*id);
sqlite3RealClose(&(*id)->fd);
}
closeFile(id);
return SQLITE_OK;
}
@@ -225,8 +257,9 @@ int sqlite3OsRead(OsFile *id, void *pBuf, int amt){
int i;
u8 *zCsr;
int rc = SQLITE_OK;
OsTestFile *pFile = *id;
offset = osTell(id);
offset = osTell(pFile);
end = offset+amt;
blk = (offset/BLOCKSIZE);
@@ -244,13 +277,13 @@ int sqlite3OsRead(OsFile *id, void *pBuf, int amt){
len = len - (BLOCK_OFFSET(i+1)-end);
}
if( i<id->nBlk && id->apBlk[i]){
u8 *pBlk = id->apBlk[i];
if( i<pFile->nBlk && pFile->apBlk[i]){
u8 *pBlk = pFile->apBlk[i];
memcpy(zCsr, &pBlk[off], len);
}else{
rc = sqlite3RealSeek(&id->fd, BLOCK_OFFSET(i) + off);
rc = sqlite3RealSeek(&pFile->fd, BLOCK_OFFSET(i) + off);
if( rc!=SQLITE_OK ) return rc;
rc = sqlite3RealRead(&id->fd, zCsr, len);
rc = sqlite3RealRead(&pFile->fd, zCsr, len);
if( rc!=SQLITE_OK ) return rc;
}
@@ -258,7 +291,7 @@ int sqlite3OsRead(OsFile *id, void *pBuf, int amt){
}
assert( zCsr==&((u8 *)pBuf)[amt] );
rc = sqlite3RealSeek(&id->fd, end);
rc = sqlite3RealSeek(&pFile->fd, end);
return rc;
}
@@ -269,8 +302,9 @@ int sqlite3OsWrite(OsFile *id, const void *pBuf, int amt){
int i;
const u8 *zCsr;
int rc = SQLITE_OK;
OsTestFile *pFile = *id;
offset = osTell(id);
offset = osTell(pFile);
end = offset+amt;
blk = (offset/BLOCKSIZE);
@@ -281,11 +315,11 @@ int sqlite3OsWrite(OsFile *id, const void *pBuf, int amt){
int len = 0;
/* Make sure the block is in the cache */
rc = cacheBlock(id, i);
rc = cacheBlock(pFile, i);
if( rc!=SQLITE_OK ) return rc;
/* Write into the cache */
pBlk = id->apBlk[i];
pBlk = pFile->apBlk[i];
assert( pBlk );
if( BLOCK_OFFSET(i) < offset ){
@@ -298,12 +332,12 @@ int sqlite3OsWrite(OsFile *id, const void *pBuf, int amt){
memcpy(&pBlk[off], zCsr, len);
zCsr += len;
}
if( id->nMaxWrite<end ){
id->nMaxWrite = end;
if( pFile->nMaxWrite<end ){
pFile->nMaxWrite = end;
}
assert( zCsr==&((u8 *)pBuf)[amt] );
rc = sqlite3RealSeek(&id->fd, end);
rc = sqlite3RealSeek(&pFile->fd, end);
return rc;
}
@@ -312,9 +346,9 @@ int sqlite3OsWrite(OsFile *id, const void *pBuf, int amt){
** real sync() function.
*/
int sqlite3OsSync(OsFile *id){
int rc = writeCache(id);
int rc = writeCache(*id);
if( rc!=SQLITE_OK ) return rc;
rc = sqlite3RealSync(&id->fd);
rc = sqlite3RealSync(&(*id)->fd);
return rc;
}
@@ -324,8 +358,8 @@ int sqlite3OsSync(OsFile *id){
** is written to disk.
*/
int sqlite3OsTruncate(OsFile *id, off_t nByte){
id->nMaxWrite = nByte;
return sqlite3RealTruncate(&id->fd, nByte);
(*id)->nMaxWrite = nByte;
return sqlite3RealTruncate(&(*id)->fd, nByte);
}
/*
@@ -333,9 +367,9 @@ int sqlite3OsTruncate(OsFile *id, off_t nByte){
** the file, then return this size instead of the on-disk size.
*/
int sqlite3OsFileSize(OsFile *id, off_t *pSize){
int rc = sqlite3RealFileSize(&id->fd, pSize);
if( rc==SQLITE_OK && pSize && *pSize<id->nMaxWrite ){
*pSize = id->nMaxWrite;
int rc = sqlite3RealFileSize(&(*id)->fd, pSize);
if( rc==SQLITE_OK && pSize && *pSize<(*id)->nMaxWrite ){
*pSize = (*id)->nMaxWrite;
}
return rc;
}
@@ -347,15 +381,15 @@ int sqlite3OsFileSize(OsFile *id, off_t *pSize){
*/
int sqlite3OsOpenReadWrite(const char *zFilename, OsFile *id, int *pReadonly){
initFile(id);
return sqlite3RealOpenReadWrite(zFilename, &id->fd, pReadonly);
return sqlite3RealOpenReadWrite(zFilename, &(*id)->fd, pReadonly);
}
int sqlite3OsOpenExclusive(const char *zFilename, OsFile *id, int delFlag){
initFile(id);
return sqlite3RealOpenExclusive(zFilename, &id->fd, delFlag);
return sqlite3RealOpenExclusive(zFilename, &(*id)->fd, delFlag);
}
int sqlite3OsOpenReadOnly(const char *zFilename, OsFile *id){
initFile(id);
return sqlite3RealOpenReadOnly(zFilename, &id->fd);
return sqlite3RealOpenReadOnly(zFilename, &(*id)->fd);
}
/*
@@ -363,22 +397,22 @@ int sqlite3OsOpenReadOnly(const char *zFilename, OsFile *id){
** backend.
*/
int sqlite3OsSeek(OsFile *id, off_t offset){
return sqlite3RealSeek(&id->fd, offset);
return sqlite3RealSeek(&(*id)->fd, offset);
}
int sqlite3OsCheckReservedLock(OsFile *id){
return sqlite3RealCheckReservedLock(&id->fd);
return sqlite3RealCheckReservedLock(&(*id)->fd);
}
int sqlite3OsLock(OsFile *id, int locktype){
return sqlite3RealLock(&id->fd, locktype);
return sqlite3RealLock(&(*id)->fd, locktype);
}
int sqlite3OsUnlock(OsFile *id, int locktype){
return sqlite3RealUnlock(&id->fd, locktype);
return sqlite3RealUnlock(&(*id)->fd, locktype);
}
int sqlite3OsFileModTime(OsFile *id, double *prNow){
return sqlite3RealFileModTime(&id->fd, prNow);
return sqlite3RealFileModTime(&(*id)->fd, prNow);
}
int sqlite3OsOpenDirectory(const char *zDirname, OsFile *id){
return sqlite3RealOpenDirectory(zDirname, &id->fd);
return sqlite3RealOpenDirectory(zDirname, &(*id)->fd);
}
#endif /* OS_TEST */
+4 -2
View File
@@ -23,12 +23,14 @@
/* Include sqliteInt.h now to get the type u8. */
#include "sqliteInt.h"
typedef struct OsFile OsFile;
struct OsFile {
typedef struct OsTestFile* OsFile;
typedef struct OsTestFile OsTestFile;
struct OsTestFile {
u8 **apBlk; /* Array of blocks that have been written to. */
int nBlk; /* Size of apBlock. */
int nMaxWrite; /* Largest offset written to. */
OsRealFile fd;
OsTestFile *pNext;
};
void sqlite3SetCrashseed(int seed);
+2 -2
View File
@@ -18,7 +18,7 @@
** file simultaneously, or one process from reading the database while
** another is writing.
**
** @(#) $Id: pager.c,v 1.134 2004/06/22 11:29:02 danielk1977 Exp $
** @(#) $Id: pager.c,v 1.135 2004/06/22 12:18:32 danielk1977 Exp $
*/
#include "os.h" /* Must be first to enable large file support */
#include "sqliteInt.h"
@@ -2786,7 +2786,7 @@ sync_exit:
*/
int sqlite3pager_lockstate(Pager *pPager){
#ifdef OS_TEST
return pPager->fd.fd.locktype;
return pPager->fd->fd.locktype;
#else
return pPager->fd.locktype;
#endif
+23 -1
View File
@@ -13,7 +13,7 @@
** is not included in the SQLite library. It is used for automated
** testing of the SQLite library.
**
** $Id: test1.c,v 1.80 2004/06/19 08:18:23 danielk1977 Exp $
** $Id: test1.c,v 1.81 2004/06/22 12:18:32 danielk1977 Exp $
*/
#include "sqliteInt.h"
#include "tcl.h"
@@ -984,6 +984,27 @@ bad_args:
return TCL_ERROR;
}
static int sqlite3_crashseed(
void * clientData,
Tcl_Interp *interp,
int objc,
Tcl_Obj *CONST objv[]
){
#ifdef OS_TEST
int seed;
if( objc!=2 ) goto bad_args;
if( Tcl_GetIntFromObj(interp, objv[2], &seed) ) return TCL_ERROR;
sqlite3SetCrashseed(seed);
#endif
return TCL_OK;
bad_args:
Tcl_AppendResult(interp, "wrong # args: should be \"",
Tcl_GetStringFromObj(objv[0], 0), "<seed>", 0);
return TCL_ERROR;
}
/*
** Usage: breakpoint
**
@@ -1995,6 +2016,7 @@ int Sqlitetest1_Init(Tcl_Interp *interp){
{ "sqlite3OsLock", test_sqlite3OsLock, 0 },
{ "sqlite3OsUnlock", test_sqlite3OsUnlock, 0 },
{ "add_test_collate", test_collate, 0 },
{ "sqlite3_crashseed", sqlite3_crashseed, 0 },
};
int i;