}
}
-static char *otaStrndup(const char *zStr, int nStr, int *pRc){
+static char *otaStrndup(const char *zStr, int *pRc){
char *zRet = 0;
- assert( *pRc==SQLITE_OK );
+ assert( *pRc==SQLITE_OK );
if( zStr ){
- int nCopy = nStr;
- if( nCopy<0 ) nCopy = strlen(zStr) + 1;
+ int nCopy = strlen(zStr) + 1;
zRet = (char*)sqlite3_malloc(nCopy);
if( zRet ){
memcpy(zRet, zStr, nCopy);
for(i=0; p->rc==SQLITE_OK && i<nCol; i++){
const char *zName = (const char*)sqlite3_column_name(pStmt, i);
if( sqlite3_strnicmp("ota_", zName, 4) ){
- char *zCopy = otaStrndup(zName, -1, &p->rc);
+ char *zCopy = otaStrndup(zName, &p->rc);
pIter->aiSrcOrder[pIter->nTblCol] = pIter->nTblCol;
pIter->azTblCol[pIter->nTblCol++] = zCopy;
}
SWAP(char*, pIter->azTblCol[i], pIter->azTblCol[iOrder]);
}
- pIter->azTblType[iOrder] = otaStrndup(zType, -1, &p->rc);
+ pIter->azTblType[iOrder] = otaStrndup(zType, &p->rc);
pIter->abTblPk[iOrder] = (iPk!=0);
pIter->abNotNull[iOrder] = (u8)bNotNull || (iPk!=0);
iOrder++;
}
/* Allocate space required for the zMask field. */
- if( p->rc==SQLITE_OK ){
- int nMask = pIter->nTblCol+1;
- pIter->zMask = (char*)sqlite3_malloc(nMask);
- if( pIter->zMask==0 ){
- p->rc = SQLITE_NOMEM;
- }else{
- memset(pIter->zMask, 0, nMask);
- }
- }
+ pIter->zMask = (char*)otaMalloc(p, pIter->nTblCol+1);
sqlite3_free(zWhere);
sqlite3_free(zOldlist);
int rc;
int rc2;
- assert( p->rc==SQLITE_OK );
- pRet = (OtaState*)sqlite3_malloc(sizeof(OtaState));
- if( pRet==0 ){
- rc = SQLITE_NOMEM;
- }else{
- memset(pRet, 0, sizeof(OtaState));
- rc = prepareAndCollectError(p->db, &pStmt, &p->zErrmsg, zSelect);
- }
+ pRet = (OtaState*)otaMalloc(p, sizeof(OtaState));
+ if( pRet==0 ) return 0;
+ rc = prepareAndCollectError(p->db, &pStmt, &p->zErrmsg, zSelect);
while( rc==SQLITE_OK && SQLITE_ROW==sqlite3_step(pStmt) ){
switch( sqlite3_column_int(pStmt, 0) ){
case OTA_STATE_STAGE:
break;
case OTA_STATE_TBL:
- pRet->zTbl = otaStrndup((char*)sqlite3_column_text(pStmt, 1), -1, &rc);
+ pRet->zTbl = otaStrndup((char*)sqlite3_column_text(pStmt, 1), &rc);
break;
case OTA_STATE_IDX:
- pRet->zIdx = otaStrndup((char*)sqlite3_column_text(pStmt, 1), -1, &rc);
+ pRet->zIdx = otaStrndup((char*)sqlite3_column_text(pStmt, 1), &rc);
break;
case OTA_STATE_ROW:
ota_file *pDb = otaFindMaindb(pOtaVfs, zName);
if( pDb ){
if( pDb->pOta && pDb->pOta->eStage==OTA_STAGE_OAL ){
- char *zCopy = otaStrndup(zName, -1, &rc);
+ char *zCopy = otaStrndup(zName, &rc);
if( zCopy ){
int nCopy = strlen(zCopy);
zCopy[nCopy-3] = 'o';
/**************************************************************************/
-#ifdef SQLITE_TEST
-
-#include <tcl.h>
-
-/* From main.c (apparently...) */
-extern const char *sqlite3ErrName(int);
-
-void test_ota_delta(sqlite3_context *pCtx, int nArg, sqlite3_value **apVal){
- Tcl_Interp *interp = (Tcl_Interp*)sqlite3_user_data(pCtx);
- Tcl_Obj *pScript;
- int i;
-
- pScript = Tcl_NewObj();
- Tcl_IncrRefCount(pScript);
- Tcl_ListObjAppendElement(0, pScript, Tcl_NewStringObj("ota_delta", -1));
- for(i=0; i<nArg; i++){
- sqlite3_value *pIn = apVal[i];
- const char *z = (const char*)sqlite3_value_text(pIn);
- Tcl_ListObjAppendElement(0, pScript, Tcl_NewStringObj(z, -1));
- }
-
- if( TCL_OK==Tcl_EvalObjEx(interp, pScript, TCL_GLOBAL_ONLY) ){
- const char *z = Tcl_GetStringResult(interp);
- sqlite3_result_text(pCtx, z, -1, SQLITE_TRANSIENT);
- }else{
- Tcl_BackgroundError(interp);
- }
-
- Tcl_DecrRefCount(pScript);
-}
-
-
-static int test_sqlite3ota_cmd(
- ClientData clientData,
- Tcl_Interp *interp,
- int objc,
- Tcl_Obj *CONST objv[]
-){
- int ret = TCL_OK;
- sqlite3ota *pOta = (sqlite3ota*)clientData;
- const char *azMethod[] = { "step", "close", "create_ota_delta", 0 };
- int iMethod;
-
- if( objc!=2 ){
- Tcl_WrongNumArgs(interp, 1, objv, "METHOD");
- return TCL_ERROR;
- }
- if( Tcl_GetIndexFromObj(interp, objv[1], azMethod, "method", 0, &iMethod) ){
- return TCL_ERROR;
- }
-
- switch( iMethod ){
- case 0: /* step */ {
- int rc = sqlite3ota_step(pOta);
- Tcl_SetObjResult(interp, Tcl_NewStringObj(sqlite3ErrName(rc), -1));
- break;
- }
-
- case 1: /* close */ {
- char *zErrmsg = 0;
- int rc;
- Tcl_DeleteCommand(interp, Tcl_GetString(objv[0]));
- rc = sqlite3ota_close(pOta, &zErrmsg);
- if( rc==SQLITE_OK || rc==SQLITE_DONE ){
- Tcl_SetObjResult(interp, Tcl_NewStringObj(sqlite3ErrName(rc), -1));
- assert( zErrmsg==0 );
- }else{
- Tcl_SetObjResult(interp, Tcl_NewStringObj(sqlite3ErrName(rc), -1));
- if( zErrmsg ){
- Tcl_AppendResult(interp, " - ", zErrmsg, 0);
- sqlite3_free(zErrmsg);
- }
- ret = TCL_ERROR;
- }
- break;
- }
-
- case 2: /* create_ota_delta */ {
- sqlite3 *db = sqlite3ota_db(pOta);
- int rc = sqlite3_create_function(
- db, "ota_delta", -1, SQLITE_UTF8, (void*)interp, test_ota_delta, 0, 0
- );
- Tcl_SetObjResult(interp, Tcl_NewStringObj(sqlite3ErrName(rc), -1));
- ret = (rc==SQLITE_OK ? TCL_OK : TCL_ERROR);
- break;
- }
-
- default: /* seems unlikely */
- assert( !"cannot happen" );
- break;
- }
-
- return ret;
-}
-
-/*
-** Tclcmd: sqlite3ota CMD <target-db> <ota-db>
-*/
-static int test_sqlite3ota(
- ClientData clientData,
- Tcl_Interp *interp,
- int objc,
- Tcl_Obj *CONST objv[]
-){
- sqlite3ota *pOta = 0;
- const char *zCmd;
- const char *zTarget;
- const char *zOta;
-
- if( objc!=4 ){
- Tcl_WrongNumArgs(interp, 1, objv, "NAME TARGET-DB OTA-DB");
- return TCL_ERROR;
- }
- zCmd = Tcl_GetString(objv[1]);
- zTarget = Tcl_GetString(objv[2]);
- zOta = Tcl_GetString(objv[3]);
-
- pOta = sqlite3ota_open(zTarget, zOta);
- Tcl_CreateObjCommand(interp, zCmd, test_sqlite3ota_cmd, (ClientData)pOta, 0);
- Tcl_SetObjResult(interp, objv[1]);
- return TCL_OK;
-}
-
-/*
-** Tclcmd: sqlite3ota_create_vfs ?-default? NAME PARENT
-*/
-static int test_sqlite3ota_create_vfs(
- ClientData clientData,
- Tcl_Interp *interp,
- int objc,
- Tcl_Obj *CONST objv[]
-){
- const char *zName;
- const char *zParent;
- int rc;
-
- if( objc!=3 && objc!=4 ){
- Tcl_WrongNumArgs(interp, 1, objv, "?-default? NAME PARENT");
- return TCL_ERROR;
- }
-
- zName = Tcl_GetString(objv[objc-2]);
- zParent = Tcl_GetString(objv[objc-1]);
- if( zParent[0]=='\0' ) zParent = 0;
-
- rc = sqlite3ota_create_vfs(zName, zParent);
- if( rc!=SQLITE_OK ){
- Tcl_SetObjResult(interp, Tcl_NewStringObj(sqlite3ErrName(rc), -1));
- return TCL_ERROR;
- }else if( objc==4 ){
- sqlite3_vfs *pVfs = sqlite3_vfs_find(zName);
- sqlite3_vfs_register(pVfs, 1);
- }
-
- Tcl_ResetResult(interp);
- return TCL_OK;
-}
-
-/*
-** Tclcmd: sqlite3ota_destroy_vfs NAME
-*/
-static int test_sqlite3ota_destroy_vfs(
- ClientData clientData,
- Tcl_Interp *interp,
- int objc,
- Tcl_Obj *CONST objv[]
-){
- const char *zName;
-
- if( objc!=2 ){
- Tcl_WrongNumArgs(interp, 1, objv, "NAME");
- return TCL_ERROR;
- }
-
- zName = Tcl_GetString(objv[1]);
- sqlite3ota_destroy_vfs(zName);
- return TCL_OK;
-}
-
-
-int SqliteOta_Init(Tcl_Interp *interp){
- static struct {
- char *zName;
- Tcl_ObjCmdProc *xProc;
- } aObjCmd[] = {
- { "sqlite3ota", test_sqlite3ota },
- { "sqlite3ota_create_vfs", test_sqlite3ota_create_vfs },
- { "sqlite3ota_destroy_vfs", test_sqlite3ota_destroy_vfs },
- };
- int i;
- for(i=0; i<sizeof(aObjCmd)/sizeof(aObjCmd[0]); i++){
- Tcl_CreateObjCommand(interp, aObjCmd[i].zName, aObjCmd[i].xProc, 0, 0);
- }
- return TCL_OK;
-}
-#endif /* ifdef SQLITE_TEST */
-#else /* !SQLITE_CORE || SQLITE_ENABLE_OTA */
-# ifdef SQLITE_TEST
-#include <tcl.h>
-int SqliteOta_Init(Tcl_Interp *interp){ return TCL_OK; }
-# endif
-#endif
+#endif /* !defined(SQLITE_CORE) || defined(SQLITE_ENABLE_OTA) */
--- /dev/null
+/*
+** 2015 February 16
+**
+** The author disclaims copyright to this source code. In place of
+** a legal notice, here is a blessing:
+**
+** May you do good and not evil.
+** May you find forgiveness for yourself and forgive others.
+** May you share freely, never taking more than you give.
+**
+*************************************************************************
+*/
+
+#include "sqlite3.h"
+
+#if defined(SQLITE_TEST)
+#if !defined(SQLITE_CORE) || defined(SQLITE_ENABLE_OTA)
+
+#include "sqlite3ota.h"
+#include <tcl.h>
+#include <assert.h>
+
+/* From main.c (apparently...) */
+extern const char *sqlite3ErrName(int);
+
+void test_ota_delta(sqlite3_context *pCtx, int nArg, sqlite3_value **apVal){
+ Tcl_Interp *interp = (Tcl_Interp*)sqlite3_user_data(pCtx);
+ Tcl_Obj *pScript;
+ int i;
+
+ pScript = Tcl_NewObj();
+ Tcl_IncrRefCount(pScript);
+ Tcl_ListObjAppendElement(0, pScript, Tcl_NewStringObj("ota_delta", -1));
+ for(i=0; i<nArg; i++){
+ sqlite3_value *pIn = apVal[i];
+ const char *z = (const char*)sqlite3_value_text(pIn);
+ Tcl_ListObjAppendElement(0, pScript, Tcl_NewStringObj(z, -1));
+ }
+
+ if( TCL_OK==Tcl_EvalObjEx(interp, pScript, TCL_GLOBAL_ONLY) ){
+ const char *z = Tcl_GetStringResult(interp);
+ sqlite3_result_text(pCtx, z, -1, SQLITE_TRANSIENT);
+ }else{
+ Tcl_BackgroundError(interp);
+ }
+
+ Tcl_DecrRefCount(pScript);
+}
+
+
+static int test_sqlite3ota_cmd(
+ ClientData clientData,
+ Tcl_Interp *interp,
+ int objc,
+ Tcl_Obj *CONST objv[]
+){
+ int ret = TCL_OK;
+ sqlite3ota *pOta = (sqlite3ota*)clientData;
+ const char *azMethod[] = { "step", "close", "create_ota_delta", 0 };
+ int iMethod;
+
+ if( objc!=2 ){
+ Tcl_WrongNumArgs(interp, 1, objv, "METHOD");
+ return TCL_ERROR;
+ }
+ if( Tcl_GetIndexFromObj(interp, objv[1], azMethod, "method", 0, &iMethod) ){
+ return TCL_ERROR;
+ }
+
+ switch( iMethod ){
+ case 0: /* step */ {
+ int rc = sqlite3ota_step(pOta);
+ Tcl_SetObjResult(interp, Tcl_NewStringObj(sqlite3ErrName(rc), -1));
+ break;
+ }
+
+ case 1: /* close */ {
+ char *zErrmsg = 0;
+ int rc;
+ Tcl_DeleteCommand(interp, Tcl_GetString(objv[0]));
+ rc = sqlite3ota_close(pOta, &zErrmsg);
+ if( rc==SQLITE_OK || rc==SQLITE_DONE ){
+ Tcl_SetObjResult(interp, Tcl_NewStringObj(sqlite3ErrName(rc), -1));
+ assert( zErrmsg==0 );
+ }else{
+ Tcl_SetObjResult(interp, Tcl_NewStringObj(sqlite3ErrName(rc), -1));
+ if( zErrmsg ){
+ Tcl_AppendResult(interp, " - ", zErrmsg, 0);
+ sqlite3_free(zErrmsg);
+ }
+ ret = TCL_ERROR;
+ }
+ break;
+ }
+
+ case 2: /* create_ota_delta */ {
+ sqlite3 *db = sqlite3ota_db(pOta);
+ int rc = sqlite3_create_function(
+ db, "ota_delta", -1, SQLITE_UTF8, (void*)interp, test_ota_delta, 0, 0
+ );
+ Tcl_SetObjResult(interp, Tcl_NewStringObj(sqlite3ErrName(rc), -1));
+ ret = (rc==SQLITE_OK ? TCL_OK : TCL_ERROR);
+ break;
+ }
+
+ default: /* seems unlikely */
+ assert( !"cannot happen" );
+ break;
+ }
+
+ return ret;
+}
+
+/*
+** Tclcmd: sqlite3ota CMD <target-db> <ota-db>
+*/
+static int test_sqlite3ota(
+ ClientData clientData,
+ Tcl_Interp *interp,
+ int objc,
+ Tcl_Obj *CONST objv[]
+){
+ sqlite3ota *pOta = 0;
+ const char *zCmd;
+ const char *zTarget;
+ const char *zOta;
+
+ if( objc!=4 ){
+ Tcl_WrongNumArgs(interp, 1, objv, "NAME TARGET-DB OTA-DB");
+ return TCL_ERROR;
+ }
+ zCmd = Tcl_GetString(objv[1]);
+ zTarget = Tcl_GetString(objv[2]);
+ zOta = Tcl_GetString(objv[3]);
+
+ pOta = sqlite3ota_open(zTarget, zOta);
+ Tcl_CreateObjCommand(interp, zCmd, test_sqlite3ota_cmd, (ClientData)pOta, 0);
+ Tcl_SetObjResult(interp, objv[1]);
+ return TCL_OK;
+}
+
+/*
+** Tclcmd: sqlite3ota_create_vfs ?-default? NAME PARENT
+*/
+static int test_sqlite3ota_create_vfs(
+ ClientData clientData,
+ Tcl_Interp *interp,
+ int objc,
+ Tcl_Obj *CONST objv[]
+){
+ const char *zName;
+ const char *zParent;
+ int rc;
+
+ if( objc!=3 && objc!=4 ){
+ Tcl_WrongNumArgs(interp, 1, objv, "?-default? NAME PARENT");
+ return TCL_ERROR;
+ }
+
+ zName = Tcl_GetString(objv[objc-2]);
+ zParent = Tcl_GetString(objv[objc-1]);
+ if( zParent[0]=='\0' ) zParent = 0;
+
+ rc = sqlite3ota_create_vfs(zName, zParent);
+ if( rc!=SQLITE_OK ){
+ Tcl_SetObjResult(interp, Tcl_NewStringObj(sqlite3ErrName(rc), -1));
+ return TCL_ERROR;
+ }else if( objc==4 ){
+ sqlite3_vfs *pVfs = sqlite3_vfs_find(zName);
+ sqlite3_vfs_register(pVfs, 1);
+ }
+
+ Tcl_ResetResult(interp);
+ return TCL_OK;
+}
+
+/*
+** Tclcmd: sqlite3ota_destroy_vfs NAME
+*/
+static int test_sqlite3ota_destroy_vfs(
+ ClientData clientData,
+ Tcl_Interp *interp,
+ int objc,
+ Tcl_Obj *CONST objv[]
+){
+ const char *zName;
+
+ if( objc!=2 ){
+ Tcl_WrongNumArgs(interp, 1, objv, "NAME");
+ return TCL_ERROR;
+ }
+
+ zName = Tcl_GetString(objv[1]);
+ sqlite3ota_destroy_vfs(zName);
+ return TCL_OK;
+}
+
+
+int SqliteOta_Init(Tcl_Interp *interp){
+ static struct {
+ char *zName;
+ Tcl_ObjCmdProc *xProc;
+ } aObjCmd[] = {
+ { "sqlite3ota", test_sqlite3ota },
+ { "sqlite3ota_create_vfs", test_sqlite3ota_create_vfs },
+ { "sqlite3ota_destroy_vfs", test_sqlite3ota_destroy_vfs },
+ };
+ int i;
+ for(i=0; i<sizeof(aObjCmd)/sizeof(aObjCmd[0]); i++){
+ Tcl_CreateObjCommand(interp, aObjCmd[i].zName, aObjCmd[i].xProc, 0, 0);
+ }
+ return TCL_OK;
+}
+
+#else
+#include <tcl.h>
+int SqliteOta_Init(Tcl_Interp *interp){ return TCL_OK; }
+#endif /* !defined(SQLITE_CORE) || defined(SQLITE_ENABLE_OTA) */
+#endif /* defined(SQLITE_TEST) */
+
mutex.o mutex_noop.o mutex_unix.o mutex_w32.o \
notify.o opcodes.o os.o os_unix.o os_win.o \
pager.o pcache.o pcache1.o pragma.o prepare.o printf.o \
- random.o resolve.o rowset.o rtree.o select.o status.o \
+ random.o resolve.o rowset.o rtree.o select.o sqlite3ota.o status.o \
table.o threads.o tokenize.o trigger.o \
update.o userauth.o util.o vacuum.o \
vdbeapi.o vdbeaux.o vdbeblob.o vdbemem.o vdbesort.o \
$(TOP)/ext/fts3/fts3_tokenizer.c \
$(TOP)/ext/fts3/fts3_write.c \
$(TOP)/ext/async/sqlite3async.c \
- $(TOP)/ext/ota/sqlite3ota.c
+ $(TOP)/ext/ota/test_ota.c
# Header files used by all library source files.
#
userauth.o: $(TOP)/ext/userauth/userauth.c $(HDR) $(EXTHDR)
$(TCCX) -DSQLITE_CORE -c $(TOP)/ext/userauth/userauth.c
+sqlite3ota.o: $(TOP)/ext/ota/sqlite3ota.c $(HDR) $(EXTHDR)
+ $(TCCX) -DSQLITE_CORE -c $(TOP)/ext/ota/sqlite3ota.c
+
# Rules for building test programs and for running tests
#
-C Change\sthe\sway\sthe\s"incremental\scheckpoint"\sfunction\sof\sOTA\sworks\sin\sorder\sto\sreduce\sthe\seffect\son\sthe\sSQLite\score\scode.
-D 2015-02-14T18:58:22.415
+C Move\stcl\stest\scode\sfrom\ssqlite3ota.c\sto\snew\sfile\sext/ota/test_ota.c.
+D 2015-02-16T06:27:37.241
F Makefile.arm-wince-mingw32ce-gcc d6df77f1f48d690bd73162294bbba7f59507c72f
F Makefile.in 6b9e7677829aa94b9f30949656e27312aefb9a46
F Makefile.linux-gcc 91d710bdc4998cb015f39edf3cb314ec4f4d7e23
F ext/ota/ota9.test d3eee95dd836824d07a22e5efcdb7bf6e869358b
F ext/ota/otaA.test 95566a8d193113867b960eadf85b310937f2fe03
F ext/ota/otafault.test 508ba87c83d632670ac0f94371a465d4bb4d49dd
-F ext/ota/sqlite3ota.c 0cf2a1b5ac7009050159a39d938f1334ce7072b8
+F ext/ota/sqlite3ota.c 79874bc6f31a514aebd17ab24d31e7c567e6225e
F ext/ota/sqlite3ota.h 1cc7201086fe65a36957740381485a24738c4077
+F ext/ota/test_ota.c 5dd58e4e6eb3ae7b471566616d44b701971bce88
F ext/rtree/README 6315c0d73ebf0ec40dedb5aa0e942bc8b54e3761
F ext/rtree/rtree.c 14e6239434d4e3f65d3e90320713f26aa24e167f
F ext/rtree/rtree.h 834dbcb82dc85b2481cde6a07cdadfddc99e9b9e
F install-sh 9d4de14ab9fb0facae2f48780b874848cbf2f895 x
F ltmain.sh 3ff0879076df340d2e23ae905484d8c15d5fdea8
F magic.txt 8273bf49ba3b0c8559cb2774495390c31fd61c60
-F main.mk 57c115aba023c1988564edb80ac87c3e07472b05
+F main.mk 00070461df537e8e0ece33cf05caf3d536c28802
F mkopcodec.awk c2ff431854d702cdd2d779c9c0d1f58fa16fa4ea
F mkopcodeh.awk c6b3fa301db6ef7ac916b14c60868aeaec1337b5
F mkso.sh fd21c06b063bb16a5d25deea1752c2da6ac3ed83
F tool/warnings-clang.sh f6aa929dc20ef1f856af04a730772f59283631d4
F tool/warnings.sh 0abfd78ceb09b7f7c27c688c8e3fe93268a13b32
F tool/win/sqlite.vsix deb315d026cc8400325c5863eef847784a219a2f
-P 71887cd9b38def398d48eaf0ec34eeac3c7c5177
-R 9f9fcb7ec94597bb519ead7cc6d77d1b
+P b64a11a754dc56f3406d3b703531ebe9e4af4908
+R 8813c4f37af98778b18f1d2e1e748912
U dan
-Z b1cfeba62f30a42f6b3ffd27f7078fc0
+Z ac67e9a36714c8c694cc168f5b99c0ce
-b64a11a754dc56f3406d3b703531ebe9e4af4908
\ No newline at end of file
+f20779a6e890ba73bfaa904cefcf3a029b01fed4
\ No newline at end of file