diff --git a/src/include/mdbtools.h b/src/include/mdbtools.h index 43e0547..3d19d0f 100644 --- a/src/include/mdbtools.h +++ b/src/include/mdbtools.h @@ -76,7 +76,7 @@ typedef struct { unsigned int kkd_rowid; int num_props; GArray *props; - GArray *columns; + GPtrArray *columns; } MdbCatalogEntry; typedef struct { @@ -86,7 +86,7 @@ typedef struct { int num_rows; int num_pgs; int first_data_pg; - GArray *columns; + GPtrArray *columns; } MdbTableDef; typedef struct { diff --git a/src/libmdb/data.c b/src/libmdb/data.c index d3cfa70..d013d86 100644 --- a/src/libmdb/data.c +++ b/src/libmdb/data.c @@ -19,12 +19,18 @@ #include "mdbtools.h" -#define MDB_DEBUG 1 +#define MDB_DEBUG 0 char *mdb_col_to_string(MdbHandle *mdb, int start, int datatype, int size); -void mdb_bind_col(MdbColumn *col, void *bind_ptr) +void mdb_bind_column(MdbTableDef *table, int col_num, void *bind_ptr) { +MdbColumn *col; + + /* + ** the column arrary is 0 based, so decrement to get 1 based parameter + */ + col=g_ptr_array_index(table->columns, col_num - 1); col->bind_ptr = bind_ptr; } int mdb_find_end_of_row(MdbHandle *mdb, int row) @@ -42,7 +48,7 @@ int rows, row_end; int mdb_read_row(MdbTableDef *table, int pg_num, int row) { MdbHandle *mdb = table->entry->mdb; -MdbColumn col; +MdbColumn *col; int j; int num_cols, var_cols, fixed_cols; int row_start, row_end; @@ -90,33 +96,33 @@ int delflag, lookupflag; /* fixed columns */ for (j=0;jnum_cols;j++) { - col = g_array_index(table->columns,MdbColumn,j); - if (mdb_is_fixed_col(&col) && + col = g_ptr_array_index(table->columns,j); + if (mdb_is_fixed_col(col) && ++fixed_cols_found <= fixed_cols) { - if (col.bind_ptr) { - strcpy(col.bind_ptr, + if (col->bind_ptr) { + strcpy(col->bind_ptr, mdb_col_to_string(mdb, row_start + col_start, - col.col_type, + col->col_type, 0) ); } #if MDB_DEBUG fprintf(stdout,"fixed col %s = %s\n", - col.name, + col->name, mdb_col_to_string(mdb, row_start + col_start, - col.col_type, + col->col_type, 0)); - col_start += col.col_size; #endif + col_start += col->col_size; } } /* variable columns */ for (j=0;jnum_cols;j++) { - col = g_array_index(table->columns,MdbColumn,j); - if (!mdb_is_fixed_col(&col) && + col = g_ptr_array_index(table->columns,j); + if (!mdb_is_fixed_col(col) && ++var_cols_found <= var_cols) { col_start = mdb->pg_buf[row_end-1-var_cols_found]; @@ -127,24 +133,24 @@ int delflag, lookupflag; #if MDB_DEBUG fprintf(stdout,"coltype %d colstart %d len %d\n", - col.col_type, + col->col_type, col_start, len); #endif - if (col.bind_ptr) { - strcpy(col.bind_ptr, + if (col->bind_ptr) { + strcpy(col->bind_ptr, mdb_col_to_string(mdb, row_start + col_start, - col.col_type, + col->col_type, len) ); } #if MDB_DEBUG fprintf(stdout,"var col %s = %s\n", - col.name, + col->name, mdb_col_to_string(mdb, row_start + col_start, - col.col_type, + col->col_type, len)); #endif @@ -158,9 +164,14 @@ int delflag, lookupflag; void mdb_data_dump(MdbTableDef *table) { MdbHandle *mdb = table->entry->mdb; -int i, pg_num; +int i, j, pg_num; int rows; +char *bound_values[256]; /* warning doesn't handle table > 256 columns. Can that happen? */ + for (i=0;inum_cols;i++) { + bound_values[i] = (char *) malloc(256); + mdb_bind_column(table, i+1, bound_values[i]); + } for (pg_num=1;pg_num<=table->num_pgs;pg_num++) { mdb_read_pg(mdb,table->first_data_pg + pg_num); rows = mdb_get_int16(mdb,8); @@ -169,8 +180,14 @@ int rows; rows); for (i=0;ifirst_data_pg + pg_num, i); + for (j=0;jnum_cols;j++) { + fprintf(stdout, "column %d is %s\n", j+1, bound_values[j]); + } } } + for (i=0;inum_cols;i++) { + free(bound_values[i]); + } } int mdb_is_fixed_col(MdbColumn *col) diff --git a/src/libmdb/mem.c b/src/libmdb/mem.c index bdc6a6a..140ad6e 100644 --- a/src/libmdb/mem.c +++ b/src/libmdb/mem.c @@ -57,3 +57,14 @@ void mdb_free_tabledef(MdbTableDef *table) { if (table) free(table); } +mdb_append_column(GPtrArray *columns, MdbColumn *in_col) +{ +MdbColumn *col; + + col = g_memdup(in_col,sizeof(MdbCatalogEntry)); + g_ptr_array_add(columns, col); +} +mdb_free_columns(GPtrArray *columns) +{ + g_ptr_array_free(columns, TRUE); +} diff --git a/src/libmdb/table.c b/src/libmdb/table.c index 5c7043e..d4c2f37 100644 --- a/src/libmdb/table.c +++ b/src/libmdb/table.c @@ -77,11 +77,10 @@ int len, i; return table; } -GArray *mdb_read_columns(MdbTableDef *table) +GPtrArray *mdb_read_columns(MdbTableDef *table) { MdbHandle *mdb = table->entry->mdb; MdbColumn col; -GArray *columns; int len, i; int cur_col, cur_name; int col_type, col_size; @@ -89,7 +88,7 @@ int col_start, name_start; char name[MDB_MAX_OBJ_NAME+1]; int name_sz; - table->columns = g_array_new(FALSE,FALSE,sizeof(MdbColumn)); + table->columns = g_ptr_array_new(); col_start = 43 + (table->num_pgs * 8); name_start = col_start + (table->num_cols * 18); @@ -109,7 +108,7 @@ int name_sz; cur_col += 18; cur_name += name_sz + 1; - g_array_append_val(table->columns, col); + mdb_append_column(table->columns, &col); } return table->columns; @@ -118,7 +117,7 @@ int name_sz; void mdb_table_dump(MdbCatalogEntry *entry) { MdbTableDef *table; -MdbColumn col; +MdbColumn *col; MdbHandle *mdb = entry->mdb; int i; @@ -130,11 +129,11 @@ int i; mdb_read_columns(table); for (i=0;inum_cols;i++) { - col = g_array_index(table->columns,MdbColumn,i); + col = g_ptr_array_index(table->columns,i); fprintf(stdout,"column %d Name: %-20s Type: %s(%d)\n", - i, col.name, - mdb_get_coltype_string(col.col_type), - col.col_size); + i, col->name, + mdb_get_coltype_string(col->col_type), + col->col_size); } } diff --git a/src/util/schema.c b/src/util/schema.c index 9e3debc..1edb3c2 100644 --- a/src/util/schema.c +++ b/src/util/schema.c @@ -26,7 +26,7 @@ int i, j, k; MdbHandle *mdb; MdbCatalogEntry entry; MdbTableDef *table; -MdbColumn col; +MdbColumn *col; if (argc < 2) { fprintf (stderr, "Usage: schema \n"); @@ -75,13 +75,13 @@ MdbColumn col; for (k = 0; k < table->num_cols; k++) { - col = g_array_index (table->columns, MdbColumn, k); + col = g_ptr_array_index (table->columns, k); - fprintf (stdout, "\t%s\t\t\t%s", col.name, - mdb_get_coltype_string (col.col_type)); + fprintf (stdout, "\t%s\t\t\t%s", col->name, + mdb_get_coltype_string (col->col_type)); - if (col.col_size != 0) - fprintf (stdout, " (%d)", col.col_size); + if (col->col_size != 0) + fprintf (stdout, " (%d)", col->col_size); if (k < table->num_cols - 1) fprintf (stdout, ", \n");