Corrections and enhancements on index handling.

This commit is contained in:
brianb 2001-05-23 01:42:46 +00:00
parent 7104e68db2
commit abab3e0fc8
5 changed files with 65 additions and 21 deletions

View File

@ -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 {

View File

@ -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;

View File

@ -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;
}

View File

@ -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"
);
}
}
}

View File

@ -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);
}
}