> Afternoon all,
> 
> I have been working on a Firebird Internals manual for some time, and it 
> was built with the help of a small tool I wrote to dump out specific 
> pages from a database. The structs for each page were blatantly copied 
> from jrd/ods.h and when I compiled my app back then (ahem, 2009!) my gcc 
> version was 4.1.2 and all worked fine.
> 
> On my own laptop I have gcc version 4.6.3 and I'm getting complete 
> garbage with the same source code.
> 
> I suspect I'm falling foul of some gcc alignment/padding thing and I'm 
> wondering if anyone could point me in the right direction?
> 
> At present I compile with a simple "gcc -o fbdump fbdump.c" and that's 
> the same on the old system and my laptop (exactly the same source.)
> 
> As an example of how wrong it can be, here's a Firebird 2.5 employee 
> page header showing all sorts of errors:
> 
> FBDUMP 1.00 - Firebird Page Dump Utility
> 
> Parameters : -v -p 0
> Database: /var/lib/firebird/2.5/data/employee.fdb
> 
> DATABASE PAGE DETAILS - Page 0
> PAGE HEADER
>         Page Type: 1
>         Flags: 0
>         Checksum: 12345
>         Generation: 0
>         SCN: 15033110528
>         Reserved: 2993592205312
> PAGE DATA
>         Database Page Size: 698
>         ODS Version: 0
>         Pages: 240028567601152
>         Next Page: 348481045616
>         Oldest Transaction: 563031557799936
>         Oldest Active: 6291458
>         Next Transaction: 2997887172609
>         Sequence: 0
>         Flags: 0
>         Creation Date: COMING SOON
>         Attachment Id: 0
>         Shadow Count: 0
>         Implementation: 0
>         ODS minor: 0
>         ODS minororiginal: 0
>         HDR_END: 0
>         Page Buffers: 0
>         Bumped Transaction: 0
>         Oldest Snapshot: 0
>         Backup Pages: 0
> 
> A straight hexdump of the first page is as follows:
> 
> 0000  01 00 39 30 c8 02 00 00  00 00 00 00 00 00 00 00
> 0010  00 10 0b 80 03 00 00 00  00 00 00 00 b9 02 00 00
> 0020  ba 02 00 00 bb 02 00 00  00 00 82 01 4e da 00 00
> 0030  70 c4 16 23 51 00 00 00  00 00 00 00 13 00 02 00
> 0040  02 00 60 00 00 00 00 00  01 00 00 00 ba 02 00 00
> 0050  00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00
> 
> And finally, how the header page is defined in the utility:
> 
> // Page Header - on every page type.
> typedef struct
> {
>         SCHAR pag_type;
>         UCHAR pag_flags;
>         USHORT pag_checksum;
>         ULONG pag_generation;
>         ULONG pag_scn;
>         ULONG pag_reserved;
> } pageHeader;

    Looks like your ULONG is 8-byte integer while it shold be 4-byte.

Regards,
Vlad

------------------------------------------------------------------------------
Learn Graph Databases - Download FREE O'Reilly Book
"Graph Databases" is the definitive new guide to graph databases and 
their applications. This 200-page book is written by three acclaimed 
leaders in the field. The early access version is available now. 
Download your free book today! http://p.sf.net/sfu/neotech_d2d_may
Firebird-Devel mailing list, web interface at 
https://lists.sourceforge.net/lists/listinfo/firebird-devel

Reply via email to