#include "lsmtest.h" #include "bt.h" int do_bt(int nArg, char **azArg){ struct Option { const char *zName; int bPgno; int eOpt; } aOpt [] = { { "dbhdr", 0, BT_INFO_HDRDUMP }, { "filename", 0, BT_INFO_FILENAME }, { "block_freelist", 0, BT_INFO_BLOCK_FREELIST }, { "page_freelist", 0, BT_INFO_PAGE_FREELIST }, { "filename", 0, BT_INFO_FILENAME }, { "page", 1, BT_INFO_PAGEDUMP }, { "page_ascii", 1, BT_INFO_PAGEDUMP_ASCII }, { "leaks", 0, BT_INFO_PAGE_LEAKS }, { 0, 0 } }; int iOpt; int rc; bt_info buf; char *zOpt; char *zFile; bt_db *db = 0; if( nArg<2 ){ testPrintUsage("FILENAME OPTION ..."); return -1; } zFile = azArg[0]; zOpt = azArg[1]; rc = testArgSelect(aOpt, "option", zOpt, &iOpt); if( rc!=0 ) return rc; if( nArg!=2+aOpt[iOpt].bPgno ){ testPrintFUsage("FILENAME %s %s", zOpt, aOpt[iOpt].bPgno ? "PGNO" : ""); return -4; } rc = sqlite4BtNew(sqlite4_env_default(), 0, &db); if( rc!=SQLITE4_OK ){ testPrintError("sqlite4BtNew() failed: %d", rc); return -2; } rc = sqlite4BtOpen(db, zFile); if( rc!=SQLITE4_OK ){ testPrintError("sqlite4BtOpen() failed: %d", rc); return -3; } buf.eType = aOpt[iOpt].eOpt; buf.pgno = 0; sqlite4_buffer_init(&buf.output, 0); if( aOpt[iOpt].bPgno ){ buf.pgno = (u32)atoi(azArg[2]); } rc = sqlite4BtControl(db, BT_CONTROL_INFO, &buf); if( rc!=SQLITE4_OK ){ testPrintError("sqlite4BtControl() failed: %d\n", rc); return -4; } printf("%s\n", (char*)buf.output.p); sqlite4_buffer_clear(&buf.output); return 0; }