[libgda] GdaBrowser: objects cloud improvements



commit 54716b393c84a6409197c792062b37fad08bef58
Author: Vivien Malerba <malerba gnome-db org>
Date:   Wed Oct 14 15:24:17 2009 +0200

    GdaBrowser: objects cloud improvements

 tools/browser/browser-connection.c           |   85 +++++++++++++++-----------
 tools/browser/common/objects-cloud.c         |   62 ++++++++++++------
 tools/browser/schema-browser/objects-index.c |    1 +
 3 files changed, 91 insertions(+), 57 deletions(-)
---
diff --git a/tools/browser/browser-connection.c b/tools/browser/browser-connection.c
index 6819f16..8219042 100644
--- a/tools/browser/browser-connection.c
+++ b/tools/browser/browser-connection.c
@@ -375,48 +375,62 @@ check_for_wrapper_result (BrowserConnection *bcnc)
 	if (exec_res) {
 		switch (wj->job_type) {
 		case JOB_TYPE_META_STORE_UPDATE: {
-			guint job_id;
-
-			g_mutex_lock (bcnc->priv->p_mstruct_mutex);
-			if (bcnc->priv->p_mstruct)
-				g_object_unref (G_OBJECT (bcnc->priv->p_mstruct));
-			bcnc->priv->p_mstruct = gda_meta_struct_new (gda_connection_get_meta_store (bcnc->priv->cnc),
-								   GDA_META_STRUCT_FEATURE_ALL);
-			g_mutex_unlock (bcnc->priv->p_mstruct_mutex);
-			job_id = gda_thread_wrapper_execute (bcnc->priv->wrapper,
-							     (GdaThreadWrapperFunc) wrapper_meta_struct_sync,
-							     g_object_ref (bcnc), g_object_unref, &lerror);
-			if (job_id > 0)
-				push_wrapper_job (bcnc, job_id, JOB_TYPE_META_STRUCT_SYNC,
-						  _("Analysing database schema"));
-			else if (lerror) {
-				browser_show_error (NULL, _("Error while fetching meta data from the connection: %s"),
-						    lerror->message ? lerror->message : _("No detail"));
-				g_error_free (lerror);
+			if (GPOINTER_TO_INT (exec_res) == 1) {
+				browser_show_error (NULL, _("Error while analysing database schema: %s"),
+						    lerror && lerror->message ? lerror->message : _("No detail"));
+				g_clear_error (&lerror);
+			}
+			else {
+				guint job_id;
+				
+				g_mutex_lock (bcnc->priv->p_mstruct_mutex);
+				if (bcnc->priv->p_mstruct)
+					g_object_unref (G_OBJECT (bcnc->priv->p_mstruct));
+				bcnc->priv->p_mstruct = gda_meta_struct_new (gda_connection_get_meta_store (bcnc->priv->cnc),
+									     GDA_META_STRUCT_FEATURE_ALL);
+				g_mutex_unlock (bcnc->priv->p_mstruct_mutex);
+				job_id = gda_thread_wrapper_execute (bcnc->priv->wrapper,
+								     (GdaThreadWrapperFunc) wrapper_meta_struct_sync,
+								     g_object_ref (bcnc), g_object_unref, &lerror);
+				if (job_id > 0)
+					push_wrapper_job (bcnc, job_id, JOB_TYPE_META_STRUCT_SYNC,
+							  _("Analysing database schema"));
+				else if (lerror) {
+					browser_show_error (NULL, _("Error while fetching meta data from the connection: %s"),
+							    lerror->message ? lerror->message : _("No detail"));
+					g_error_free (lerror);
+				}
 			}
 			break;
 		}
 		case JOB_TYPE_META_STRUCT_SYNC: {
-			g_mutex_lock (bcnc->priv->p_mstruct_mutex);
-			GdaMetaStruct *old_mstruct;
-			old_mstruct = bcnc->priv->mstruct;
-			bcnc->priv->mstruct = bcnc->priv->p_mstruct;
-			bcnc->priv->p_mstruct = NULL;
-			if (old_mstruct)
-				g_object_unref (old_mstruct);
-#ifdef GDA_DEBUG_NO
-			GSList *all, *list;
-			all = gda_meta_struct_get_all_db_objects (bcnc->priv->mstruct);
-			for (list = all; list; list = list->next) {
-				GdaMetaDbObject *dbo = (GdaMetaDbObject *) list->data;
-				g_print ("DBO, Type %d: %s\n", dbo->obj_type,
-					 dbo->obj_short_name);
+			if (GPOINTER_TO_INT (exec_res) == 1) {
+				browser_show_error (NULL, _("Error while analysing database schema: %s"),
+						    lerror && lerror->message ? lerror->message : _("No detail"));
+				g_clear_error (&lerror);
 			}
-			g_slist_free (all);
+			else {
+				g_mutex_lock (bcnc->priv->p_mstruct_mutex);
+				GdaMetaStruct *old_mstruct;
+				old_mstruct = bcnc->priv->mstruct;
+				bcnc->priv->mstruct = bcnc->priv->p_mstruct;
+				bcnc->priv->p_mstruct = NULL;
+				if (old_mstruct)
+					g_object_unref (old_mstruct);
+#ifdef GDA_DEBUG_NO
+				GSList *all, *list;
+				all = gda_meta_struct_get_all_db_objects (bcnc->priv->mstruct);
+				for (list = all; list; list = list->next) {
+					GdaMetaDbObject *dbo = (GdaMetaDbObject *) list->data;
+					g_print ("DBO, Type %d: short=>[%s] schema=>[%s] full=>[%s]\n", dbo->obj_type,
+						 dbo->obj_short_name, dbo->obj_schema, dbo->obj_full_name);
+				}
+				g_slist_free (all);
 #endif
 
-			g_signal_emit (bcnc, browser_connection_signals [META_CHANGED], 0, bcnc->priv->mstruct);
-			g_mutex_unlock (bcnc->priv->p_mstruct_mutex);
+				g_signal_emit (bcnc, browser_connection_signals [META_CHANGED], 0, bcnc->priv->mstruct);
+				g_mutex_unlock (bcnc->priv->p_mstruct_mutex);
+			}
 			break;
 		}
 		case JOB_TYPE_STATEMENT_EXECUTE: {
@@ -509,7 +523,6 @@ browser_connection_new (GdaConnection *cnc)
 	if (update_store) {
 		GError *lerror = NULL;
 		guint job_id;
-		g_print ("UPDATING meta store...\n");
 		job_id = gda_thread_wrapper_execute (bcnc->priv->wrapper,
 						     (GdaThreadWrapperFunc) wrapper_meta_store_update,
 						     g_object_ref (bcnc), g_object_unref, &lerror);
diff --git a/tools/browser/common/objects-cloud.c b/tools/browser/common/objects-cloud.c
index 4b6b578..10eb5f0 100644
--- a/tools/browser/common/objects-cloud.c
+++ b/tools/browser/common/objects-cloud.c
@@ -34,8 +34,8 @@
 #include "popup-container.h"
 
 struct _ObjectsCloudPrivate {
-	gboolean            show_schemas;
-	ObjectsCloudObjType type;
+	gboolean             show_schemas;
+	ObjectsCloudObjType  type;
 	GdaMetaStruct       *mstruct;
 	GtkTextBuffer       *tbuffer;
 	GtkWidget           *tview;
@@ -137,12 +137,12 @@ objects_cloud_get_type (void)
 typedef struct {
 	gchar *schema;
 	GtkTextMark *mark;
+	gint nb_tables;
 } SchemaData;
 static void add_to_schema_data (ObjectsCloud *cloud, SchemaData *sd, GdaMetaDbObject *dbo);
 static void
 update_display (ObjectsCloud *cloud)
 {
-	gchar *str;
 	GSList *schemas = NULL; /* holds pointers to @SchemaData structures */
 	SchemaData *default_sd = NULL, *sd;
 	
@@ -155,9 +155,11 @@ update_display (ObjectsCloud *cloud)
         gtk_text_buffer_get_end_iter (tbuffer, &end);
         gtk_text_buffer_delete (tbuffer, &start, &end);
 
+	/* default SchemaData */
 	default_sd = g_new0 (SchemaData, 1);
 	default_sd->schema = NULL;
 	default_sd->mark = gtk_text_mark_new (NULL, TRUE);
+	default_sd->nb_tables = 0;
 	gtk_text_buffer_get_end_iter (tbuffer, &end);
 	
 	gtk_text_buffer_get_end_iter (tbuffer, &end);
@@ -165,21 +167,16 @@ update_display (ObjectsCloud *cloud)
 		gtk_text_buffer_insert_pixbuf (tbuffer, &end,
 					       browser_get_pixbuf_icon (BROWSER_ICON_TABLE));
 		gtk_text_buffer_insert (tbuffer, &end, " ", 1);
-		gtk_text_buffer_insert_with_tags_by_name (tbuffer, &end,
-							  _("Tables:"), -1, "section", NULL);
-		gtk_text_buffer_insert (tbuffer, &end, "\n\n", 2);
 	}
 	gtk_text_buffer_add_mark (tbuffer, default_sd->mark, &end);
 
-
+	/* using meta struct */
 	GdaMetaStruct *mstruct;
 	GSList *dbo_list, *list;
 	mstruct = cloud->priv->mstruct;
 	if (!mstruct) {
 		/* nothing to display */
-		g_object_unref (default_sd->mark);
-		g_free (default_sd);
-		return;
+		goto out;
 	}
 	dbo_list = g_slist_reverse (gda_meta_struct_get_all_db_objects (mstruct));
 	for (list = dbo_list; list; list = list->next) {
@@ -193,7 +190,10 @@ update_display (ObjectsCloud *cloud)
 
 		is_default = strcmp (dbo->obj_short_name, dbo->obj_full_name) ? TRUE : FALSE;
 		sd = NULL;
-		if (cloud->priv->show_schemas) {
+		if (is_default) {
+			add_to_schema_data (cloud, default_sd, dbo);
+		}
+		else if (cloud->priv->show_schemas) {
 			for (list = schemas; list; list = list->next) {
 				if (!strcmp (((SchemaData *) list->data)->schema, dbo->obj_schema)) {
 					sd = (SchemaData *) list->data;
@@ -204,18 +204,13 @@ update_display (ObjectsCloud *cloud)
 				sd = g_new0 (SchemaData, 1);
 				sd->schema = g_strdup (dbo->obj_schema);
 				sd->mark = gtk_text_mark_new (NULL, TRUE);
+				sd->nb_tables = 0;
 				
 				gtk_text_buffer_get_end_iter (tbuffer, &end);
 				gtk_text_buffer_insert (tbuffer, &end, "\n\n", 2);
 				gtk_text_buffer_insert_pixbuf (tbuffer, &end,
 							       browser_get_pixbuf_icon (BROWSER_ICON_TABLE));
-				gtk_text_buffer_insert (tbuffer, &end, " ", 1);
-				str = g_strdup_printf (_("Tables in schema '%s':"), sd->schema);
-				gtk_text_buffer_insert_with_tags_by_name (tbuffer, &end,
-									  str, -1, "section", NULL);
-				g_free (str);
-				gtk_text_buffer_insert (tbuffer, &end, "\n\n", 2);
-				
+				gtk_text_buffer_insert (tbuffer, &end, " ", 1);				
 				gtk_text_buffer_add_mark (tbuffer, sd->mark, &end);
 				
 				schemas = g_slist_append (schemas, sd);
@@ -223,18 +218,41 @@ update_display (ObjectsCloud *cloud)
 
 			add_to_schema_data (cloud, sd, dbo);
 		}
-		if (is_default)
-			add_to_schema_data (cloud, default_sd, dbo);
 	}
 	g_slist_free (dbo_list);
 
+ out:
 	if (default_sd)
 		schemas = g_slist_prepend (schemas, default_sd);
 
 	/* get rid of the SchemaData structures */
 	for (list = schemas; list; list = list->next) {
+		GtkTextIter iter;
+		gchar *str;
 		sd = (SchemaData*) list->data;
 
+		gtk_text_buffer_get_iter_at_mark (tbuffer, &iter, sd->mark);
+		if (sd == default_sd) {
+			if (sd->nb_tables > 0)
+				str = g_strdup_printf (ngettext ("%d table in current schema:",
+								 "%d tables in current schema:", sd->nb_tables),
+						       sd->nb_tables);
+			else
+				str = g_strdup (_("Tables in current schema:"));
+		}
+		else
+			str = g_strdup_printf (ngettext ("%d Table in schema '%s':", 
+							 "%d Tables in schema '%s':", sd->nb_tables),
+					       sd->nb_tables, sd->schema);
+
+		gtk_text_buffer_insert_with_tags_by_name (tbuffer, &iter,
+							  str, -1, "section", NULL);
+		g_free (str);
+		gtk_text_buffer_insert (tbuffer, &iter, "\n\n", 2);
+
+		if ((sd == default_sd) && (default_sd->nb_tables == 0))
+			gtk_text_buffer_insert (tbuffer, &iter, _("None"), -1);
+
 		g_free (sd->schema);
 		g_object_unref (sd->mark);
 		g_free (sd);
@@ -248,6 +266,8 @@ add_to_schema_data (ObjectsCloud *cloud, SchemaData *sd, GdaMetaDbObject *dbo)
 	GtkTextIter iter;
 	gdouble scale = 1.0;
 
+	sd->nb_tables ++;
+
 	if (dbo->obj_type == GDA_META_DB_TABLE)
 		scale = 1.5 + g_slist_length (dbo->depend_list) / 5.;
 
@@ -263,7 +283,7 @@ add_to_schema_data (ObjectsCloud *cloud, SchemaData *sd, GdaMetaDbObject *dbo)
 
 	gtk_text_buffer_insert_with_tags (cloud->priv->tbuffer, &iter, dbo->obj_name, -1,
 					  tag, NULL);
-	gtk_text_buffer_insert (cloud->priv->tbuffer, &iter, " ", -1);
+	gtk_text_buffer_insert (cloud->priv->tbuffer, &iter, "  ", -1);
 }
 
 static gboolean key_press_event (GtkWidget *text_view, GdkEventKey *event, ObjectsCloud *cloud);
diff --git a/tools/browser/schema-browser/objects-index.c b/tools/browser/schema-browser/objects-index.c
index 9f8c58e..eeb1a2b 100644
--- a/tools/browser/schema-browser/objects-index.c
+++ b/tools/browser/schema-browser/objects-index.c
@@ -178,6 +178,7 @@ objects_index_new (BrowserConnection *bcnc)
 	GtkWidget *cloud;
 	mstruct = browser_connection_get_meta_struct (index->priv->bcnc);
 	cloud = objects_cloud_new (mstruct, OBJECTS_CLOUD_TYPE_TABLE);
+	objects_cloud_show_schemas (OBJECTS_CLOUD (cloud), TRUE);
 	gtk_box_pack_start (GTK_BOX (index), cloud, TRUE, TRUE, 0);
 	index->priv->cloud = cloud;
 	g_signal_connect (cloud, "selected",



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