mirror of
https://github.com/sqlite/sqlite.git
synced 2025-08-08 14:02:16 +03:00
Call quota callback destructors from within sqlite3_quota_shutdown().
FossilOrigin-Name: fb80c6f3de73ed832faaeb8c4d83e1354f132b39
This commit is contained in:
26
manifest
26
manifest
@@ -1,8 +1,5 @@
|
|||||||
-----BEGIN PGP SIGNED MESSAGE-----
|
C Call\squota\scallback\sdestructors\sfrom\swithin\ssqlite3_quota_shutdown().
|
||||||
Hash: SHA1
|
D 2010-09-01T16:19:57
|
||||||
|
|
||||||
C Boundary\svalue\sfix\sto\sthe\sdescriptive\scomment\sat\sthe\stop\sof\stest_quota.c.
|
|
||||||
D 2010-09-01T15:26:18
|
|
||||||
F Makefile.arm-wince-mingw32ce-gcc d6df77f1f48d690bd73162294bbba7f59507c72f
|
F Makefile.arm-wince-mingw32ce-gcc d6df77f1f48d690bd73162294bbba7f59507c72f
|
||||||
F Makefile.in c599a15d268b1db2aeadea19df2adc3bf2eb6bee
|
F Makefile.in c599a15d268b1db2aeadea19df2adc3bf2eb6bee
|
||||||
F Makefile.linux-gcc 91d710bdc4998cb015f39edf3cb314ec4f4d7e23
|
F Makefile.linux-gcc 91d710bdc4998cb015f39edf3cb314ec4f4d7e23
|
||||||
@@ -211,7 +208,7 @@ F src/test_mutex.c ce06b59aca168cd8c520b77159a24352a7469bd3
|
|||||||
F src/test_onefile.c 40cf9e212a377a6511469384a64b01e6e34b2eec
|
F src/test_onefile.c 40cf9e212a377a6511469384a64b01e6e34b2eec
|
||||||
F src/test_osinst.c f408c6a181f2fb04c56273afd5c3e1e82f60392c
|
F src/test_osinst.c f408c6a181f2fb04c56273afd5c3e1e82f60392c
|
||||||
F src/test_pcache.c 7bf828972ac0d2403f5cfa4cd14da41f8ebe73d8
|
F src/test_pcache.c 7bf828972ac0d2403f5cfa4cd14da41f8ebe73d8
|
||||||
F src/test_quota.c 4b0c51fc8492e3879103cbed781e5c7822fa33f1
|
F src/test_quota.c 6afa78d864509f490ffffd997761ebb2890478d0
|
||||||
F src/test_rtree.c e957a603a98871dcf005c1e96ae791cfe74eb7f6
|
F src/test_rtree.c e957a603a98871dcf005c1e96ae791cfe74eb7f6
|
||||||
F src/test_schema.c 8c06ef9ddb240c7a0fcd31bc221a6a2aade58bf0
|
F src/test_schema.c 8c06ef9ddb240c7a0fcd31bc221a6a2aade58bf0
|
||||||
F src/test_server.c bbba05c144b5fc4b52ff650a4328027b3fa5fcc6
|
F src/test_server.c bbba05c144b5fc4b52ff650a4328027b3fa5fcc6
|
||||||
@@ -565,7 +562,7 @@ F test/printf.test 05970cde31b1a9f54bd75af60597be75a5c54fea
|
|||||||
F test/progress.test 5b075c3c790c7b2a61419bc199db87aaf48b8301
|
F test/progress.test 5b075c3c790c7b2a61419bc199db87aaf48b8301
|
||||||
F test/ptrchng.test ef1aa72d6cf35a2bbd0869a649b744e9d84977fc
|
F test/ptrchng.test ef1aa72d6cf35a2bbd0869a649b744e9d84977fc
|
||||||
F test/quick.test 1681febc928d686362d50057c642f77a02c62e57
|
F test/quick.test 1681febc928d686362d50057c642f77a02c62e57
|
||||||
F test/quota.test d406716c5e91df17ef7821facae6a9aefaa4dd91
|
F test/quota.test f4028117363a4a42d5b45fc8f6f5ba34556062d4
|
||||||
F test/quote.test 215897dbe8de1a6f701265836d6601cc6ed103e6
|
F test/quote.test 215897dbe8de1a6f701265836d6601cc6ed103e6
|
||||||
F test/randexpr1.tcl 40dec52119ed3a2b8b2a773bce24b63a3a746459
|
F test/randexpr1.tcl 40dec52119ed3a2b8b2a773bce24b63a3a746459
|
||||||
F test/randexpr1.test 1084050991e9ba22c1c10edd8d84673b501cc25a
|
F test/randexpr1.test 1084050991e9ba22c1c10edd8d84673b501cc25a
|
||||||
@@ -856,14 +853,7 @@ F tool/speedtest2.tcl ee2149167303ba8e95af97873c575c3e0fab58ff
|
|||||||
F tool/speedtest8.c 2902c46588c40b55661e471d7a86e4dd71a18224
|
F tool/speedtest8.c 2902c46588c40b55661e471d7a86e4dd71a18224
|
||||||
F tool/speedtest8inst1.c 293327bc76823f473684d589a8160bde1f52c14e
|
F tool/speedtest8inst1.c 293327bc76823f473684d589a8160bde1f52c14e
|
||||||
F tool/vdbe-compress.tcl d70ea6d8a19e3571d7ab8c9b75cba86d1173ff0f
|
F tool/vdbe-compress.tcl d70ea6d8a19e3571d7ab8c9b75cba86d1173ff0f
|
||||||
P 2e1a02026a0635fe05ba55a6d4d36dd7fd0ae8e9
|
P 7f6072f0827e3aafd17f5f2bac9e3a3f8482e5f6
|
||||||
R 9727013208f74b5846192ddd802d89a5
|
R 683c19de50a702003d36bb4bcbf13d6b
|
||||||
U drh
|
U dan
|
||||||
Z ca12cd7daf2cb402fea27724b9ab87c5
|
Z a5272a839c843ec4c6d420e66112a9e4
|
||||||
-----BEGIN PGP SIGNATURE-----
|
|
||||||
Version: GnuPG v1.4.6 (GNU/Linux)
|
|
||||||
|
|
||||||
iD8DBQFMfnCdoxKgR168RlERAp/3AJ9sMV19uGCPmQnx/xpMir6Lynzx9wCdGQfk
|
|
||||||
0rZF++wLzBd8e8l03xX/LSg=
|
|
||||||
=CiYA
|
|
||||||
-----END PGP SIGNATURE-----
|
|
||||||
|
@@ -1 +1 @@
|
|||||||
7f6072f0827e3aafd17f5f2bac9e3a3f8482e5f6
|
fb80c6f3de73ed832faaeb8c4d83e1354f132b39
|
@@ -156,8 +156,8 @@ static void quotaLeave(void){ sqlite3_mutex_leave(gQuota.pMutex); }
|
|||||||
*/
|
*/
|
||||||
static void quotaGroupDeref(quotaGroup *pGroup){
|
static void quotaGroupDeref(quotaGroup *pGroup){
|
||||||
if( pGroup->pFiles==0 && pGroup->iLimit==0 ){
|
if( pGroup->pFiles==0 && pGroup->iLimit==0 ){
|
||||||
|
*pGroup->ppPrev = pGroup->pNext;
|
||||||
if( pGroup->pNext ) pGroup->pNext->ppPrev = pGroup->ppPrev;
|
if( pGroup->pNext ) pGroup->pNext->ppPrev = pGroup->ppPrev;
|
||||||
if( pGroup->ppPrev ) *pGroup->ppPrev = pGroup->pNext;
|
|
||||||
if( pGroup->xDestroy ) pGroup->xDestroy(pGroup->pArg);
|
if( pGroup->xDestroy ) pGroup->xDestroy(pGroup->pArg);
|
||||||
sqlite3_free(pGroup);
|
sqlite3_free(pGroup);
|
||||||
}
|
}
|
||||||
@@ -615,7 +615,8 @@ int sqlite3_quota_shutdown(void){
|
|||||||
while( gQuota.pGroup ){
|
while( gQuota.pGroup ){
|
||||||
pGroup = gQuota.pGroup;
|
pGroup = gQuota.pGroup;
|
||||||
gQuota.pGroup = pGroup->pNext;
|
gQuota.pGroup = pGroup->pNext;
|
||||||
sqlite3_free(pGroup);
|
pGroup->iLimit = 0;
|
||||||
|
quotaGroupDeref(pGroup);
|
||||||
}
|
}
|
||||||
gQuota.isInitialized = 0;
|
gQuota.isInitialized = 0;
|
||||||
sqlite3_mutex_free(gQuota.pMutex);
|
sqlite3_mutex_free(gQuota.pMutex);
|
||||||
@@ -759,7 +760,7 @@ static void tclCallbackDestructor(void *pObj){
|
|||||||
TclQuotaCallback *p = (TclQuotaCallback*)pObj;
|
TclQuotaCallback *p = (TclQuotaCallback*)pObj;
|
||||||
if( p ){
|
if( p ){
|
||||||
Tcl_DecrRefCount(p->pScript);
|
Tcl_DecrRefCount(p->pScript);
|
||||||
ckfree((char *)p);
|
sqlite3_free((char *)p);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -830,6 +831,7 @@ static int test_quota_set(
|
|||||||
int rc; /* Value returned by quota_set() */
|
int rc; /* Value returned by quota_set() */
|
||||||
TclQuotaCallback *p; /* Callback object */
|
TclQuotaCallback *p; /* Callback object */
|
||||||
int nScript; /* Length of callback script */
|
int nScript; /* Length of callback script */
|
||||||
|
void (*xDestroy)(void*); /* Optional destructor for pArg */
|
||||||
|
|
||||||
/* Process arguments */
|
/* Process arguments */
|
||||||
if( objc!=4 ){
|
if( objc!=4 ){
|
||||||
@@ -843,17 +845,23 @@ static int test_quota_set(
|
|||||||
|
|
||||||
if( nScript>0 ){
|
if( nScript>0 ){
|
||||||
/* Allocate a TclQuotaCallback object */
|
/* Allocate a TclQuotaCallback object */
|
||||||
p = (TclQuotaCallback *)ckalloc(sizeof(TclQuotaCallback));
|
p = (TclQuotaCallback *)sqlite3_malloc(sizeof(TclQuotaCallback));
|
||||||
|
if( !p ){
|
||||||
|
Tcl_SetResult(interp, (char *)"SQLITE_NOMEM", TCL_STATIC);
|
||||||
|
return TCL_OK;
|
||||||
|
}
|
||||||
memset(p, 0, sizeof(TclQuotaCallback));
|
memset(p, 0, sizeof(TclQuotaCallback));
|
||||||
p->interp = interp;
|
p->interp = interp;
|
||||||
Tcl_IncrRefCount(pScript);
|
Tcl_IncrRefCount(pScript);
|
||||||
p->pScript = pScript;
|
p->pScript = pScript;
|
||||||
|
xDestroy = tclCallbackDestructor;
|
||||||
}else{
|
}else{
|
||||||
p = 0;
|
p = 0;
|
||||||
|
xDestroy = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Invoke sqlite3_quota_set() */
|
/* Invoke sqlite3_quota_set() */
|
||||||
rc = sqlite3_quota_set(zPattern, iLimit, tclQuotaCallback,
|
rc = sqlite3_quota_set(zPattern, iLimit, tclQuotaCallback, (void*)p,xDestroy);
|
||||||
(void*)p, tclCallbackDestructor);
|
|
||||||
|
|
||||||
Tcl_SetResult(interp, (char *)sqlite3TestErrorName(rc), TCL_STATIC);
|
Tcl_SetResult(interp, (char *)sqlite3TestErrorName(rc), TCL_STATIC);
|
||||||
return TCL_OK;
|
return TCL_OK;
|
||||||
|
@@ -121,7 +121,6 @@ do_test quota-3.1.1 {
|
|||||||
sqlite3_quota_initialize "" 1
|
sqlite3_quota_initialize "" 1
|
||||||
sqlite3_quota_set *test.db 4096 quota_check
|
sqlite3_quota_set *test.db 4096 quota_check
|
||||||
} {SQLITE_OK}
|
} {SQLITE_OK}
|
||||||
|
|
||||||
do_test quota-3.1.2 {
|
do_test quota-3.1.2 {
|
||||||
sqlite3 db test.db
|
sqlite3 db test.db
|
||||||
execsql {
|
execsql {
|
||||||
@@ -139,7 +138,13 @@ do_test quota-3.1.3 {
|
|||||||
execsql { CREATE TABLE t2(a, b) } db2
|
execsql { CREATE TABLE t2(a, b) } db2
|
||||||
set ::quota
|
set ::quota
|
||||||
} {}
|
} {}
|
||||||
puts "quotas: [sqlite3_quota_dump]"
|
do_test quota-3.1.4 {
|
||||||
|
catchsql { CREATE TABLE t3(a, b) }
|
||||||
|
} {1 {database or disk is full}}
|
||||||
|
do_test quota-3.1.5 {
|
||||||
|
set ::quota_request_ok 1
|
||||||
|
execsql { CREATE TABLE t3(a, b) }
|
||||||
|
} {}
|
||||||
|
|
||||||
do_test quota-3.X {
|
do_test quota-3.X {
|
||||||
catch { db close }
|
catch { db close }
|
||||||
@@ -160,55 +165,108 @@ proc quota_list {} {
|
|||||||
return [lsort $allq]
|
return [lsort $allq]
|
||||||
}
|
}
|
||||||
|
|
||||||
do_test quota-4.1 {
|
do_test quota-4.1.1 {
|
||||||
sqlite3_quota_set *test.db 0 {}
|
sqlite3_quota_set *test.db 0 {}
|
||||||
quota_list
|
quota_list
|
||||||
} {}
|
} {}
|
||||||
do_test quota-4.2 {
|
do_test quota-4.1.2 {
|
||||||
sqlite3_quota_set *test.db 4096 {}
|
sqlite3_quota_set *test.db 4096 {}
|
||||||
quota_list
|
quota_list
|
||||||
} {*test.db}
|
} {*test.db}
|
||||||
do_test quota-4.3 {
|
do_test quota-4.1.3 {
|
||||||
sqlite3_quota_set *test2.db 0 {}
|
sqlite3_quota_set *test2.db 0 {}
|
||||||
quota_list
|
quota_list
|
||||||
} {*test.db}
|
} {*test.db}
|
||||||
do_test quota-4.4 {
|
do_test quota-4.1.4 {
|
||||||
sqlite3_quota_set *test2.db 100000 {}
|
sqlite3_quota_set *test2.db 100000 {}
|
||||||
quota_list
|
quota_list
|
||||||
} {*test.db *test2.db}
|
} {*test.db *test2.db}
|
||||||
do_test quota-4.5 {
|
do_test quota-4.1.5 {
|
||||||
sqlite3_quota_set *test.db 0 {}
|
sqlite3_quota_set *test.db 0 {}
|
||||||
quota_list
|
quota_list
|
||||||
} {*test2.db}
|
} {*test2.db}
|
||||||
do_test quota-4.6 {
|
do_test quota-4.1.6 {
|
||||||
file delete -force test2.db test2.db-journal test2.db-wal
|
file delete -force test2.db test2.db-journal test2.db-wal
|
||||||
sqlite3 db test2.db
|
sqlite3 db test2.db
|
||||||
db eval {CREATE TABLE t2(x); INSERT INTO t2 VALUES('tab-t2');}
|
db eval {CREATE TABLE t2(x); INSERT INTO t2 VALUES('tab-t2');}
|
||||||
quota_list
|
quota_list
|
||||||
} {*test2.db}
|
} {*test2.db}
|
||||||
do_test quota-4.7 {
|
do_test quota-4.1.7 {
|
||||||
catchsql {INSERT INTO t2 VALUES(zeroblob(200000))}
|
catchsql {INSERT INTO t2 VALUES(zeroblob(200000))}
|
||||||
} {1 {database or disk is full}}
|
} {1 {database or disk is full}}
|
||||||
do_test quota-4.8 {
|
do_test quota-4.1.8 {
|
||||||
sqlite3 db2 test2.db
|
sqlite3 db2 test2.db
|
||||||
db2 eval {SELECT * FROM t2}
|
db2 eval {SELECT * FROM t2}
|
||||||
} {tab-t2}
|
} {tab-t2}
|
||||||
do_test quota-4.9 {
|
do_test quota-4.1.9 {
|
||||||
sqlite3_quota_set *test2.db 0 {}
|
sqlite3_quota_set *test2.db 0 {}
|
||||||
catchsql {INSERT INTO t2 VALUES(zeroblob(200000))}
|
catchsql {INSERT INTO t2 VALUES(zeroblob(200000))}
|
||||||
} {0 {}}
|
} {0 {}}
|
||||||
do_test quota-4.10 {
|
do_test quota-4.1.10 {
|
||||||
quota_list
|
quota_list
|
||||||
} {*test2.db}
|
} {*test2.db}
|
||||||
do_test quota-4.11 {
|
do_test quota-4.1.11 {
|
||||||
db2 close
|
db2 close
|
||||||
quota_list
|
quota_list
|
||||||
} {*test2.db}
|
} {*test2.db}
|
||||||
do_test quota-4.12 {
|
do_test quota-4.1.12 {
|
||||||
db close
|
db close
|
||||||
quota_list
|
quota_list
|
||||||
} {}
|
} {}
|
||||||
|
|
||||||
|
do_test quota-4.2.1 {
|
||||||
|
sqlite3_quota_set A 1000 {}
|
||||||
|
sqlite3_quota_set B 1000 {}
|
||||||
|
sqlite3_quota_set C 1000 {}
|
||||||
|
sqlite3_quota_set D 1000 {}
|
||||||
|
quota_list
|
||||||
|
} {A B C D}
|
||||||
|
do_test quota-4.2.2 {
|
||||||
|
sqlite3_quota_set C 0 {}
|
||||||
|
sqlite3_quota_set B 0 {}
|
||||||
|
quota_list
|
||||||
|
} {A D}
|
||||||
|
do_test quota-4.2.3 {
|
||||||
|
sqlite3_quota_set A 0 {}
|
||||||
|
sqlite3_quota_set D 0 {}
|
||||||
|
quota_list
|
||||||
|
} {}
|
||||||
|
do_test quota-4.2.4 {
|
||||||
|
sqlite3_quota_set A 1000 {}
|
||||||
|
sqlite3_quota_set B 1000 {}
|
||||||
|
sqlite3_quota_set C 1000 {}
|
||||||
|
sqlite3_quota_set A 0 {}
|
||||||
|
sqlite3_quota_set B 0 {}
|
||||||
|
sqlite3_quota_set C 0 {}
|
||||||
|
quota_list
|
||||||
|
} {}
|
||||||
|
do_test quota-4.2.5 {
|
||||||
|
sqlite3_quota_set A 1000 {}
|
||||||
|
sqlite3_quota_set B 1000 {}
|
||||||
|
sqlite3_quota_set C 1000 {}
|
||||||
|
sqlite3_quota_set C 0 {}
|
||||||
|
sqlite3_quota_set B 0 {}
|
||||||
|
sqlite3_quota_set A 0 {}
|
||||||
|
quota_list
|
||||||
|
} {}
|
||||||
|
|
||||||
sqlite3_quota_shutdown
|
do_test quota-4.3.1 {
|
||||||
|
sqlite3_quota_set A 1000 quota_callback
|
||||||
|
sqlite3 db A
|
||||||
|
sqlite3_quota_set A 0 quota_callback
|
||||||
|
db close
|
||||||
|
quota_list
|
||||||
|
} {}
|
||||||
|
|
||||||
|
do_test quota-4.4.1 {
|
||||||
|
sqlite3_quota_set A 1000 quota_callback
|
||||||
|
sqlite3_quota_shutdown
|
||||||
|
} {SQLITE_OK}
|
||||||
|
do_test quota-4.4.2 {
|
||||||
|
quota_list
|
||||||
|
} {}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
catch { sqlite3_quota_shutdown }
|
||||||
finish_test
|
finish_test
|
||||||
|
Reference in New Issue
Block a user