support routine for index writes

port fix from data.c to mdb_crack_row?()
more tdef4 dissector work in gmdb2
This commit is contained in:
brianb
2004-02-15 06:00:25 +00:00
parent feba3eece6
commit eb2b863b35
5 changed files with 72 additions and 7 deletions

View File

@@ -313,11 +313,49 @@ mdb_index_test_sargs(MdbHandle *mdb, MdbIndex *idx, unsigned char *buf, int len)
}
return 1;
}
/*
* pack the pages bitmap
*/
int
mdb_index_pack_bitmap(MdbHandle *mdb, MdbIndexPage *ipg)
{
int mask_bit = 0;
int mask_pos = 0x16;
int mask_byte;
int elem = 0;
int len, start, i;
start = ipg->idx_starts[elem++];
while (start) {
len = ipg->idx_starts[elem] - start;
fprintf(stdout, "len is %d\n", len);
for (i=0; i < len; i++) {
mask_bit++;
if (mask_bit==8) {
mask_bit=0;
mdb->pg_buf[mask_pos++] = mask_byte;
mask_byte = 0;
}
/* upon reaching the len, set the bit */
}
mask_byte = (1 << mask_bit) | mask_byte;
fprintf(stdout, "mask byte is %02x at %d\n", mask_byte, mask_pos);
start = ipg->idx_starts[elem++];
}
/* flush the last byte if any */
mdb->pg_buf[mask_pos++] = mask_byte;
/* remember to zero the rest of the bitmap */
for (i = mask_pos; i < 0xf8; i++) {
mdb->pg_buf[mask_pos++] = 0;
}
return 0;
}
/*
* unpack the pages bitmap
*/
int
mdb_index_unpack_page(MdbHandle *mdb, MdbIndexPage *ipg)
mdb_index_unpack_bitmap(MdbHandle *mdb, MdbIndexPage *ipg)
{
int mask_bit = 0;
int mask_pos = 0x16;
@@ -364,7 +402,7 @@ mdb_index_find_next_on_page(MdbHandle *mdb, MdbIndexPage *ipg)
/* if this page has not been unpacked to it */
if (!ipg->idx_starts[0]){
//fprintf(stdout, "Unpacking page %d\n", ipg->pg);
mdb_index_unpack_page(mdb, ipg);
mdb_index_unpack_bitmap(mdb, ipg);
}
@@ -377,8 +415,6 @@ mdb_index_find_next_on_page(MdbHandle *mdb, MdbIndexPage *ipg)
}
void mdb_index_page_reset(MdbIndexPage *ipg)
{
int i;
ipg->offset = 0xf8; /* start byte of the index entries */
ipg->start_pos=0;
ipg->len = 0;

View File

@@ -167,7 +167,7 @@ int eod, len; /* end of data */
next_col = mdb_pg_get_int16(mdb, var_entry_pos);
len = next_col - col_start;
} /* if found==var_cols */
if (len<0) len+=256;
while (len<0) len+=256;
fields[totcols].start = row_start + col_start;
fields[totcols].value = &mdb->pg_buf[row_start +col_start];
fields[totcols++].siz = len;
@@ -302,7 +302,7 @@ int eod, len; /* end of data */
var_cols_found - 1;
len=mdb->pg_buf[var_entry_pos] - mdb->pg_buf[var_entry_pos+1];
} /* if found==var_cols */
if (len<0) len+=256;
while (len<0) len+=256;
fields[totcols].start = row_start + col_start;
fields[totcols].value = &mdb->pg_buf[row_start +col_start];
fields[totcols++].siz = len;