1.1 --- /dev/null Thu Jan 01 00:00:00 1970 +0000
1.2 +++ b/os/persistentdata/persistentstorage/sqlite3api/TEST/SRC/test2.c Fri Jun 15 03:10:57 2012 +0200
1.3 @@ -0,0 +1,659 @@
1.4 +/*
1.5 +** 2001 September 15
1.6 +**
1.7 +** The author disclaims copyright to this source code. In place of
1.8 +** a legal notice, here is a blessing:
1.9 +**
1.10 +** May you do good and not evil.
1.11 +** May you find forgiveness for yourself and forgive others.
1.12 +** May you share freely, never taking more than you give.
1.13 +**
1.14 +*************************************************************************
1.15 +** Code for testing the pager.c module in SQLite. This code
1.16 +** is not included in the SQLite library. It is used for automated
1.17 +** testing of the SQLite library.
1.18 +**
1.19 +** $Id: test2.c,v 1.62 2008/09/29 11:49:48 danielk1977 Exp $
1.20 +*/
1.21 +#include "sqliteInt.h"
1.22 +#include "tcl.h"
1.23 +#include <stdlib.h>
1.24 +#include <string.h>
1.25 +#include <ctype.h>
1.26 +
1.27 +/*
1.28 +** Interpret an SQLite error number
1.29 +*/
1.30 +static char *errorName(int rc){
1.31 + char *zName;
1.32 + switch( rc ){
1.33 + case SQLITE_OK: zName = "SQLITE_OK"; break;
1.34 + case SQLITE_ERROR: zName = "SQLITE_ERROR"; break;
1.35 + case SQLITE_PERM: zName = "SQLITE_PERM"; break;
1.36 + case SQLITE_ABORT: zName = "SQLITE_ABORT"; break;
1.37 + case SQLITE_BUSY: zName = "SQLITE_BUSY"; break;
1.38 + case SQLITE_NOMEM: zName = "SQLITE_NOMEM"; break;
1.39 + case SQLITE_READONLY: zName = "SQLITE_READONLY"; break;
1.40 + case SQLITE_INTERRUPT: zName = "SQLITE_INTERRUPT"; break;
1.41 + case SQLITE_IOERR: zName = "SQLITE_IOERR"; break;
1.42 + case SQLITE_CORRUPT: zName = "SQLITE_CORRUPT"; break;
1.43 + case SQLITE_FULL: zName = "SQLITE_FULL"; break;
1.44 + case SQLITE_CANTOPEN: zName = "SQLITE_CANTOPEN"; break;
1.45 + case SQLITE_PROTOCOL: zName = "SQLITE_PROTOCOL"; break;
1.46 + case SQLITE_EMPTY: zName = "SQLITE_EMPTY"; break;
1.47 + case SQLITE_SCHEMA: zName = "SQLITE_SCHEMA"; break;
1.48 + case SQLITE_CONSTRAINT: zName = "SQLITE_CONSTRAINT"; break;
1.49 + case SQLITE_MISMATCH: zName = "SQLITE_MISMATCH"; break;
1.50 + case SQLITE_MISUSE: zName = "SQLITE_MISUSE"; break;
1.51 + case SQLITE_NOLFS: zName = "SQLITE_NOLFS"; break;
1.52 + default: zName = "SQLITE_Unknown"; break;
1.53 + }
1.54 + return zName;
1.55 +}
1.56 +
1.57 +/*
1.58 +** Page size and reserved size used for testing.
1.59 +*/
1.60 +static int test_pagesize = 1024;
1.61 +
1.62 +/*
1.63 +** Usage: pager_open FILENAME N-PAGE
1.64 +**
1.65 +** Open a new pager
1.66 +*/
1.67 +static int pager_open(
1.68 + void *NotUsed,
1.69 + Tcl_Interp *interp, /* The TCL interpreter that invoked this command */
1.70 + int argc, /* Number of arguments */
1.71 + const char **argv /* Text of each argument */
1.72 +){
1.73 + u16 pageSize;
1.74 + Pager *pPager;
1.75 + int nPage;
1.76 + int rc;
1.77 + char zBuf[100];
1.78 + if( argc!=3 ){
1.79 + Tcl_AppendResult(interp, "wrong # args: should be \"", argv[0],
1.80 + " FILENAME N-PAGE\"", 0);
1.81 + return TCL_ERROR;
1.82 + }
1.83 + if( Tcl_GetInt(interp, argv[2], &nPage) ) return TCL_ERROR;
1.84 + rc = sqlite3PagerOpen(sqlite3_vfs_find(0), &pPager, argv[1], 0, 0,
1.85 + SQLITE_OPEN_READWRITE | SQLITE_OPEN_CREATE | SQLITE_OPEN_MAIN_DB);
1.86 + if( rc!=SQLITE_OK ){
1.87 + Tcl_AppendResult(interp, errorName(rc), 0);
1.88 + return TCL_ERROR;
1.89 + }
1.90 + sqlite3PagerSetCachesize(pPager, nPage);
1.91 + pageSize = test_pagesize;
1.92 + sqlite3PagerSetPagesize(pPager, &pageSize);
1.93 + sqlite3_snprintf(sizeof(zBuf),zBuf,"%p",pPager);
1.94 + Tcl_AppendResult(interp, zBuf, 0);
1.95 + return TCL_OK;
1.96 +}
1.97 +
1.98 +/*
1.99 +** Usage: pager_close ID
1.100 +**
1.101 +** Close the given pager.
1.102 +*/
1.103 +static int pager_close(
1.104 + void *NotUsed,
1.105 + Tcl_Interp *interp, /* The TCL interpreter that invoked this command */
1.106 + int argc, /* Number of arguments */
1.107 + const char **argv /* Text of each argument */
1.108 +){
1.109 + Pager *pPager;
1.110 + int rc;
1.111 + if( argc!=2 ){
1.112 + Tcl_AppendResult(interp, "wrong # args: should be \"", argv[0],
1.113 + " ID\"", 0);
1.114 + return TCL_ERROR;
1.115 + }
1.116 + pPager = sqlite3TestTextToPtr(argv[1]);
1.117 + rc = sqlite3PagerClose(pPager);
1.118 + if( rc!=SQLITE_OK ){
1.119 + Tcl_AppendResult(interp, errorName(rc), 0);
1.120 + return TCL_ERROR;
1.121 + }
1.122 + return TCL_OK;
1.123 +}
1.124 +
1.125 +/*
1.126 +** Usage: pager_rollback ID
1.127 +**
1.128 +** Rollback changes
1.129 +*/
1.130 +static int pager_rollback(
1.131 + void *NotUsed,
1.132 + Tcl_Interp *interp, /* The TCL interpreter that invoked this command */
1.133 + int argc, /* Number of arguments */
1.134 + const char **argv /* Text of each argument */
1.135 +){
1.136 + Pager *pPager;
1.137 + int rc;
1.138 + if( argc!=2 ){
1.139 + Tcl_AppendResult(interp, "wrong # args: should be \"", argv[0],
1.140 + " ID\"", 0);
1.141 + return TCL_ERROR;
1.142 + }
1.143 + pPager = sqlite3TestTextToPtr(argv[1]);
1.144 + rc = sqlite3PagerRollback(pPager);
1.145 + if( rc!=SQLITE_OK ){
1.146 + Tcl_AppendResult(interp, errorName(rc), 0);
1.147 + return TCL_ERROR;
1.148 + }
1.149 + return TCL_OK;
1.150 +}
1.151 +
1.152 +/*
1.153 +** Usage: pager_commit ID
1.154 +**
1.155 +** Commit all changes
1.156 +*/
1.157 +static int pager_commit(
1.158 + void *NotUsed,
1.159 + Tcl_Interp *interp, /* The TCL interpreter that invoked this command */
1.160 + int argc, /* Number of arguments */
1.161 + const char **argv /* Text of each argument */
1.162 +){
1.163 + Pager *pPager;
1.164 + int rc;
1.165 + if( argc!=2 ){
1.166 + Tcl_AppendResult(interp, "wrong # args: should be \"", argv[0],
1.167 + " ID\"", 0);
1.168 + return TCL_ERROR;
1.169 + }
1.170 + pPager = sqlite3TestTextToPtr(argv[1]);
1.171 + rc = sqlite3PagerCommitPhaseOne(pPager, 0, 0, 0);
1.172 + if( rc!=SQLITE_OK ){
1.173 + Tcl_AppendResult(interp, errorName(rc), 0);
1.174 + return TCL_ERROR;
1.175 + }
1.176 + rc = sqlite3PagerCommitPhaseTwo(pPager);
1.177 + if( rc!=SQLITE_OK ){
1.178 + Tcl_AppendResult(interp, errorName(rc), 0);
1.179 + return TCL_ERROR;
1.180 + }
1.181 + return TCL_OK;
1.182 +}
1.183 +
1.184 +/*
1.185 +** Usage: pager_stmt_begin ID
1.186 +**
1.187 +** Start a new checkpoint.
1.188 +*/
1.189 +static int pager_stmt_begin(
1.190 + void *NotUsed,
1.191 + Tcl_Interp *interp, /* The TCL interpreter that invoked this command */
1.192 + int argc, /* Number of arguments */
1.193 + const char **argv /* Text of each argument */
1.194 +){
1.195 + Pager *pPager;
1.196 + int rc;
1.197 + if( argc!=2 ){
1.198 + Tcl_AppendResult(interp, "wrong # args: should be \"", argv[0],
1.199 + " ID\"", 0);
1.200 + return TCL_ERROR;
1.201 + }
1.202 + pPager = sqlite3TestTextToPtr(argv[1]);
1.203 + rc = sqlite3PagerStmtBegin(pPager);
1.204 + if( rc!=SQLITE_OK ){
1.205 + Tcl_AppendResult(interp, errorName(rc), 0);
1.206 + return TCL_ERROR;
1.207 + }
1.208 + return TCL_OK;
1.209 +}
1.210 +
1.211 +/*
1.212 +** Usage: pager_stmt_rollback ID
1.213 +**
1.214 +** Rollback changes to a checkpoint
1.215 +*/
1.216 +static int pager_stmt_rollback(
1.217 + void *NotUsed,
1.218 + Tcl_Interp *interp, /* The TCL interpreter that invoked this command */
1.219 + int argc, /* Number of arguments */
1.220 + const char **argv /* Text of each argument */
1.221 +){
1.222 + Pager *pPager;
1.223 + int rc;
1.224 + if( argc!=2 ){
1.225 + Tcl_AppendResult(interp, "wrong # args: should be \"", argv[0],
1.226 + " ID\"", 0);
1.227 + return TCL_ERROR;
1.228 + }
1.229 + pPager = sqlite3TestTextToPtr(argv[1]);
1.230 + rc = sqlite3PagerStmtRollback(pPager);
1.231 + if( rc!=SQLITE_OK ){
1.232 + Tcl_AppendResult(interp, errorName(rc), 0);
1.233 + return TCL_ERROR;
1.234 + }
1.235 + return TCL_OK;
1.236 +}
1.237 +
1.238 +/*
1.239 +** Usage: pager_stmt_commit ID
1.240 +**
1.241 +** Commit changes to a checkpoint
1.242 +*/
1.243 +static int pager_stmt_commit(
1.244 + void *NotUsed,
1.245 + Tcl_Interp *interp, /* The TCL interpreter that invoked this command */
1.246 + int argc, /* Number of arguments */
1.247 + const char **argv /* Text of each argument */
1.248 +){
1.249 + Pager *pPager;
1.250 + int rc;
1.251 + if( argc!=2 ){
1.252 + Tcl_AppendResult(interp, "wrong # args: should be \"", argv[0],
1.253 + " ID\"", 0);
1.254 + return TCL_ERROR;
1.255 + }
1.256 + pPager = sqlite3TestTextToPtr(argv[1]);
1.257 + rc = sqlite3PagerStmtCommit(pPager);
1.258 + if( rc!=SQLITE_OK ){
1.259 + Tcl_AppendResult(interp, errorName(rc), 0);
1.260 + return TCL_ERROR;
1.261 + }
1.262 + return TCL_OK;
1.263 +}
1.264 +
1.265 +/*
1.266 +** Usage: pager_stats ID
1.267 +**
1.268 +** Return pager statistics.
1.269 +*/
1.270 +static int pager_stats(
1.271 + void *NotUsed,
1.272 + Tcl_Interp *interp, /* The TCL interpreter that invoked this command */
1.273 + int argc, /* Number of arguments */
1.274 + const char **argv /* Text of each argument */
1.275 +){
1.276 + Pager *pPager;
1.277 + int i, *a;
1.278 + if( argc!=2 ){
1.279 + Tcl_AppendResult(interp, "wrong # args: should be \"", argv[0],
1.280 + " ID\"", 0);
1.281 + return TCL_ERROR;
1.282 + }
1.283 + pPager = sqlite3TestTextToPtr(argv[1]);
1.284 + a = sqlite3PagerStats(pPager);
1.285 + for(i=0; i<9; i++){
1.286 + static char *zName[] = {
1.287 + "ref", "page", "max", "size", "state", "err",
1.288 + "hit", "miss", "ovfl",
1.289 + };
1.290 + char zBuf[100];
1.291 + Tcl_AppendElement(interp, zName[i]);
1.292 + sqlite3_snprintf(sizeof(zBuf),zBuf,"%d",a[i]);
1.293 + Tcl_AppendElement(interp, zBuf);
1.294 + }
1.295 + return TCL_OK;
1.296 +}
1.297 +
1.298 +/*
1.299 +** Usage: pager_pagecount ID
1.300 +**
1.301 +** Return the size of the database file.
1.302 +*/
1.303 +static int pager_pagecount(
1.304 + void *NotUsed,
1.305 + Tcl_Interp *interp, /* The TCL interpreter that invoked this command */
1.306 + int argc, /* Number of arguments */
1.307 + const char **argv /* Text of each argument */
1.308 +){
1.309 + Pager *pPager;
1.310 + char zBuf[100];
1.311 + int nPage;
1.312 + if( argc!=2 ){
1.313 + Tcl_AppendResult(interp, "wrong # args: should be \"", argv[0],
1.314 + " ID\"", 0);
1.315 + return TCL_ERROR;
1.316 + }
1.317 + pPager = sqlite3TestTextToPtr(argv[1]);
1.318 + sqlite3PagerPagecount(pPager, &nPage);
1.319 + sqlite3_snprintf(sizeof(zBuf), zBuf, "%d", nPage);
1.320 + Tcl_AppendResult(interp, zBuf, 0);
1.321 + return TCL_OK;
1.322 +}
1.323 +
1.324 +/*
1.325 +** Usage: page_get ID PGNO
1.326 +**
1.327 +** Return a pointer to a page from the database.
1.328 +*/
1.329 +static int page_get(
1.330 + void *NotUsed,
1.331 + Tcl_Interp *interp, /* The TCL interpreter that invoked this command */
1.332 + int argc, /* Number of arguments */
1.333 + const char **argv /* Text of each argument */
1.334 +){
1.335 + Pager *pPager;
1.336 + char zBuf[100];
1.337 + DbPage *pPage;
1.338 + int pgno;
1.339 + int rc;
1.340 + if( argc!=3 ){
1.341 + Tcl_AppendResult(interp, "wrong # args: should be \"", argv[0],
1.342 + " ID PGNO\"", 0);
1.343 + return TCL_ERROR;
1.344 + }
1.345 + pPager = sqlite3TestTextToPtr(argv[1]);
1.346 + if( Tcl_GetInt(interp, argv[2], &pgno) ) return TCL_ERROR;
1.347 + rc = sqlite3PagerGet(pPager, pgno, &pPage);
1.348 + if( rc!=SQLITE_OK ){
1.349 + Tcl_AppendResult(interp, errorName(rc), 0);
1.350 + return TCL_ERROR;
1.351 + }
1.352 + sqlite3_snprintf(sizeof(zBuf),zBuf,"%p",pPage);
1.353 + Tcl_AppendResult(interp, zBuf, 0);
1.354 + return TCL_OK;
1.355 +}
1.356 +
1.357 +/*
1.358 +** Usage: page_lookup ID PGNO
1.359 +**
1.360 +** Return a pointer to a page if the page is already in cache.
1.361 +** If not in cache, return an empty string.
1.362 +*/
1.363 +static int page_lookup(
1.364 + void *NotUsed,
1.365 + Tcl_Interp *interp, /* The TCL interpreter that invoked this command */
1.366 + int argc, /* Number of arguments */
1.367 + const char **argv /* Text of each argument */
1.368 +){
1.369 + Pager *pPager;
1.370 + char zBuf[100];
1.371 + DbPage *pPage;
1.372 + int pgno;
1.373 + if( argc!=3 ){
1.374 + Tcl_AppendResult(interp, "wrong # args: should be \"", argv[0],
1.375 + " ID PGNO\"", 0);
1.376 + return TCL_ERROR;
1.377 + }
1.378 + pPager = sqlite3TestTextToPtr(argv[1]);
1.379 + if( Tcl_GetInt(interp, argv[2], &pgno) ) return TCL_ERROR;
1.380 + pPage = sqlite3PagerLookup(pPager, pgno);
1.381 + if( pPage ){
1.382 + sqlite3_snprintf(sizeof(zBuf),zBuf,"%p",pPage);
1.383 + Tcl_AppendResult(interp, zBuf, 0);
1.384 + }
1.385 + return TCL_OK;
1.386 +}
1.387 +
1.388 +/*
1.389 +** Usage: pager_truncate ID PGNO
1.390 +*/
1.391 +static int pager_truncate(
1.392 + void *NotUsed,
1.393 + Tcl_Interp *interp, /* The TCL interpreter that invoked this command */
1.394 + int argc, /* Number of arguments */
1.395 + const char **argv /* Text of each argument */
1.396 +){
1.397 + Pager *pPager;
1.398 + int rc;
1.399 + int pgno;
1.400 + if( argc!=3 ){
1.401 + Tcl_AppendResult(interp, "wrong # args: should be \"", argv[0],
1.402 + " ID PGNO\"", 0);
1.403 + return TCL_ERROR;
1.404 + }
1.405 + pPager = sqlite3TestTextToPtr(argv[1]);
1.406 + if( Tcl_GetInt(interp, argv[2], &pgno) ) return TCL_ERROR;
1.407 + rc = sqlite3PagerTruncate(pPager, pgno);
1.408 + if( rc!=SQLITE_OK ){
1.409 + Tcl_AppendResult(interp, errorName(rc), 0);
1.410 + return TCL_ERROR;
1.411 + }
1.412 + return TCL_OK;
1.413 +}
1.414 +
1.415 +
1.416 +/*
1.417 +** Usage: page_unref PAGE
1.418 +**
1.419 +** Drop a pointer to a page.
1.420 +*/
1.421 +static int page_unref(
1.422 + void *NotUsed,
1.423 + Tcl_Interp *interp, /* The TCL interpreter that invoked this command */
1.424 + int argc, /* Number of arguments */
1.425 + const char **argv /* Text of each argument */
1.426 +){
1.427 + DbPage *pPage;
1.428 + int rc;
1.429 + if( argc!=2 ){
1.430 + Tcl_AppendResult(interp, "wrong # args: should be \"", argv[0],
1.431 + " PAGE\"", 0);
1.432 + return TCL_ERROR;
1.433 + }
1.434 + pPage = (DbPage *)sqlite3TestTextToPtr(argv[1]);
1.435 + rc = sqlite3PagerUnref(pPage);
1.436 + if( rc!=SQLITE_OK ){
1.437 + Tcl_AppendResult(interp, errorName(rc), 0);
1.438 + return TCL_ERROR;
1.439 + }
1.440 + return TCL_OK;
1.441 +}
1.442 +
1.443 +/*
1.444 +** Usage: page_read PAGE
1.445 +**
1.446 +** Return the content of a page
1.447 +*/
1.448 +static int page_read(
1.449 + void *NotUsed,
1.450 + Tcl_Interp *interp, /* The TCL interpreter that invoked this command */
1.451 + int argc, /* Number of arguments */
1.452 + const char **argv /* Text of each argument */
1.453 +){
1.454 + char zBuf[100];
1.455 + DbPage *pPage;
1.456 + if( argc!=2 ){
1.457 + Tcl_AppendResult(interp, "wrong # args: should be \"", argv[0],
1.458 + " PAGE\"", 0);
1.459 + return TCL_ERROR;
1.460 + }
1.461 + pPage = sqlite3TestTextToPtr(argv[1]);
1.462 + memcpy(zBuf, sqlite3PagerGetData(pPage), sizeof(zBuf));
1.463 + Tcl_AppendResult(interp, zBuf, 0);
1.464 + return TCL_OK;
1.465 +}
1.466 +
1.467 +/*
1.468 +** Usage: page_number PAGE
1.469 +**
1.470 +** Return the page number for a page.
1.471 +*/
1.472 +static int page_number(
1.473 + void *NotUsed,
1.474 + Tcl_Interp *interp, /* The TCL interpreter that invoked this command */
1.475 + int argc, /* Number of arguments */
1.476 + const char **argv /* Text of each argument */
1.477 +){
1.478 + char zBuf[100];
1.479 + DbPage *pPage;
1.480 + if( argc!=2 ){
1.481 + Tcl_AppendResult(interp, "wrong # args: should be \"", argv[0],
1.482 + " PAGE\"", 0);
1.483 + return TCL_ERROR;
1.484 + }
1.485 + pPage = (DbPage *)sqlite3TestTextToPtr(argv[1]);
1.486 + sqlite3_snprintf(sizeof(zBuf), zBuf, "%d", sqlite3PagerPagenumber(pPage));
1.487 + Tcl_AppendResult(interp, zBuf, 0);
1.488 + return TCL_OK;
1.489 +}
1.490 +
1.491 +/*
1.492 +** Usage: page_write PAGE DATA
1.493 +**
1.494 +** Write something into a page.
1.495 +*/
1.496 +static int page_write(
1.497 + void *NotUsed,
1.498 + Tcl_Interp *interp, /* The TCL interpreter that invoked this command */
1.499 + int argc, /* Number of arguments */
1.500 + const char **argv /* Text of each argument */
1.501 +){
1.502 + DbPage *pPage;
1.503 + char *pData;
1.504 + int rc;
1.505 + if( argc!=3 ){
1.506 + Tcl_AppendResult(interp, "wrong # args: should be \"", argv[0],
1.507 + " PAGE DATA\"", 0);
1.508 + return TCL_ERROR;
1.509 + }
1.510 + pPage = (DbPage *)sqlite3TestTextToPtr(argv[1]);
1.511 + rc = sqlite3PagerWrite(pPage);
1.512 + if( rc!=SQLITE_OK ){
1.513 + Tcl_AppendResult(interp, errorName(rc), 0);
1.514 + return TCL_ERROR;
1.515 + }
1.516 + pData = sqlite3PagerGetData(pPage);
1.517 + strncpy(pData, argv[2], test_pagesize-1);
1.518 + pData[test_pagesize-1] = 0;
1.519 + return TCL_OK;
1.520 +}
1.521 +
1.522 +#ifndef SQLITE_OMIT_DISKIO
1.523 +/*
1.524 +** Usage: fake_big_file N FILENAME
1.525 +**
1.526 +** Write a few bytes at the N megabyte point of FILENAME. This will
1.527 +** create a large file. If the file was a valid SQLite database, then
1.528 +** the next time the database is opened, SQLite will begin allocating
1.529 +** new pages after N. If N is 2096 or bigger, this will test the
1.530 +** ability of SQLite to write to large files.
1.531 +*/
1.532 +static int fake_big_file(
1.533 + void *NotUsed,
1.534 + Tcl_Interp *interp, /* The TCL interpreter that invoked this command */
1.535 + int argc, /* Number of arguments */
1.536 + const char **argv /* Text of each argument */
1.537 +){
1.538 + sqlite3_vfs *pVfs;
1.539 + sqlite3_file *fd = 0;
1.540 + int rc;
1.541 + int n;
1.542 + i64 offset;
1.543 + if( argc!=3 ){
1.544 + Tcl_AppendResult(interp, "wrong # args: should be \"", argv[0],
1.545 + " N-MEGABYTES FILE\"", 0);
1.546 + return TCL_ERROR;
1.547 + }
1.548 + if( Tcl_GetInt(interp, argv[1], &n) ) return TCL_ERROR;
1.549 +
1.550 + pVfs = sqlite3_vfs_find(0);
1.551 + rc = sqlite3OsOpenMalloc(pVfs, argv[2], &fd,
1.552 + (SQLITE_OPEN_CREATE|SQLITE_OPEN_READWRITE|SQLITE_OPEN_MAIN_DB), 0
1.553 + );
1.554 + if( rc ){
1.555 + Tcl_AppendResult(interp, "open failed: ", errorName(rc), 0);
1.556 + return TCL_ERROR;
1.557 + }
1.558 + offset = n;
1.559 + offset *= 1024*1024;
1.560 + rc = sqlite3OsWrite(fd, "Hello, World!", 14, offset);
1.561 + sqlite3OsCloseFree(fd);
1.562 + if( rc ){
1.563 + Tcl_AppendResult(interp, "write failed: ", errorName(rc), 0);
1.564 + return TCL_ERROR;
1.565 + }
1.566 + return TCL_OK;
1.567 +}
1.568 +#endif
1.569 +
1.570 +
1.571 +/*
1.572 +** sqlite3BitvecBuiltinTest SIZE PROGRAM
1.573 +**
1.574 +** Invoke the SQLITE_TESTCTRL_BITVEC_TEST operator on test_control.
1.575 +** See comments on sqlite3BitvecBuiltinTest() for additional information.
1.576 +*/
1.577 +static int testBitvecBuiltinTest(
1.578 + void *NotUsed,
1.579 + Tcl_Interp *interp, /* The TCL interpreter that invoked this command */
1.580 + int argc, /* Number of arguments */
1.581 + const char **argv /* Text of each argument */
1.582 +){
1.583 + int sz, rc;
1.584 + int nProg = 0;
1.585 + int aProg[100];
1.586 + const char *z;
1.587 + if( argc!=3 ){
1.588 + Tcl_AppendResult(interp, "wrong # args: should be \"", argv[0],
1.589 + " SIZE PROGRAM\"", (void*)0);
1.590 + }
1.591 + if( Tcl_GetInt(interp, argv[1], &sz) ) return TCL_ERROR;
1.592 + z = argv[2];
1.593 + while( nProg<99 && *z ){
1.594 + while( *z && !isdigit(*z) ){ z++; }
1.595 + if( *z==0 ) break;
1.596 + aProg[nProg++] = atoi(z);
1.597 + while( isdigit(*z) ){ z++; }
1.598 + }
1.599 + aProg[nProg] = 0;
1.600 + rc = sqlite3_test_control(SQLITE_TESTCTRL_BITVEC_TEST, sz, aProg);
1.601 + Tcl_SetObjResult(interp, Tcl_NewIntObj(rc));
1.602 + return TCL_OK;
1.603 +}
1.604 +
1.605 +/*
1.606 +** Register commands with the TCL interpreter.
1.607 +*/
1.608 +int Sqlitetest2_Init(Tcl_Interp *interp){
1.609 + extern int sqlite3_io_error_persist;
1.610 + extern int sqlite3_io_error_pending;
1.611 + extern int sqlite3_io_error_hit;
1.612 + extern int sqlite3_io_error_hardhit;
1.613 + extern int sqlite3_diskfull_pending;
1.614 + extern int sqlite3_diskfull;
1.615 + extern int sqlite3_pager_n_sort_bucket;
1.616 + static struct {
1.617 + char *zName;
1.618 + Tcl_CmdProc *xProc;
1.619 + } aCmd[] = {
1.620 + { "pager_open", (Tcl_CmdProc*)pager_open },
1.621 + { "pager_close", (Tcl_CmdProc*)pager_close },
1.622 + { "pager_commit", (Tcl_CmdProc*)pager_commit },
1.623 + { "pager_rollback", (Tcl_CmdProc*)pager_rollback },
1.624 + { "pager_stmt_begin", (Tcl_CmdProc*)pager_stmt_begin },
1.625 + { "pager_stmt_commit", (Tcl_CmdProc*)pager_stmt_commit },
1.626 + { "pager_stmt_rollback", (Tcl_CmdProc*)pager_stmt_rollback },
1.627 + { "pager_stats", (Tcl_CmdProc*)pager_stats },
1.628 + { "pager_pagecount", (Tcl_CmdProc*)pager_pagecount },
1.629 + { "page_get", (Tcl_CmdProc*)page_get },
1.630 + { "page_lookup", (Tcl_CmdProc*)page_lookup },
1.631 + { "page_unref", (Tcl_CmdProc*)page_unref },
1.632 + { "page_read", (Tcl_CmdProc*)page_read },
1.633 + { "page_write", (Tcl_CmdProc*)page_write },
1.634 + { "page_number", (Tcl_CmdProc*)page_number },
1.635 + { "pager_truncate", (Tcl_CmdProc*)pager_truncate },
1.636 +#ifndef SQLITE_OMIT_DISKIO
1.637 + { "fake_big_file", (Tcl_CmdProc*)fake_big_file },
1.638 +#endif
1.639 + { "sqlite3BitvecBuiltinTest",(Tcl_CmdProc*)testBitvecBuiltinTest},
1.640 + };
1.641 + int i;
1.642 + for(i=0; i<sizeof(aCmd)/sizeof(aCmd[0]); i++){
1.643 + Tcl_CreateCommand(interp, aCmd[i].zName, aCmd[i].xProc, 0, 0);
1.644 + }
1.645 + Tcl_LinkVar(interp, "sqlite_io_error_pending",
1.646 + (char*)&sqlite3_io_error_pending, TCL_LINK_INT);
1.647 + Tcl_LinkVar(interp, "sqlite_io_error_persist",
1.648 + (char*)&sqlite3_io_error_persist, TCL_LINK_INT);
1.649 + Tcl_LinkVar(interp, "sqlite_io_error_hit",
1.650 + (char*)&sqlite3_io_error_hit, TCL_LINK_INT);
1.651 + Tcl_LinkVar(interp, "sqlite_io_error_hardhit",
1.652 + (char*)&sqlite3_io_error_hardhit, TCL_LINK_INT);
1.653 + Tcl_LinkVar(interp, "sqlite_diskfull_pending",
1.654 + (char*)&sqlite3_diskfull_pending, TCL_LINK_INT);
1.655 + Tcl_LinkVar(interp, "sqlite_diskfull",
1.656 + (char*)&sqlite3_diskfull, TCL_LINK_INT);
1.657 + Tcl_LinkVar(interp, "sqlite_pending_byte",
1.658 + (char*)&sqlite3_pending_byte, TCL_LINK_INT);
1.659 + Tcl_LinkVar(interp, "sqlite_pager_n_sort_bucket",
1.660 + (char*)&sqlite3_pager_n_sort_bucket, TCL_LINK_INT);
1.661 + return TCL_OK;
1.662 +}