summaryrefslogtreecommitdiffstats
path: root/lib/libsqlite3/src/test3.c
diff options
context:
space:
mode:
Diffstat (limited to 'lib/libsqlite3/src/test3.c')
-rw-r--r--lib/libsqlite3/src/test3.c633
1 files changed, 0 insertions, 633 deletions
diff --git a/lib/libsqlite3/src/test3.c b/lib/libsqlite3/src/test3.c
deleted file mode 100644
index 07d12d28c03..00000000000
--- a/lib/libsqlite3/src/test3.c
+++ /dev/null
@@ -1,633 +0,0 @@
-/*
-** 2001 September 15
-**
-** 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.
-**
-*************************************************************************
-** Code for testing the btree.c module in SQLite. This code
-** is not included in the SQLite library. It is used for automated
-** testing of the SQLite library.
-*/
-#include "sqliteInt.h"
-#include "btreeInt.h"
-#include "tcl.h"
-#include <stdlib.h>
-#include <string.h>
-
-extern const char *sqlite3ErrName(int);
-
-/*
-** A bogus sqlite3 connection structure for use in the btree
-** tests.
-*/
-static sqlite3 sDb;
-static int nRefSqlite3 = 0;
-
-/*
-** Usage: btree_open FILENAME NCACHE
-**
-** Open a new database
-*/
-static int btree_open(
- void *NotUsed,
- Tcl_Interp *interp, /* The TCL interpreter that invoked this command */
- int argc, /* Number of arguments */
- const char **argv /* Text of each argument */
-){
- Btree *pBt;
- int rc, nCache;
- char zBuf[100];
- int n;
- char *zFilename;
- if( argc!=3 ){
- Tcl_AppendResult(interp, "wrong # args: should be \"", argv[0],
- " FILENAME NCACHE FLAGS\"", 0);
- return TCL_ERROR;
- }
- if( Tcl_GetInt(interp, argv[2], &nCache) ) return TCL_ERROR;
- nRefSqlite3++;
- if( nRefSqlite3==1 ){
- sDb.pVfs = sqlite3_vfs_find(0);
- sDb.mutex = sqlite3MutexAlloc(SQLITE_MUTEX_RECURSIVE);
- sqlite3_mutex_enter(sDb.mutex);
- }
- n = (int)strlen(argv[1]);
- zFilename = sqlite3_malloc( n+2 );
- if( zFilename==0 ) return TCL_ERROR;
- memcpy(zFilename, argv[1], n+1);
- zFilename[n+1] = 0;
- rc = sqlite3BtreeOpen(sDb.pVfs, zFilename, &sDb, &pBt, 0,
- SQLITE_OPEN_READWRITE | SQLITE_OPEN_CREATE | SQLITE_OPEN_MAIN_DB);
- sqlite3_free(zFilename);
- if( rc!=SQLITE_OK ){
- Tcl_AppendResult(interp, sqlite3ErrName(rc), 0);
- return TCL_ERROR;
- }
- sqlite3BtreeSetCacheSize(pBt, nCache);
- sqlite3_snprintf(sizeof(zBuf), zBuf,"%p", pBt);
- Tcl_AppendResult(interp, zBuf, 0);
- return TCL_OK;
-}
-
-/*
-** Usage: btree_close ID
-**
-** Close the given database.
-*/
-static int btree_close(
- void *NotUsed,
- Tcl_Interp *interp, /* The TCL interpreter that invoked this command */
- int argc, /* Number of arguments */
- const char **argv /* Text of each argument */
-){
- Btree *pBt;
- int rc;
- if( argc!=2 ){
- Tcl_AppendResult(interp, "wrong # args: should be \"", argv[0],
- " ID\"", 0);
- return TCL_ERROR;
- }
- pBt = sqlite3TestTextToPtr(argv[1]);
- rc = sqlite3BtreeClose(pBt);
- if( rc!=SQLITE_OK ){
- Tcl_AppendResult(interp, sqlite3ErrName(rc), 0);
- return TCL_ERROR;
- }
- nRefSqlite3--;
- if( nRefSqlite3==0 ){
- sqlite3_mutex_leave(sDb.mutex);
- sqlite3_mutex_free(sDb.mutex);
- sDb.mutex = 0;
- sDb.pVfs = 0;
- }
- return TCL_OK;
-}
-
-
-/*
-** Usage: btree_begin_transaction ID
-**
-** Start a new transaction
-*/
-static int btree_begin_transaction(
- void *NotUsed,
- Tcl_Interp *interp, /* The TCL interpreter that invoked this command */
- int argc, /* Number of arguments */
- const char **argv /* Text of each argument */
-){
- Btree *pBt;
- int rc;
- if( argc!=2 ){
- Tcl_AppendResult(interp, "wrong # args: should be \"", argv[0],
- " ID\"", 0);
- return TCL_ERROR;
- }
- pBt = sqlite3TestTextToPtr(argv[1]);
- sqlite3BtreeEnter(pBt);
- rc = sqlite3BtreeBeginTrans(pBt, 1);
- sqlite3BtreeLeave(pBt);
- if( rc!=SQLITE_OK ){
- Tcl_AppendResult(interp, sqlite3ErrName(rc), 0);
- return TCL_ERROR;
- }
- return TCL_OK;
-}
-
-/*
-** Usage: btree_pager_stats ID
-**
-** Returns pager statistics
-*/
-static int btree_pager_stats(
- void *NotUsed,
- Tcl_Interp *interp, /* The TCL interpreter that invoked this command */
- int argc, /* Number of arguments */
- const char **argv /* Text of each argument */
-){
- Btree *pBt;
- int i;
- int *a;
-
- if( argc!=2 ){
- Tcl_AppendResult(interp, "wrong # args: should be \"", argv[0],
- " ID\"", 0);
- return TCL_ERROR;
- }
- pBt = sqlite3TestTextToPtr(argv[1]);
-
- /* Normally in this file, with a b-tree handle opened using the
- ** [btree_open] command it is safe to call sqlite3BtreeEnter() directly.
- ** But this function is sometimes called with a btree handle obtained
- ** from an open SQLite connection (using [btree_from_db]). In this case
- ** we need to obtain the mutex for the controlling SQLite handle before
- ** it is safe to call sqlite3BtreeEnter().
- */
- sqlite3_mutex_enter(pBt->db->mutex);
-
- sqlite3BtreeEnter(pBt);
- a = sqlite3PagerStats(sqlite3BtreePager(pBt));
- for(i=0; i<11; i++){
- static char *zName[] = {
- "ref", "page", "max", "size", "state", "err",
- "hit", "miss", "ovfl", "read", "write"
- };
- char zBuf[100];
- Tcl_AppendElement(interp, zName[i]);
- sqlite3_snprintf(sizeof(zBuf), zBuf,"%d",a[i]);
- Tcl_AppendElement(interp, zBuf);
- }
- sqlite3BtreeLeave(pBt);
-
- /* Release the mutex on the SQLite handle that controls this b-tree */
- sqlite3_mutex_leave(pBt->db->mutex);
- return TCL_OK;
-}
-
-/*
-** Usage: btree_cursor ID TABLENUM WRITEABLE
-**
-** Create a new cursor. Return the ID for the cursor.
-*/
-static int btree_cursor(
- void *NotUsed,
- Tcl_Interp *interp, /* The TCL interpreter that invoked this command */
- int argc, /* Number of arguments */
- const char **argv /* Text of each argument */
-){
- Btree *pBt;
- int iTable;
- BtCursor *pCur;
- int rc = SQLITE_OK;
- int wrFlag;
- char zBuf[30];
-
- if( argc!=4 ){
- Tcl_AppendResult(interp, "wrong # args: should be \"", argv[0],
- " ID TABLENUM WRITEABLE\"", 0);
- return TCL_ERROR;
- }
- pBt = sqlite3TestTextToPtr(argv[1]);
- if( Tcl_GetInt(interp, argv[2], &iTable) ) return TCL_ERROR;
- if( Tcl_GetBoolean(interp, argv[3], &wrFlag) ) return TCL_ERROR;
- pCur = (BtCursor *)ckalloc(sqlite3BtreeCursorSize());
- memset(pCur, 0, sqlite3BtreeCursorSize());
- sqlite3BtreeEnter(pBt);
-#ifndef SQLITE_OMIT_SHARED_CACHE
- rc = sqlite3BtreeLockTable(pBt, iTable, wrFlag);
-#endif
- if( rc==SQLITE_OK ){
- rc = sqlite3BtreeCursor(pBt, iTable, wrFlag, 0, pCur);
- }
- sqlite3BtreeLeave(pBt);
- if( rc ){
- ckfree((char *)pCur);
- Tcl_AppendResult(interp, sqlite3ErrName(rc), 0);
- return TCL_ERROR;
- }
- sqlite3_snprintf(sizeof(zBuf), zBuf,"%p", pCur);
- Tcl_AppendResult(interp, zBuf, 0);
- return SQLITE_OK;
-}
-
-/*
-** Usage: btree_close_cursor ID
-**
-** Close a cursor opened using btree_cursor.
-*/
-static int btree_close_cursor(
- void *NotUsed,
- Tcl_Interp *interp, /* The TCL interpreter that invoked this command */
- int argc, /* Number of arguments */
- const char **argv /* Text of each argument */
-){
- BtCursor *pCur;
- Btree *pBt;
- int rc;
-
- if( argc!=2 ){
- Tcl_AppendResult(interp, "wrong # args: should be \"", argv[0],
- " ID\"", 0);
- return TCL_ERROR;
- }
- pCur = sqlite3TestTextToPtr(argv[1]);
- pBt = pCur->pBtree;
- sqlite3BtreeEnter(pBt);
- rc = sqlite3BtreeCloseCursor(pCur);
- sqlite3BtreeLeave(pBt);
- ckfree((char *)pCur);
- if( rc ){
- Tcl_AppendResult(interp, sqlite3ErrName(rc), 0);
- return TCL_ERROR;
- }
- return SQLITE_OK;
-}
-
-/*
-** Usage: btree_next ID
-**
-** Move the cursor to the next entry in the table. Return 0 on success
-** or 1 if the cursor was already on the last entry in the table or if
-** the table is empty.
-*/
-static int btree_next(
- void *NotUsed,
- Tcl_Interp *interp, /* The TCL interpreter that invoked this command */
- int argc, /* Number of arguments */
- const char **argv /* Text of each argument */
-){
- BtCursor *pCur;
- int rc;
- int res = 0;
- char zBuf[100];
-
- if( argc!=2 ){
- Tcl_AppendResult(interp, "wrong # args: should be \"", argv[0],
- " ID\"", 0);
- return TCL_ERROR;
- }
- pCur = sqlite3TestTextToPtr(argv[1]);
- sqlite3BtreeEnter(pCur->pBtree);
- rc = sqlite3BtreeNext(pCur, &res);
- sqlite3BtreeLeave(pCur->pBtree);
- if( rc ){
- Tcl_AppendResult(interp, sqlite3ErrName(rc), 0);
- return TCL_ERROR;
- }
- sqlite3_snprintf(sizeof(zBuf),zBuf,"%d",res);
- Tcl_AppendResult(interp, zBuf, 0);
- return SQLITE_OK;
-}
-
-/*
-** Usage: btree_first ID
-**
-** Move the cursor to the first entry in the table. Return 0 if the
-** cursor was left point to something and 1 if the table is empty.
-*/
-static int btree_first(
- void *NotUsed,
- Tcl_Interp *interp, /* The TCL interpreter that invoked this command */
- int argc, /* Number of arguments */
- const char **argv /* Text of each argument */
-){
- BtCursor *pCur;
- int rc;
- int res = 0;
- char zBuf[100];
-
- if( argc!=2 ){
- Tcl_AppendResult(interp, "wrong # args: should be \"", argv[0],
- " ID\"", 0);
- return TCL_ERROR;
- }
- pCur = sqlite3TestTextToPtr(argv[1]);
- sqlite3BtreeEnter(pCur->pBtree);
- rc = sqlite3BtreeFirst(pCur, &res);
- sqlite3BtreeLeave(pCur->pBtree);
- if( rc ){
- Tcl_AppendResult(interp, sqlite3ErrName(rc), 0);
- return TCL_ERROR;
- }
- sqlite3_snprintf(sizeof(zBuf),zBuf,"%d",res);
- Tcl_AppendResult(interp, zBuf, 0);
- return SQLITE_OK;
-}
-
-/*
-** Usage: btree_eof ID
-**
-** Return TRUE if the given cursor is not pointing at a valid entry.
-** Return FALSE if the cursor does point to a valid entry.
-*/
-static int btree_eof(
- void *NotUsed,
- Tcl_Interp *interp, /* The TCL interpreter that invoked this command */
- int argc, /* Number of arguments */
- const char **argv /* Text of each argument */
-){
- BtCursor *pCur;
- int rc;
- char zBuf[50];
-
- if( argc!=2 ){
- Tcl_AppendResult(interp, "wrong # args: should be \"", argv[0],
- " ID\"", 0);
- return TCL_ERROR;
- }
- pCur = sqlite3TestTextToPtr(argv[1]);
- sqlite3BtreeEnter(pCur->pBtree);
- rc = sqlite3BtreeEof(pCur);
- sqlite3BtreeLeave(pCur->pBtree);
- sqlite3_snprintf(sizeof(zBuf),zBuf, "%d", rc);
- Tcl_AppendResult(interp, zBuf, 0);
- return SQLITE_OK;
-}
-
-/*
-** Usage: btree_payload_size ID
-**
-** Return the number of bytes of payload
-*/
-static int btree_payload_size(
- void *NotUsed,
- Tcl_Interp *interp, /* The TCL interpreter that invoked this command */
- int argc, /* Number of arguments */
- const char **argv /* Text of each argument */
-){
- BtCursor *pCur;
- int n2;
- u64 n1;
- char zBuf[50];
-
- if( argc!=2 ){
- Tcl_AppendResult(interp, "wrong # args: should be \"", argv[0],
- " ID\"", 0);
- return TCL_ERROR;
- }
- pCur = sqlite3TestTextToPtr(argv[1]);
- sqlite3BtreeEnter(pCur->pBtree);
-
- /* The cursor may be in "require-seek" state. If this is the case, the
- ** call to BtreeDataSize() will fix it. */
- sqlite3BtreeDataSize(pCur, (u32*)&n2);
- if( pCur->apPage[pCur->iPage]->intKey ){
- n1 = 0;
- }else{
- sqlite3BtreeKeySize(pCur, (i64*)&n1);
- }
- sqlite3BtreeLeave(pCur->pBtree);
- sqlite3_snprintf(sizeof(zBuf),zBuf, "%d", (int)(n1+n2));
- Tcl_AppendResult(interp, zBuf, 0);
- return SQLITE_OK;
-}
-
-/*
-** usage: varint_test START MULTIPLIER COUNT INCREMENT
-**
-** This command tests the putVarint() and getVarint()
-** routines, both for accuracy and for speed.
-**
-** An integer is written using putVarint() and read back with
-** getVarint() and varified to be unchanged. This repeats COUNT
-** times. The first integer is START*MULTIPLIER. Each iteration
-** increases the integer by INCREMENT.
-**
-** This command returns nothing if it works. It returns an error message
-** if something goes wrong.
-*/
-static int btree_varint_test(
- void *NotUsed,
- Tcl_Interp *interp, /* The TCL interpreter that invoked this command */
- int argc, /* Number of arguments */
- const char **argv /* Text of each argument */
-){
- u32 start, mult, count, incr;
- u64 in, out;
- int n1, n2, i, j;
- unsigned char zBuf[100];
- if( argc!=5 ){
- Tcl_AppendResult(interp, "wrong # args: should be \"", argv[0],
- " START MULTIPLIER COUNT INCREMENT\"", 0);
- return TCL_ERROR;
- }
- if( Tcl_GetInt(interp, argv[1], (int*)&start) ) return TCL_ERROR;
- if( Tcl_GetInt(interp, argv[2], (int*)&mult) ) return TCL_ERROR;
- if( Tcl_GetInt(interp, argv[3], (int*)&count) ) return TCL_ERROR;
- if( Tcl_GetInt(interp, argv[4], (int*)&incr) ) return TCL_ERROR;
- in = start;
- in *= mult;
- for(i=0; i<(int)count; i++){
- char zErr[200];
- n1 = putVarint(zBuf, in);
- if( n1>9 || n1<1 ){
- sqlite3_snprintf(sizeof(zErr), zErr,
- "putVarint returned %d - should be between 1 and 9", n1);
- Tcl_AppendResult(interp, zErr, 0);
- return TCL_ERROR;
- }
- n2 = getVarint(zBuf, &out);
- if( n1!=n2 ){
- sqlite3_snprintf(sizeof(zErr), zErr,
- "putVarint returned %d and getVarint returned %d", n1, n2);
- Tcl_AppendResult(interp, zErr, 0);
- return TCL_ERROR;
- }
- if( in!=out ){
- sqlite3_snprintf(sizeof(zErr), zErr,
- "Wrote 0x%016llx and got back 0x%016llx", in, out);
- Tcl_AppendResult(interp, zErr, 0);
- return TCL_ERROR;
- }
- if( (in & 0xffffffff)==in ){
- u32 out32;
- n2 = getVarint32(zBuf, out32);
- out = out32;
- if( n1!=n2 ){
- sqlite3_snprintf(sizeof(zErr), zErr,
- "putVarint returned %d and GetVarint32 returned %d",
- n1, n2);
- Tcl_AppendResult(interp, zErr, 0);
- return TCL_ERROR;
- }
- if( in!=out ){
- sqlite3_snprintf(sizeof(zErr), zErr,
- "Wrote 0x%016llx and got back 0x%016llx from GetVarint32",
- in, out);
- Tcl_AppendResult(interp, zErr, 0);
- return TCL_ERROR;
- }
- }
-
- /* In order to get realistic timings, run getVarint 19 more times.
- ** This is because getVarint is called about 20 times more often
- ** than putVarint.
- */
- for(j=0; j<19; j++){
- getVarint(zBuf, &out);
- }
- in += incr;
- }
- return TCL_OK;
-}
-
-/*
-** usage: btree_from_db DB-HANDLE
-**
-** This command returns the btree handle for the main database associated
-** with the database-handle passed as the argument. Example usage:
-**
-** sqlite3 db test.db
-** set bt [btree_from_db db]
-*/
-static int btree_from_db(
- void *NotUsed,
- Tcl_Interp *interp, /* The TCL interpreter that invoked this command */
- int argc, /* Number of arguments */
- const char **argv /* Text of each argument */
-){
- char zBuf[100];
- Tcl_CmdInfo info;
- sqlite3 *db;
- Btree *pBt;
- int iDb = 0;
-
- if( argc!=2 && argc!=3 ){
- Tcl_AppendResult(interp, "wrong # args: should be \"", argv[0],
- " DB-HANDLE ?N?\"", 0);
- return TCL_ERROR;
- }
-
- if( 1!=Tcl_GetCommandInfo(interp, argv[1], &info) ){
- Tcl_AppendResult(interp, "No such db-handle: \"", argv[1], "\"", 0);
- return TCL_ERROR;
- }
- if( argc==3 ){
- iDb = atoi(argv[2]);
- }
-
- db = *((sqlite3 **)info.objClientData);
- assert( db );
-
- pBt = db->aDb[iDb].pBt;
- sqlite3_snprintf(sizeof(zBuf), zBuf, "%p", pBt);
- Tcl_SetResult(interp, zBuf, TCL_VOLATILE);
- return TCL_OK;
-}
-
-/*
-** Usage: btree_ismemdb ID
-**
-** Return true if the B-Tree is in-memory.
-*/
-static int btree_ismemdb(
- void *NotUsed,
- Tcl_Interp *interp, /* The TCL interpreter that invoked this command */
- int argc, /* Number of arguments */
- const char **argv /* Text of each argument */
-){
- Btree *pBt;
- int res;
-
- if( argc!=2 ){
- Tcl_AppendResult(interp, "wrong # args: should be \"", argv[0],
- " ID\"", 0);
- return TCL_ERROR;
- }
- pBt = sqlite3TestTextToPtr(argv[1]);
- sqlite3_mutex_enter(pBt->db->mutex);
- sqlite3BtreeEnter(pBt);
- res = sqlite3PagerIsMemdb(sqlite3BtreePager(pBt));
- sqlite3BtreeLeave(pBt);
- sqlite3_mutex_leave(pBt->db->mutex);
- Tcl_SetObjResult(interp, Tcl_NewBooleanObj(res));
- return SQLITE_OK;
-}
-
-/*
-** usage: btree_set_cache_size ID NCACHE
-**
-** Set the size of the cache used by btree $ID.
-*/
-static int btree_set_cache_size(
- void *NotUsed,
- Tcl_Interp *interp, /* The TCL interpreter that invoked this command */
- int argc, /* Number of arguments */
- const char **argv /* Text of each argument */
-){
- int nCache;
- Btree *pBt;
-
- if( argc!=3 ){
- Tcl_AppendResult(
- interp, "wrong # args: should be \"", argv[0], " BT NCACHE\"", 0);
- return TCL_ERROR;
- }
- pBt = sqlite3TestTextToPtr(argv[1]);
- if( Tcl_GetInt(interp, argv[2], &nCache) ) return TCL_ERROR;
-
- sqlite3_mutex_enter(pBt->db->mutex);
- sqlite3BtreeEnter(pBt);
- sqlite3BtreeSetCacheSize(pBt, nCache);
- sqlite3BtreeLeave(pBt);
- sqlite3_mutex_leave(pBt->db->mutex);
- return TCL_OK;
-}
-
-
-
-/*
-** Register commands with the TCL interpreter.
-*/
-int Sqlitetest3_Init(Tcl_Interp *interp){
- static struct {
- char *zName;
- Tcl_CmdProc *xProc;
- } aCmd[] = {
- { "btree_open", (Tcl_CmdProc*)btree_open },
- { "btree_close", (Tcl_CmdProc*)btree_close },
- { "btree_begin_transaction", (Tcl_CmdProc*)btree_begin_transaction },
- { "btree_pager_stats", (Tcl_CmdProc*)btree_pager_stats },
- { "btree_cursor", (Tcl_CmdProc*)btree_cursor },
- { "btree_close_cursor", (Tcl_CmdProc*)btree_close_cursor },
- { "btree_next", (Tcl_CmdProc*)btree_next },
- { "btree_eof", (Tcl_CmdProc*)btree_eof },
- { "btree_payload_size", (Tcl_CmdProc*)btree_payload_size },
- { "btree_first", (Tcl_CmdProc*)btree_first },
- { "btree_varint_test", (Tcl_CmdProc*)btree_varint_test },
- { "btree_from_db", (Tcl_CmdProc*)btree_from_db },
- { "btree_ismemdb", (Tcl_CmdProc*)btree_ismemdb },
- { "btree_set_cache_size", (Tcl_CmdProc*)btree_set_cache_size }
- };
- int i;
-
- for(i=0; i<sizeof(aCmd)/sizeof(aCmd[0]); i++){
- Tcl_CreateCommand(interp, aCmd[i].zName, aCmd[i].xProc, 0, 0);
- }
-
- return TCL_OK;
-}