[libgda] GdaBrowser: objects cloud improvements
- From: Vivien Malerba <vivien src gnome org>
- To: svn-commits-list gnome org
- Cc:
- Subject: [libgda] GdaBrowser: objects cloud improvements
- Date: Mon, 19 Oct 2009 18:42:13 +0000 (UTC)
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]