From: drh Date: Thu, 19 Jun 2014 23:38:53 +0000 (+0000) Subject: Add the ability to decode the headers of individual cells, byte-by-byte, X-Git-Tag: version-3.8.6~104 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=6a30cd5a446405d19b047de984d78c048da4ae08;p=thirdparty%2Fsqlite.git Add the ability to decode the headers of individual cells, byte-by-byte, in the "showdb.exe" utility. FossilOrigin-Name: 306b461d7c0643b6ac4df944759ecc9ce8581634 --- diff --git a/manifest b/manifest index e4246ebcc8..d6ee27e4ac 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Add\sthe\s"LogEst"\sand\s"LogEst.exe"\starget\sto\sthe\smakefiles. -D 2014-06-18T18:10:12.200 +C Add\sthe\sability\sto\sdecode\sthe\sheaders\sof\sindividual\scells,\sbyte-by-byte,\nin\sthe\s"showdb.exe"\sutility. +D 2014-06-19T23:38:53.722 F Makefile.arm-wince-mingw32ce-gcc d6df77f1f48d690bd73162294bbba7f59507c72f F Makefile.in b03432313a3aad96c706f8164fb9f5307eaf19f5 F Makefile.linux-gcc 91d710bdc4998cb015f39edf3cb314ec4f4d7e23 @@ -1158,7 +1158,7 @@ F tool/opcodeDoc.awk b3a2a3d5d3075b8bd90b7afe24283efdd586659c F tool/pagesig.c ff0ca355fd3c2398e933da5e22439bbff89b803b F tool/restore_jrnl.tcl 6957a34f8f1f0f8285e07536225ec3b292a9024a F tool/rollback-test.c 9fc98427d1e23e84429d7e6d07d9094fbdec65a5 -F tool/showdb.c 1f3fe634d6f690b8d39ab1b9fd34583d468921e1 +F tool/showdb.c c080dea3addc8440191aef2c7cf222ee7959529c F tool/showjournal.c b62cecaab86a4053d944c276bb5232e4d17ece02 F tool/showwal.c 3f7f7da5ec0cba51b1449a75f700493377da57b5 F tool/soak1.tcl 8d407956e1a45b485a8e072470a3e629a27037fe @@ -1179,7 +1179,7 @@ F tool/vdbe_profile.tcl 67746953071a9f8f2f668b73fe899074e2c6d8c1 F tool/warnings-clang.sh f6aa929dc20ef1f856af04a730772f59283631d4 F tool/warnings.sh 0abfd78ceb09b7f7c27c688c8e3fe93268a13b32 F tool/win/sqlite.vsix deb315d026cc8400325c5863eef847784a219a2f -P 5e514f6acebcfad4f18300d1a34f4917f1a746d9 -R 608fed792452245bc29949099b24055c +P 7b91b0581d169a353462d96120a2e0d4dcc8e8ae +R 80dc9f5b1256cb0818cbd9270f47db96 U drh -Z 8ecf2902c498abf367d738a353cfaa20 +Z ec7d321d3c2511a642cbe0539a129858 diff --git a/manifest.uuid b/manifest.uuid index 858eff2d28..204ffc59ee 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -7b91b0581d169a353462d96120a2e0d4dcc8e8ae \ No newline at end of file +306b461d7c0643b6ac4df944759ecc9ce8581634 \ No newline at end of file diff --git a/tool/showdb.c b/tool/showdb.c index 4d274a7aac..d4e26f45c1 100644 --- a/tool/showdb.c +++ b/tool/showdb.c @@ -129,6 +129,7 @@ static void print_page(int iPg){ free(aData); } + /* Print a line of decode output showing a 4-byte integer. */ static void print_decode_line( @@ -341,6 +342,120 @@ static int describeCell( return nLocal+n; } +/* Print an offset followed by nByte bytes. Add extra white-space +** at the end so that subsequent text is aligned. +*/ +static void printBytes( + unsigned char *aData, /* Content being decoded */ + unsigned char *aStart, /* Start of content to be printed */ + int nByte /* Number of bytes to print */ +){ + int j; + printf(" %03x: ", (int)(aStart-aData)); + for(j=0; j<9; j++){ + if( j>=nByte ){ + printf(" "); + }else{ + printf("%02x ", aStart[j]); + } + } +} + + +/* +** Write a full decode on stdout for the cell at a[ofst]. +** Assume the page contains a header of size szPgHdr bytes. +*/ +static void decodeCell( + unsigned char *a, /* Page content (without the page-1 header) */ + unsigned pgno, /* Page number */ + int iCell, /* Cell index */ + int szPgHdr, /* Size of the page header. 0 or 100 */ + int ofst /* Cell begins at a[ofst] */ +){ + int i, j, k; + int leftChild; + i64 nPayload; + i64 rowid; + i64 nHdr; + i64 iType; + int nLocal; + unsigned char *x = a + ofst; + unsigned char *end; + unsigned char cType = a[0]; + + printf("Decode cell[%d] on page %d offset %04x....\n", + iCell, pgno, szPgHdr+ofst); + if( cType<=5 ){ + leftChild = ((x[0]*256 + x[1])*256 + x[2])*256 + x[3]; + printBytes(a, x, 4); + printf("left child page:: %d\n", leftChild); + x += 4; + } + if( cType!=5 ){ + i = decodeVarint(x, &nPayload); + printBytes(a, x, i); + nLocal = localPayload(nPayload, cType); + printf("bytes of payload: %d (local: %d)\n", (int)nPayload, nLocal); + x += i; + }else{ + nPayload = nLocal = 0; + } + end = x + nLocal; + if( cType==5 || cType==13 ){ + i = decodeVarint(x, &rowid); + printBytes(a, x, i); + printf("rowid: %lld\n", rowid); + x += i; + } + if( nLocal>0 ){ + i = decodeVarint(x, &nHdr); + printBytes(a, x, i); + printf("record header size: %d\n", (int)nHdr); + j = i; + k = 0; + while( x+j0 ){ - printf(" key: lx=left-child n=payload-size r=rowid\n"); + iCellPtr = (a[0]==2 || a[0]==5) ? 12 : 8; + if( cellToDecode==(-2) ){ + printf("Decode of btree page %d:\n", pgno); + print_decode_line(a, 0, 1, zType); + print_decode_line(a, 1, 2, "Offset to first freeblock"); + print_decode_line(a, 3, 2, "Number of cells on this page"); + print_decode_line(a, 5, 2, "Offset to cell content area"); + print_decode_line(a, 7, 1, "Fragmented byte count"); + if( a[0]==2 || a[0]==5 ){ + print_decode_line(a, 8, 4, "Right child"); + } + if( nCell>0 ){ + printf(" key: lx=left-child n=payload-size r=rowid\n"); + } + }else if( cellToDecode>=nCell ){ + printf("Page %d has only %d cells\n", pgno, nCell); + return; } if( showMap ){ zMap = malloc(pagesize); @@ -409,14 +540,18 @@ static void decode_btree_page( j = strlen(zBuf); if( j<=n-2 ) memcpy(&zMap[cofst+1], zBuf, j); } - printf(" %03x: cell[%d] %s\n", cofst, i, zDesc); + if( cellToDecode==(-2) ){ + printf(" %03x: cell[%d] %s\n", cofst, i, zDesc); + }else if( cellToDecode==(-1) || cellToDecode==i ){ + decodeCell(a, pgno, i, hdrSize, cofst-hdrSize); + } } if( showMap ){ for(i=0; i