/* ** This utility program decodes and displays the content of the ** sqlite_stat4 table in the database file named on the command ** line. */ #include #include #include #include #include "sqlite3.h" typedef sqlite3_int64 i64; /* 64-bit signed integer type */ /* ** Convert the var-int format into i64. Return the number of bytes ** in the var-int. Write the var-int value into *pVal. */ static int decodeVarint(const unsigned char *z, i64 *pVal){ i64 v = 0; int i; for(i=0; i<8; i++){ v = (v<<7) + (z[i]&0x7f); if( (z[i]&0x80)==0 ){ *pVal = v; return i+1; } } v = (v<<8) + (z[i]&0xff); *pVal = v; return 9; } int main(int argc, char **argv){ sqlite3 *db; sqlite3_stmt *pStmt; char *zIdx = 0; int rc, j, x, y, mxHdr; const unsigned char *aSample; int nSample; i64 iVal; const char *zSep; if( argc!=2 ){ fprintf(stderr, "Usage: %s DATABASE-FILE\n", argv[0]); exit(1); } rc = sqlite3_open(argv[1], &db); if( rc!=SQLITE_OK || db==0 ){ fprintf(stderr, "Cannot open database file [%s]\n", argv[1]); exit(1); } rc = sqlite3_prepare_v2(db, "SELECT tbl||'.'||idx, nEq, nLT, nDLt, sample " "FROM sqlite_stat4 ORDER BY 1", -1, &pStmt, 0); if( rc!=SQLITE_OK || pStmt==0 ){ fprintf(stderr, "%s\n", sqlite3_errmsg(db)); sqlite3_close(db); exit(1); } while( SQLITE_ROW==sqlite3_step(pStmt) ){ if( zIdx==0 || strcmp(zIdx, (const char*)sqlite3_column_text(pStmt,0))!=0 ){ if( zIdx ) printf("\n"); sqlite3_free(zIdx); zIdx = sqlite3_mprintf("%s", sqlite3_column_text(pStmt,0)); printf("%s:\n", zIdx); }else{ printf(" -----------------------------------------------------------\n"); } printf(" nEq = %s\n", sqlite3_column_text(pStmt,1)); printf(" nLt = %s\n", sqlite3_column_text(pStmt,2)); printf(" nDLt = %s\n", sqlite3_column_text(pStmt,3)); printf(" sample = x'"); aSample = sqlite3_column_blob(pStmt,4); nSample = sqlite3_column_bytes(pStmt,4); for(j=0; jnSample ){ printf(" \n"); continue; } y = mxHdr = (int)iVal; while( xmxHdr ) break; if( iVal<0 ) break; switch( iVal ){ case 0: sz = 0; break; case 1: sz = 1; break; case 2: sz = 2; break; case 3: sz = 3; break; case 4: sz = 4; break; case 5: sz = 6; break; case 6: sz = 8; break; case 7: sz = 8; break; case 8: sz = 0; break; case 9: sz = 0; break; case 10: case 11: sz = 0; break; default: sz = (int)(iVal-12)/2; break; } if( y+sz>nSample ) break; if( iVal==0 ){ printf("%sNULL", zSep); }else if( iVal<=7 ){ v = (signed char)aSample[y]; for(j=1; j