mirror of
https://github.com/mdbtools/mdbtools.git
synced 2025-04-05 20:31:00 +08:00
Debian patch 160-foreign-keys from Nirgal Vourgère
This commit is contained in:
parent
30e5a6f4bb
commit
f2bc2e1a21
@ -283,25 +283,31 @@ int mdb_set_default_backend(MdbHandle *mdb, const char *backend_name)
|
|||||||
* 'szObject' contains the table name of the child table.
|
* 'szObject' contains the table name of the child table.
|
||||||
* 'szReferencedColumn' contains the column name of the parent table.
|
* 'szReferencedColumn' contains the column name of the parent table.
|
||||||
* 'szReferencedObject' contains the table 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
|
* Returns: a string stating that relationships are not supported for the
|
||||||
* selected backend, or a string containing SQL commands for setting up
|
* selected backend, or a string containing SQL commands for setting up
|
||||||
* the relationship, tailored for the selected backend. The caller is
|
* the relationship, tailored for the selected backend.
|
||||||
* responsible for freeing this string.
|
* Returns NULL on last iteration.
|
||||||
|
* The caller is responsible for freeing this string.
|
||||||
*/
|
*/
|
||||||
char *mdb_get_relationships(MdbHandle *mdb)
|
char *mdb_get_relationships(MdbHandle *mdb)
|
||||||
{
|
{
|
||||||
unsigned int i;
|
unsigned int i;
|
||||||
gchar *text = NULL; /* String to be returned */
|
gchar *text = NULL; /* String to be returned */
|
||||||
static char *bound[4]; /* Bound values */
|
static char *bound[5]; /* Bound values */
|
||||||
static MdbTableDef *table; /* Relationships table */
|
static MdbTableDef *table; /* Relationships table */
|
||||||
int backend = 0; /* Backends: 1=oracle */
|
int backend = 0; /* Backends: 1=oracle, 2=postgres */
|
||||||
char *quoted_table_1, *quoted_column_1,
|
char *quoted_table_1, *quoted_column_1,
|
||||||
*quoted_table_2, *quoted_column_2,
|
*quoted_table_2, *quoted_column_2,
|
||||||
*constraint_name, *quoted_constraint_name;
|
*index_name, *quoted_index_name,
|
||||||
|
*constraint_name, *quoted_constraint_name;
|
||||||
|
long grbit;
|
||||||
|
|
||||||
if (strncmp(mdb->backend_name,"oracle",6) == 0) {
|
if (!strcmp(mdb->backend_name, "oracle")) {
|
||||||
backend = 1;
|
backend = 1;
|
||||||
|
} else if (!strcmp(mdb->backend_name, "postgres")) {
|
||||||
|
backend = 2;
|
||||||
} else {
|
} else {
|
||||||
if (is_init == 0) { /* the first time through */
|
if (is_init == 0) { /* the first time through */
|
||||||
is_init = 1;
|
is_init = 1;
|
||||||
@ -317,55 +323,82 @@ char *mdb_get_relationships(MdbHandle *mdb)
|
|||||||
if (is_init == 0) {
|
if (is_init == 0) {
|
||||||
table = mdb_read_table_by_name(mdb, "MSysRelationships", MDB_TABLE);
|
table = mdb_read_table_by_name(mdb, "MSysRelationships", MDB_TABLE);
|
||||||
if ((!table) || (table->num_rows == 0)) {
|
if ((!table) || (table->num_rows == 0)) {
|
||||||
|
fprintf(stderr, "No MSysRelationships\n");
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
mdb_read_columns(table);
|
mdb_read_columns(table);
|
||||||
for (i=0;i<4;i++) {
|
for (i=0;i<5;i++) {
|
||||||
bound[i] = (char *) g_malloc0(MDB_BIND_SIZE);
|
bound[i] = (char *) g_malloc0(MDB_BIND_SIZE);
|
||||||
}
|
}
|
||||||
mdb_bind_column_by_name(table, "szColumn", bound[0], NULL);
|
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, "szObject", bound[1], NULL);
|
||||||
mdb_bind_column_by_name(table, "szReferencedColumn", bound[2], 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, "szReferencedObject", bound[3], NULL);
|
||||||
|
mdb_bind_column_by_name(table, "grbit", bound[4], NULL);
|
||||||
mdb_rewind_table(table);
|
mdb_rewind_table(table);
|
||||||
|
|
||||||
is_init = 1;
|
is_init = 1;
|
||||||
}
|
}
|
||||||
else if (table->cur_row >= table->num_rows) { /* past the last row */
|
else {
|
||||||
for (i=0;i<4;i++)
|
if (!table) {
|
||||||
g_free(bound[i]);
|
fprintf(stderr, "table is NULL\n");
|
||||||
is_init = 0;
|
}
|
||||||
return NULL;
|
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;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!mdb_fetch_row(table)) {
|
if (!mdb_fetch_row(table)) {
|
||||||
for (i=0;i<4;i++)
|
for (i=0;i<5;i++)
|
||||||
g_free(bound[i]);
|
g_free(bound[i]);
|
||||||
is_init = 0;
|
is_init = 0;
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
switch (backend) {
|
quoted_table_1 = mdb->default_backend->quote_name(bound[1]);
|
||||||
case 1: /* oracle */
|
quoted_column_1 = mdb->default_backend->quote_name(bound[0]);
|
||||||
quoted_table_1 = mdb->default_backend->quote_name(bound[1]);
|
quoted_table_2 = mdb->default_backend->quote_name(bound[3]);
|
||||||
quoted_column_1 = mdb->default_backend->quote_name(bound[0]);
|
quoted_column_2 = mdb->default_backend->quote_name(bound[2]);
|
||||||
quoted_table_2 = mdb->default_backend->quote_name(bound[3]);
|
grbit = atoi(bound[4]);
|
||||||
quoted_column_2 = mdb->default_backend->quote_name(bound[2]);
|
constraint_name = g_strconcat(bound[1], "_", bound[0], "_fk", NULL);
|
||||||
constraint_name = g_strconcat(bound[3], "_", bound[1], NULL);
|
quoted_constraint_name = mdb->default_backend->quote_name(constraint_name);
|
||||||
quoted_constraint_name = mdb->default_backend->quote_name(constraint_name);
|
free(constraint_name);
|
||||||
free(constraint_name);
|
index_name = g_strconcat(bound[3], "_", bound[2], "_idx", NULL);
|
||||||
text = g_strconcat("ALTER TABLE ", quoted_table_1,
|
quoted_index_name = mdb->default_backend->quote_name(index_name);
|
||||||
" ADD CONSTRAINT ", quoted_constraint_name,
|
free(index_name);
|
||||||
" FOREIGN KEY (", quoted_column_1, ")"
|
|
||||||
" REFERENCES ", quoted_table_2, "(", quoted_column_2, ");", NULL);
|
if (grbit & 0x00000002) {
|
||||||
free(quoted_table_1);
|
text = g_strconcat(
|
||||||
free(quoted_column_1);
|
"-- Relationship from ", quoted_table_1,
|
||||||
free(quoted_table_2);
|
" (", quoted_column_1, ")"
|
||||||
free(quoted_column_2);
|
" to ", quoted_table_2, "(", quoted_column_2, ")",
|
||||||
free(quoted_constraint_name);
|
" does not enforce integrity.\n", NULL);
|
||||||
break;
|
} 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);
|
||||||
|
free(quoted_index_name);
|
||||||
|
|
||||||
return (char *)text;
|
return (char *)text;
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user