mirror of
https://github.com/sqlite/sqlite.git
synced 2025-07-30 19:03:16 +03:00
Add the sqlite3session_object_config() API. Current used to enable/disable collecting data for sqlite3session_changeset_size().
FossilOrigin-Name: 4d5fd2151e024d11289b6c4fbce2996d8d07b2b5a1c953ef895c237e79d3aa55
This commit is contained in:
@ -104,5 +104,28 @@ do_changeset_size_test 2.7 {
|
|||||||
INSERT INTO t3 VALUES(1,2,3,4);
|
INSERT INTO t3 VALUES(1,2,3,4);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#-------------------------------------------------------------------------
|
||||||
|
reset_db
|
||||||
|
|
||||||
|
do_execsql_test 3.0 {
|
||||||
|
CREATE TABLE t1(a INTEGER PRIMARY KEY, b);
|
||||||
|
}
|
||||||
|
|
||||||
|
do_test 3.1 {
|
||||||
|
sqlite3session S db main
|
||||||
|
S object_config_size -1
|
||||||
|
} 1
|
||||||
|
|
||||||
|
do_test 3.2.1 { S object_config_size 0 } 0
|
||||||
|
do_test 3.2.2 { S object_config_size -1 } 0
|
||||||
|
do_test 3.2.3 { S object_config_size 1 } 1
|
||||||
|
do_test 3.2.4 { S object_config_size -1 } 1
|
||||||
|
|
||||||
|
do_test 3.3 { S attach t1 } {}
|
||||||
|
do_test 3.4 { S object_config_size 1 } {SQLITE_MISUSE}
|
||||||
|
do_test 3.4 { S object_config_size -1 } {1}
|
||||||
|
|
||||||
|
S delete
|
||||||
|
|
||||||
finish_test
|
finish_test
|
||||||
|
|
||||||
|
@ -42,6 +42,7 @@ struct SessionHook {
|
|||||||
struct sqlite3_session {
|
struct sqlite3_session {
|
||||||
sqlite3 *db; /* Database handle session is attached to */
|
sqlite3 *db; /* Database handle session is attached to */
|
||||||
char *zDb; /* Name of database session is attached to */
|
char *zDb; /* Name of database session is attached to */
|
||||||
|
int bEnableSize; /* True if changeset_size() enabled */
|
||||||
int bEnable; /* True if currently recording */
|
int bEnable; /* True if currently recording */
|
||||||
int bIndirect; /* True if all changes are indirect */
|
int bIndirect; /* True if all changes are indirect */
|
||||||
int bAutoAttach; /* True to auto-attach tables */
|
int bAutoAttach; /* True to auto-attach tables */
|
||||||
@ -1124,9 +1125,11 @@ static int sessionInitTable(sqlite3_session *pSession, SessionTable *pTab){
|
|||||||
pTab->bStat1 = 1;
|
pTab->bStat1 = 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
pSession->nMaxChangesetSize += (
|
if( pSession->bEnableSize ){
|
||||||
1 + sessionVarintLen(pTab->nCol) + pTab->nCol + strlen(pTab->zName) + 1
|
pSession->nMaxChangesetSize += (
|
||||||
);
|
1 + sessionVarintLen(pTab->nCol) + pTab->nCol + strlen(pTab->zName)+1
|
||||||
|
);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return (pSession->rc || pTab->abPK==0);
|
return (pSession->rc || pTab->abPK==0);
|
||||||
@ -1411,7 +1414,9 @@ static void sessionPreupdateOneChange(
|
|||||||
}
|
}
|
||||||
|
|
||||||
assert( rc==SQLITE_OK );
|
assert( rc==SQLITE_OK );
|
||||||
rc = sessionUpdateMaxSize(op, pSession, pTab, pC);
|
if( pSession->bEnableSize ){
|
||||||
|
rc = sessionUpdateMaxSize(op, pSession, pTab, pC);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@ -2627,7 +2632,9 @@ int sqlite3session_changeset(
|
|||||||
void **ppChangeset /* OUT: Buffer containing changeset */
|
void **ppChangeset /* OUT: Buffer containing changeset */
|
||||||
){
|
){
|
||||||
int rc = sessionGenerateChangeset(pSession, 0, 0, 0, pnChangeset,ppChangeset);
|
int rc = sessionGenerateChangeset(pSession, 0, 0, 0, pnChangeset,ppChangeset);
|
||||||
assert( rc || pnChangeset==0 || *pnChangeset<=pSession->nMaxChangesetSize );
|
assert( rc || pnChangeset==0
|
||||||
|
|| pSession->bEnableSize==0 || *pnChangeset<=pSession->nMaxChangesetSize
|
||||||
|
);
|
||||||
return rc;
|
return rc;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -2720,6 +2727,32 @@ sqlite3_int64 sqlite3session_memory_used(sqlite3_session *pSession){
|
|||||||
return pSession->nMalloc;
|
return pSession->nMalloc;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
** Configure the session object passed as the first argument.
|
||||||
|
*/
|
||||||
|
int sqlite3session_object_config(sqlite3_session *pSession, int op, void *pArg){
|
||||||
|
int rc = SQLITE_OK;
|
||||||
|
switch( op ){
|
||||||
|
case SQLITE_SESSION_OBJCONFIG_SIZE: {
|
||||||
|
int iArg = *(int*)pArg;
|
||||||
|
if( iArg>=0 ){
|
||||||
|
if( pSession->pTable ){
|
||||||
|
rc = SQLITE_MISUSE;
|
||||||
|
}else{
|
||||||
|
pSession->bEnableSize = (iArg!=0);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
*(int*)pArg = pSession->bEnableSize;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
default:
|
||||||
|
rc = SQLITE_MISUSE;
|
||||||
|
}
|
||||||
|
|
||||||
|
return rc;
|
||||||
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
** Return the maximum size of sqlite3session_changeset() output.
|
** Return the maximum size of sqlite3session_changeset() output.
|
||||||
*/
|
*/
|
||||||
|
@ -79,6 +79,33 @@ int sqlite3session_create(
|
|||||||
*/
|
*/
|
||||||
void sqlite3session_delete(sqlite3_session *pSession);
|
void sqlite3session_delete(sqlite3_session *pSession);
|
||||||
|
|
||||||
|
/*
|
||||||
|
** CAPIREF: Conigure a Session Object
|
||||||
|
** METHOD: sqlite3_session
|
||||||
|
*/
|
||||||
|
int sqlite3session_object_config(sqlite3_session*, int op, void *pArg);
|
||||||
|
|
||||||
|
/*
|
||||||
|
** CAPI3REF: Arguments for sqlite3session_object_config()
|
||||||
|
**
|
||||||
|
** The following values may passed as the the 4th parameter to
|
||||||
|
** [sqlite3session_object_config].
|
||||||
|
**
|
||||||
|
** <dt>SQLITE_SESSION_OBJCONFIG_SIZE <dd>
|
||||||
|
** This option is used to set, clear or query the flag that enables
|
||||||
|
** the [sqlite3session_changeset_size()] API. Because it imposes some
|
||||||
|
** computational overhead, this API is disabled by default. Argument
|
||||||
|
** pArg must point to a value of type (int). If the value is initially
|
||||||
|
** 0, then the sqlite3session_changeset_size() API is disabled. If it
|
||||||
|
** is greater than 0, then the same API is enabled. Or, if the initial
|
||||||
|
** value is less than zero, no change is made. In all cases the (int)
|
||||||
|
** variable is set to 1 if the sqlite3session_changeset_size() API is
|
||||||
|
** enabled following the current call, or 0 otherwise.
|
||||||
|
**
|
||||||
|
** It is an error (SQLITE_MISUSE) to attempt to modify this setting after
|
||||||
|
** the first table has been attached to the session object.
|
||||||
|
*/
|
||||||
|
#define SQLITE_SESSION_OBJCONFIG_SIZE 1
|
||||||
|
|
||||||
/*
|
/*
|
||||||
** CAPI3REF: Enable Or Disable A Session Object
|
** CAPI3REF: Enable Or Disable A Session Object
|
||||||
|
@ -247,6 +247,7 @@ static int SQLITE_TCLAPI test_session_cmd(
|
|||||||
{ "diff", 2, "FROMDB TBL", }, /* 8 */
|
{ "diff", 2, "FROMDB TBL", }, /* 8 */
|
||||||
{ "memory_used", 0, "", }, /* 9 */
|
{ "memory_used", 0, "", }, /* 9 */
|
||||||
{ "changeset_size", 0, "", }, /* 10 */
|
{ "changeset_size", 0, "", }, /* 10 */
|
||||||
|
{ "object_config_size", 1, "INTEGER", }, /* 11 */
|
||||||
{ 0 }
|
{ 0 }
|
||||||
};
|
};
|
||||||
int iSub;
|
int iSub;
|
||||||
@ -364,6 +365,23 @@ static int SQLITE_TCLAPI test_session_cmd(
|
|||||||
Tcl_SetObjResult(interp, Tcl_NewWideIntObj(nSize));
|
Tcl_SetObjResult(interp, Tcl_NewWideIntObj(nSize));
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
case 11: {
|
||||||
|
int rc;
|
||||||
|
int iArg;
|
||||||
|
if( Tcl_GetIntFromObj(interp, objv[2], &iArg) ){
|
||||||
|
return TCL_ERROR;
|
||||||
|
}
|
||||||
|
rc = sqlite3session_object_config(
|
||||||
|
pSession, SQLITE_SESSION_OBJCONFIG_SIZE, &iArg
|
||||||
|
);
|
||||||
|
if( rc!=SQLITE_OK ){
|
||||||
|
extern const char *sqlite3ErrName(int);
|
||||||
|
Tcl_SetObjResult(interp, Tcl_NewStringObj(sqlite3ErrName(rc), -1));
|
||||||
|
}else{
|
||||||
|
Tcl_SetObjResult(interp, Tcl_NewIntObj(iArg));
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
return TCL_OK;
|
return TCL_OK;
|
||||||
@ -389,6 +407,7 @@ static int SQLITE_TCLAPI test_sqlite3session(
|
|||||||
Tcl_CmdInfo info;
|
Tcl_CmdInfo info;
|
||||||
int rc; /* sqlite3session_create() return code */
|
int rc; /* sqlite3session_create() return code */
|
||||||
TestSession *p; /* New wrapper object */
|
TestSession *p; /* New wrapper object */
|
||||||
|
int iArg = -1;
|
||||||
|
|
||||||
if( objc!=4 ){
|
if( objc!=4 ){
|
||||||
Tcl_WrongNumArgs(interp, 1, objv, "CMD DB-HANDLE DB-NAME");
|
Tcl_WrongNumArgs(interp, 1, objv, "CMD DB-HANDLE DB-NAME");
|
||||||
@ -409,6 +428,13 @@ static int SQLITE_TCLAPI test_sqlite3session(
|
|||||||
return test_session_error(interp, rc, 0);
|
return test_session_error(interp, rc, 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* Query the SQLITE_SESSION_OBJCONFIG_SIZE option to ensure that it
|
||||||
|
** is clear by default. Then set it. */
|
||||||
|
sqlite3session_object_config(p->pSession,SQLITE_SESSION_OBJCONFIG_SIZE,&iArg);
|
||||||
|
assert( iArg==0 );
|
||||||
|
iArg = 1;
|
||||||
|
sqlite3session_object_config(p->pSession,SQLITE_SESSION_OBJCONFIG_SIZE,&iArg);
|
||||||
|
|
||||||
Tcl_CreateObjCommand(
|
Tcl_CreateObjCommand(
|
||||||
interp, Tcl_GetString(objv[1]), test_session_cmd, (ClientData)p,
|
interp, Tcl_GetString(objv[1]), test_session_cmd, (ClientData)p,
|
||||||
test_session_del
|
test_session_del
|
||||||
|
21
manifest
21
manifest
@ -1,5 +1,5 @@
|
|||||||
C Add\sthe\sexperimental\ssqlite3session_changeset_size()\sAPI.
|
C Add\sthe\ssqlite3session_object_config()\sAPI.\sCurrent\sused\sto\senable/disable\scollecting\sdata\sfor\ssqlite3session_changeset_size().
|
||||||
D 2021-04-21T20:52:17.903
|
D 2021-04-22T17:40:28.167
|
||||||
F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1
|
F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1
|
||||||
F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea
|
F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea
|
||||||
F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724
|
F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724
|
||||||
@ -453,12 +453,12 @@ F ext/session/sessioninvert.test 04075517a9497a80d39c495ba6b44f3982c7371129b89e2
|
|||||||
F ext/session/sessionmem.test f2a735db84a3e9e19f571033b725b0b2daf847f3f28b1da55a0c1a4e74f1de09
|
F ext/session/sessionmem.test f2a735db84a3e9e19f571033b725b0b2daf847f3f28b1da55a0c1a4e74f1de09
|
||||||
F ext/session/sessionnoop.test a9366a36a95ef85f8a3687856ebef46983df399541174cb1ede2ee53b8011bc7
|
F ext/session/sessionnoop.test a9366a36a95ef85f8a3687856ebef46983df399541174cb1ede2ee53b8011bc7
|
||||||
F ext/session/sessionrebase.test ccfa716b23bd1d3b03217ee58cfd90c78d4b99f53e6a9a2f05e82363b9142810
|
F ext/session/sessionrebase.test ccfa716b23bd1d3b03217ee58cfd90c78d4b99f53e6a9a2f05e82363b9142810
|
||||||
F ext/session/sessionsize.test 32ce42e9fed589276ef072b68c6f325e54ef7ef67c37ccd3ec8c822dd997f3c7
|
F ext/session/sessionsize.test 6f644aff31c7f1e4871e9ff3542766e18da68fc7e587b83a347ea9820a002dd8
|
||||||
F ext/session/sessionstat1.test 218d351cf9fcd6648f125a26b607b140310160184723c2666091b54450a68fb5
|
F ext/session/sessionstat1.test 218d351cf9fcd6648f125a26b607b140310160184723c2666091b54450a68fb5
|
||||||
F ext/session/sessionwor.test 6fd9a2256442cebde5b2284936ae9e0d54bde692d0f5fd009ecef8511f4cf3fc
|
F ext/session/sessionwor.test 6fd9a2256442cebde5b2284936ae9e0d54bde692d0f5fd009ecef8511f4cf3fc
|
||||||
F ext/session/sqlite3session.c b205b57eecfb93aee23653ba4b07be6930afaa3760317c22ad9872a0bc451d3f
|
F ext/session/sqlite3session.c 703634ca25b4b903ae8ec25045802a8c8deca36a65d2b993c4bc8888f6d6c7ee
|
||||||
F ext/session/sqlite3session.h 7d05ae78d03f778bf13f8160595b263d9436260137a8f50c78dc956f4d5121e2
|
F ext/session/sqlite3session.h 874b084ea97252a57ff1b79bb5da172ab4156f6302a8d3e3f5c88ce2748480d8
|
||||||
F ext/session/test_session.c b3d03f73b73d3794007392cf5a9bc27d1a2d3e970d500ab52026c726fa528142
|
F ext/session/test_session.c f433f68a8a8c64b0f5bc74dc725078f12483301ad4ae8375205eef790274a787
|
||||||
F ext/userauth/sqlite3userauth.h 7f3ea8c4686db8e40b0a0e7a8e0b00fac13aa7a3
|
F ext/userauth/sqlite3userauth.h 7f3ea8c4686db8e40b0a0e7a8e0b00fac13aa7a3
|
||||||
F ext/userauth/user-auth.txt e6641021a9210364665fe625d067617d03f27b04
|
F ext/userauth/user-auth.txt e6641021a9210364665fe625d067617d03f27b04
|
||||||
F ext/userauth/userauth.c 7f00cded7dcaa5d47f54539b290a43d2e59f4b1eb5f447545fa865f002fc80cb
|
F ext/userauth/userauth.c 7f00cded7dcaa5d47f54539b290a43d2e59f4b1eb5f447545fa865f002fc80cb
|
||||||
@ -1914,10 +1914,7 @@ F vsixtest/vsixtest.tcl 6a9a6ab600c25a91a7acc6293828957a386a8a93
|
|||||||
F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc
|
F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc
|
||||||
F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e
|
F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e
|
||||||
F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0
|
F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0
|
||||||
P 6fe50dcc239d2d1fc2a38aa705f4c75cbe26b3e48d098537306d96d6a4005659
|
P b5564a6fd54875db1de884fdc0e5eeabcd6aa5595ad03a8a60843503e830a2d8
|
||||||
R e870b873cf49a44c733c175dd8b4c0b8
|
R fa53b8d1cc3def8dc3ef8249968de9f0
|
||||||
T *branch * session-changeset-size
|
|
||||||
T *sym-session-changeset-size *
|
|
||||||
T -sym-trunk *
|
|
||||||
U dan
|
U dan
|
||||||
Z c5add95d4af95f7f7d5a36a6c86b17cc
|
Z 5eb2943cb766ada953003dbe5c9f5486
|
||||||
|
@ -1 +1 @@
|
|||||||
b5564a6fd54875db1de884fdc0e5eeabcd6aa5595ad03a8a60843503e830a2d8
|
4d5fd2151e024d11289b6c4fbce2996d8d07b2b5a1c953ef895c237e79d3aa55
|
Reference in New Issue
Block a user