static void meta_changed_cb (G_GNUC_UNUSED TConnection *tcnc, GdaMetaStruct *mstruct, TableRelations *trels) { GdaMetaDbObject *dbo; GValue *tname, *tschema; BrowserCanvasTable *ctable; g_object_set (G_OBJECT (trels->priv->canvas), "meta-struct", mstruct, NULL); g_value_set_string ((tschema = gda_value_new (G_TYPE_STRING)), table_info_get_table_schema (trels->priv->tinfo)); g_value_set_string ((tname = gda_value_new (G_TYPE_STRING)), table_info_get_table_name (trels->priv->tinfo)); ctable = browser_canvas_db_relations_add_table (BROWSER_CANVAS_DB_RELATIONS (trels->priv->canvas), NULL, tschema, tname); browser_canvas_db_relations_select_table (BROWSER_CANVAS_DB_RELATIONS (trels->priv->canvas), ctable); dbo = gda_meta_struct_get_db_object (mstruct, NULL, tschema, tname); if (dbo && (dbo->obj_type == GDA_META_DB_TABLE)) { GdaMetaTable *table; table = GDA_META_TABLE (dbo); GSList *list; for (list = table->reverse_fk_list; list; list = list->next) { GdaMetaTableForeignKey *fkey = (GdaMetaTableForeignKey*) list->data; if (! trels->priv->all_schemas && ! strcmp (fkey->meta_table->obj_short_name, fkey->meta_table->obj_full_name)) continue; g_value_set_string (tname, fkey->meta_table->obj_name); g_value_set_string (tschema, fkey->meta_table->obj_schema); browser_canvas_db_relations_add_table (BROWSER_CANVAS_DB_RELATIONS (trels->priv->canvas), NULL, tschema, tname); } for (list = table->fk_list; list; list = list->next) { GdaMetaTableForeignKey *fkey = (GdaMetaTableForeignKey*) list->data; if (! trels->priv->all_schemas && (fkey->depend_on->obj_type != GDA_META_DB_UNKNOWN) && ! strcmp (fkey->depend_on->obj_short_name, fkey->depend_on->obj_full_name)) continue; g_value_set_string (tname, fkey->depend_on->obj_name); g_value_set_string (tschema, fkey->depend_on->obj_schema); browser_canvas_db_relations_add_table (BROWSER_CANVAS_DB_RELATIONS (trels->priv->canvas), NULL, tschema, tname); } } gda_value_free (tschema); gda_value_free (tname); browser_canvas_perform_auto_layout (BROWSER_CANVAS (trels->priv->canvas), TRUE, BROWSER_CANVAS_LAYOUT_DEFAULT); }
static void meta_changed_cb (G_GNUC_UNUSED BrowserConnection *bcnc, GdaMetaStruct *mstruct, TablePreferences *tpref) { gtk_list_store_clear (tpref->priv->columns_store); tpref->priv->current_table = NULL; tpref->priv->current_column = NULL; if (!mstruct) return; GdaMetaDbObject *dbo; GValue *schema_v = NULL, *name_v; const gchar *str; str = table_info_get_table_schema (tpref->priv->tinfo); if (str) g_value_set_string ((schema_v = gda_value_new (G_TYPE_STRING)), str); str = table_info_get_table_name (tpref->priv->tinfo); g_value_set_string ((name_v = gda_value_new (G_TYPE_STRING)), str); dbo = gda_meta_struct_get_db_object (mstruct, NULL, schema_v, name_v); if (schema_v) gda_value_free (schema_v); gda_value_free (name_v); if (dbo) { GdaMetaTable *mtable = GDA_META_TABLE (dbo); GSList *list; tpref->priv->current_table = mtable; for (list = mtable->columns; list; list = list->next) { GdaMetaTableColumn *column = GDA_META_TABLE_COLUMN (list->data); GtkTreeIter iter; gchar *eprops; GError *error = NULL; eprops = browser_connection_get_table_column_attribute (tpref->priv->bcnc, tpref->priv->current_table, column, BROWSER_CONNECTION_COLUMN_PLUGIN, &error); if (error) { TO_IMPLEMENT; /* FIXME: add a notice somewhere in the UI */ g_warning ("Error: %s\n", error->message); g_clear_error (&error); } gtk_list_store_append (tpref->priv->columns_store, &iter); gtk_list_store_set (tpref->priv->columns_store, &iter, COLUMN_POINTER, column, COLUMN_GTYPE, column->gtype, COLUMN_PLUGIN, eprops, -1); g_free (eprops); } } }
static GSList * mgr_columns_update_children (GdaTreeManager *manager, GdaTreeNode *node, const GSList *children_nodes, gboolean *out_error, GError **error) { MgrColumns *mgr = MGR_COLUMNS (manager); GSList *nodes_list = NULL; GHashTable *ehash = NULL; if (out_error) *out_error = FALSE; if (children_nodes) ehash = hash_for_existing_nodes (children_nodes); GdaMetaStruct *mstruct; mstruct = t_connection_get_meta_struct (mgr->priv->tcnc); if (!mstruct) { g_set_error (error, MGR_COLUMNS_ERROR, MGR_COLUMNS_NO_META_STRUCT, "%s", _("Not ready")); if (out_error) *out_error = TRUE; return NULL; } GdaMetaDbObject *dbo; GValue *schema_v = NULL, *name_v; if (mgr->priv->schema) g_value_set_string ((schema_v = gda_value_new (G_TYPE_STRING)), mgr->priv->schema); g_value_set_string ((name_v = gda_value_new (G_TYPE_STRING)), mgr->priv->table_name); dbo = gda_meta_struct_get_db_object (mstruct, NULL, schema_v, name_v); if (schema_v) gda_value_free (schema_v); gda_value_free (name_v); if (!dbo) { g_set_error (error, MGR_COLUMNS_ERROR, MGR_COLUMNS_TABLE_NOT_FOUND, "%s", _("Table not found")); if (out_error) *out_error = TRUE; return NULL; } if ((dbo->obj_type != GDA_META_DB_TABLE) && (dbo->obj_type != GDA_META_DB_VIEW)) { g_set_error (error, MGR_COLUMNS_ERROR, MGR_COLUMNS_WRONG_OBJ_TYPE, "%s", _("Requested object is not a table or view")); if (out_error) *out_error = TRUE; return NULL; } GdaMetaTable *dbotable; GSList *columns; gint index; dbotable = GDA_META_TABLE (dbo); for (columns = dbotable->columns, index = 0; columns; columns = columns->next, index ++) { GdaMetaTableColumn *col; col = GDA_META_TABLE_COLUMN (columns->data); GdaTreeNode* snode = NULL; GValue *av; if (ehash) snode = g_hash_table_lookup (ehash, col->column_name); if (snode) { /* use the same node */ g_object_ref (G_OBJECT (snode)); } else { /* column's name */ snode = gda_tree_manager_create_node (manager, node, NULL); if (col->pkey) g_value_take_string ((av = gda_value_new (G_TYPE_STRING)), g_strdup_printf ("<b>%s</b>", col->column_name)); else g_value_set_string ((av = gda_value_new (G_TYPE_STRING)), col->column_name); gda_tree_node_set_node_attribute (snode, MGR_COLUMNS_COL_NAME_ATT_NAME, av, NULL); gda_value_free (av); } /* column's type */ g_value_set_string ((av = gda_value_new (G_TYPE_STRING)), col->column_type); gda_tree_node_set_node_attribute (snode, MGR_COLUMNS_COL_TYPE_ATT_NAME, av, NULL); gda_value_free (av); /* NOT NULL */ g_value_set_boolean ((av = gda_value_new (G_TYPE_BOOLEAN)), !col->nullok); gda_tree_node_set_node_attribute (snode, MGR_COLUMNS_COL_NOTNULL_ATT_NAME, av, NULL); gda_value_free (av); /* default value */ g_value_set_string ((av = gda_value_new (G_TYPE_STRING)), col->default_value); gda_tree_node_set_node_attribute (snode, MGR_COLUMNS_COL_DEFAULT_ATT_NAME, av, NULL); gda_value_free (av); /* icon */ UiIconType type = UI_ICON_COLUMN; GdkPixbuf *pixbuf; gboolean is_fk = column_is_fk_part (dbo, index); if (col->pkey) type = UI_ICON_COLUMN_PK; else if (!col->nullok) { if (is_fk) type = UI_ICON_COLUMN_FK_NN; else type = UI_ICON_COLUMN_NN; } else if (is_fk) type = UI_ICON_COLUMN_FK; pixbuf = ui_get_pixbuf_icon (type); av = gda_value_new (G_TYPE_OBJECT); g_value_set_object (av, pixbuf); 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")); } const GValue *autoinc; autoinc = gda_meta_table_column_get_attribute (col, GDA_ATTRIBUTE_AUTO_INCREMENT); if (autoinc) { if (details) g_string_append (details, ", "); else details = g_string_new (""); g_string_append (details, _("Auto incremented")); } 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); } if (ehash) g_hash_table_destroy (ehash); return g_slist_reverse (nodes_list); }