Many hyperlinks are disabled.
Use anonymous login
to enable hyperlinks.
Overview
Comment: | Fix the hash signature algorithm in vfslog.c. Add a utility program to show the hash signatures for every page of a database file. |
---|---|
Downloads: | Tarball | ZIP archive |
Timelines: | family | ancestors | descendants | both | trunk |
Files: | files | file ages | folders |
SHA1: |
eaf4de13a63b2294ae575432a0224933 |
User & Date: | drh 2013-10-10 13:38:51.770 |
Context
2013-10-10
| ||
13:41 | Another fix to the hash signature algorithm in vfslog.c. (check-in: 34212aa8c4 user: drh tags: trunk) | |
13:38 | Fix the hash signature algorithm in vfslog.c. Add a utility program to show the hash signatures for every page of a database file. (check-in: eaf4de13a6 user: drh tags: trunk) | |
13:04 | Add ext/misc/vfslog.c, a VFS shim for unix that keeps a log of method calls made by SQLite. (check-in: 24a827b876 user: dan tags: trunk) | |
Changes
Changes to ext/misc/vfslog.c.
︙ | ︙ | |||
303 304 305 306 307 308 309 | vlogLogClose(p->pLog); return rc; } /* ** Compute signature for a block of content. ** | > > > | | > > > | | | | | | | | > | 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322 323 324 325 326 327 328 329 330 331 332 333 334 335 336 337 338 | vlogLogClose(p->pLog); return rc; } /* ** Compute signature for a block of content. ** ** For blocks of 16 or fewer bytes, the signature is just a hex dump of ** the entire block. ** ** For blocks of more than 16 bytes, the signature is a hex dump of the ** first 8 bytes followed by a 64-bit has of the entire block. */ static void vlogSignature(unsigned char *p, int n, char *zCksum){ unsigned int s0 = 0, s1 = 0; unsigned int *pI; int i; if( n<=16 ){ for(i=0; i<n; i++) sqlite3_snprintf(3, zCksum+i*2, "%02x", p[i]); }else{ pI = (unsigned int*)p; for(i=0; i<n-7; i+=8){ s0 += pI[0] + s1; s1 += pI[1] + s0; pI += 2; } for(i=0; i<8; i++) sqlite3_snprintf(3, zCksum+i*2, "%02x", p[i]); sqlite3_snprintf(18, zCksum+i*2, "-%08x08x", s0, s1); } } /* ** Read data from an vlog-file. */ static int vlogRead( sqlite3_file *pFile, |
︙ | ︙ | |||
656 657 658 659 660 661 662 | ** Register debugvfs as the default VFS for this process. */ int sqlite3_register_vfslog(const char *zArg){ vlog_vfs.pVfs = sqlite3_vfs_find(0); vlog_vfs.base.szOsFile = sizeof(VLogFile) + vlog_vfs.pVfs->szOsFile; return sqlite3_vfs_register(&vlog_vfs.base, 1); } | < < | 663 664 665 666 667 668 669 | ** Register debugvfs as the default VFS for this process. */ int sqlite3_register_vfslog(const char *zArg){ vlog_vfs.pVfs = sqlite3_vfs_find(0); vlog_vfs.base.szOsFile = sizeof(VLogFile) + vlog_vfs.pVfs->szOsFile; return sqlite3_vfs_register(&vlog_vfs.base, 1); } |
Added tool/pagesig.c.
> > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 | /* ** 2013-10-01 ** ** The author disclaims copyright to this source code. In place of ** a legal notice, here is a blessing: ** ** May you do good and not evil. ** May you find forgiveness for yourself and forgive others. ** May you share freely, never taking more than you give. ** ****************************************************************************** ** ** Compute hash signatures for every page of a database file. This utility ** program is useful for analyzing the output logs generated by the ** ext/misc/vfslog.c extension. */ #include <stdio.h> #include <string.h> #include <assert.h> #include <stdlib.h> /* ** Compute signature for a block of content. ** ** For blocks of 16 or fewer bytes, the signature is just a hex dump of ** the entire block. ** ** For blocks of more than 16 bytes, the signature is a hex dump of the ** first 8 bytes followed by a 64-bit has of the entire block. */ static void vlogSignature(unsigned char *p, int n, char *zCksum){ unsigned int s0 = 0, s1 = 0; unsigned int *pI; int i; if( n<=16 ){ for(i=0; i<n; i++) sprintf(zCksum+i*2, "%02x", p[i]); }else{ pI = (unsigned int*)p; for(i=0; i<n-7; i+=8){ s0 += pI[0] + s1; s1 += pI[1] + s0; pI += 2; } for(i=0; i<8; i++) sprintf(zCksum+i*2, "%02x", p[i]); sprintf(zCksum+i*2, "-%08x08x", s0, s1); } } /* ** Open a file. Find its page size. Read each page, and compute and ** display the page signature. */ static void computeSigs(const char *zFilename){ FILE *in = fopen(zFilename, "rb"); unsigned pgsz; size_t got; unsigned n; unsigned char aBuf[50]; unsigned char aPage[65536]; if( in==0 ){ fprintf(stderr, "cannot open \"%s\"\n", zFilename); return; } got = fread(aBuf, 1, sizeof(aBuf), in); if( got!=sizeof(aBuf) ){ goto endComputeSigs; } pgsz = aBuf[16]*256 + aBuf[17]; if( pgsz==1 ) pgsz = 65536; if( (pgsz & (pgsz-1))!=0 ){ fprintf(stderr, "invalid page size: %02x%02x\n", aBuf[16], aBuf[17]); goto endComputeSigs; } rewind(in); for(n=1; (got=fread(aPage, 1, pgsz, in))==pgsz; n++){ vlogSignature(aPage, pgsz, aBuf); printf("%4d: %s\n", n, aBuf); } endComputeSigs: fclose(in); } /* ** Find page signatures for all named files. */ int main(int argc, char **argv){ int i; for(i=1; i<argc; i++) computeSigs(argv[i]); return 0; } |