[libgda] GdaBrowser: show tables referencing the current table with FK constraints



commit 2bb1e35c0d4bde7e98d4fdebf4ce20842d5f75ef
Author: Vivien Malerba <malerba gnome-db org>
Date:   Wed Jul 21 17:19:06 2010 +0200

    GdaBrowser: show tables referencing the current table with FK constraints

 tools/browser/browser-connection.c           |    1 -
 tools/browser/schema-browser/mgr-columns.c   |   18 +++++++
 tools/browser/schema-browser/mgr-columns.h   |    1 +
 tools/browser/schema-browser/table-columns.c |   66 ++++++++++++++++++++++++-
 4 files changed, 82 insertions(+), 4 deletions(-)
---
diff --git a/tools/browser/browser-connection.c b/tools/browser/browser-connection.c
index c4d7036..1ad2aed 100644
--- a/tools/browser/browser-connection.c
+++ b/tools/browser/browser-connection.c
@@ -1257,7 +1257,6 @@ query_exec_fetch_cb (BrowserConnection *bcnc)
 	ExecCallbackData *cbdata;
 	GdaSet *last_inserted_row = NULL;
 
-	g_print (".");
 	if (!bcnc->priv->results_list)
 		goto out;
 
diff --git a/tools/browser/schema-browser/mgr-columns.c b/tools/browser/schema-browser/mgr-columns.c
index a5faed2..136932c 100644
--- a/tools/browser/schema-browser/mgr-columns.c
+++ b/tools/browser/schema-browser/mgr-columns.c
@@ -369,6 +369,24 @@ mgr_columns_update_children (GdaTreeManager *manager, GdaTreeNode *node, const G
 		gda_tree_node_set_node_attribute (snode, "icon", av, NULL);
 		gda_value_free (av);
 
+		/* details */
+		GString *details = NULL;
+		if (col->pkey)
+			details = g_string_new (_("Primary key"));
+		if (is_fk) {
+			if (details)
+				g_string_append (details, ", ");
+			else
+				details = g_string_new ("");
+			g_string_append (details, _("Foreign key"));
+		}
+		if (details) {
+			g_value_set_string ((av = gda_value_new (G_TYPE_STRING)), details->str);
+			gda_tree_node_set_node_attribute (snode, MGR_COLUMNS_COL_DETAILS, av, NULL);
+			gda_value_free (av);
+			g_string_free (details, TRUE);
+		}
+
 		nodes_list = g_slist_prepend (nodes_list, snode);		
 	}
 
diff --git a/tools/browser/schema-browser/mgr-columns.h b/tools/browser/schema-browser/mgr-columns.h
index df4ea19..951b36d 100644
--- a/tools/browser/schema-browser/mgr-columns.h
+++ b/tools/browser/schema-browser/mgr-columns.h
@@ -65,6 +65,7 @@ GdaTreeManager* mgr_columns_new                      (BrowserConnection *bcnc, c
 #define MGR_COLUMNS_COL_TYPE_ATT_NAME "type"
 #define MGR_COLUMNS_COL_NOTNULL_ATT_NAME "notnull"
 #define MGR_COLUMNS_COL_DEFAULT_ATT_NAME "default"
+#define MGR_COLUMNS_COL_DETAILS "details"
 
 G_END_DECLS
 
diff --git a/tools/browser/schema-browser/table-columns.c b/tools/browser/schema-browser/table-columns.c
index a6fe29e..89e04a4 100644
--- a/tools/browser/schema-browser/table-columns.c
+++ b/tools/browser/schema-browser/table-columns.c
@@ -317,6 +317,58 @@ meta_changed_cb (BrowserConnection *bcnc, GdaMetaStruct *mstruct, TableColumns *
 				}
 				g_object_unref (model);
 			}
