mirror of
https://github.com/mdbtools/mdbtools.git
synced 2025-07-16 23:32:50 +08:00
Patch from Carl for relationships
This commit is contained in:
parent
1980ca9694
commit
a23867cd2e
@ -47,10 +47,10 @@ enum {
|
|||||||
MDB_QUERY,
|
MDB_QUERY,
|
||||||
MDB_LINKED_TABLE,
|
MDB_LINKED_TABLE,
|
||||||
MDB_MODULE,
|
MDB_MODULE,
|
||||||
MDB_UNKNOWN_08,
|
MDB_RELATIONSHIP,
|
||||||
MDB_UNKNOWN_09,
|
MDB_UNKNOWN_09,
|
||||||
MDB_UNKNOWN_0A,
|
MDB_UNKNOWN_0A,
|
||||||
MDB_UNKNOWN_0B
|
MDB_DATABASE_PROPERTY
|
||||||
};
|
};
|
||||||
enum {
|
enum {
|
||||||
MDB_BOOL = 0x01,
|
MDB_BOOL = 0x01,
|
||||||
@ -88,6 +88,7 @@ typedef struct {
|
|||||||
guint32 db_key;
|
guint32 db_key;
|
||||||
char db_passwd[14];
|
char db_passwd[14];
|
||||||
MdbBackend *default_backend;
|
MdbBackend *default_backend;
|
||||||
|
char *backend_name;
|
||||||
} MdbHandle;
|
} MdbHandle;
|
||||||
|
|
||||||
typedef struct {
|
typedef struct {
|
||||||
@ -168,5 +169,6 @@ extern char *mdb_get_coltype_string(MdbBackend *backend, int col_type);
|
|||||||
extern void mdb_init_backends();
|
extern void mdb_init_backends();
|
||||||
extern void mdb_register_backend(MdbBackend *backend, char *backend_name);
|
extern void mdb_register_backend(MdbBackend *backend, char *backend_name);
|
||||||
extern int mdb_set_default_backend(MdbHandle *mdb, char *backend_name);
|
extern int mdb_set_default_backend(MdbHandle *mdb, char *backend_name);
|
||||||
|
extern char *mdb_get_relationships(MdbHandle *mdb);
|
||||||
|
|
||||||
#endif /* _mdbtools_h_ */
|
#endif /* _mdbtools_h_ */
|
||||||
|
@ -98,6 +98,14 @@ char *mdb_postgres_types[] =
|
|||||||
"Postgres_Unknown 0x0d",
|
"Postgres_Unknown 0x0d",
|
||||||
"Postgres_Unknown 0x0e",
|
"Postgres_Unknown 0x0e",
|
||||||
"Serial"};
|
"Serial"};
|
||||||
|
|
||||||
|
char *bound_values[256];
|
||||||
|
char *relationships[4];
|
||||||
|
MdbColumn *col;
|
||||||
|
MdbCatalogEntry entry;
|
||||||
|
MdbTableDef *table;
|
||||||
|
int did_first;
|
||||||
|
|
||||||
char *mdb_get_coltype_string(MdbBackend *backend, int col_type)
|
char *mdb_get_coltype_string(MdbBackend *backend, int col_type)
|
||||||
{
|
{
|
||||||
if (col_type > 0x0f) {
|
if (col_type > 0x0f) {
|
||||||
@ -143,8 +151,99 @@ MdbBackend *backend;
|
|||||||
backend = (MdbBackend *) g_hash_table_lookup(mdb_backends, backend_name);
|
backend = (MdbBackend *) g_hash_table_lookup(mdb_backends, backend_name);
|
||||||
if (backend) {
|
if (backend) {
|
||||||
mdb->default_backend = backend;
|
mdb->default_backend = backend;
|
||||||
|
mdb->backend_name = (char *) malloc(strlen(backend_name)+1);
|
||||||
|
strcpy(mdb->backend_name, backend_name);
|
||||||
|
did_first = 0;
|
||||||
return 1;
|
return 1;
|
||||||
} else {
|
} else {
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
char *mdb_get_relationships(MdbHandle *mdb) {
|
||||||
|
|
||||||
|
int i, j, k;
|
||||||
|
static char text[255];
|
||||||
|
void do_first () {
|
||||||
|
mdb_read_catalog (mdb, MDB_TABLE);
|
||||||
|
|
||||||
|
/* loop over each entry in the catalog */
|
||||||
|
for (i=0; i < mdb->num_catalog; i++) {
|
||||||
|
entry = g_array_index (mdb->catalog, MdbCatalogEntry, i);
|
||||||
|
if ((entry.object_type == MDB_TABLE) &&
|
||||||
|
(strncmp (entry.object_name, "MSysRelationships", 17) == 0))
|
||||||
|
{
|
||||||
|
table = mdb_read_table (&entry);
|
||||||
|
if ( table->num_rows > 0 ) {
|
||||||
|
mdb_read_columns(table);
|
||||||
|
mdb_rewind_table(table);
|
||||||
|
for (k=0;k<table->num_cols;k++) {
|
||||||
|
bound_values[k] = (char *) malloc(256);
|
||||||
|
bound_values[k][0] = '\0';
|
||||||
|
mdb_bind_column(table,k+1,bound_values[k]);
|
||||||
|
}
|
||||||
|
relationships[0] = (char *) malloc(256); /* child column */
|
||||||
|
|
||||||
|
relationships[1] = (char *) malloc(256); /* child table */
|
||||||
|
relationships[2] = (char *) malloc(256); /* parent column
|
||||||
|
*/
|
||||||
|
relationships[3] = (char *) malloc(256); /* parent table */
|
||||||
|
|
||||||
|
}
|
||||||
|
did_first = 1;
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
/*
|
||||||
|
* generate 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
|
||||||
|
*/
|
||||||
|
sprintf(text,"%c",0);
|
||||||
|
if ( did_first == 0)
|
||||||
|
do_first();
|
||||||
|
if (table->cur_row < table->num_rows) {
|
||||||
|
if (mdb_fetch_row(table)) {
|
||||||
|
relationships[0][0] = '\0';
|
||||||
|
relationships[1][0] = '\0';
|
||||||
|
relationships[2][0] = '\0';
|
||||||
|
relationships[3][0] = '\0';
|
||||||
|
for (k=0;k<table->num_cols;k++) {
|
||||||
|
col=g_ptr_array_index(table->columns,k);
|
||||||
|
if (strncmp(col->name,"szColumn",8) == 0)
|
||||||
|
strcpy(relationships[0],bound_values[k]);
|
||||||
|
else if (strncmp(col->name,"szObject",8) == 0)
|
||||||
|
strcpy(relationships[1],bound_values[k]);
|
||||||
|
else if (strncmp(col->name,"szReferencedColumn",18) == 0)
|
||||||
|
strcpy(relationships[2],bound_values[k]);
|
||||||
|
else if (strncmp(col->name,"szReferencedObject",18) == 0)
|
||||||
|
strcpy(relationships[3],bound_values[k]);
|
||||||
|
}
|
||||||
|
if (strncmp(mdb->backend_name,"oracle",6) == 0)
|
||||||
|
sprintf(text,"alter table %s add constraint %s_%s foreign key
|
||||||
|
(%s) references %s(%s)",
|
||||||
|
|
||||||
|
relationships[1],relationships[3],relationships[1],
|
||||||
|
|
||||||
|
relationships[0],relationships[3],relationships[2]);
|
||||||
|
else
|
||||||
|
sprintf(text,"relationships are not supported for
|
||||||
|
%s",mdb->backend_name);
|
||||||
|
} /* got a row */
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
for (k=0;k<table->num_cols;k++) {
|
||||||
|
free(bound_values[k]);
|
||||||
|
}
|
||||||
|
free(relationships[0]);
|
||||||
|
free(relationships[1]);
|
||||||
|
free(relationships[2]);
|
||||||
|
free(relationships[3]);
|
||||||
|
did_first = 0;
|
||||||
|
}
|
||||||
|
return text;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -29,10 +29,10 @@ static char *type_name[] = {"Form",
|
|||||||
"Query",
|
"Query",
|
||||||
"Linked Table",
|
"Linked Table",
|
||||||
"Module",
|
"Module",
|
||||||
"Unknown 0x08",
|
"Relationship",
|
||||||
"Unknown 0x09",
|
"Unknown 0x09",
|
||||||
"Unknown 0x0a",
|
"Unknown 0x0a",
|
||||||
"Unknown 0x0b"
|
"Database"
|
||||||
};
|
};
|
||||||
|
|
||||||
if (obj_type > 11) {
|
if (obj_type > 11) {
|
||||||
|
@ -244,6 +244,7 @@ int mdb_is_fixed_col(MdbColumn *col)
|
|||||||
}
|
}
|
||||||
char *mdb_col_to_string(MdbHandle *mdb, int start, int datatype, int size)
|
char *mdb_col_to_string(MdbHandle *mdb, int start, int datatype, int size)
|
||||||
{
|
{
|
||||||
|
/* FIX ME -- not thread safe */
|
||||||
static char text[256];
|
static char text[256];
|
||||||
|
|
||||||
switch (datatype) {
|
switch (datatype) {
|
||||||
|
@ -47,6 +47,7 @@ void mdb_free_handle(MdbHandle *mdb)
|
|||||||
|
|
||||||
if (mdb->filename) free(mdb->filename);
|
if (mdb->filename) free(mdb->filename);
|
||||||
if (mdb->catalog) mdb_free_catalog(mdb);
|
if (mdb->catalog) mdb_free_catalog(mdb);
|
||||||
|
if (mdb->backend_name) free(mdb->backend_name);
|
||||||
free(mdb);
|
free(mdb);
|
||||||
}
|
}
|
||||||
void mdb_free_catalog(MdbHandle *mdb)
|
void mdb_free_catalog(MdbHandle *mdb)
|
||||||
|
@ -27,6 +27,7 @@ MdbHandle *mdb;
|
|||||||
MdbCatalogEntry entry;
|
MdbCatalogEntry entry;
|
||||||
MdbTableDef *table;
|
MdbTableDef *table;
|
||||||
MdbColumn *col;
|
MdbColumn *col;
|
||||||
|
char *the_relation;
|
||||||
|
|
||||||
if (argc < 2) {
|
if (argc < 2) {
|
||||||
fprintf (stderr, "Usage: %s <file> [<backend>]\n",argv[0]);
|
fprintf (stderr, "Usage: %s <file> [<backend>]\n",argv[0]);
|
||||||
@ -105,6 +106,14 @@ MdbColumn *col;
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
fprintf (stdout, "\n\n");
|
||||||
|
fprintf (stdout, "-- CREATE ANY Relationships ...\n");
|
||||||
|
fprintf (stdout, "\n");
|
||||||
|
the_relation=mdb_get_relationships(mdb);
|
||||||
|
while (the_relation[0] != '\0') {
|
||||||
|
fprintf(stdout,"%s\n",the_relation);
|
||||||
|
the_relation=mdb_get_relationships(mdb);
|
||||||
|
}
|
||||||
|
|
||||||
mdb_free_handle (mdb);
|
mdb_free_handle (mdb);
|
||||||
mdb_exit();
|
mdb_exit();
|
||||||
|
Loading…
Reference in New Issue
Block a user