return TCL_OK;
}
+#include "sqlite3changebatch.h"
+
+typedef struct TestChangebatch TestChangebatch;
+struct TestChangebatch {
+ sqlite3_changebatch *pChangebatch;
+};
+
+/*
+** Tclcmd: $changebatch add BLOB
+** $changebatch zero
+** $changebatch delete
+*/
+static int SQLITE_TCLAPI test_changebatch_cmd(
+ void *clientData,
+ Tcl_Interp *interp,
+ int objc,
+ Tcl_Obj *CONST objv[]
+){
+ TestChangebatch *p = (TestChangebatch*)clientData;
+ sqlite3_changebatch *pChangebatch = p->pChangebatch;
+ struct SessionSubcmd {
+ const char *zSub;
+ int nArg;
+ const char *zMsg;
+ int iSub;
+ } aSub[] = {
+ { "add", 1, "CHANGESET", }, /* 0 */
+ { "zero", 0, "", }, /* 1 */
+ { "delete", 0, "", }, /* 2 */
+ { 0 }
+ };
+ int iSub;
+ int rc;
+
+ if( objc<2 ){
+ Tcl_WrongNumArgs(interp, 1, objv, "SUBCOMMAND ...");
+ return TCL_ERROR;
+ }
+ rc = Tcl_GetIndexFromObjStruct(interp,
+ objv[1], aSub, sizeof(aSub[0]), "sub-command", 0, &iSub
+ );
+ if( rc!=TCL_OK ) return rc;
+ if( objc!=2+aSub[iSub].nArg ){
+ Tcl_WrongNumArgs(interp, 2, objv, aSub[iSub].zMsg);
+ return TCL_ERROR;
+ }
+
+ switch( iSub ){
+ case 0: { /* add */
+ int nArg;
+ unsigned char *pArg = Tcl_GetByteArrayFromObj(objv[2], &nArg);
+ rc = sqlite3changebatch_add(pChangebatch, pArg, nArg);
+ if( rc!=SQLITE_OK && rc!=SQLITE_CONSTRAINT ){
+ return test_session_error(interp, rc, 0);
+ }else{
+ extern const char *sqlite3ErrName(int);
+ Tcl_SetObjResult(interp, Tcl_NewStringObj(sqlite3ErrName(rc), -1));
+ }
+ break;
+ }
+
+ case 1: { /* zero */
+ sqlite3changebatch_zero(pChangebatch);
+ break;
+ }
+
+ case 2: /* delete */
+ Tcl_DeleteCommand(interp, Tcl_GetString(objv[0]));
+ break;
+ }
+
+ return TCL_OK;
+}
+
+static void SQLITE_TCLAPI test_changebatch_del(void *clientData){
+ TestChangebatch *p = (TestChangebatch*)clientData;
+ sqlite3changebatch_delete(p->pChangebatch);
+ ckfree((char*)p);
+}
+
+/*
+** Tclcmd: sqlite3changebatch CMD DB-HANDLE
+*/
+static int SQLITE_TCLAPI test_sqlite3changebatch(
+ void * clientData,
+ Tcl_Interp *interp,
+ int objc,
+ Tcl_Obj *CONST objv[]
+){
+ sqlite3 *db;
+ Tcl_CmdInfo info;
+ int rc; /* sqlite3session_create() return code */
+ TestChangebatch *p; /* New wrapper object */
+
+ if( objc!=3 ){
+ Tcl_WrongNumArgs(interp, 1, objv, "CMD DB-HANDLE");
+ return TCL_ERROR;
+ }
+
+ if( 0==Tcl_GetCommandInfo(interp, Tcl_GetString(objv[2]), &info) ){
+ Tcl_AppendResult(interp, "no such handle: ", Tcl_GetString(objv[2]), 0);
+ return TCL_ERROR;
+ }
+ db = *(sqlite3 **)info.objClientData;
+
+ p = (TestChangebatch*)ckalloc(sizeof(TestChangebatch));
+ memset(p, 0, sizeof(TestChangebatch));
+ rc = sqlite3changebatch_new(db, &p->pChangebatch);
+ if( rc!=SQLITE_OK ){
+ ckfree((char*)p);
+ return test_session_error(interp, rc, 0);
+ }
+
+ Tcl_CreateObjCommand(
+ interp, Tcl_GetString(objv[1]), test_changebatch_cmd, (ClientData)p,
+ test_changebatch_del
+ );
+ Tcl_SetObjResult(interp, objv[1]);
+ return TCL_OK;
+}
+
int TestSession_Init(Tcl_Interp *interp){
- Tcl_CreateObjCommand(interp, "sqlite3session", test_sqlite3session, 0, 0);
- Tcl_CreateObjCommand(
- interp, "sqlite3session_foreach", test_sqlite3session_foreach, 0, 0
- );
- Tcl_CreateObjCommand(
- interp, "sqlite3changeset_invert", test_sqlite3changeset_invert, 0, 0
- );
- Tcl_CreateObjCommand(
- interp, "sqlite3changeset_concat", test_sqlite3changeset_concat, 0, 0
- );
- Tcl_CreateObjCommand(
- interp, "sqlite3changeset_apply", test_sqlite3changeset_apply, 0, 0
- );
- Tcl_CreateObjCommand(
- interp, "sqlite3changeset_apply_replace_all",
- test_sqlite3changeset_apply_replace_all, 0, 0
- );
+ struct Cmd {
+ const char *zCmd;
+ Tcl_ObjCmdProc *xProc;
+ } aCmd[] = {
+ { "sqlite3session", test_sqlite3session },
+ { "sqlite3session_foreach", test_sqlite3session_foreach },
+ { "sqlite3changeset_invert", test_sqlite3changeset_invert },
+ { "sqlite3changeset_concat", test_sqlite3changeset_concat },
+ { "sqlite3changeset_apply", test_sqlite3changeset_apply },
+ { "sqlite3changeset_apply_replace_all",
+ test_sqlite3changeset_apply_replace_all },
+ { "sql_exec_changeset", test_sql_exec_changeset },
+ };
+ int i;
+
+ for(i=0; i<sizeof(aCmd)/sizeof(struct Cmd); i++){
+ struct Cmd *p = &aCmd[i];
+ Tcl_CreateObjCommand(interp, p->zCmd, p->xProc, 0, 0);
+ }
+
+
+ Tcl_CreateObjCommand(
+ interp, "sqlite3changebatch", test_sqlite3changebatch, 0, 0
+ );
return TCL_OK;
}
- C Add\sthe\ssqlite3changebatch_db()\sAPI.
- D 2016-08-24T19:14:59.159
- F Makefile.in cfd8fb987cd7a6af046daa87daa146d5aad0e088
-C Performance\simprovement\sand\ssize\sreduction\sin\sthe\sExpr\snode\sallocator\nfunction\ssqlite3PExpr().
-D 2016-12-06T22:47:23.006
++C Merge\slatest\strunk\schanges\sinto\sthis\sbranch.
++D 2016-12-07T07:46:50.572
+ F Makefile.in 7639c6a09da11a9c7c6f2630fc981ee588d1072d
F Makefile.linux-gcc 7bc79876b875010e8c8f9502eb935ca92aa3c434
- F Makefile.msc d66d0395c38571aab3804f8db0fa20707ae4609a
+ F Makefile.msc b8ca53350ae545e3562403d5da2a69cec79308da
F README.md 8ecc12493ff9f820cdea6520a9016001cb2e59b7
- F VERSION 25e2e333adeff5965520bc8db999c658898c972d
+ F VERSION 661b3e6a778cfbfd7bdce8bbb1545b22f4b6f09e
F aclocal.m4 a5c22d164aff7ed549d53a90fa56d56955281f50
F art/sqlite370.eps aa97a671332b432a54e1d74ff5e8775be34200c2
F art/sqlite370.ico af56c1d00fee7cd4753e8631ed60703ed0fc6e90
F ext/rtree/sqlite3rtree.h 9c5777af3d2921c7b4ae4954e8e5697502289d28
F ext/rtree/tkt3363.test 142ab96eded44a3615ec79fba98c7bde7d0f96de
F ext/rtree/viewrtree.tcl eea6224b3553599ae665b239bd827e182b466024
+F ext/session/changebatch1.test 9ceaa8f7b2a505933e250fbe6cbc550e4ce1e59d
+F ext/session/changebatchfault.test be49c793219bf387ad692a60856b921f0854ad6d
F ext/session/changeset.c 4ccbaa4531944c24584bf6a61ba3a39c62b6267a
- F ext/session/session1.test 98f384736e2bc21ccf5ed81bdadcff4ad863393b
+ F ext/session/session1.test e5125b216d1e8c91e0984b361b0b68529e7c5dfb
F ext/session/session2.test 284de45abae4cc1082bc52012ee81521d5ac58e0
F ext/session/session3.test a7a9ce59b8d1e49e2cc23d81421ac485be0eea01
- F ext/session/session4.test a6ed685da7a5293c5d6f99855bcf41dbc352ca84
+ F ext/session/session4.test 457b02bdc349eb01151e54de014df77abd3c08c8
F ext/session/session5.test 716bc6fafd625ce60dfa62ae128971628c1a1169
F ext/session/session6.test 443789bc2fca12e4f7075cf692c60b8a2bea1a26
F ext/session/session8.test 8e194b3f655d861ca36de5d4de53f702751bab3b
F ext/session/sessionE.test e60a238c47f0feb3bb707e7f35e22be09c7e8f26
F ext/session/sessionF.test c2f178d4dfd723a5fd94a730ea2ccb44c669e3ce
F ext/session/sessionG.test 01ef705096a9d3984eebdcca79807a211dee1b60
- F ext/session/session_common.tcl a1293167d14774b5e728836720497f40fe4ea596
+ F ext/session/session_common.tcl 9b696a341cf1d3744823715ed92bb19749b6c3d4
F ext/session/sessionfault.test da273f2712b6411e85e71465a1733b8501dbf6f7
F ext/session/sessionfault2.test 04aa0bc9aa70ea43d8de82c4f648db4de1e990b0
-F ext/session/sqlite3session.c 37485891b4add26cf61495df193c419f36556a32
-F ext/session/sqlite3session.h 9345166bd8f80562145586cf817f707de5ecada2
-F ext/session/test_session.c eb0bd6c1ea791c1d66ee4ef94c16500dad936386
+F ext/session/sqlite3changebatch.c 96011bdf72ac12ebf707f4d0f0e719e333631605
+F ext/session/sqlite3changebatch.h e72016998c9a22d439ddfd547b69e1ebac810c24
+F ext/session/sqlite3session.c e5591f76aea6058720e04f78ae9e88487eb56c6b
- F ext/session/sqlite3session.h c772b5440f41af44631891aa7f352e9a44b740ad
- F ext/session/test_session.c 9e6a4313dc94b053edd33f54c3ffc053aeddff45
++F ext/session/sqlite3session.h 30b9ba3c5906d711b4e5b2e532d7a1f419942a29
++F ext/session/test_session.c badd5da3cb561564b093745f7d843430d1d76347
F ext/userauth/sqlite3userauth.h 19cb6f0e31316d0ee4afdfb7a85ef9da3333a220
F ext/userauth/user-auth.txt e6641021a9210364665fe625d067617d03f27b04
F ext/userauth/userauth.c 5fa3bdb492f481bbc1709fc83c91ebd13460c69e
F install-sh 9d4de14ab9fb0facae2f48780b874848cbf2f895 x
F ltmain.sh 3ff0879076df340d2e23ae905484d8c15d5fdea8
F magic.txt 8273bf49ba3b0c8559cb2774495390c31fd61c60
- F main.mk de9447348ea580282aa47dbffd20b042bfbec4e1
-F main.mk da18a283b8fc3c6892e9205e6228f3ae60d8cd8d
++F main.mk 388cb5112039df08fef105fe43ad7a388148f3c4
F mkso.sh fd21c06b063bb16a5d25deea1752c2da6ac3ed83
F mptest/config01.test 3c6adcbc50b991866855f1977ff172eb6d901271
F mptest/config02.test 4415dfe36c48785f751e16e32c20b077c28ae504
F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc
F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e
F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0
- P 506d6ff4b64c72d4ca65f0d15e1fdf8a132556bc
- R 437a725ec959b210c45a517f0a4720a0
-P 0820f8b3dedfc846d187844847dfa8617539fc9a
-R 66c67520d75b6cc9d6a9f98310fc2b1f
-U drh
-Z aa79b15c8c6da20e9ca7087094bfadd8
++P bee44ebc532f37e3fe61c18878e0d3db06805190 2a81763e68cdf9b8c46389b1e1a87bc2084b53e7
++R 26a7e980cb19dc3794c477a845df1a9a
+U dan
- Z 7a3026050d391945a1ada937b36aa9ce
++Z dabf828998107ef3f44ce5005fb7fe86