15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* 25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** 2001 September 15 35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** 45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** The author disclaims copyright to this source code. In place of 55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** a legal notice, here is a blessing: 65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** 75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** May you do good and not evil. 85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** May you find forgiveness for yourself and forgive others. 95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** May you share freely, never taking more than you give. 105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** 115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)************************************************************************* 125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** Code for testing the btree.c module in SQLite. This code 135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** is not included in the SQLite library. It is used for automated 145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** testing of the SQLite library. 155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)*/ 165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "sqliteInt.h" 175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "btreeInt.h" 185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "tcl.h" 195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <stdlib.h> 205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <string.h> 215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* 235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** Interpret an SQLite error number 245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)*/ 255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static char *errorName(int rc){ 265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) char *zName; 275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) switch( rc ){ 285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case SQLITE_OK: zName = "SQLITE_OK"; break; 295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case SQLITE_ERROR: zName = "SQLITE_ERROR"; break; 305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case SQLITE_PERM: zName = "SQLITE_PERM"; break; 315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case SQLITE_ABORT: zName = "SQLITE_ABORT"; break; 325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case SQLITE_BUSY: zName = "SQLITE_BUSY"; break; 335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case SQLITE_NOMEM: zName = "SQLITE_NOMEM"; break; 345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case SQLITE_READONLY: zName = "SQLITE_READONLY"; break; 355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case SQLITE_INTERRUPT: zName = "SQLITE_INTERRUPT"; break; 365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case SQLITE_IOERR: zName = "SQLITE_IOERR"; break; 375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case SQLITE_CORRUPT: zName = "SQLITE_CORRUPT"; break; 385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case SQLITE_FULL: zName = "SQLITE_FULL"; break; 395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case SQLITE_CANTOPEN: zName = "SQLITE_CANTOPEN"; break; 405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case SQLITE_PROTOCOL: zName = "SQLITE_PROTOCOL"; break; 415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case SQLITE_EMPTY: zName = "SQLITE_EMPTY"; break; 425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case SQLITE_LOCKED: zName = "SQLITE_LOCKED"; break; 435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) default: zName = "SQLITE_Unknown"; break; 445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return zName; 465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* 495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** A bogus sqlite3 connection structure for use in the btree 505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** tests. 515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)*/ 525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static sqlite3 sDb; 535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static int nRefSqlite3 = 0; 545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* 565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** Usage: btree_open FILENAME NCACHE 575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** 585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** Open a new database 595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)*/ 605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static int btree_open( 615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void *NotUsed, 625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Tcl_Interp *interp, /* The TCL interpreter that invoked this command */ 635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int argc, /* Number of arguments */ 645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const char **argv /* Text of each argument */ 655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)){ 665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Btree *pBt; 675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int rc, nCache; 685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) char zBuf[100]; 695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( argc!=3 ){ 705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Tcl_AppendResult(interp, "wrong # args: should be \"", argv[0], 715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) " FILENAME NCACHE FLAGS\"", 0); 725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return TCL_ERROR; 735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( Tcl_GetInt(interp, argv[2], &nCache) ) return TCL_ERROR; 755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) nRefSqlite3++; 765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( nRefSqlite3==1 ){ 775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sDb.pVfs = sqlite3_vfs_find(0); 785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sDb.mutex = sqlite3MutexAlloc(SQLITE_MUTEX_RECURSIVE); 795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3_mutex_enter(sDb.mutex); 805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) rc = sqlite3BtreeOpen(argv[1], &sDb, &pBt, 0, 825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SQLITE_OPEN_READWRITE | SQLITE_OPEN_CREATE | SQLITE_OPEN_MAIN_DB); 835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( rc!=SQLITE_OK ){ 845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Tcl_AppendResult(interp, errorName(rc), 0); 855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return TCL_ERROR; 865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3BtreeSetCacheSize(pBt, nCache); 885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3_snprintf(sizeof(zBuf), zBuf,"%p", pBt); 895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Tcl_AppendResult(interp, zBuf, 0); 905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return TCL_OK; 915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* 945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** Usage: btree_close ID 955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** 965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** Close the given database. 975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)*/ 985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static int btree_close( 995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void *NotUsed, 1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Tcl_Interp *interp, /* The TCL interpreter that invoked this command */ 1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int argc, /* Number of arguments */ 1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const char **argv /* Text of each argument */ 1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)){ 1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Btree *pBt; 1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int rc; 1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( argc!=2 ){ 1075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Tcl_AppendResult(interp, "wrong # args: should be \"", argv[0], 1085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) " ID\"", 0); 1095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return TCL_ERROR; 1105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pBt = sqlite3TestTextToPtr(argv[1]); 1125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) rc = sqlite3BtreeClose(pBt); 1135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( rc!=SQLITE_OK ){ 1145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Tcl_AppendResult(interp, errorName(rc), 0); 1155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return TCL_ERROR; 1165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) nRefSqlite3--; 1185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( nRefSqlite3==0 ){ 1195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3_mutex_leave(sDb.mutex); 1205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3_mutex_free(sDb.mutex); 1215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sDb.mutex = 0; 1225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sDb.pVfs = 0; 1235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return TCL_OK; 1255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* 1295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** Usage: btree_begin_transaction ID 1305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** 1315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** Start a new transaction 1325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)*/ 1335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static int btree_begin_transaction( 1345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void *NotUsed, 1355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Tcl_Interp *interp, /* The TCL interpreter that invoked this command */ 1365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int argc, /* Number of arguments */ 1375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const char **argv /* Text of each argument */ 1385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)){ 1395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Btree *pBt; 1405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int rc; 1415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( argc!=2 ){ 1425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Tcl_AppendResult(interp, "wrong # args: should be \"", argv[0], 1435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) " ID\"", 0); 1445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return TCL_ERROR; 1455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pBt = sqlite3TestTextToPtr(argv[1]); 1475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3BtreeEnter(pBt); 1485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) rc = sqlite3BtreeBeginTrans(pBt, 1); 1495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3BtreeLeave(pBt); 1505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( rc!=SQLITE_OK ){ 1515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Tcl_AppendResult(interp, errorName(rc), 0); 1525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return TCL_ERROR; 1535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return TCL_OK; 1555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* 1585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** Usage: btree_pager_stats ID 1595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** 1605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** Returns pager statistics 1615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)*/ 1625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static int btree_pager_stats( 1635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void *NotUsed, 1645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Tcl_Interp *interp, /* The TCL interpreter that invoked this command */ 1655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int argc, /* Number of arguments */ 1665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const char **argv /* Text of each argument */ 1675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)){ 1685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Btree *pBt; 1695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int i; 1705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int *a; 1715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( argc!=2 ){ 1735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Tcl_AppendResult(interp, "wrong # args: should be \"", argv[0], 1745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) " ID\"", 0); 1755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return TCL_ERROR; 1765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pBt = sqlite3TestTextToPtr(argv[1]); 1785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* Normally in this file, with a b-tree handle opened using the 1805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ** [btree_open] command it is safe to call sqlite3BtreeEnter() directly. 1815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ** But this function is sometimes called with a btree handle obtained 1825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ** from an open SQLite connection (using [btree_from_db]). In this case 1835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ** we need to obtain the mutex for the controlling SQLite handle before 1845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ** it is safe to call sqlite3BtreeEnter(). 1855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 1865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3_mutex_enter(pBt->db->mutex); 1875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3BtreeEnter(pBt); 1895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) a = sqlite3PagerStats(sqlite3BtreePager(pBt)); 1905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for(i=0; i<11; i++){ 1915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static char *zName[] = { 1925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "ref", "page", "max", "size", "state", "err", 1935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "hit", "miss", "ovfl", "read", "write" 1945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) }; 1955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) char zBuf[100]; 1965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Tcl_AppendElement(interp, zName[i]); 1975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3_snprintf(sizeof(zBuf), zBuf,"%d",a[i]); 1985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Tcl_AppendElement(interp, zBuf); 1995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 2005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3BtreeLeave(pBt); 2015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* Release the mutex on the SQLite handle that controls this b-tree */ 2035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3_mutex_leave(pBt->db->mutex); 2045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return TCL_OK; 2055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* 2085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** Usage: btree_cursor ID TABLENUM WRITEABLE 2095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** 2105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** Create a new cursor. Return the ID for the cursor. 2115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)*/ 2125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static int btree_cursor( 2135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void *NotUsed, 2145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Tcl_Interp *interp, /* The TCL interpreter that invoked this command */ 2155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int argc, /* Number of arguments */ 2165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const char **argv /* Text of each argument */ 2175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)){ 2185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Btree *pBt; 2195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int iTable; 2205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) BtCursor *pCur; 2215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int rc = SQLITE_OK; 2225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int wrFlag; 2235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) char zBuf[30]; 2245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( argc!=4 ){ 2265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Tcl_AppendResult(interp, "wrong # args: should be \"", argv[0], 2275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) " ID TABLENUM WRITEABLE\"", 0); 2285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return TCL_ERROR; 2295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 2305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pBt = sqlite3TestTextToPtr(argv[1]); 2315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( Tcl_GetInt(interp, argv[2], &iTable) ) return TCL_ERROR; 2325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( Tcl_GetBoolean(interp, argv[3], &wrFlag) ) return TCL_ERROR; 2335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pCur = (BtCursor *)ckalloc(sqlite3BtreeCursorSize()); 2345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) memset(pCur, 0, sqlite3BtreeCursorSize()); 2355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3BtreeEnter(pBt); 2365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifndef SQLITE_OMIT_SHARED_CACHE 2375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) rc = sqlite3BtreeLockTable(pBt, iTable, wrFlag); 2385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 2395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( rc==SQLITE_OK ){ 2405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) rc = sqlite3BtreeCursor(pBt, iTable, wrFlag, 0, pCur); 2415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 2425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3BtreeLeave(pBt); 2435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( rc ){ 2445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ckfree((char *)pCur); 2455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Tcl_AppendResult(interp, errorName(rc), 0); 2465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return TCL_ERROR; 2475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 2485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3_snprintf(sizeof(zBuf), zBuf,"%p", pCur); 2495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Tcl_AppendResult(interp, zBuf, 0); 2505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return SQLITE_OK; 2515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* 2545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** Usage: btree_close_cursor ID 2555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** 2565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** Close a cursor opened using btree_cursor. 2575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)*/ 2585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static int btree_close_cursor( 2595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void *NotUsed, 2605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Tcl_Interp *interp, /* The TCL interpreter that invoked this command */ 2615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int argc, /* Number of arguments */ 2625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const char **argv /* Text of each argument */ 2635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)){ 2645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) BtCursor *pCur; 2655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Btree *pBt; 2665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int rc; 2675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( argc!=2 ){ 2695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Tcl_AppendResult(interp, "wrong # args: should be \"", argv[0], 2705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) " ID\"", 0); 2715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return TCL_ERROR; 2725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 2735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pCur = sqlite3TestTextToPtr(argv[1]); 2745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pBt = pCur->pBtree; 2755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3BtreeEnter(pBt); 2765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) rc = sqlite3BtreeCloseCursor(pCur); 2775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3BtreeLeave(pBt); 2785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ckfree((char *)pCur); 2795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( rc ){ 2805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Tcl_AppendResult(interp, errorName(rc), 0); 2815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return TCL_ERROR; 2825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 2835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return SQLITE_OK; 2845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* 2875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** Usage: btree_next ID 2885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** 2895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** Move the cursor to the next entry in the table. Return 0 on success 2905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** or 1 if the cursor was already on the last entry in the table or if 2915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** the table is empty. 2925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)*/ 2935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static int btree_next( 2945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void *NotUsed, 2955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Tcl_Interp *interp, /* The TCL interpreter that invoked this command */ 2965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int argc, /* Number of arguments */ 2975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const char **argv /* Text of each argument */ 2985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)){ 2995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) BtCursor *pCur; 3005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int rc; 3015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int res = 0; 3025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) char zBuf[100]; 3035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( argc!=2 ){ 3055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Tcl_AppendResult(interp, "wrong # args: should be \"", argv[0], 3065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) " ID\"", 0); 3075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return TCL_ERROR; 3085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 3095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pCur = sqlite3TestTextToPtr(argv[1]); 3105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3BtreeEnter(pCur->pBtree); 3115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) rc = sqlite3BtreeNext(pCur, &res); 3125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3BtreeLeave(pCur->pBtree); 3135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( rc ){ 3145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Tcl_AppendResult(interp, errorName(rc), 0); 3155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return TCL_ERROR; 3165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 3175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3_snprintf(sizeof(zBuf),zBuf,"%d",res); 3185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Tcl_AppendResult(interp, zBuf, 0); 3195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return SQLITE_OK; 3205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 3215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* 3235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** Usage: btree_first ID 3245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** 3255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** Move the cursor to the first entry in the table. Return 0 if the 3265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** cursor was left point to something and 1 if the table is empty. 3275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)*/ 3285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static int btree_first( 3295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void *NotUsed, 3305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Tcl_Interp *interp, /* The TCL interpreter that invoked this command */ 3315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int argc, /* Number of arguments */ 3325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const char **argv /* Text of each argument */ 3335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)){ 3345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) BtCursor *pCur; 3355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int rc; 3365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int res = 0; 3375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) char zBuf[100]; 3385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( argc!=2 ){ 3405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Tcl_AppendResult(interp, "wrong # args: should be \"", argv[0], 3415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) " ID\"", 0); 3425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return TCL_ERROR; 3435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 3445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pCur = sqlite3TestTextToPtr(argv[1]); 3455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3BtreeEnter(pCur->pBtree); 3465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) rc = sqlite3BtreeFirst(pCur, &res); 3475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3BtreeLeave(pCur->pBtree); 3485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( rc ){ 3495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Tcl_AppendResult(interp, errorName(rc), 0); 3505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return TCL_ERROR; 3515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 3525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3_snprintf(sizeof(zBuf),zBuf,"%d",res); 3535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Tcl_AppendResult(interp, zBuf, 0); 3545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return SQLITE_OK; 3555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 3565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* 3585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** Usage: btree_eof ID 3595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** 3605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** Return TRUE if the given cursor is not pointing at a valid entry. 3615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** Return FALSE if the cursor does point to a valid entry. 3625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)*/ 3635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static int btree_eof( 3645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void *NotUsed, 3655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Tcl_Interp *interp, /* The TCL interpreter that invoked this command */ 3665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int argc, /* Number of arguments */ 3675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const char **argv /* Text of each argument */ 3685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)){ 3695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) BtCursor *pCur; 3705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int rc; 3715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) char zBuf[50]; 3725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( argc!=2 ){ 3745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Tcl_AppendResult(interp, "wrong # args: should be \"", argv[0], 3755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) " ID\"", 0); 3765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return TCL_ERROR; 3775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 3785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pCur = sqlite3TestTextToPtr(argv[1]); 3795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3BtreeEnter(pCur->pBtree); 3805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) rc = sqlite3BtreeEof(pCur); 3815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3BtreeLeave(pCur->pBtree); 3825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3_snprintf(sizeof(zBuf),zBuf, "%d", rc); 3835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Tcl_AppendResult(interp, zBuf, 0); 3845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return SQLITE_OK; 3855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 3865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* 3885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** Usage: btree_payload_size ID 3895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** 3905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** Return the number of bytes of payload 3915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)*/ 3925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static int btree_payload_size( 3935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void *NotUsed, 3945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Tcl_Interp *interp, /* The TCL interpreter that invoked this command */ 3955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int argc, /* Number of arguments */ 3965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const char **argv /* Text of each argument */ 3975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)){ 3985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) BtCursor *pCur; 3995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int n2; 4005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) u64 n1; 4015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) char zBuf[50]; 4025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( argc!=2 ){ 4045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Tcl_AppendResult(interp, "wrong # args: should be \"", argv[0], 4055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) " ID\"", 0); 4065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return TCL_ERROR; 4075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 4085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pCur = sqlite3TestTextToPtr(argv[1]); 4095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3BtreeEnter(pCur->pBtree); 4105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* The cursor may be in "require-seek" state. If this is the case, the 4125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ** call to BtreeDataSize() will fix it. */ 4135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3BtreeDataSize(pCur, (u32*)&n2); 4145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( pCur->apPage[pCur->iPage]->intKey ){ 4155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) n1 = 0; 4165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) }else{ 4175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3BtreeKeySize(pCur, (i64*)&n1); 4185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 4195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3BtreeLeave(pCur->pBtree); 4205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3_snprintf(sizeof(zBuf),zBuf, "%d", (int)(n1+n2)); 4215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Tcl_AppendResult(interp, zBuf, 0); 4225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return SQLITE_OK; 4235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 4245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* 4265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** usage: varint_test START MULTIPLIER COUNT INCREMENT 4275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** 4285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** This command tests the putVarint() and getVarint() 4295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** routines, both for accuracy and for speed. 4305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** 4315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** An integer is written using putVarint() and read back with 4325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** getVarint() and varified to be unchanged. This repeats COUNT 4335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** times. The first integer is START*MULTIPLIER. Each iteration 4345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** increases the integer by INCREMENT. 4355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** 4365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** This command returns nothing if it works. It returns an error message 4375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** if something goes wrong. 4385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)*/ 4395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static int btree_varint_test( 4405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void *NotUsed, 4415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Tcl_Interp *interp, /* The TCL interpreter that invoked this command */ 4425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int argc, /* Number of arguments */ 4435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const char **argv /* Text of each argument */ 4445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)){ 4455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) u32 start, mult, count, incr; 4465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) u64 in, out; 4475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int n1, n2, i, j; 4485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) unsigned char zBuf[100]; 4495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( argc!=5 ){ 4505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Tcl_AppendResult(interp, "wrong # args: should be \"", argv[0], 4515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) " START MULTIPLIER COUNT INCREMENT\"", 0); 4525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return TCL_ERROR; 4535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 4545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( Tcl_GetInt(interp, argv[1], (int*)&start) ) return TCL_ERROR; 4555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( Tcl_GetInt(interp, argv[2], (int*)&mult) ) return TCL_ERROR; 4565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( Tcl_GetInt(interp, argv[3], (int*)&count) ) return TCL_ERROR; 4575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( Tcl_GetInt(interp, argv[4], (int*)&incr) ) return TCL_ERROR; 4585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) in = start; 4595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) in *= mult; 4605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for(i=0; i<count; i++){ 4615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) char zErr[200]; 4625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) n1 = putVarint(zBuf, in); 4635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( n1>9 || n1<1 ){ 4645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sprintf(zErr, "putVarint returned %d - should be between 1 and 9", n1); 4655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Tcl_AppendResult(interp, zErr, 0); 4665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return TCL_ERROR; 4675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 4685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) n2 = getVarint(zBuf, &out); 4695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( n1!=n2 ){ 4705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sprintf(zErr, "putVarint returned %d and getVarint returned %d", n1, n2); 4715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Tcl_AppendResult(interp, zErr, 0); 4725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return TCL_ERROR; 4735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 4745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( in!=out ){ 4755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sprintf(zErr, "Wrote 0x%016llx and got back 0x%016llx", in, out); 4765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Tcl_AppendResult(interp, zErr, 0); 4775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return TCL_ERROR; 4785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 4795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( (in & 0xffffffff)==in ){ 4805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) u32 out32; 4815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) n2 = getVarint32(zBuf, out32); 4825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) out = out32; 4835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( n1!=n2 ){ 4845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sprintf(zErr, "putVarint returned %d and GetVarint32 returned %d", 4855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) n1, n2); 4865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Tcl_AppendResult(interp, zErr, 0); 4875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return TCL_ERROR; 4885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 4895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( in!=out ){ 4905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sprintf(zErr, "Wrote 0x%016llx and got back 0x%016llx from GetVarint32", 4915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) in, out); 4925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Tcl_AppendResult(interp, zErr, 0); 4935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return TCL_ERROR; 4945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 4955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 4965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* In order to get realistic timings, run getVarint 19 more times. 4985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ** This is because getVarint is called about 20 times more often 4995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ** than putVarint. 5005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 5015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for(j=0; j<19; j++){ 5025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) getVarint(zBuf, &out); 5035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 5045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) in += incr; 5055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 5065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return TCL_OK; 5075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 5085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* 5105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** usage: btree_from_db DB-HANDLE 5115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** 5125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** This command returns the btree handle for the main database associated 5135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** with the database-handle passed as the argument. Example usage: 5145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** 5155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** sqlite3 db test.db 5165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** set bt [btree_from_db db] 5175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)*/ 5185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static int btree_from_db( 5195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void *NotUsed, 5205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Tcl_Interp *interp, /* The TCL interpreter that invoked this command */ 5215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int argc, /* Number of arguments */ 5225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const char **argv /* Text of each argument */ 5235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)){ 5245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) char zBuf[100]; 5255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Tcl_CmdInfo info; 5265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3 *db; 5275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Btree *pBt; 5285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int iDb = 0; 5295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( argc!=2 && argc!=3 ){ 5315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Tcl_AppendResult(interp, "wrong # args: should be \"", argv[0], 5325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) " DB-HANDLE ?N?\"", 0); 5335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return TCL_ERROR; 5345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 5355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( 1!=Tcl_GetCommandInfo(interp, argv[1], &info) ){ 5375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Tcl_AppendResult(interp, "No such db-handle: \"", argv[1], "\"", 0); 5385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return TCL_ERROR; 5395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 5405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( argc==3 ){ 5415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) iDb = atoi(argv[2]); 5425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 5435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) db = *((sqlite3 **)info.objClientData); 5455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) assert( db ); 5465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pBt = db->aDb[iDb].pBt; 5485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3_snprintf(sizeof(zBuf), zBuf, "%p", pBt); 5495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Tcl_SetResult(interp, zBuf, TCL_VOLATILE); 5505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return TCL_OK; 5515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 5525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* 5545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** Usage: btree_ismemdb ID 5555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** 5565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** Return true if the B-Tree is in-memory. 5575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)*/ 5585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static int btree_ismemdb( 5595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void *NotUsed, 5605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Tcl_Interp *interp, /* The TCL interpreter that invoked this command */ 5615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int argc, /* Number of arguments */ 5625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const char **argv /* Text of each argument */ 5635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)){ 5645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Btree *pBt; 5655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int res; 5665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( argc!=2 ){ 5685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Tcl_AppendResult(interp, "wrong # args: should be \"", argv[0], 5695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) " ID\"", 0); 5705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return TCL_ERROR; 5715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 5725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pBt = sqlite3TestTextToPtr(argv[1]); 5735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3_mutex_enter(pBt->db->mutex); 5745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3BtreeEnter(pBt); 5755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) res = sqlite3PagerIsMemdb(sqlite3BtreePager(pBt)); 5765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3BtreeLeave(pBt); 5775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3_mutex_leave(pBt->db->mutex); 5785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Tcl_SetObjResult(interp, Tcl_NewBooleanObj(res)); 5795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return SQLITE_OK; 5805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 5815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* 5835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** usage: btree_set_cache_size ID NCACHE 5845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** 5855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** Set the size of the cache used by btree $ID. 5865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)*/ 5875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static int btree_set_cache_size( 5885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void *NotUsed, 5895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Tcl_Interp *interp, /* The TCL interpreter that invoked this command */ 5905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int argc, /* Number of arguments */ 5915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const char **argv /* Text of each argument */ 5925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)){ 5935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int nCache; 5945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Btree *pBt; 5955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( argc!=3 ){ 5975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Tcl_AppendResult( 5985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) interp, "wrong # args: should be \"", argv[0], " BT NCACHE\"", 0); 5995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return TCL_ERROR; 6005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 6015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pBt = sqlite3TestTextToPtr(argv[1]); 6025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( Tcl_GetInt(interp, argv[2], &nCache) ) return TCL_ERROR; 6035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3_mutex_enter(pBt->db->mutex); 6055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3BtreeEnter(pBt); 6065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3BtreeSetCacheSize(pBt, nCache); 6075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3BtreeLeave(pBt); 6085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3_mutex_leave(pBt->db->mutex); 6095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return TCL_OK; 6105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 6115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* 6155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** Register commands with the TCL interpreter. 6165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)*/ 6175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)int Sqlitetest3_Init(Tcl_Interp *interp){ 6185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static struct { 6195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) char *zName; 6205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Tcl_CmdProc *xProc; 6215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } aCmd[] = { 6225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { "btree_open", (Tcl_CmdProc*)btree_open }, 6235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { "btree_close", (Tcl_CmdProc*)btree_close }, 6245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { "btree_begin_transaction", (Tcl_CmdProc*)btree_begin_transaction }, 6255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { "btree_pager_stats", (Tcl_CmdProc*)btree_pager_stats }, 6265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { "btree_cursor", (Tcl_CmdProc*)btree_cursor }, 6275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { "btree_close_cursor", (Tcl_CmdProc*)btree_close_cursor }, 6285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { "btree_next", (Tcl_CmdProc*)btree_next }, 6295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { "btree_eof", (Tcl_CmdProc*)btree_eof }, 6305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { "btree_payload_size", (Tcl_CmdProc*)btree_payload_size }, 6315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { "btree_first", (Tcl_CmdProc*)btree_first }, 6325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { "btree_varint_test", (Tcl_CmdProc*)btree_varint_test }, 6335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { "btree_from_db", (Tcl_CmdProc*)btree_from_db }, 6345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { "btree_ismemdb", (Tcl_CmdProc*)btree_ismemdb }, 6355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { "btree_set_cache_size", (Tcl_CmdProc*)btree_set_cache_size } 6365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) }; 6375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int i; 6385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for(i=0; i<sizeof(aCmd)/sizeof(aCmd[0]); i++){ 6405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Tcl_CreateCommand(interp, aCmd[i].zName, aCmd[i].xProc, 0, 0); 6415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 6425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return TCL_OK; 6445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 645