mirror of
https://github.com/mdbtools/mdbtools.git
synced 2025-04-05 20:31:00 +08:00
Corrections and enhancements on index handling.
This commit is contained in:
parent
7104e68db2
commit
abab3e0fc8
@ -32,6 +32,7 @@
|
||||
#define MDB_PGSIZE 2048
|
||||
#define MDB_MAX_OBJ_NAME 30
|
||||
#define MDB_MAX_COLS 256
|
||||
#define MDB_MAX_IDX_COLS 10
|
||||
#define MDB_CATALOG_PG 18
|
||||
#define MDB_MEMO_OVERHEAD 12
|
||||
#define MDB_BIND_SIZE 2048
|
||||
@ -139,14 +140,16 @@ typedef struct {
|
||||
int cur_pg_num;
|
||||
int cur_phys_pg;
|
||||
int cur_row;
|
||||
int noskip_del; /* don't skip deleted rows */
|
||||
} MdbTableDef;
|
||||
|
||||
typedef struct {
|
||||
int index_num;
|
||||
char name[MDB_MAX_OBJ_NAME+1];
|
||||
unsigned char primary_key;
|
||||
unsigned char index_type;
|
||||
int first_pg;
|
||||
unsigned char sort_order;
|
||||
short key_col_num[MDB_MAX_IDX_COLS];
|
||||
unsigned char key_col_order[MDB_MAX_IDX_COLS];
|
||||
} MdbIndex;
|
||||
|
||||
typedef struct {
|
||||
|
@ -138,6 +138,7 @@ int next_pg, next_pg_off;
|
||||
if (mdb->pg_buf[0]==0x01 &&
|
||||
mdb->pg_buf[1]==0x01 &&
|
||||
mdb_get_int32(mdb,4)==2) {
|
||||
fprintf(stderr,"cat page %d\n", next_pg);
|
||||
rows = mdb_catalog_rows(mdb);
|
||||
for (i=0;i<rows;i++) {
|
||||
if (mdb->pg_buf[11 + 2 * i] & 0x40) continue;
|
||||
|
@ -49,6 +49,7 @@ one.
|
||||
break;
|
||||
}
|
||||
}
|
||||
row_start &= 0x0FFF;
|
||||
|
||||
if (i == -1) {
|
||||
row_end = mdb->pg_size - 1;
|
||||
@ -119,7 +120,7 @@ unsigned char isnull;
|
||||
lookupflag ? "[lookup]" : "",
|
||||
delflag ? "[delflag]" : "");
|
||||
#endif
|
||||
if (delflag || lookupflag) {
|
||||
if (!table->noskip_del && (delflag || lookupflag)) {
|
||||
row_end = row_start-1;
|
||||
return 0;
|
||||
}
|
||||
|
@ -23,7 +23,8 @@ GPtrArray *mdb_read_indices(MdbTableDef *table)
|
||||
{
|
||||
MdbHandle *mdb = table->entry->mdb;
|
||||
MdbIndex idx, *pidx;
|
||||
int len, i;
|
||||
int len, i, j;
|
||||
int idx_num, key_num, col_num;
|
||||
int cur_pos;
|
||||
int name_sz;
|
||||
|
||||
@ -31,22 +32,14 @@ int name_sz;
|
||||
|
||||
table->indices = g_ptr_array_new();
|
||||
|
||||
cur_pos = table->index_start;
|
||||
|
||||
for (i=0;i<table->num_real_idxs;i++) {
|
||||
memset(&idx, '\0', sizeof(MdbIndex));
|
||||
idx.index_num = i;
|
||||
cur_pos += 34;
|
||||
idx.first_pg = mdb_get_int32(mdb, cur_pos);
|
||||
cur_pos += 5;
|
||||
mdb_append_index(table->indices, &idx);
|
||||
}
|
||||
cur_pos = table->index_start + 39 * table->num_real_idxs;
|
||||
|
||||
for (i=0;i<table->num_idxs;i++) {
|
||||
pidx = g_ptr_array_index (table->indices, i);
|
||||
memset(&idx, '\0', sizeof(MdbIndex));
|
||||
idx.index_num = mdb_get_int16(mdb, cur_pos);
|
||||
cur_pos += 19;
|
||||
if (mdb->pg_buf[cur_pos++]==0x01)
|
||||
pidx->primary_key=1;
|
||||
idx.index_type = mdb->pg_buf[cur_pos++];
|
||||
mdb_append_index(table->indices, &idx);
|
||||
}
|
||||
|
||||
for (i=0;i<table->num_idxs;i++) {
|
||||
@ -57,13 +50,60 @@ int name_sz;
|
||||
//fprintf(stderr, "index name %s\n", pidx->name);
|
||||
cur_pos += name_sz;
|
||||
}
|
||||
|
||||
cur_pos = table->index_start;
|
||||
idx_num=0;
|
||||
for (i=0;i<table->num_real_idxs;i++) {
|
||||
do {
|
||||
pidx = g_ptr_array_index (table->indices, idx_num++);
|
||||
} while (pidx && pidx->index_type==2);
|
||||
|
||||
/* if there are more real indexes than index entries left after
|
||||
removing type 2's decrement real indexes and continue. Happens
|
||||
on Northwind Orders table.
|
||||
*/
|
||||
if (!pidx) {
|
||||
table->num_real_idxs--;
|
||||
continue;
|
||||
}
|
||||
key_num=0;
|
||||
for (j=0;j<MDB_MAX_IDX_COLS;j++) {
|
||||
col_num=mdb_get_int16(mdb,cur_pos);
|
||||
cur_pos += 2;
|
||||
if (col_num != 0xFFFF) {
|
||||
/* set column number to a 1 based column number and store */
|
||||
pidx->key_col_num[key_num]=col_num + 1;
|
||||
if (mdb->pg_buf[cur_pos]) {
|
||||
pidx->key_col_order[key_num]=MDB_ASC;
|
||||
} else {
|
||||
pidx->key_col_order[key_num]=MDB_DESC;
|
||||
}
|
||||
key_num++;
|
||||
}
|
||||
cur_pos++;
|
||||
}
|
||||
cur_pos += 4;
|
||||
pidx->first_pg = mdb_get_int32(mdb, cur_pos);
|
||||
cur_pos += 5;
|
||||
}
|
||||
}
|
||||
void mdb_index_dump(MdbIndex *idx)
|
||||
void mdb_index_dump(MdbTableDef *table, MdbIndex *idx)
|
||||
{
|
||||
int i;
|
||||
MdbColumn *col;
|
||||
|
||||
fprintf(stdout,"index number %d\n", idx->index_num);
|
||||
fprintf(stdout,"index name %s\n", idx->name);
|
||||
fprintf(stdout,"index first page %d\n", idx->first_pg);
|
||||
if (idx->primary_key) fprintf(stdout,"index is a primary key\n");
|
||||
if (idx->index_type==1) fprintf(stdout,"index is a primary key\n");
|
||||
for (i=0;i<MDB_MAX_IDX_COLS;i++) {
|
||||
if (idx->key_col_num[i]) {
|
||||
col=g_ptr_array_index(table->columns,idx->key_col_num[i]-1);
|
||||
fprintf(stdout,"Column %s(%d) Sorted %s\n",
|
||||
col->name,
|
||||
idx->key_col_num[i],
|
||||
idx->key_col_order[i]==MDB_ASC ? "ascending" : "descending"
|
||||
);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -168,7 +168,6 @@ int i;
|
||||
|
||||
for (i=0;i<table->num_idxs;i++) {
|
||||
idx = g_ptr_array_index (table->indices, i);
|
||||
mdb_index_dump(idx);
|
||||
mdb_index_dump(table, idx);
|
||||
}
|
||||
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user