diff --git a/ChangeLog b/ChangeLog index 20bcc63..e6a06c3 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,18 @@ +Fri Jul 2 07:27:32 CDT 2004 Jeff Smith + * src/libmdb/backend.c: + * src/libmdb/table.c: + * src/sql/mdbsql.c: + * src/util/mdb-array.c: + * src/util/mdb-export.c: + * src/util/mdb-import.c: + * src/util/mdb-prop.c: + * src/util/prdata.c: + * src/util/prindex.c: + * src/util/prole.c: + * src/util/sargtest.c: + * src/util/updrow.c: + * include/mdbtools.h: Add function mdb_read_table_by_name + Wed Jun 23 23:19:43 CDT 2004 Jeff Smith * src/libmdb/table.c: * src/util/mdb-array.c: diff --git a/include/mdbtools.h b/include/mdbtools.h index e9251d4..7a17e6f 100644 --- a/include/mdbtools.h +++ b/include/mdbtools.h @@ -416,6 +416,7 @@ extern char *mdb_get_objtype_string(int obj_type); extern MdbTableDef *mdb_alloc_tabledef(MdbCatalogEntry *entry); extern void mdb_free_tabledef(MdbTableDef *table); extern MdbTableDef *mdb_read_table(MdbCatalogEntry *entry); +extern MdbTableDef *mdb_read_table_by_name(MdbHandle *mdb, gchar *table_name, int obj_type); extern void mdb_append_column(GPtrArray *columns, MdbColumn *in_col); extern void mdb_free_columns(GPtrArray *columns); extern GPtrArray *mdb_read_columns(MdbTableDef *table); diff --git a/src/libmdb/backend.c b/src/libmdb/backend.c index 952ee28..9b1c675 100644 --- a/src/libmdb/backend.c +++ b/src/libmdb/backend.c @@ -258,22 +258,7 @@ char *mdb_get_relationships(MdbHandle *mdb) } if (is_init == 0) { - MdbCatalogEntry *entry; - - mdb_read_catalog (mdb, MDB_TABLE); - - /* loop over each entry in the catalog */ - for (i=0; i < mdb->num_catalog; i++) { - entry = g_ptr_array_index (mdb->catalog, i); - if ((entry->object_type == MDB_TABLE) && - (strncmp (entry->object_name, "MSysRelationships", 17) == 0)) - break; - } - if (i == mdb->num_catalog) { - return NULL; - } - - table = mdb_read_table (entry); + table = mdb_read_table_by_name(mdb, "MSysRelationships", MDB_TABLE); if ((!table) || (table->num_rows == 0)) { return NULL; } diff --git a/src/libmdb/table.c b/src/libmdb/table.c index bf3b167..46425da 100644 --- a/src/libmdb/table.c +++ b/src/libmdb/table.c @@ -117,6 +117,21 @@ MdbTableDef *mdb_read_table(MdbCatalogEntry *entry) return table; } +MdbTableDef *mdb_read_table_by_name(MdbHandle *mdb, gchar *table_name, int obj_type) +{ + unsigned int i; + MdbCatalogEntry *entry; + + mdb_read_catalog(mdb, obj_type); + + for (i=0; inum_catalog; i++) { + entry = g_ptr_array_index(mdb->catalog, i); + if (!strcasecmp(entry->object_name, table_name)) + return mdb_read_table(entry); + } + + return NULL; +} /* ** read the next page if offset is > pg_size diff --git a/src/sql/mdbsql.c b/src/sql/mdbsql.c index 9a3b8f8..94e1734 100644 --- a/src/sql/mdbsql.c +++ b/src/sql/mdbsql.c @@ -574,7 +574,6 @@ void mdb_sql_describe_table(MdbSQL *sql) { MdbTableDef *ttable, *table = NULL; MdbSQLTable *sql_tab; - MdbCatalogEntry *entry; MdbHandle *mdb = sql->mdb; MdbColumn *col; int i; @@ -593,16 +592,7 @@ void mdb_sql_describe_table(MdbSQL *sql) sql_tab = g_ptr_array_index(sql->tables,0); - mdb_read_catalog(mdb, MDB_TABLE); - - for (i=0;inum_catalog;i++) { - entry = g_ptr_array_index(mdb->catalog,i); - if (entry->object_type == MDB_TABLE && - !strcasecmp(entry->object_name,sql_tab->name)) { - table = mdb_read_table(entry); - break; - } - } + table = mdb_read_table_by_name(mdb, sql_tab->name, MDB_TABLE); if (!table) { mdb_sql_error("%s is not a table in this database", sql_tab->name); /* the column and table names are no good now */ @@ -670,7 +660,6 @@ void mdb_sql_select(MdbSQL *sql) { int i,j; -MdbCatalogEntry *entry; MdbHandle *mdb = sql->mdb; MdbTableDef *table = NULL; MdbSQLTable *sql_tab; @@ -685,16 +674,7 @@ int found = 0; sql_tab = g_ptr_array_index(sql->tables,0); - mdb_read_catalog(mdb, MDB_TABLE); - - for (i=0;inum_catalog;i++) { - entry = g_ptr_array_index(mdb->catalog,i); - if (entry->object_type == MDB_TABLE && - !strcasecmp(entry->object_name,sql_tab->name)) { - table = mdb_read_table(entry); - break; - } - } + table = mdb_read_table_by_name(mdb, sql_tab->name, MDB_TABLE); if (!table) { mdb_sql_error("%s is not a table in this database", sql_tab->name); /* the column and table names are no good now */ diff --git a/src/util/mdb-array.c b/src/util/mdb-array.c index 1d41d18..d2277bf 100644 --- a/src/util/mdb-array.c +++ b/src/util/mdb-array.c @@ -30,9 +30,8 @@ int main (int argc, char **argv) { -int i, j; +int j; MdbHandle *mdb; -MdbCatalogEntry *entry; MdbTableDef *table; MdbColumn *col; /* doesn't handle tables > 256 columns. Can that happen? */ @@ -51,15 +50,9 @@ int started; mdb_init(); mdb = mdb_open (argv [1], MDB_NOFLAGS); - mdb_read_catalog (mdb, MDB_TABLE); - - for (i = 0; i < mdb->num_catalog; i++) - { - entry = g_ptr_array_index (mdb->catalog, i); - if (entry->object_type == MDB_TABLE && - !strcmp (entry->object_name, argv [2])) + table = mdb_read_table_by_name (mdb, argv[2], MDB_TABLE); + if (table) { - table = mdb_read_table (entry); mdb_read_columns (table); mdb_rewind_table (table); @@ -123,7 +116,6 @@ int started; mdb_free_tabledef(table); } - } mdb_close (mdb); mdb_exit(); diff --git a/src/util/mdb-export.c b/src/util/mdb-export.c index faa9d83..81ca853 100644 --- a/src/util/mdb-export.c +++ b/src/util/mdb-export.c @@ -49,9 +49,8 @@ print_col(gchar *col_val, int quote_text, int col_type) int main(int argc, char **argv) { - int i, j; + int j; MdbHandle *mdb; - MdbCatalogEntry *entry; MdbTableDef *table; MdbColumn *col; /* doesn't handle tables > 256 columns. Can that happen? */ @@ -120,87 +119,75 @@ main(int argc, char **argv) mdb_init(); if (!(mdb = mdb_open(argv[optind], MDB_NOFLAGS))) { + g_free (delimiter); + g_free (row_delimiter); + mdb_exit(); exit(1); } + + table = mdb_read_table_by_name(mdb, argv[argc-1], MDB_TABLE); + if (!table) { + g_free (delimiter); + g_free (row_delimiter); + mdb_close(mdb); + mdb_exit(); + exit(0); + } + + mdb_read_columns(table); + mdb_rewind_table(table); - if (!mdb_read_catalog (mdb, MDB_TABLE)) { - fprintf(stderr,"File does not appear to be an Access database\n"); - exit(1); + for (j=0;jnum_cols;j++) { + bound_values[j] = (char *) g_malloc0(MDB_BIND_SIZE); + mdb_bind_column(table, j+1, bound_values[j]); + mdb_bind_len(table, j+1, &bound_lens[j]); } - - for (i=0;inum_catalog;i++) { - entry = g_ptr_array_index(mdb->catalog,i); - if (entry->object_type == MDB_TABLE && - !strcmp(entry->object_name,argv[argc-1])) { - table = mdb_read_table(entry); - mdb_read_columns(table); - mdb_rewind_table(table); - - for (j=0;jnum_cols;j++) { - bound_values[j] = (char *) g_malloc(MDB_BIND_SIZE); - bound_values[j][0] = '\0'; - mdb_bind_column(table, j+1, bound_values[j]); - mdb_bind_len(table, j+1, &bound_lens[j]); - } - if (header_row) { - col=g_ptr_array_index(table->columns,0); - fprintf(stdout,"%s",col->name); - for (j=1;jnum_cols;j++) { - col=g_ptr_array_index(table->columns,j); - fprintf(stdout,"%s%s",delimiter,col->name); - } - fprintf(stdout,"\n"); - } - - while(mdb_fetch_row(table)) { - - if (insert_statements) { - fprintf(stdout, "INSERT INTO %s (", - sanitize_name(argv[optind + 1],sanitize)); - for (j=0;jnum_cols;j++) { - if (j>0) fprintf(stdout, ", "); - col=g_ptr_array_index(table->columns,j); - fprintf(stdout,"%s", sanitize_name(col->name,sanitize)); - } - fprintf(stdout, ") VALUES ("); - } - - col=g_ptr_array_index(table->columns,0); - if (col->col_type == MDB_OLE) { - mdb_ole_read(mdb, col, bound_values[0], MDB_BIND_SIZE); - } - - if (insert_statements && !bound_lens[0]) - print_col("NULL",0,col->col_type); - else - print_col(bound_values[0], - quote_text, - col->col_type); - - for (j=1;jnum_cols;j++) { - col=g_ptr_array_index(table->columns,j); - if (col->col_type == MDB_OLE) { - if (col->cur_value_len) - mdb_ole_read(mdb, col, bound_values[j], MDB_BIND_SIZE); - } - fprintf(stdout,"%s",delimiter); - if (insert_statements && !bound_lens[j]) - print_col("NULL",0,col->col_type); - else - print_col(bound_values[j], - quote_text, - col->col_type); - } - if (insert_statements) fprintf(stdout,")"); - fprintf(stdout,"%s", row_delimiter); - } - for (j=0;jnum_cols;j++) { - g_free(bound_values[j]); - } - mdb_free_tabledef(table); + if (header_row) { + col=g_ptr_array_index(table->columns,0); + fprintf(stdout,"%s",col->name); + for (j=1;jnum_cols;j++) { + col=g_ptr_array_index(table->columns,j); + fprintf(stdout,"%s%s",delimiter,col->name); } + fprintf(stdout,"\n"); } + while(mdb_fetch_row(table)) { + + if (insert_statements) { + fprintf(stdout, "INSERT INTO %s (", + sanitize_name(argv[optind + 1],sanitize)); + for (j=0;jnum_cols;j++) { + if (j>0) fprintf(stdout, ", "); + col=g_ptr_array_index(table->columns,j); + fprintf(stdout,"%s", sanitize_name(col->name,sanitize)); + } + fprintf(stdout, ") VALUES ("); + } + + for (j=0;jnum_cols;j++) { + col=g_ptr_array_index(table->columns,j); + if ((col->col_type == MDB_OLE) + && ((j==0) || (col->cur_value_len))) { + mdb_ole_read(mdb, col, bound_values[j], MDB_BIND_SIZE); + } + if (j>0) { + fprintf(stdout,"%s",delimiter); + } + if (insert_statements && !bound_lens[j]) { + print_col("NULL",0,col->col_type); + } else { + print_col(bound_values[j], quote_text, col->col_type); + } + } + if (insert_statements) fprintf(stdout,")"); + fprintf(stdout,"%s", row_delimiter); + } + for (j=0;jnum_cols;j++) { + g_free(bound_values[j]); + } + mdb_free_tabledef(table); + g_free (delimiter); g_free (row_delimiter); mdb_close(mdb); diff --git a/src/util/mdb-import.c b/src/util/mdb-import.c index 412d509..517185d 100644 --- a/src/util/mdb-import.c +++ b/src/util/mdb-import.c @@ -150,7 +150,6 @@ main(int argc, char **argv) { int i, row; MdbHandle *mdb; - MdbCatalogEntry *entry; MdbTableDef *table; MdbField fields[256]; unsigned char line[MAX_ROW_SIZE]; @@ -196,23 +195,15 @@ main(int argc, char **argv) exit(1); } - mdb_read_catalog(mdb, MDB_TABLE); - - for (i=0;inum_catalog;i++) { - entry = g_ptr_array_index(mdb->catalog,i); - if (entry->object_type == MDB_TABLE && - !strcmp(entry->object_name,argv[argc-2])) { - table = mdb_read_table(entry); - mdb_read_columns(table); - mdb_read_indices(table); - mdb_rewind_table(table); - break; - } - } + table = mdb_read_table_by_name(mdb, argv[argc-2], MDB_TABLE); if (!table) { fprintf(stderr,"Table %s not found in database\n", argv[argc-2]); exit(1); } + mdb_read_columns(table); + mdb_read_indices(table); + mdb_rewind_table(table); + /* * open the CSV file and read any header rows */ diff --git a/src/util/mdb-prop.c b/src/util/mdb-prop.c index f1acfbd..95a2f45 100644 --- a/src/util/mdb-prop.c +++ b/src/util/mdb-prop.c @@ -33,10 +33,9 @@ MdbHandle *mdb; int main(int argc, char **argv) { - int i, len, pos, col_num; + int len, pos, col_num; MdbColumn *col; MdbTableDef *table; - MdbCatalogEntry *entry; gchar name[256]; gchar buf[MDB_BIND_SIZE]; gchar kkd_pg[200000]; @@ -57,15 +56,7 @@ main(int argc, char **argv) if (!(mdb = mdb_open(argv[optind], MDB_NOFLAGS))) { exit(1); } - mdb_read_catalog(mdb, MDB_ANY); - - for (i=0;inum_catalog;i++) { - entry = g_ptr_array_index(mdb->catalog,i); - if (!strcmp(entry->object_name,MSYSOBJECTS)) { - break; - } - } - table = mdb_read_table(entry); + table = mdb_read_table_by_name(mdb, MSYSOBJECTS, MDB_ANY); mdb_read_columns(table); mdb_rewind_table(table); diff --git a/src/util/prdata.c b/src/util/prdata.c index aa8121e..8e6a77d 100644 --- a/src/util/prdata.c +++ b/src/util/prdata.c @@ -23,10 +23,8 @@ int main(int argc, char **argv) { -int i; -MdbHandle *mdb; -MdbCatalogEntry *entry; -MdbTableDef *table; + MdbHandle *mdb; + MdbTableDef *table; if (argc<2) { fprintf(stderr,"Usage: %s \n",argv[0]); @@ -36,17 +34,11 @@ MdbTableDef *table; mdb_init(); mdb = mdb_open(argv[1], MDB_NOFLAGS); - mdb_read_catalog(mdb, MDB_TABLE); - - for (i=0;inum_catalog;i++) { - entry = g_ptr_array_index(mdb->catalog,i); - if (entry->object_type == MDB_TABLE && - !strcmp(entry->object_name,argv[2])) { - table = mdb_read_table(entry); - mdb_read_columns(table); - mdb_data_dump(table); - mdb_free_tabledef(table); - } + table = mdb_read_table_by_name(mdb, argv[2], MDB_TABLE); + if (table) { + mdb_read_columns(table); + mdb_data_dump(table); + mdb_free_tabledef(table); } mdb_close(mdb); diff --git a/src/util/prindex.c b/src/util/prindex.c index 9b35ff5..a5edff5 100644 --- a/src/util/prindex.c +++ b/src/util/prindex.c @@ -26,13 +26,10 @@ void walk_index(MdbHandle *mdb, MdbIndex *idx); int main(int argc, char **argv) { -int i, j; -MdbHandle *mdb; -MdbCatalogEntry *entry; -MdbTableDef *table; -MdbIndex *idx; -int found = 0; - + int j; + MdbHandle *mdb; + MdbTableDef *table; + MdbIndex *idx; if (argc<4) { fprintf(stderr,"Usage: %s
\n",argv[0]); @@ -45,31 +42,22 @@ int found = 0; exit(1); } - mdb_read_catalog(mdb, MDB_TABLE); + table = mdb_read_table_by_name(mdb, argv[2], MDB_TABLE); - for (i=0;inum_catalog;i++) { - entry = g_ptr_array_index(mdb->catalog,i); - if (entry->object_type == MDB_TABLE && - !strcmp(entry->object_name,argv[2])) { - table = mdb_read_table(entry); - mdb_read_columns(table); - mdb_read_indices(table); - for (j=0;jnum_idxs;j++) { - idx = g_ptr_array_index (table->indices, j); - if (!strcmp(idx->name, argv[3])) { - walk_index(mdb, idx); - } - } - mdb_free_tabledef(table); - - //mdb_table_dump(entry); - found++; + if (table) { + mdb_read_columns(table); + mdb_read_indices(table); + for (j=0;jnum_idxs;j++) { + idx = g_ptr_array_index (table->indices, j); + if (!strcmp(idx->name, argv[3])) { + walk_index(mdb, idx); + } } - } - - if (!found) { + mdb_free_tabledef(table); + } else { fprintf(stderr,"No table named %s found.\n", argv[2]); } + mdb_close(mdb); mdb_exit(); diff --git a/src/util/prole.c b/src/util/prole.c index 617ed8f..fd3b35a 100644 --- a/src/util/prole.c +++ b/src/util/prole.c @@ -25,12 +25,10 @@ void dump_ole(MdbTableDef *table, char *colname, char *sargname); int main(int argc, char **argv) { -int i; -MdbHandle *mdb; -MdbCatalogEntry *entry; -MdbTableDef *table; -char *dot, *colname, *tabname; -char *sargname = NULL; + MdbHandle *mdb; + MdbTableDef *table; + char *dot, *colname, *tabname; + char *sargname = NULL; if (argc<2) { @@ -51,17 +49,12 @@ char *sargname = NULL; *dot='\0'; colname = ++dot; - mdb_read_catalog(mdb, MDB_TABLE); + table = mdb_read_table_by_name(mdb, tabname, MDB_TABLE); - for (i=0;inum_catalog;i++) { - entry = g_ptr_array_index(mdb->catalog,i); - if (entry->object_type == MDB_TABLE && - !strcmp(entry->object_name,tabname)) { - table = mdb_read_table(entry); - mdb_read_columns(table); - dump_ole(table, colname, sargname); - mdb_free_tabledef(table); - } + if (table) { + mdb_read_columns(table); + dump_ole(table, colname, sargname); + mdb_free_tabledef(table); } mdb_close(mdb); diff --git a/src/util/sargtest.c b/src/util/sargtest.c index aaa7c7f..2fc45fa 100644 --- a/src/util/sargtest.c +++ b/src/util/sargtest.c @@ -28,12 +28,8 @@ void print_table(MdbTableDef *table); main(int argc, char **argv) { -int rows; -int i; -unsigned char buf[2048]; -MdbHandle *mdb; -MdbCatalogEntry *entry; -MdbTableDef *table; + MdbHandle *mdb; + MdbTableDef *table; mdb_init(); @@ -41,16 +37,11 @@ MdbTableDef *table; exit(1); } - mdb_read_catalog(mdb, MDB_TABLE); + table = mdb_read_table_by_name(mdb, TABLE_NAME, MDB_TABLE); - for (i=0;inum_catalog;i++) { - entry = g_ptr_array_index(mdb->catalog,i); - if (entry->object_type == MDB_TABLE && - !strcmp(entry->object_name,TABLE_NAME)) { - table = mdb_read_table(entry); - print_table(table); - mdb_free_tabledef(table); - } + if (table) { + print_table(table); + mdb_free_tabledef(table); } mdb_close(mdb); diff --git a/src/util/updrow.c b/src/util/updrow.c index 5c1e724..be0f34b 100644 --- a/src/util/updrow.c +++ b/src/util/updrow.c @@ -26,9 +26,7 @@ void read_to_row(MdbTableDef *table, char *sargname); int main(int argc, char **argv) { -int i; MdbHandle *mdb; -MdbCatalogEntry *entry; MdbTableDef *table; char *colname, *tabname; char *colval; @@ -49,26 +47,21 @@ int len; sargname = argv[3]; updstr = strdup(argv[4]); - mdb_read_catalog(mdb, MDB_TABLE); + table = mdb_read_table_by_name(mdb, tabname, MDB_TABLE); - for (i=0;inum_catalog;i++) { - entry = g_ptr_array_index(mdb->catalog,i); - if (entry->object_type == MDB_TABLE && - !strcmp(entry->object_name,tabname)) { - table = mdb_read_table(entry); - mdb_read_columns(table); - mdb_read_indices(table); - printf("updstr %s\n",updstr); - colname = strtok(updstr,"="); - colval = strtok(NULL,"="); - bind_column(table, colname, data, &len); - read_to_row(table, sargname); - printf("current value of %s is %s, changing to %s\n", colname, data, colval); - len = strlen(colval); - strcpy(data,colval); - mdb_update_row(table); - mdb_free_tabledef(table); - } + if (table) { + mdb_read_columns(table); + mdb_read_indices(table); + printf("updstr %s\n",updstr); + colname = strtok(updstr,"="); + colval = strtok(NULL,"="); + bind_column(table, colname, data, &len); + read_to_row(table, sargname); + printf("current value of %s is %s, changing to %s\n", colname, data, colval); + len = strlen(colval); + strcpy(data,colval); + mdb_update_row(table); + mdb_free_tabledef(table); } mdb_close(mdb);