int main(int argc, char **argv) { MdbHandle *mdb; MdbTableDef *table; char *colname, *tabname; char *colval; int colnum; char *sargname = NULL; char *updstr = NULL; char data[255]; int len; if (argc<4) { fprintf(stderr,"Usage: %s <file> <table> <sargs> <updstr>\n",argv[0]); exit(1); } mdb = mdb_open(argv[1], MDB_WRITABLE); tabname = argv[2]; sargname = argv[3]; updstr = g_strdup(argv[4]); table = mdb_read_table_by_name(mdb, tabname, MDB_TABLE); if (table) { mdb_read_columns(table); mdb_read_indices(table); printf("updstr %s\n",updstr); colname = strtok(updstr,"="); colval = strtok(NULL,"="); colnum = mdb_bind_column_by_name(table, colname, data, &len); printf("column %d\n", colnum); 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); return 0; }
int main(int argc, char **argv) { MdbHandle *mdb; MdbTableDef *table; char *dot, *colname, *tabname; char *sargname = NULL; if (argc<2) { fprintf(stderr,"Usage: %s <file> <table.column> [sargs]\n",argv[0]); exit(1); } mdb_init(); mdb = mdb_open(argv[1], MDB_NOFLAGS); dot = strchr(argv[2],'.'); if (argc>3) sargname = argv[3]; if (!dot) { fprintf(stderr,"Usage: %s <file> <table.column> [sarg]\n",argv[0]); exit(1); } tabname = argv[2]; *dot='\0'; colname = ++dot; table = mdb_read_table_by_name(mdb, tabname, MDB_TABLE); if (table) { mdb_read_columns(table); dump_ole(table, colname, sargname); mdb_free_tabledef(table); } mdb_close(mdb); mdb_exit(); exit(0); }
main(int argc, char **argv) { MdbHandle *mdb; MdbTableDef *table; mdb_init(); if (!(mdb = mdb_open(MDB_FILE, MDB_NOFLAGS))) { exit(1); } table = mdb_read_table_by_name(mdb, TABLE_NAME, MDB_TABLE); if (table) { print_table(table); mdb_free_tabledef(table); } mdb_close(mdb); mdb_exit(); exit(0); }
/** * mdb_get_relationships * @mdb: Handle to open MDB database file * @tablename: Name of the table to process. Process all tables if NULL. * * Generates relationships by reading the MSysRelationships table. * 'szColumn' contains the column name of the child table. * 'szObject' contains the table name of the child table. * 'szReferencedColumn' contains the column name of the parent table. * 'szReferencedObject' contains the table name of the parent table. * 'grbit' contains integrity constraints. * * Returns: a string stating that relationships are not supported for the * selected backend, or a string containing SQL commands for setting up * the relationship, tailored for the selected backend. * Returns NULL on last iteration. * The caller is responsible for freeing this string. */ static char * mdb_get_relationships(MdbHandle *mdb, const gchar *dbnamespace, const char* tablename) { unsigned int i; gchar *text = NULL; /* String to be returned */ static char *bound[5]; /* Bound values */ static MdbTableDef *table; /* Relationships table */ int backend = 0; /* Backends: 1=oracle, 2=postgres */ char *quoted_table_1, *quoted_column_1, *quoted_table_2, *quoted_column_2, *constraint_name, *quoted_constraint_name; long grbit; if (!strcmp(mdb->backend_name, "oracle")) { backend = 1; } else if (!strcmp(mdb->backend_name, "postgres")) { backend = 2; } else { if (is_init == 0) { /* the first time through */ is_init = 1; return (char *) g_strconcat( "-- relationships are not implemented for ", mdb->backend_name, "\n", NULL); } else { /* the second time through */ is_init = 0; return NULL; } } if (is_init == 0) { table = mdb_read_table_by_name(mdb, "MSysRelationships", MDB_TABLE); if ((!table) || (table->num_rows == 0)) { fprintf(stderr, "No MSysRelationships\n"); return NULL; } mdb_read_columns(table); for (i=0;i<5;i++) { bound[i] = (char *) g_malloc0(MDB_BIND_SIZE); } mdb_bind_column_by_name(table, "szColumn", bound[0], NULL); mdb_bind_column_by_name(table, "szObject", bound[1], NULL); mdb_bind_column_by_name(table, "szReferencedColumn", bound[2], NULL); mdb_bind_column_by_name(table, "szReferencedObject", bound[3], NULL); mdb_bind_column_by_name(table, "grbit", bound[4], NULL); mdb_rewind_table(table); is_init = 1; } else { if (!table) { fprintf(stderr, "table is NULL\n"); } if (table->cur_row >= table->num_rows) { /* past the last row */ for (i=0;i<5;i++) g_free(bound[i]); is_init = 0; return NULL; } } while (1) { if (!mdb_fetch_row(table)) { for (i=0;i<5;i++) g_free(bound[i]); is_init = 0; return NULL; } if (!tablename || !strcmp(bound[1], tablename)) break; } quoted_table_1 = mdb->default_backend->quote_schema_name(dbnamespace, bound[1]); quoted_column_1 = mdb->default_backend->quote_schema_name(dbnamespace, bound[0]); quoted_table_2 = mdb->default_backend->quote_schema_name(dbnamespace, bound[3]); quoted_column_2 = mdb->default_backend->quote_schema_name(dbnamespace, bound[2]); grbit = atoi(bound[4]); constraint_name = g_strconcat(bound[1], "_", bound[0], "_fk", NULL); quoted_constraint_name = mdb->default_backend->quote_schema_name(dbnamespace, constraint_name); free(constraint_name); if (grbit & 0x00000002) { text = g_strconcat( "-- Relationship from ", quoted_table_1, " (", quoted_column_1, ")" " to ", quoted_table_2, "(", quoted_column_2, ")", " does not enforce integrity.\n", NULL); } else { switch (backend) { case 1: /* oracle */ case 2: /* postgres */ text = g_strconcat( "ALTER TABLE ", quoted_table_1, " ADD CONSTRAINT ", quoted_constraint_name, " FOREIGN KEY (", quoted_column_1, ")" " REFERENCES ", quoted_table_2, "(", quoted_column_2, ")", (grbit & 0x00000100) ? " ON UPDATE CASCADE" : "", (grbit & 0x00001000) ? " ON DELETE CASCADE" : "", ";\n", NULL); break; } } free(quoted_table_1); free(quoted_column_1); free(quoted_table_2); free(quoted_column_2); free(quoted_constraint_name); return (char *)text; }
int main(int argc, char **argv) { MdbHandle *mdb; MdbTableDef *table; gchar name[256]; gchar *propColName; void *buf; int col_num; int found = 0; if (argc < 3) { fprintf(stderr,"Usage: %s <file> <object name> [<prop col>]\n", argv[0]); return 1; } if (argc < 4) propColName = "LvProp"; else propColName = argv[3]; mdb_init(); mdb = mdb_open(argv[1], MDB_NOFLAGS); if (!mdb) { mdb_exit(); return 1; } table = mdb_read_table_by_name(mdb, "MSysObjects", MDB_ANY); if (!table) { mdb_close(mdb); mdb_exit(); return 1; } mdb_read_columns(table); mdb_rewind_table(table); mdb_bind_column_by_name(table, "Name", name, NULL); buf = g_malloc(MDB_BIND_SIZE); col_num = mdb_bind_column_by_name(table, propColName, buf, NULL); if (col_num < 1) { g_free(buf); mdb_free_tabledef(table); mdb_close(mdb); mdb_exit(); printf("Column %s not found in MSysObjects!\n", argv[3]); return 1; } while(mdb_fetch_row(table)) { if (!strcmp(name, argv[2])) { found = 1; break; } } if (found) { MdbColumn *col = g_ptr_array_index(table->columns, col_num-1); size_t size; void *kkd = mdb_ole_read_full(mdb, col, &size); dump_kkd(mdb, kkd, size); free(kkd); } g_free(buf); mdb_free_tabledef(table); mdb_close(mdb); mdb_exit(); return 0; }
int main (int argc, char **argv) { unsigned int j; MdbHandle *mdb; MdbTableDef *table; MdbColumn *col; /* doesn't handle tables > 256 columns. Can that happen? */ char *bound_values [256]; char delimiter [] = ", "; char quote_text = 1; int count = 0; int started; if (argc < 3) { fprintf (stderr, "Usage: %s <file> <table>\n", argv [0]); exit (1); } mdb_init(); mdb = mdb_open (argv [1], MDB_NOFLAGS); table = mdb_read_table_by_name (mdb, argv[2], MDB_TABLE); if (table) { mdb_read_columns (table); mdb_rewind_table (table); for (j = 0; j < table->num_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], NULL); } fprintf (stdout, "/******************************************************************/\n"); fprintf (stdout, "/* THIS IS AN AUTOMATICALLY GENERATED FILE. DO NOT EDIT IT!!!!!! */\n"); fprintf (stdout, "/******************************************************************/\n"); fprintf (stdout, "\n"); fprintf (stdout, "#include <stdio.h>\n"); fprintf (stdout, "#include \"types.h\"\n"); fprintf (stdout, "#include \"dump.h\"\n"); fprintf (stdout, "\n"); fprintf (stdout, "const %s %s_array [] = {\n", argv [2], argv [2]); count = 0; started = 0; while (mdb_fetch_row (table)) { if (started != 0) { fprintf (stdout, ",\n"); } started = 1; fprintf (stdout, "{\t\t\t\t/* %6d */\n\t", count); for (j = 0; j < table->num_cols; j++) { fprintf (stdout, "\t"); col = g_ptr_array_index (table->columns, j); if (quote_text && (col->col_type == MDB_TEXT || col->col_type == MDB_MEMO)) { fprintf (stdout, "\"%s\"", bound_values [j]); } else { fprintf (stdout, "%s", bound_values [j]); } if (j != table->num_cols - 1) { fprintf (stdout, "%s\n", delimiter); } else { fprintf (stdout, "\n"); } } fprintf (stdout, "}"); count++; } fprintf (stdout, "\n};\n\n"); for (j = 0; j < table->num_cols; j++) { g_free (bound_values [j]); } mdb_free_tabledef(table); } mdb_close (mdb); mdb_exit(); fprintf (stdout, "const int %s_array_length = %d;\n", argv [2], count); exit(0); }
int main(int argc, char **argv) { int i, row; MdbHandle *mdb; MdbTableDef *table; MdbField fields[256]; char line[MAX_ROW_SIZE]; int num_fields; /* doesn't handle tables > 256 columns. Can that happen? */ int opt; FILE *in; char delimiter[2] = ","; char header_rows = 0; while ((opt=getopt(argc, argv, "H:d:"))!=-1) { switch (opt) { case 'H': header_rows = atol(optarg); break; case 'd': delimiter[0] = optarg[0]; break; default: break; } } /* ** optind is now the position of the first non-option arg, ** see getopt(3) */ if (argc-optind < 3) { fprintf(stderr,"Usage: %s [options] <database> <table> <csv file>\n",argv[0]); fprintf(stderr,"where options are:\n"); fprintf(stderr," -H <rows> skip <rows> header rows\n"); fprintf(stderr," -d <delimiter> specify a column delimiter\n"); exit(1); } if (!(mdb = mdb_open(argv[optind], MDB_WRITABLE))) { exit(1); } 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 */ in = fopen(argv[argc-1], "r"); if (!in) { fprintf(stderr, "Can not open file %s\n", argv[argc-1]); exit(1); } for (i=0;i<header_rows;i++) if (!fgets(line, MAX_ROW_SIZE, in)) { fprintf(stderr, "Error while reading header column #%d. Check -H parameter.\n", i); exit(1); } row = 1; while (fgets(line, MAX_ROW_SIZE, in)) { num_fields = prep_row(table, line, fields, delimiter); if (!num_fields) { fprintf(stderr, "Aborting import at row %d\n", row); exit(1); } /* * all the prep work is done, let's add the row */ mdb_insert_row(table, num_fields, fields); } mdb_free_tabledef(table); fclose(in); mdb_close(mdb); return 0; }