Debian patch 160-foreign-keys from Nirgal Vourgère

This commit is contained in:
Brian Bruns 2010-06-20 16:28:54 -04:00
parent 30e5a6f4bb
commit f2bc2e1a21

View File

@ -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;
} }