+
+			/* reverse FK constraints */
+			g_value_set_string ((catalog_v = gda_value_new (G_TYPE_STRING)), dbo->obj_catalog);
+			model = gda_meta_store_extract (browser_connection_get_meta_store (tcolumns->priv->bcnc),
+							"SELECT c.table_schema, c.table_name, t.table_short_name FROM _referential_constraints c NATURAL JOIN _tables t WHERE ref_table_catalog = ##catalog::string AND ref_table_schema=##schema::string AND ref_table_name=##tname::string", &error,
+							"catalog", catalog_v,
+							"schema", schema_v,
+							"tname", name_v, NULL);
+			if (model) {
+				gint nrows;
+				
+				gda_data_model_dump (model, NULL);
+				nrows = gda_data_model_get_n_rows (model);
+				if (nrows > 0) {
+					gtk_text_buffer_insert_with_tags_by_name (tbuffer,
+										  &current, 
+										  _("Tables referencing this one"), -1,
+										  "section", NULL);
+					gtk_text_buffer_insert (tbuffer, &current, "\n", -1);
+
+					gint i;
+					const GValue *cvalue[3];
+					for (i = 0; i < nrows; i++) {
+						if (i > 0)
+							gtk_text_buffer_insert (tbuffer, &current, "\n", -1);
+
+						gint j;
+						for (j = 0; j < 3; j++) {
+							cvalue[j] = gda_data_model_get_value_at (model, j, i, NULL);
+							if (! cvalue[j])
+								break;
+						}
+						if (j != 3)
+							break;
+						GtkTextTag *tag;
+						tag = gtk_text_buffer_create_tag (tbuffer, NULL, 
+										  "foreground", "blue", 
+										  "weight", PANGO_WEIGHT_NORMAL,
+										  "underline", PANGO_UNDERLINE_SINGLE, 
+										  NULL);
+						g_object_set_data_full (G_OBJECT (tag), "table_schema", 
+									g_value_dup_string (cvalue[0]), g_free);
+						g_object_set_data_full (G_OBJECT (tag), "table_name", 
+									g_value_dup_string (cvalue[1]), g_free);
+						g_object_set_data_full (G_OBJECT (tag), "table_short_name", 
+									g_value_dup_string (cvalue[2]), g_free);
+						gtk_text_buffer_insert_with_tags (tbuffer, &current,
+										  g_value_get_string (cvalue[2]), -1, tag, NULL);
+					}
+				}
+				g_object_unref (model);
+			}
 		}
 
 		if (schema_v)
@@ -343,7 +395,8 @@ table_columns_new (TableInfo *tinfo)
 		COLUMN_TYPE,
 		COLUMN_NOTNULL,
 		COLUMN_DEFAULT,
-		COLUMN_ICON
+		COLUMN_ICON,
+		COLUMN_DETAILS
 	};
 
 	g_return_val_if_fail (IS_TABLE_INFO (tinfo), NULL);
@@ -382,12 +435,13 @@ table_columns_new (TableInfo *tinfo)
         GtkCellRenderer *renderer;
         GtkTreeViewColumn *column;
 
-        model = gdaui_tree_store_new (tcolumns->priv->columns_tree, 5,
+        model = gdaui_tree_store_new (tcolumns->priv->columns_tree, 6,
                                       G_TYPE_STRING, MGR_COLUMNS_COL_NAME_ATT_NAME,
 				      G_TYPE_STRING, MGR_COLUMNS_COL_TYPE_ATT_NAME,
 				      G_TYPE_BOOLEAN, MGR_COLUMNS_COL_NOTNULL_ATT_NAME,
 				      G_TYPE_STRING, MGR_COLUMNS_COL_DEFAULT_ATT_NAME,
-                                      G_TYPE_OBJECT, "icon");
+                                      G_TYPE_OBJECT, "icon",
+				      G_TYPE_STRING, MGR_COLUMNS_COL_DETAILS);
         treeview = browser_make_tree_view (model);
         g_object_unref (model);
 
@@ -423,6 +477,12 @@ table_columns_new (TableInfo *tinfo)
 							   "text", COLUMN_DEFAULT, NULL);
 	gtk_tree_view_append_column (GTK_TREE_VIEW (treeview), column);
 
+	/* Colum: Details */
+	renderer = gtk_cell_renderer_text_new ();
+	column = gtk_tree_view_column_new_with_attributes ("Details", renderer,
+							   "text", COLUMN_DETAILS, NULL);
+	gtk_tree_view_append_column (GTK_TREE_VIEW (treeview), column);
+
 	/* scrolled window packing */
         GtkWidget *sw;
         sw = gtk_scrolled_window_new (NULL, NULL);



[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]