Subject | Re: [firebird-support] Dump blobs from GDB File - Part II |
---|---|
Author | Ann Harrison |
Post date | 2003-09-12T16:22:09Z |
Pierre Y. wrote:
Level 0 blobs contain the blob data. In that case, the bytes following
the blob header are actual data, complete with the length words we
talked about earlier. Level 1 blobs are arrays of page numbers of level
0 blob pages. Level 2 blobs are arrays of page numbers of level 1
blobs. So, if your header says level 0, just read the data. If it says
level 1, then you've got a multi-page blob, and you'll find it the way
you've been doing.
it makes no attempt to handle either record or blob data.
{
char * p = index->dpg_offset + sizeof (struct
(blh));
char * end = index->dpg_offset + index->dpg_length;
read from p to end.
}
Give or take some formatting and casts and an actually read loop, that
should do it.
Regards,
Ann
>Now I can dump the blobs that are in BLOB Pages even if they are fragmented in two or more pages.Great.
>
> But when I look the database file using IB Surgeon, I see that most of my blobs are lesser than the pagefile size so they are stored in "standard" data pages.OK.
>
> How can I read a blob stored in a data page ?Here's part of the answer. Blobs can be stored in up to three levels.
>
Level 0 blobs contain the blob data. In that case, the bytes following
the blob header are actual data, complete with the length words we
talked about earlier. Level 1 blobs are arrays of page numbers of level
0 blob pages. Level 2 blobs are arrays of page numbers of level 1
blobs. So, if your header says level 0, just read the data. If it says
level 1, then you've got a multi-page blob, and you'll find it the way
you've been doing.
>I found in the dmp.c file an algorithm to read the data pages but there are no indication on to get the blob datas :Dmp is really only intested in structurally significant information, so
>
it makes no attempt to handle either record or blob data.
>if (blob->blh_level == 0)
>static void dmp_data (register DPG page)
>{
>
> /* .... */
>
> header = (RHD) ((SCHAR*) page + index->dpg_offset);
> fragment = (RHDF) header;
> if (header->rhd_flags & rhd_blob)
> {
> blob = (BLH) header;
>
{
char * p = index->dpg_offset + sizeof (struct
(blh));
char * end = index->dpg_offset + index->dpg_length;
read from p to end.
}
Give or take some formatting and casts and an actually read loop, that
should do it.
Regards,
Ann