diff options
author | Ilia Alshanetsky <iliaa@php.net> | 2005-08-28 16:57:01 +0000 |
---|---|---|
committer | Ilia Alshanetsky <iliaa@php.net> | 2005-08-28 16:57:01 +0000 |
commit | bb3801714270de37f05383214aadfb09006113ea (patch) | |
tree | 2549f7b9f0563bb3e88cc95f80ce1692d3e89f69 /ext/pdo_sqlite/sqlite/src/util.c | |
parent | 4509fb9d5d9bc423e34f6a944191b6309e9d0b74 (diff) | |
download | php-git-bb3801714270de37f05383214aadfb09006113ea.tar.gz |
Upgrade sqlite lib to 3.2.5
Diffstat (limited to 'ext/pdo_sqlite/sqlite/src/util.c')
-rw-r--r-- | ext/pdo_sqlite/sqlite/src/util.c | 60 |
1 files changed, 44 insertions, 16 deletions
diff --git a/ext/pdo_sqlite/sqlite/src/util.c b/ext/pdo_sqlite/sqlite/src/util.c index 90edb98a09..a35a43fce3 100644 --- a/ext/pdo_sqlite/sqlite/src/util.c +++ b/ext/pdo_sqlite/sqlite/src/util.c @@ -58,6 +58,8 @@ int sqlite3_malloc_failed = 0; */ int sqlite3_nMalloc; /* Number of sqliteMalloc() calls */ int sqlite3_nFree; /* Number of sqliteFree() calls */ +int sqlite3_memUsed; /* Total memory obtained from malloc */ +int sqlite3_memMax; /* Mem usage high-water mark */ int sqlite3_iMallocFail; /* Fail sqliteMalloc() after this many calls */ int sqlite3_iMallocReset = -1; /* When iMallocFail reaches 0, set to this */ #if SQLITE_MEMDEBUG>1 @@ -72,13 +74,10 @@ static int memcnt = 0; #define N_GUARD 2 /* -** Allocate new memory and set it to zero. Return NULL if -** no memory is available. +** Check for a simulated memory allocation failure. Return true if +** the failure should be simulated. Return false to proceed as normal. */ -void *sqlite3Malloc_(int n, int bZero, char *zFile, int line){ - void *p; - int *pi; - int i, k; +static int simulatedMallocFailure(int n, char *zFile, int line){ if( sqlite3_iMallocFail>=0 ){ sqlite3_iMallocFail--; if( sqlite3_iMallocFail==0 ){ @@ -88,10 +87,28 @@ void *sqlite3Malloc_(int n, int bZero, char *zFile, int line){ n, zFile,line); #endif sqlite3_iMallocFail = sqlite3_iMallocReset; - return 0; + return 1; } } - if( n==0 ) return 0; + return 0; +} + +/* +** Allocate new memory and set it to zero. Return NULL if +** no memory is available. +*/ +void *sqlite3Malloc_(int n, int bZero, char *zFile, int line){ + void *p; + int *pi; + int i, k; + if( n==0 ){ + return 0; + } + if( simulatedMallocFailure(n, zFile, line) ){ + return 0; + } + sqlite3_memUsed += n; + if( sqlite3_memMax<sqlite3_memUsed ) sqlite3_memMax = sqlite3_memUsed; k = (n+sizeof(int)-1)/sizeof(int); pi = malloc( (N_GUARD*2+1+k)*sizeof(int)); if( pi==0 ){ @@ -157,6 +174,7 @@ void sqlite3Free_(void *p, char *zFile, int line){ } } n = pi[N_GUARD]; + sqlite3_memUsed -= n; k = (n+sizeof(int)-1)/sizeof(int); for(i=0; i<N_GUARD; i++){ if( pi[k+N_GUARD+1+i]!=0xdead3344 ){ @@ -188,6 +206,9 @@ void *sqlite3Realloc_(void *oldP, int n, char *zFile, int line){ sqlite3Free_(oldP,zFile,line); return 0; } + if( simulatedMallocFailure(n, zFile, line) ){ + return 0; + } oldPi = oldP; oldPi -= N_GUARD+1; if( oldPi[0]!=0xdead1122 ){ @@ -195,6 +216,7 @@ void *sqlite3Realloc_(void *oldP, int n, char *zFile, int line){ return 0; } oldN = oldPi[N_GUARD]; + sqlite3_memUsed -= oldN; oldK = (oldN+sizeof(int)-1)/sizeof(int); for(i=0; i<N_GUARD; i++){ if( oldPi[oldK+N_GUARD+1+i]!=0xdead3344 ){ @@ -211,6 +233,8 @@ void *sqlite3Realloc_(void *oldP, int n, char *zFile, int line){ } for(i=0; i<N_GUARD; i++) pi[i] = 0xdead1122; pi[N_GUARD] = n; + sqlite3_memUsed += n; + if( sqlite3_memMax<sqlite3_memUsed ) sqlite3_memMax = sqlite3_memUsed; for(i=0; i<N_GUARD; i++) pi[k+N_GUARD+1+i] = 0xdead3344; p = &pi[N_GUARD+1]; memcpy(p, oldP, n>oldN ? oldN : n); @@ -268,6 +292,7 @@ void sqlite3FreeX(void *p){ */ void *sqlite3Malloc(int n){ void *p; + if( n==0 ) return 0; if( (p = malloc(n))==0 ){ if( n>0 ) sqlite3_malloc_failed++; }else{ @@ -282,6 +307,7 @@ void *sqlite3Malloc(int n){ */ void *sqlite3MallocRaw(int n){ void *p; + if( n==0 ) return 0; if( (p = malloc(n))==0 ){ if( n>0 ) sqlite3_malloc_failed++; } @@ -372,8 +398,8 @@ void sqlite3SetString(char **pz, ...){ zResult += strlen(zResult); } va_end(ap); -#ifdef SQLITE_DEBUG -#if SQLITE_DEBUG>1 +#ifdef SQLITE_MEMDEBUG +#if SQLITE_MEMDEBUG>1 fprintf(stderr,"string at 0x%x is %s\n", (int)*pz, *pz); #endif #endif @@ -460,7 +486,8 @@ void sqlite3Dequote(char *z){ switch( quote ){ case '\'': break; case '"': break; - case '[': quote = ']'; break; + case '`': break; /* For MySQL compatibility */ + case '[': quote = ']'; break; /* For MS SqlServer compatibility */ default: return; } for(i=1, j=0; z[i]; i++){ @@ -565,8 +592,9 @@ int sqlite3IsNumber(const char *z, int *realnum, u8 enc){ ** of "." depending on how locale is set. But that would cause problems ** for SQL. So this routine always uses "." regardless of locale. */ -double sqlite3AtoF(const char *z, const char **pzEnd){ +int sqlite3AtoF(const char *z, double *pResult){ int sign = 1; + const char *zBegin = z; LONGDOUBLE_TYPE v1 = 0.0; if( *z=='-' ){ sign = -1; @@ -613,8 +641,8 @@ double sqlite3AtoF(const char *z, const char **pzEnd){ v1 *= scale; } } - if( pzEnd ) *pzEnd = z; - return sign<0 ? -v1 : v1; + *pResult = sign<0 ? -v1 : v1; + return z - zBegin; } /* @@ -720,7 +748,7 @@ int sqlite3SafetyOn(sqlite3 *db){ if( db->magic==SQLITE_MAGIC_OPEN ){ db->magic = SQLITE_MAGIC_BUSY; return 0; - }else if( db->magic==SQLITE_MAGIC_BUSY || db->magic==SQLITE_MAGIC_ERROR ){ + }else if( db->magic==SQLITE_MAGIC_BUSY ){ db->magic = SQLITE_MAGIC_ERROR; db->flags |= SQLITE_Interrupt; } @@ -736,7 +764,7 @@ int sqlite3SafetyOff(sqlite3 *db){ if( db->magic==SQLITE_MAGIC_BUSY ){ db->magic = SQLITE_MAGIC_OPEN; return 0; - }else if( db->magic==SQLITE_MAGIC_OPEN || db->magic==SQLITE_MAGIC_ERROR ){ + }else if( db->magic==SQLITE_MAGIC_OPEN ){ db->magic = SQLITE_MAGIC_ERROR; db->flags |= SQLITE_Interrupt; } |