Annotation of embedaddon/sqlite3/src/test2.c, revision 1.1.1.1

1.1       misho       1: /*
                      2: ** 2001 September 15
                      3: **
                      4: ** The author disclaims copyright to this source code.  In place of
                      5: ** a legal notice, here is a blessing:
                      6: **
                      7: **    May you do good and not evil.
                      8: **    May you find forgiveness for yourself and forgive others.
                      9: **    May you share freely, never taking more than you give.
                     10: **
                     11: *************************************************************************
                     12: ** Code for testing the pager.c module in SQLite.  This code
                     13: ** is not included in the SQLite library.  It is used for automated
                     14: ** testing of the SQLite library.
                     15: */
                     16: #include "sqliteInt.h"
                     17: #include "tcl.h"
                     18: #include <stdlib.h>
                     19: #include <string.h>
                     20: #include <ctype.h>
                     21: 
                     22: /*
                     23: ** Interpret an SQLite error number
                     24: */
                     25: static char *errorName(int rc){
                     26:   char *zName;
                     27:   switch( rc ){
                     28:     case SQLITE_OK:         zName = "SQLITE_OK";          break;
                     29:     case SQLITE_ERROR:      zName = "SQLITE_ERROR";       break;
                     30:     case SQLITE_PERM:       zName = "SQLITE_PERM";        break;
                     31:     case SQLITE_ABORT:      zName = "SQLITE_ABORT";       break;
                     32:     case SQLITE_BUSY:       zName = "SQLITE_BUSY";        break;
                     33:     case SQLITE_NOMEM:      zName = "SQLITE_NOMEM";       break;
                     34:     case SQLITE_READONLY:   zName = "SQLITE_READONLY";    break;
                     35:     case SQLITE_INTERRUPT:  zName = "SQLITE_INTERRUPT";   break;
                     36:     case SQLITE_IOERR:      zName = "SQLITE_IOERR";       break;
                     37:     case SQLITE_CORRUPT:    zName = "SQLITE_CORRUPT";     break;
                     38:     case SQLITE_FULL:       zName = "SQLITE_FULL";        break;
                     39:     case SQLITE_CANTOPEN:   zName = "SQLITE_CANTOPEN";    break;
                     40:     case SQLITE_PROTOCOL:   zName = "SQLITE_PROTOCOL";    break;
                     41:     case SQLITE_EMPTY:      zName = "SQLITE_EMPTY";       break;
                     42:     case SQLITE_SCHEMA:     zName = "SQLITE_SCHEMA";      break;
                     43:     case SQLITE_CONSTRAINT: zName = "SQLITE_CONSTRAINT";  break;
                     44:     case SQLITE_MISMATCH:   zName = "SQLITE_MISMATCH";    break;
                     45:     case SQLITE_MISUSE:     zName = "SQLITE_MISUSE";      break;
                     46:     case SQLITE_NOLFS:      zName = "SQLITE_NOLFS";       break;
                     47:     default:                zName = "SQLITE_Unknown";     break;
                     48:   }
                     49:   return zName;
                     50: }
                     51: 
                     52: /*
                     53: ** Page size and reserved size used for testing.
                     54: */
                     55: static int test_pagesize = 1024;
                     56: 
                     57: /*
                     58: ** Dummy page reinitializer
                     59: */
                     60: static void pager_test_reiniter(DbPage *pNotUsed){
                     61:   return;
                     62: }
                     63: 
                     64: /*
                     65: ** Usage:   pager_open FILENAME N-PAGE
                     66: **
                     67: ** Open a new pager
                     68: */
                     69: static int pager_open(
                     70:   void *NotUsed,
                     71:   Tcl_Interp *interp,    /* The TCL interpreter that invoked this command */
                     72:   int argc,              /* Number of arguments */
                     73:   const char **argv      /* Text of each argument */
                     74: ){
                     75:   u32 pageSize;
                     76:   Pager *pPager;
                     77:   int nPage;
                     78:   int rc;
                     79:   char zBuf[100];
                     80:   if( argc!=3 ){
                     81:     Tcl_AppendResult(interp, "wrong # args: should be \"", argv[0],
                     82:        " FILENAME N-PAGE\"", 0);
                     83:     return TCL_ERROR;
                     84:   }
                     85:   if( Tcl_GetInt(interp, argv[2], &nPage) ) return TCL_ERROR;
                     86:   rc = sqlite3PagerOpen(sqlite3_vfs_find(0), &pPager, argv[1], 0, 0,
                     87:       SQLITE_OPEN_READWRITE | SQLITE_OPEN_CREATE | SQLITE_OPEN_MAIN_DB,
                     88:       pager_test_reiniter);
                     89:   if( rc!=SQLITE_OK ){
                     90:     Tcl_AppendResult(interp, errorName(rc), 0);
                     91:     return TCL_ERROR;
                     92:   }
                     93:   sqlite3PagerSetCachesize(pPager, nPage);
                     94:   pageSize = test_pagesize;
                     95:   sqlite3PagerSetPagesize(pPager, &pageSize, -1);
                     96:   sqlite3_snprintf(sizeof(zBuf),zBuf,"%p",pPager);
                     97:   Tcl_AppendResult(interp, zBuf, 0);
                     98:   return TCL_OK;
                     99: }
                    100: 
                    101: /*
                    102: ** Usage:   pager_close ID
                    103: **
                    104: ** Close the given pager.
                    105: */
                    106: static int pager_close(
                    107:   void *NotUsed,
                    108:   Tcl_Interp *interp,    /* The TCL interpreter that invoked this command */
                    109:   int argc,              /* Number of arguments */
                    110:   const char **argv      /* Text of each argument */
                    111: ){
                    112:   Pager *pPager;
                    113:   int rc;
                    114:   if( argc!=2 ){
                    115:     Tcl_AppendResult(interp, "wrong # args: should be \"", argv[0],
                    116:        " ID\"", 0);
                    117:     return TCL_ERROR;
                    118:   }
                    119:   pPager = sqlite3TestTextToPtr(argv[1]);
                    120:   rc = sqlite3PagerClose(pPager);
                    121:   if( rc!=SQLITE_OK ){
                    122:     Tcl_AppendResult(interp, errorName(rc), 0);
                    123:     return TCL_ERROR;
                    124:   }
                    125:   return TCL_OK;
                    126: }
                    127: 
                    128: /*
                    129: ** Usage:   pager_rollback ID
                    130: **
                    131: ** Rollback changes
                    132: */
                    133: static int pager_rollback(
                    134:   void *NotUsed,
                    135:   Tcl_Interp *interp,    /* The TCL interpreter that invoked this command */
                    136:   int argc,              /* Number of arguments */
                    137:   const char **argv      /* Text of each argument */
                    138: ){
                    139:   Pager *pPager;
                    140:   int rc;
                    141:   if( argc!=2 ){
                    142:     Tcl_AppendResult(interp, "wrong # args: should be \"", argv[0],
                    143:        " ID\"", 0);
                    144:     return TCL_ERROR;
                    145:   }
                    146:   pPager = sqlite3TestTextToPtr(argv[1]);
                    147:   rc = sqlite3PagerRollback(pPager);
                    148:   if( rc!=SQLITE_OK ){
                    149:     Tcl_AppendResult(interp, errorName(rc), 0);
                    150:     return TCL_ERROR;
                    151:   }
                    152:   return TCL_OK;
                    153: }
                    154: 
                    155: /*
                    156: ** Usage:   pager_commit ID
                    157: **
                    158: ** Commit all changes
                    159: */
                    160: static int pager_commit(
                    161:   void *NotUsed,
                    162:   Tcl_Interp *interp,    /* The TCL interpreter that invoked this command */
                    163:   int argc,              /* Number of arguments */
                    164:   const char **argv      /* Text of each argument */
                    165: ){
                    166:   Pager *pPager;
                    167:   int rc;
                    168:   if( argc!=2 ){
                    169:     Tcl_AppendResult(interp, "wrong # args: should be \"", argv[0],
                    170:        " ID\"", 0);
                    171:     return TCL_ERROR;
                    172:   }
                    173:   pPager = sqlite3TestTextToPtr(argv[1]);
                    174:   rc = sqlite3PagerCommitPhaseOne(pPager, 0, 0);
                    175:   if( rc!=SQLITE_OK ){
                    176:     Tcl_AppendResult(interp, errorName(rc), 0);
                    177:     return TCL_ERROR;
                    178:   }
                    179:   rc = sqlite3PagerCommitPhaseTwo(pPager);
                    180:   if( rc!=SQLITE_OK ){
                    181:     Tcl_AppendResult(interp, errorName(rc), 0);
                    182:     return TCL_ERROR;
                    183:   }
                    184:   return TCL_OK;
                    185: }
                    186: 
                    187: /*
                    188: ** Usage:   pager_stmt_begin ID
                    189: **
                    190: ** Start a new checkpoint.
                    191: */
                    192: static int pager_stmt_begin(
                    193:   void *NotUsed,
                    194:   Tcl_Interp *interp,    /* The TCL interpreter that invoked this command */
                    195:   int argc,              /* Number of arguments */
                    196:   const char **argv      /* Text of each argument */
                    197: ){
                    198:   Pager *pPager;
                    199:   int rc;
                    200:   if( argc!=2 ){
                    201:     Tcl_AppendResult(interp, "wrong # args: should be \"", argv[0],
                    202:        " ID\"", 0);
                    203:     return TCL_ERROR;
                    204:   }
                    205:   pPager = sqlite3TestTextToPtr(argv[1]);
                    206:   rc = sqlite3PagerOpenSavepoint(pPager, 1);
                    207:   if( rc!=SQLITE_OK ){
                    208:     Tcl_AppendResult(interp, errorName(rc), 0);
                    209:     return TCL_ERROR;
                    210:   }
                    211:   return TCL_OK;
                    212: }
                    213: 
                    214: /*
                    215: ** Usage:   pager_stmt_rollback ID
                    216: **
                    217: ** Rollback changes to a checkpoint
                    218: */
                    219: static int pager_stmt_rollback(
                    220:   void *NotUsed,
                    221:   Tcl_Interp *interp,    /* The TCL interpreter that invoked this command */
                    222:   int argc,              /* Number of arguments */
                    223:   const char **argv      /* Text of each argument */
                    224: ){
                    225:   Pager *pPager;
                    226:   int rc;
                    227:   if( argc!=2 ){
                    228:     Tcl_AppendResult(interp, "wrong # args: should be \"", argv[0],
                    229:        " ID\"", 0);
                    230:     return TCL_ERROR;
                    231:   }
                    232:   pPager = sqlite3TestTextToPtr(argv[1]);
                    233:   rc = sqlite3PagerSavepoint(pPager, SAVEPOINT_ROLLBACK, 0);
                    234:   sqlite3PagerSavepoint(pPager, SAVEPOINT_RELEASE, 0);
                    235:   if( rc!=SQLITE_OK ){
                    236:     Tcl_AppendResult(interp, errorName(rc), 0);
                    237:     return TCL_ERROR;
                    238:   }
                    239:   return TCL_OK;
                    240: }
                    241: 
                    242: /*
                    243: ** Usage:   pager_stmt_commit ID
                    244: **
                    245: ** Commit changes to a checkpoint
                    246: */
                    247: static int pager_stmt_commit(
                    248:   void *NotUsed,
                    249:   Tcl_Interp *interp,    /* The TCL interpreter that invoked this command */
                    250:   int argc,              /* Number of arguments */
                    251:   const char **argv      /* Text of each argument */
                    252: ){
                    253:   Pager *pPager;
                    254:   int rc;
                    255:   if( argc!=2 ){
                    256:     Tcl_AppendResult(interp, "wrong # args: should be \"", argv[0],
                    257:        " ID\"", 0);
                    258:     return TCL_ERROR;
                    259:   }
                    260:   pPager = sqlite3TestTextToPtr(argv[1]);
                    261:   rc = sqlite3PagerSavepoint(pPager, SAVEPOINT_RELEASE, 0);
                    262:   if( rc!=SQLITE_OK ){
                    263:     Tcl_AppendResult(interp, errorName(rc), 0);
                    264:     return TCL_ERROR;
                    265:   }
                    266:   return TCL_OK;
                    267: }
                    268: 
                    269: /*
                    270: ** Usage:   pager_stats ID
                    271: **
                    272: ** Return pager statistics.
                    273: */
                    274: static int pager_stats(
                    275:   void *NotUsed,
                    276:   Tcl_Interp *interp,    /* The TCL interpreter that invoked this command */
                    277:   int argc,              /* Number of arguments */
                    278:   const char **argv      /* Text of each argument */
                    279: ){
                    280:   Pager *pPager;
                    281:   int i, *a;
                    282:   if( argc!=2 ){
                    283:     Tcl_AppendResult(interp, "wrong # args: should be \"", argv[0],
                    284:        " ID\"", 0);
                    285:     return TCL_ERROR;
                    286:   }
                    287:   pPager = sqlite3TestTextToPtr(argv[1]);
                    288:   a = sqlite3PagerStats(pPager);
                    289:   for(i=0; i<9; i++){
                    290:     static char *zName[] = {
                    291:       "ref", "page", "max", "size", "state", "err",
                    292:       "hit", "miss", "ovfl",
                    293:     };
                    294:     char zBuf[100];
                    295:     Tcl_AppendElement(interp, zName[i]);
                    296:     sqlite3_snprintf(sizeof(zBuf),zBuf,"%d",a[i]);
                    297:     Tcl_AppendElement(interp, zBuf);
                    298:   }
                    299:   return TCL_OK;
                    300: }
                    301: 
                    302: /*
                    303: ** Usage:   pager_pagecount ID
                    304: **
                    305: ** Return the size of the database file.
                    306: */
                    307: static int pager_pagecount(
                    308:   void *NotUsed,
                    309:   Tcl_Interp *interp,    /* The TCL interpreter that invoked this command */
                    310:   int argc,              /* Number of arguments */
                    311:   const char **argv      /* Text of each argument */
                    312: ){
                    313:   Pager *pPager;
                    314:   char zBuf[100];
                    315:   int nPage;
                    316:   if( argc!=2 ){
                    317:     Tcl_AppendResult(interp, "wrong # args: should be \"", argv[0],
                    318:        " ID\"", 0);
                    319:     return TCL_ERROR;
                    320:   }
                    321:   pPager = sqlite3TestTextToPtr(argv[1]);
                    322:   sqlite3PagerPagecount(pPager, &nPage);
                    323:   sqlite3_snprintf(sizeof(zBuf), zBuf, "%d", nPage);
                    324:   Tcl_AppendResult(interp, zBuf, 0);
                    325:   return TCL_OK;
                    326: }
                    327: 
                    328: /*
                    329: ** Usage:   page_get ID PGNO
                    330: **
                    331: ** Return a pointer to a page from the database.
                    332: */
                    333: static int page_get(
                    334:   void *NotUsed,
                    335:   Tcl_Interp *interp,    /* The TCL interpreter that invoked this command */
                    336:   int argc,              /* Number of arguments */
                    337:   const char **argv      /* Text of each argument */
                    338: ){
                    339:   Pager *pPager;
                    340:   char zBuf[100];
                    341:   DbPage *pPage;
                    342:   int pgno;
                    343:   int rc;
                    344:   if( argc!=3 ){
                    345:     Tcl_AppendResult(interp, "wrong # args: should be \"", argv[0],
                    346:        " ID PGNO\"", 0);
                    347:     return TCL_ERROR;
                    348:   }
                    349:   pPager = sqlite3TestTextToPtr(argv[1]);
                    350:   if( Tcl_GetInt(interp, argv[2], &pgno) ) return TCL_ERROR;
                    351:   rc = sqlite3PagerSharedLock(pPager);
                    352:   if( rc==SQLITE_OK ){
                    353:     rc = sqlite3PagerGet(pPager, pgno, &pPage);
                    354:   }
                    355:   if( rc!=SQLITE_OK ){
                    356:     Tcl_AppendResult(interp, errorName(rc), 0);
                    357:     return TCL_ERROR;
                    358:   }
                    359:   sqlite3_snprintf(sizeof(zBuf),zBuf,"%p",pPage);
                    360:   Tcl_AppendResult(interp, zBuf, 0);
                    361:   return TCL_OK;
                    362: }
                    363: 
                    364: /*
                    365: ** Usage:   page_lookup ID PGNO
                    366: **
                    367: ** Return a pointer to a page if the page is already in cache.
                    368: ** If not in cache, return an empty string.
                    369: */
                    370: static int page_lookup(
                    371:   void *NotUsed,
                    372:   Tcl_Interp *interp,    /* The TCL interpreter that invoked this command */
                    373:   int argc,              /* Number of arguments */
                    374:   const char **argv      /* Text of each argument */
                    375: ){
                    376:   Pager *pPager;
                    377:   char zBuf[100];
                    378:   DbPage *pPage;
                    379:   int pgno;
                    380:   if( argc!=3 ){
                    381:     Tcl_AppendResult(interp, "wrong # args: should be \"", argv[0],
                    382:        " ID PGNO\"", 0);
                    383:     return TCL_ERROR;
                    384:   }
                    385:   pPager = sqlite3TestTextToPtr(argv[1]);
                    386:   if( Tcl_GetInt(interp, argv[2], &pgno) ) return TCL_ERROR;
                    387:   pPage = sqlite3PagerLookup(pPager, pgno);
                    388:   if( pPage ){
                    389:     sqlite3_snprintf(sizeof(zBuf),zBuf,"%p",pPage);
                    390:     Tcl_AppendResult(interp, zBuf, 0);
                    391:   }
                    392:   return TCL_OK;
                    393: }
                    394: 
                    395: /*
                    396: ** Usage:   pager_truncate ID PGNO
                    397: */
                    398: static int pager_truncate(
                    399:   void *NotUsed,
                    400:   Tcl_Interp *interp,    /* The TCL interpreter that invoked this command */
                    401:   int argc,              /* Number of arguments */
                    402:   const char **argv      /* Text of each argument */
                    403: ){
                    404:   Pager *pPager;
                    405:   int pgno;
                    406:   if( argc!=3 ){
                    407:     Tcl_AppendResult(interp, "wrong # args: should be \"", argv[0],
                    408:        " ID PGNO\"", 0);
                    409:     return TCL_ERROR;
                    410:   }
                    411:   pPager = sqlite3TestTextToPtr(argv[1]);
                    412:   if( Tcl_GetInt(interp, argv[2], &pgno) ) return TCL_ERROR;
                    413:   sqlite3PagerTruncateImage(pPager, pgno);
                    414:   return TCL_OK;
                    415: }
                    416: 
                    417: 
                    418: /*
                    419: ** Usage:   page_unref PAGE
                    420: **
                    421: ** Drop a pointer to a page.
                    422: */
                    423: static int page_unref(
                    424:   void *NotUsed,
                    425:   Tcl_Interp *interp,    /* The TCL interpreter that invoked this command */
                    426:   int argc,              /* Number of arguments */
                    427:   const char **argv      /* Text of each argument */
                    428: ){
                    429:   DbPage *pPage;
                    430:   if( argc!=2 ){
                    431:     Tcl_AppendResult(interp, "wrong # args: should be \"", argv[0],
                    432:        " PAGE\"", 0);
                    433:     return TCL_ERROR;
                    434:   }
                    435:   pPage = (DbPage *)sqlite3TestTextToPtr(argv[1]);
                    436:   sqlite3PagerUnref(pPage);
                    437:   return TCL_OK;
                    438: }
                    439: 
                    440: /*
                    441: ** Usage:   page_read PAGE
                    442: **
                    443: ** Return the content of a page
                    444: */
                    445: static int page_read(
                    446:   void *NotUsed,
                    447:   Tcl_Interp *interp,    /* The TCL interpreter that invoked this command */
                    448:   int argc,              /* Number of arguments */
                    449:   const char **argv      /* Text of each argument */
                    450: ){
                    451:   char zBuf[100];
                    452:   DbPage *pPage;
                    453:   if( argc!=2 ){
                    454:     Tcl_AppendResult(interp, "wrong # args: should be \"", argv[0],
                    455:        " PAGE\"", 0);
                    456:     return TCL_ERROR;
                    457:   }
                    458:   pPage = sqlite3TestTextToPtr(argv[1]);
                    459:   memcpy(zBuf, sqlite3PagerGetData(pPage), sizeof(zBuf));
                    460:   Tcl_AppendResult(interp, zBuf, 0);
                    461:   return TCL_OK;
                    462: }
                    463: 
                    464: /*
                    465: ** Usage:   page_number PAGE
                    466: **
                    467: ** Return the page number for a page.
                    468: */
                    469: static int page_number(
                    470:   void *NotUsed,
                    471:   Tcl_Interp *interp,    /* The TCL interpreter that invoked this command */
                    472:   int argc,              /* Number of arguments */
                    473:   const char **argv      /* Text of each argument */
                    474: ){
                    475:   char zBuf[100];
                    476:   DbPage *pPage;
                    477:   if( argc!=2 ){
                    478:     Tcl_AppendResult(interp, "wrong # args: should be \"", argv[0],
                    479:        " PAGE\"", 0);
                    480:     return TCL_ERROR;
                    481:   }
                    482:   pPage = (DbPage *)sqlite3TestTextToPtr(argv[1]);
                    483:   sqlite3_snprintf(sizeof(zBuf), zBuf, "%d", sqlite3PagerPagenumber(pPage));
                    484:   Tcl_AppendResult(interp, zBuf, 0);
                    485:   return TCL_OK;
                    486: }
                    487: 
                    488: /*
                    489: ** Usage:   page_write PAGE DATA
                    490: **
                    491: ** Write something into a page.
                    492: */
                    493: static int page_write(
                    494:   void *NotUsed,
                    495:   Tcl_Interp *interp,    /* The TCL interpreter that invoked this command */
                    496:   int argc,              /* Number of arguments */
                    497:   const char **argv      /* Text of each argument */
                    498: ){
                    499:   DbPage *pPage;
                    500:   char *pData;
                    501:   int rc;
                    502:   if( argc!=3 ){
                    503:     Tcl_AppendResult(interp, "wrong # args: should be \"", argv[0],
                    504:        " PAGE DATA\"", 0);
                    505:     return TCL_ERROR;
                    506:   }
                    507:   pPage = (DbPage *)sqlite3TestTextToPtr(argv[1]);
                    508:   rc = sqlite3PagerWrite(pPage);
                    509:   if( rc!=SQLITE_OK ){
                    510:     Tcl_AppendResult(interp, errorName(rc), 0);
                    511:     return TCL_ERROR;
                    512:   }
                    513:   pData = sqlite3PagerGetData(pPage);
                    514:   strncpy(pData, argv[2], test_pagesize-1);
                    515:   pData[test_pagesize-1] = 0;
                    516:   return TCL_OK;
                    517: }
                    518: 
                    519: #ifndef SQLITE_OMIT_DISKIO
                    520: /*
                    521: ** Usage:   fake_big_file  N  FILENAME
                    522: **
                    523: ** Write a few bytes at the N megabyte point of FILENAME.  This will
                    524: ** create a large file.  If the file was a valid SQLite database, then
                    525: ** the next time the database is opened, SQLite will begin allocating
                    526: ** new pages after N.  If N is 2096 or bigger, this will test the
                    527: ** ability of SQLite to write to large files.
                    528: */
                    529: static int fake_big_file(
                    530:   void *NotUsed,
                    531:   Tcl_Interp *interp,    /* The TCL interpreter that invoked this command */
                    532:   int argc,              /* Number of arguments */
                    533:   const char **argv      /* Text of each argument */
                    534: ){
                    535:   sqlite3_vfs *pVfs;
                    536:   sqlite3_file *fd = 0;
                    537:   int rc;
                    538:   int n;
                    539:   i64 offset;
                    540:   char *zFile;
                    541:   int nFile;
                    542:   if( argc!=3 ){
                    543:     Tcl_AppendResult(interp, "wrong # args: should be \"", argv[0],
                    544:        " N-MEGABYTES FILE\"", 0);
                    545:     return TCL_ERROR;
                    546:   }
                    547:   if( Tcl_GetInt(interp, argv[1], &n) ) return TCL_ERROR;
                    548: 
                    549:   pVfs = sqlite3_vfs_find(0);
                    550:   nFile = strlen(argv[2]);
                    551:   zFile = sqlite3_malloc( nFile+2 );
                    552:   if( zFile==0 ) return TCL_ERROR;
                    553:   memcpy(zFile, argv[2], nFile+1);
                    554:   zFile[nFile+1] = 0;
                    555:   rc = sqlite3OsOpenMalloc(pVfs, zFile, &fd, 
                    556:       (SQLITE_OPEN_CREATE|SQLITE_OPEN_READWRITE|SQLITE_OPEN_MAIN_DB), 0
                    557:   );
                    558:   if( rc ){
                    559:     Tcl_AppendResult(interp, "open failed: ", errorName(rc), 0);
                    560:     sqlite3_free(zFile);
                    561:     return TCL_ERROR;
                    562:   }
                    563:   offset = n;
                    564:   offset *= 1024*1024;
                    565:   rc = sqlite3OsWrite(fd, "Hello, World!", 14, offset);
                    566:   sqlite3OsCloseFree(fd);
                    567:   sqlite3_free(zFile);
                    568:   if( rc ){
                    569:     Tcl_AppendResult(interp, "write failed: ", errorName(rc), 0);
                    570:     return TCL_ERROR;
                    571:   }
                    572:   return TCL_OK;
                    573: }
                    574: #endif
                    575: 
                    576: 
                    577: /*
                    578: ** test_control_pending_byte  PENDING_BYTE
                    579: **
                    580: ** Set the PENDING_BYTE using the sqlite3_test_control() interface.
                    581: */
                    582: static int testPendingByte(
                    583:   void *NotUsed,
                    584:   Tcl_Interp *interp,    /* The TCL interpreter that invoked this command */
                    585:   int argc,              /* Number of arguments */
                    586:   const char **argv      /* Text of each argument */
                    587: ){
                    588:   int pbyte;
                    589:   int rc;
                    590:   if( argc!=2 ){
                    591:     Tcl_AppendResult(interp, "wrong # args: should be \"", argv[0],
                    592:                      " PENDING-BYTE\"", (void*)0);
                    593:     return TCL_ERROR;
                    594:   }
                    595:   if( Tcl_GetInt(interp, argv[1], &pbyte) ) return TCL_ERROR;
                    596:   rc = sqlite3_test_control(SQLITE_TESTCTRL_PENDING_BYTE, pbyte);
                    597:   Tcl_SetObjResult(interp, Tcl_NewIntObj(rc));
                    598:   return TCL_OK;
                    599: }  
                    600: 
                    601: /*
                    602: ** sqlite3BitvecBuiltinTest SIZE PROGRAM
                    603: **
                    604: ** Invoke the SQLITE_TESTCTRL_BITVEC_TEST operator on test_control.
                    605: ** See comments on sqlite3BitvecBuiltinTest() for additional information.
                    606: */
                    607: static int testBitvecBuiltinTest(
                    608:   void *NotUsed,
                    609:   Tcl_Interp *interp,    /* The TCL interpreter that invoked this command */
                    610:   int argc,              /* Number of arguments */
                    611:   const char **argv      /* Text of each argument */
                    612: ){
                    613:   int sz, rc;
                    614:   int nProg = 0;
                    615:   int aProg[100];
                    616:   const char *z;
                    617:   if( argc!=3 ){
                    618:     Tcl_AppendResult(interp, "wrong # args: should be \"", argv[0],
                    619:                      " SIZE PROGRAM\"", (void*)0);
                    620:   }
                    621:   if( Tcl_GetInt(interp, argv[1], &sz) ) return TCL_ERROR;
                    622:   z = argv[2];
                    623:   while( nProg<99 && *z ){
                    624:     while( *z && !sqlite3Isdigit(*z) ){ z++; }
                    625:     if( *z==0 ) break;
                    626:     aProg[nProg++] = atoi(z);
                    627:     while( sqlite3Isdigit(*z) ){ z++; }
                    628:   }
                    629:   aProg[nProg] = 0;
                    630:   rc = sqlite3_test_control(SQLITE_TESTCTRL_BITVEC_TEST, sz, aProg);
                    631:   Tcl_SetObjResult(interp, Tcl_NewIntObj(rc));
                    632:   return TCL_OK;
                    633: }  
                    634: 
                    635: /*
                    636: ** Register commands with the TCL interpreter.
                    637: */
                    638: int Sqlitetest2_Init(Tcl_Interp *interp){
                    639:   extern int sqlite3_io_error_persist;
                    640:   extern int sqlite3_io_error_pending;
                    641:   extern int sqlite3_io_error_hit;
                    642:   extern int sqlite3_io_error_hardhit;
                    643:   extern int sqlite3_diskfull_pending;
                    644:   extern int sqlite3_diskfull;
                    645:   static struct {
                    646:     char *zName;
                    647:     Tcl_CmdProc *xProc;
                    648:   } aCmd[] = {
                    649:     { "pager_open",              (Tcl_CmdProc*)pager_open          },
                    650:     { "pager_close",             (Tcl_CmdProc*)pager_close         },
                    651:     { "pager_commit",            (Tcl_CmdProc*)pager_commit        },
                    652:     { "pager_rollback",          (Tcl_CmdProc*)pager_rollback      },
                    653:     { "pager_stmt_begin",        (Tcl_CmdProc*)pager_stmt_begin    },
                    654:     { "pager_stmt_commit",       (Tcl_CmdProc*)pager_stmt_commit   },
                    655:     { "pager_stmt_rollback",     (Tcl_CmdProc*)pager_stmt_rollback },
                    656:     { "pager_stats",             (Tcl_CmdProc*)pager_stats         },
                    657:     { "pager_pagecount",         (Tcl_CmdProc*)pager_pagecount     },
                    658:     { "page_get",                (Tcl_CmdProc*)page_get            },
                    659:     { "page_lookup",             (Tcl_CmdProc*)page_lookup         },
                    660:     { "page_unref",              (Tcl_CmdProc*)page_unref          },
                    661:     { "page_read",               (Tcl_CmdProc*)page_read           },
                    662:     { "page_write",              (Tcl_CmdProc*)page_write          },
                    663:     { "page_number",             (Tcl_CmdProc*)page_number         },
                    664:     { "pager_truncate",          (Tcl_CmdProc*)pager_truncate      },
                    665: #ifndef SQLITE_OMIT_DISKIO
                    666:     { "fake_big_file",           (Tcl_CmdProc*)fake_big_file       },
                    667: #endif
                    668:     { "sqlite3BitvecBuiltinTest",(Tcl_CmdProc*)testBitvecBuiltinTest     },
                    669:     { "sqlite3_test_control_pending_byte", (Tcl_CmdProc*)testPendingByte },
                    670:   };
                    671:   int i;
                    672:   for(i=0; i<sizeof(aCmd)/sizeof(aCmd[0]); i++){
                    673:     Tcl_CreateCommand(interp, aCmd[i].zName, aCmd[i].xProc, 0, 0);
                    674:   }
                    675:   Tcl_LinkVar(interp, "sqlite_io_error_pending",
                    676:      (char*)&sqlite3_io_error_pending, TCL_LINK_INT);
                    677:   Tcl_LinkVar(interp, "sqlite_io_error_persist",
                    678:      (char*)&sqlite3_io_error_persist, TCL_LINK_INT);
                    679:   Tcl_LinkVar(interp, "sqlite_io_error_hit",
                    680:      (char*)&sqlite3_io_error_hit, TCL_LINK_INT);
                    681:   Tcl_LinkVar(interp, "sqlite_io_error_hardhit",
                    682:      (char*)&sqlite3_io_error_hardhit, TCL_LINK_INT);
                    683:   Tcl_LinkVar(interp, "sqlite_diskfull_pending",
                    684:      (char*)&sqlite3_diskfull_pending, TCL_LINK_INT);
                    685:   Tcl_LinkVar(interp, "sqlite_diskfull",
                    686:      (char*)&sqlite3_diskfull, TCL_LINK_INT);
                    687: #ifndef SQLITE_OMIT_WSD
                    688:   Tcl_LinkVar(interp, "sqlite_pending_byte",
                    689:      (char*)&sqlite3PendingByte, TCL_LINK_INT | TCL_LINK_READ_ONLY);
                    690: #endif
                    691:   return TCL_OK;
                    692: }

FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>