mirror of
https://github.com/mdbtools/mdbtools.git
synced 2025-06-28 15:39:02 +08:00
mdb-import fixes, kinda works now
This commit is contained in:
parent
93979e0881
commit
2002c19cee
@ -1,3 +1,9 @@
|
||||
Fri Feb 11 10:41:55 EST 2005 Brian Bruns <brian@bruns.com>
|
||||
* src/libmdb/index.c: Fix off by one bug in mdb_index_swap_n()
|
||||
* src/libmdb/write.c: Fix bug in key hash
|
||||
* src/libmdb/mem.c: Comment out METHOD define(?) which broke compile
|
||||
* src/util/mdb-import.c: set fixed flag before calling pack_row
|
||||
|
||||
Wed Feb 9 23:37:43 CST 2005 Jeff Smith <whydoubt@yahoo.com>
|
||||
* src/libmdb/data.c: Date calculation bugfix (David Mansfield)
|
||||
* src/libmdb/data.c: Deleted rows bugfix (David Mansfield)
|
||||
|
@ -185,7 +185,7 @@ mdb_index_swap_n(unsigned char *src, int sz, unsigned char *dest)
|
||||
{
|
||||
int i, j = 0;
|
||||
|
||||
for (i = sz; i > 0; i--) {
|
||||
for (i = sz-1; i >= 0; i--) {
|
||||
dest[j++] = src[i];
|
||||
}
|
||||
}
|
||||
@ -321,9 +321,9 @@ mdb_index_pack_bitmap(MdbHandle *mdb, MdbIndexPage *ipg)
|
||||
start = ipg->idx_starts[elem++];
|
||||
|
||||
while (start) {
|
||||
fprintf(stdout, "elem %d is %d\n", elem, ipg->idx_starts[elem]);
|
||||
//fprintf(stdout, "elem %d is %d\n", elem, ipg->idx_starts[elem]);
|
||||
len = ipg->idx_starts[elem] - start;
|
||||
fprintf(stdout, "len is %d\n", len);
|
||||
//fprintf(stdout, "len is %d\n", len);
|
||||
for (i=0; i < len; i++) {
|
||||
mask_bit++;
|
||||
if (mask_bit==8) {
|
||||
@ -334,7 +334,7 @@ mdb_index_pack_bitmap(MdbHandle *mdb, MdbIndexPage *ipg)
|
||||
/* 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);
|
||||
//fprintf(stdout, "mask byte is %02x at %d\n", mask_byte, mask_pos);
|
||||
start = ipg->idx_starts[elem++];
|
||||
}
|
||||
/* flush the last byte if any */
|
||||
|
@ -114,7 +114,7 @@ mdb_map_find_next_freepage(MdbTableDef *table, int row_size)
|
||||
pgnum = mdb_map_find_next(mdb,
|
||||
table->free_usage_map,
|
||||
table->freemap_sz, cur_pg);
|
||||
printf("looking at page %d\n", pgnum);
|
||||
//printf("looking at page %d\n", pgnum);
|
||||
if (!pgnum) {
|
||||
/* allocate new page */
|
||||
pgnum = mdb_alloc_page(table);
|
||||
@ -127,7 +127,7 @@ mdb_map_find_next_freepage(MdbTableDef *table, int row_size)
|
||||
|
||||
} while (free_space < row_size);
|
||||
|
||||
printf("page %d has %d bytes left\n", pgnum, free_space);
|
||||
//printf("page %d has %d bytes left\n", pgnum, free_space);
|
||||
|
||||
return pgnum;
|
||||
}
|
||||
|
@ -33,7 +33,7 @@
|
||||
* by calling program and prior to any other function.
|
||||
*
|
||||
**/
|
||||
METHOD void mdb_init()
|
||||
/* METHOD */ void mdb_init()
|
||||
{
|
||||
mdb_init_backends();
|
||||
}
|
||||
@ -46,7 +46,7 @@ METHOD void mdb_init()
|
||||
* functions).
|
||||
*
|
||||
**/
|
||||
METHOD void mdb_exit()
|
||||
/* METHOD */ void mdb_exit()
|
||||
{
|
||||
mdb_remove_backends();
|
||||
}
|
||||
|
@ -572,6 +572,7 @@ mdb_update_index(MdbTableDef *table, MdbIndex *idx, unsigned int num_fields, Mdb
|
||||
}
|
||||
}
|
||||
}
|
||||
/*
|
||||
for (i = 0; i < idx->num_keys; i++) {
|
||||
fprintf(stdout, "key col %d (%d) is mapped to field %d (%d %d)\n",
|
||||
i, idx->key_col_num[i], idx_xref[i], fields[idx_xref[i]].colnum,
|
||||
@ -582,13 +583,14 @@ mdb_update_index(MdbTableDef *table, MdbIndex *idx, unsigned int num_fields, Mdb
|
||||
i, fields[i].colnum,
|
||||
fields[i].siz);
|
||||
}
|
||||
*/
|
||||
|
||||
chain = g_malloc0(sizeof(MdbIndexChain));
|
||||
|
||||
mdb_index_find_row(mdb, idx, chain, pgnum, rownum);
|
||||
printf("chain depth = %d\n", chain->cur_depth);
|
||||
printf("pg = %" G_GUINT32_FORMAT "\n",
|
||||
chain->pages[chain->cur_depth-1].pg);
|
||||
//printf("chain depth = %d\n", chain->cur_depth);
|
||||
//printf("pg = %" G_GUINT32_FORMAT "\n",
|
||||
//chain->pages[chain->cur_depth-1].pg);
|
||||
//mdb_copy_index_pg(table, idx, &chain->pages[chain->cur_depth-1]);
|
||||
mdb_add_row_to_leaf_pg(table, idx, &chain->pages[chain->cur_depth-1], idx_fields, pgnum, rownum);
|
||||
|
||||
@ -742,13 +744,12 @@ unsigned int num_fields;
|
||||
|
||||
if (mdb_get_option(MDB_DEBUG_WRITE)) {
|
||||
for (i=0;i<num_fields;i++) {
|
||||
printf("col %d %d start %d siz %d\n", i, fields[i].colnum, fields[i].start, fields[i].siz);
|
||||
//printf("col %d %d start %d siz %d fixed 5d\n", i, fields[i].colnum, fields[i].start, fields[i].siz, fields[i].is_fixed);
|
||||
}
|
||||
}
|
||||
for (i=0;i<table->num_cols;i++) {
|
||||
col = g_ptr_array_index(table->columns,i);
|
||||
if (col->bind_ptr) {
|
||||
printf("yes\n");
|
||||
fields[i].value = col->bind_ptr;
|
||||
fields[i].siz = *(col->len_ptr);
|
||||
}
|
||||
@ -851,6 +852,7 @@ mdb_copy_index_pg(MdbTableDef *table, MdbIndex *idx, MdbIndexPage *ipg)
|
||||
|
||||
new_pg = mdb_new_leaf_pg(entry);
|
||||
|
||||
/* reinitial ipg pointers to start of page */
|
||||
mdb_index_page_reset(ipg);
|
||||
mdb_read_pg(mdb, ipg->pg);
|
||||
|
||||
@ -861,12 +863,10 @@ mdb_copy_index_pg(MdbTableDef *table, MdbIndex *idx, MdbIndexPage *ipg)
|
||||
}
|
||||
keycol = idx->key_col_num[0];
|
||||
col = g_ptr_array_index (table->columns, keycol - 1);
|
||||
printf("keycol = %d (%s)\n", keycol, col->name);
|
||||
if (!mdb_is_fixed_col(col)) {
|
||||
fprintf(stderr,"variable length key columns not yet supported, aborting\n");
|
||||
return 0;
|
||||
}
|
||||
printf("col size = %d\n", col->col_size);
|
||||
|
||||
while (mdb_index_find_next_on_page(mdb, ipg)) {
|
||||
|
||||
@ -884,13 +884,11 @@ mdb_copy_index_pg(MdbTableDef *table, MdbIndex *idx, MdbIndexPage *ipg)
|
||||
mdb_index_swap_n(&mdb->pg_buf[ipg->offset + 1], col->col_size, key_hash);
|
||||
key_hash[col->col_size - 1] &= 0x7f;
|
||||
|
||||
printf("length = %d\n", ipg->len);
|
||||
printf("offset = %d\n", ipg->offset);
|
||||
printf("iflag = %d pg = %" G_GUINT32_FORMAT
|
||||
" row = %" G_GUINT16_FORMAT "\n", iflag, pg, row);
|
||||
buffer_dump(mdb->pg_buf, ipg->offset, ipg->offset + ipg->len - 1);
|
||||
buffer_dump(mdb->pg_buf, ipg->offset + 1, ipg->offset + col->col_size);
|
||||
buffer_dump(key_hash, 0, col->col_size - 1);
|
||||
if (mdb_get_option(MDB_DEBUG_WRITE)) {
|
||||
buffer_dump(mdb->pg_buf, ipg->offset, ipg->offset + ipg->len - 1);
|
||||
buffer_dump(mdb->pg_buf, ipg->offset + 1, ipg->offset + col->col_size);
|
||||
buffer_dump(key_hash, 0, col->col_size - 1);
|
||||
}
|
||||
|
||||
memcpy(&new_pg[ipg->offset], &mdb->pg_buf[ipg->offset], ipg->len);
|
||||
ipg->offset += ipg->len;
|
||||
@ -901,20 +899,30 @@ mdb_copy_index_pg(MdbTableDef *table, MdbIndex *idx, MdbIndexPage *ipg)
|
||||
//_mdb_put_int16(new_pg, mdb->fmt->row_count_offset, row);
|
||||
/* free space left */
|
||||
_mdb_put_int16(new_pg, 2, mdb->fmt->pg_size - ipg->offset);
|
||||
printf("offset = %d\n", ipg->offset);
|
||||
//printf("offset = %d\n", ipg->offset);
|
||||
|
||||
mdb_index_swap_n(idx_fields[0].value, col->col_size, key_hash);
|
||||
key_hash[0] |= 0x080;
|
||||
if (mdb_get_option(MDB_DEBUG_WRITE)) {
|
||||
printf("key_hash\n");
|
||||
buffer_dump(idx_fields[0].value, 0, col->col_size-1);
|
||||
buffer_dump(key_hash, 0, col->col_size-1);
|
||||
printf("--------\n");
|
||||
}
|
||||
new_pg[ipg->offset] = 0x7f;
|
||||
memcpy(&new_pg[ipg->offset + 1], key_hash, col->col_size);
|
||||
_mdb_put_int24_msb(new_pg, ipg->offset + 5, pgnum);
|
||||
new_pg[ipg->offset + 8] = rownum;
|
||||
printf("row %d offset %d\n", row, ipg->offset);
|
||||
new_pg[ipg->offset + 8] = rownum-1;
|
||||
ipg->idx_starts[row++] = ipg->offset + ipg->len;
|
||||
//ipg->idx_starts[row] = ipg->offset + ipg->len;
|
||||
buffer_dump(mdb->pg_buf, 0, mdb->fmt->pg_size-1);
|
||||
if (mdb_get_option(MDB_DEBUG_WRITE)) {
|
||||
buffer_dump(mdb->pg_buf, 0, mdb->fmt->pg_size-1);
|
||||
}
|
||||
memcpy(mdb->pg_buf, new_pg, mdb->fmt->pg_size);
|
||||
mdb_index_pack_bitmap(mdb, ipg);
|
||||
buffer_dump(mdb->pg_buf, 0, mdb->fmt->pg_size-1);
|
||||
if (mdb_get_option(MDB_DEBUG_WRITE)) {
|
||||
buffer_dump(mdb->pg_buf, 0, mdb->fmt->pg_size-1);
|
||||
}
|
||||
g_free(new_pg);
|
||||
|
||||
return ipg->len;
|
||||
|
@ -39,6 +39,7 @@ convert_field(MdbColumn *col, char *s, MdbField *field)
|
||||
MdbAny any;
|
||||
|
||||
field->colnum = col->col_num;
|
||||
field->is_fixed = col->is_fixed;
|
||||
switch (col->col_type) {
|
||||
case MDB_TEXT:
|
||||
field->value = g_strdup(s);
|
||||
|
Loading…
Reference in New Issue
Block a user