mirror of
https://github.com/sqlite/sqlite.git
synced 2025-07-30 19:03:16 +03:00
Add tests for the sqlite3changegroup_schema() API.
FossilOrigin-Name: 5dab481c101b1523b1cfde92678cbc654ea26d946bf29da372d71c1f89cbaf46
This commit is contained in:
@ -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 },
|
||||
|
Reference in New Issue
Block a user