aboutsummaryrefslogtreecommitdiff
path: root/ext/session/test_session.c
diff options
context:
space:
mode:
Diffstat (limited to 'ext/session/test_session.c')
-rw-r--r--ext/session/test_session.c132
1 files changed, 132 insertions, 0 deletions
diff --git a/ext/session/test_session.c b/ext/session/test_session.c
index 0836238b5..df42884ef 100644
--- a/ext/session/test_session.c
+++ b/ext/session/test_session.c
@@ -1452,12 +1452,144 @@ static int SQLITE_TCLAPI test_sqlite3session_config(
return TCL_OK;
}
+typedef struct TestChangegroup TestChangegroup;
+struct TestChangegroup {
+ sqlite3_changegroup *pGrp;
+};
+
+/*
+** Destructor for Tcl changegroup command object.
+*/
+static void test_changegroup_del(void *clientData){
+ TestChangegroup *pGrp = (TestChangegroup*)clientData;
+ sqlite3changegroup_delete(pGrp->pGrp);
+ ckfree(pGrp);
+}
+
+/*
+** Tclcmd: $changegroup schema DB DBNAME
+** Tclcmd: $changegroup add CHANGESET
+** Tclcmd: $changegroup output
+** Tclcmd: $changegroup delete
+*/
+static int SQLITE_TCLAPI test_changegroup_cmd(
+ void * clientData,
+ Tcl_Interp *interp,
+ int objc,
+ Tcl_Obj *CONST objv[]
+){
+ TestChangegroup *p = (TestChangegroup*)clientData;
+ static struct ChangegroupCmd {
+ const char *zSub;
+ int nArg;
+ const char *zMsg;
+ int iSub;
+ } aSub[] = {
+ { "schema", 2, "DB DBNAME", }, /* 0 */
+ { "add", 1, "CHANGESET", }, /* 1 */
+ { "output", 0, "", }, /* 2 */
+ { "delete", 0, "", }, /* 3 */
+ { 0 }
+ };
+ int rc = TCL_OK;
+ int iSub = 0;
+
+ 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: { /* schema */
+ sqlite3 *db = 0;
+ const char *zDb = Tcl_GetString(objv[3]);
+ if( dbHandleFromObj(interp, objv[2], &db) ){
+ return TCL_ERROR;
+ }
+ rc = sqlite3changegroup_schema(p->pGrp, db, zDb);
+ if( rc!=SQLITE_OK ) rc = test_session_error(interp, rc, 0);
+ break;
+ };
+
+ case 1: { /* add */
+ int nByte = 0;
+ const u8 *aByte = Tcl_GetByteArrayFromObj(objv[2], &nByte);
+ rc = sqlite3changegroup_add(p->pGrp, nByte, (void*)aByte);
+ if( rc!=SQLITE_OK ) rc = test_session_error(interp, rc, 0);
+ break;
+ };
+
+ case 2: { /* output */
+ int nByte = 0;
+ const u8 *aByte = 0;
+ rc = sqlite3changegroup_output(p->pGrp, &nByte, (void**)&aByte);
+ if( rc!=SQLITE_OK ){
+ rc = test_session_error(interp, rc, 0);
+ }else{
+ Tcl_SetObjResult(interp, Tcl_NewByteArrayObj(aByte, nByte));
+ }
+ sqlite3_free(aByte);
+ break;
+ };
+
+ default: { /* delete */
+ assert( iSub==3 );
+ Tcl_DeleteCommand(interp, Tcl_GetString(objv[0]));
+ break;
+ }
+ }
+
+ return rc;
+}
+
+/*
+** Tclcmd: sqlite3changegroup CMD
+*/
+static int SQLITE_TCLAPI test_sqlite3changegroup(
+ void * clientData,
+ Tcl_Interp *interp,
+ int objc,
+ Tcl_Obj *CONST objv[]
+){
+ int rc; /* sqlite3changegroup_new() return code */
+ TestChangegroup *p; /* New wrapper object */
+
+ if( objc!=2 ){
+ Tcl_WrongNumArgs(interp, 1, objv, "CMD");
+ return TCL_ERROR;
+ }
+
+ p = (TestChangegroup*)ckalloc(sizeof(TestChangegroup));
+ memset(p, 0, sizeof(TestChangegroup));
+ rc = sqlite3changegroup_new(&p->pGrp);
+ if( rc!=SQLITE_OK ){
+ ckfree((char*)p);
+ return test_session_error(interp, rc, 0);
+ }
+
+ Tcl_CreateObjCommand(
+ interp, Tcl_GetString(objv[1]), test_changegroup_cmd, (ClientData)p,
+ test_changegroup_del
+ );
+ Tcl_SetObjResult(interp, objv[1]);
+ return TCL_OK;
+}
+
int TestSession_Init(Tcl_Interp *interp){
struct Cmd {
const char *zCmd;
Tcl_ObjCmdProc *xProc;
} aCmd[] = {
{ "sqlite3session", test_sqlite3session },
+ { "sqlite3changegroup", test_sqlite3changegroup },
{ "sqlite3session_foreach", test_sqlite3session_foreach },
{ "sqlite3changeset_invert", test_sqlite3changeset_invert },
{ "sqlite3changeset_concat", test_sqlite3changeset_concat },