201 lines
4.8 KiB
C
201 lines
4.8 KiB
C
/*
|
|
** 2007 March 29
|
|
**
|
|
** 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.
|
|
**
|
|
*************************************************************************
|
|
**
|
|
** This file contains obscure tests of the C-interface required
|
|
** for completeness. Test code is written in C for these cases
|
|
** as there is not much point in binding to Tcl.
|
|
*/
|
|
#include "sqliteInt.h"
|
|
#include "tcl.h"
|
|
#include <stdlib.h>
|
|
#include <string.h>
|
|
|
|
/*
|
|
** c_collation_test
|
|
*/
|
|
static int c_collation_test(
|
|
ClientData clientData, /* Pointer to sqlite3_enable_XXX function */
|
|
Tcl_Interp *interp, /* The TCL interpreter that invoked this command */
|
|
int objc, /* Number of arguments */
|
|
Tcl_Obj *CONST objv[] /* Command arguments */
|
|
){
|
|
const char *zErrFunction = "N/A";
|
|
sqlite3 *db;
|
|
|
|
int rc;
|
|
if( objc!=1 ){
|
|
Tcl_WrongNumArgs(interp, 1, objv, "");
|
|
return TCL_ERROR;
|
|
}
|
|
|
|
/* Open a database. */
|
|
rc = sqlite3_open(":memory:", &db);
|
|
if( rc!=SQLITE_OK ){
|
|
zErrFunction = "sqlite3_open";
|
|
goto error_out;
|
|
}
|
|
|
|
rc = sqlite3_create_collation(db, "collate", 456, 0, 0);
|
|
if( rc!=SQLITE_MISUSE ){
|
|
sqlite3_close(db);
|
|
zErrFunction = "sqlite3_create_collation";
|
|
goto error_out;
|
|
}
|
|
|
|
sqlite3_close(db);
|
|
return TCL_OK;
|
|
|
|
error_out:
|
|
Tcl_ResetResult(interp);
|
|
Tcl_AppendResult(interp, "Error testing function: ", zErrFunction, 0);
|
|
return TCL_ERROR;
|
|
}
|
|
|
|
/*
|
|
** c_realloc_test
|
|
*/
|
|
static int c_realloc_test(
|
|
ClientData clientData, /* Pointer to sqlite3_enable_XXX function */
|
|
Tcl_Interp *interp, /* The TCL interpreter that invoked this command */
|
|
int objc, /* Number of arguments */
|
|
Tcl_Obj *CONST objv[] /* Command arguments */
|
|
){
|
|
void *p;
|
|
const char *zErrFunction = "N/A";
|
|
|
|
if( objc!=1 ){
|
|
Tcl_WrongNumArgs(interp, 1, objv, "");
|
|
return TCL_ERROR;
|
|
}
|
|
|
|
p = sqlite3_malloc(5);
|
|
if( !p ){
|
|
zErrFunction = "sqlite3_malloc";
|
|
goto error_out;
|
|
}
|
|
|
|
/* Test that realloc()ing a block of memory to a negative size is
|
|
** the same as free()ing that memory.
|
|
*/
|
|
p = sqlite3_realloc(p, -1);
|
|
if( p ){
|
|
zErrFunction = "sqlite3_realloc";
|
|
goto error_out;
|
|
}
|
|
|
|
return TCL_OK;
|
|
|
|
error_out:
|
|
Tcl_ResetResult(interp);
|
|
Tcl_AppendResult(interp, "Error testing function: ", zErrFunction, 0);
|
|
return TCL_ERROR;
|
|
}
|
|
|
|
|
|
/*
|
|
** c_misuse_test
|
|
*/
|
|
static int c_misuse_test(
|
|
ClientData clientData, /* Pointer to sqlite3_enable_XXX function */
|
|
Tcl_Interp *interp, /* The TCL interpreter that invoked this command */
|
|
int objc, /* Number of arguments */
|
|
Tcl_Obj *CONST objv[] /* Command arguments */
|
|
){
|
|
const char *zErrFunction = "N/A";
|
|
sqlite3 *db = 0;
|
|
sqlite3_stmt *pStmt;
|
|
int rc;
|
|
|
|
if( objc!=1 ){
|
|
Tcl_WrongNumArgs(interp, 1, objv, "");
|
|
return TCL_ERROR;
|
|
}
|
|
|
|
/* Open a database. Then close it again. We need to do this so that
|
|
** we have a "closed database handle" to pass to various API functions.
|
|
*/
|
|
rc = sqlite3_open(":memory:", &db);
|
|
if( rc!=SQLITE_OK ){
|
|
zErrFunction = "sqlite3_open";
|
|
goto error_out;
|
|
}
|
|
sqlite3_close(db);
|
|
|
|
|
|
rc = sqlite3_errcode(db);
|
|
if( rc!=SQLITE_MISUSE ){
|
|
zErrFunction = "sqlite3_errcode";
|
|
goto error_out;
|
|
}
|
|
|
|
pStmt = (sqlite3_stmt*)1234;
|
|
rc = sqlite3_prepare(db, 0, 0, &pStmt, 0);
|
|
if( rc!=SQLITE_MISUSE ){
|
|
zErrFunction = "sqlite3_prepare";
|
|
goto error_out;
|
|
}
|
|
assert( pStmt==0 ); /* Verify that pStmt is zeroed even on a MISUSE error */
|
|
|
|
pStmt = (sqlite3_stmt*)1234;
|
|
rc = sqlite3_prepare_v2(db, 0, 0, &pStmt, 0);
|
|
if( rc!=SQLITE_MISUSE ){
|
|
zErrFunction = "sqlite3_prepare_v2";
|
|
goto error_out;
|
|
}
|
|
assert( pStmt==0 );
|
|
|
|
#ifndef SQLITE_OMIT_UTF16
|
|
pStmt = (sqlite3_stmt*)1234;
|
|
rc = sqlite3_prepare16(db, 0, 0, &pStmt, 0);
|
|
if( rc!=SQLITE_MISUSE ){
|
|
zErrFunction = "sqlite3_prepare16";
|
|
goto error_out;
|
|
}
|
|
assert( pStmt==0 );
|
|
pStmt = (sqlite3_stmt*)1234;
|
|
rc = sqlite3_prepare16_v2(db, 0, 0, &pStmt, 0);
|
|
if( rc!=SQLITE_MISUSE ){
|
|
zErrFunction = "sqlite3_prepare16_v2";
|
|
goto error_out;
|
|
}
|
|
assert( pStmt==0 );
|
|
#endif
|
|
|
|
return TCL_OK;
|
|
|
|
error_out:
|
|
Tcl_ResetResult(interp);
|
|
Tcl_AppendResult(interp, "Error testing function: ", zErrFunction, 0);
|
|
return TCL_ERROR;
|
|
}
|
|
|
|
/*
|
|
** Register commands with the TCL interpreter.
|
|
*/
|
|
int Sqlitetest9_Init(Tcl_Interp *interp){
|
|
static struct {
|
|
char *zName;
|
|
Tcl_ObjCmdProc *xProc;
|
|
void *clientData;
|
|
} aObjCmd[] = {
|
|
{ "c_misuse_test", c_misuse_test, 0 },
|
|
{ "c_realloc_test", c_realloc_test, 0 },
|
|
{ "c_collation_test", c_collation_test, 0 },
|
|
};
|
|
int i;
|
|
for(i=0; i<sizeof(aObjCmd)/sizeof(aObjCmd[0]); i++){
|
|
Tcl_CreateObjCommand(interp, aObjCmd[i].zName,
|
|
aObjCmd[i].xProc, aObjCmd[i].clientData, 0);
|
|
}
|
|
return TCL_OK;
|
|
}
|