示例#1
0
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);
}
示例#2
0
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);
		}
	}
}
示例#3
0
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);
}