/** * base_tool_output_data_model_to_string: */ gchar * base_tool_output_data_model_to_string (GdaDataModel *model, ToolOutputFormat format, FILE *stream, GdaSet *options) { if (!GDA_IS_DATA_MODEL (model)) return NULL; if (format & BASE_TOOL_OUTPUT_FORMAT_DEFAULT) { gchar *tmp; GdaSet *local_options; gint width; base_tool_input_get_size (&width, NULL); local_options = gda_set_new_inline (6, "NAME", G_TYPE_BOOLEAN, TRUE, "NULL_AS_EMPTY", G_TYPE_BOOLEAN, TRUE, "MAX_WIDTH", G_TYPE_INT, width, "COLUMN_SEPARATORS", G_TYPE_BOOLEAN, TRUE, "SEPARATOR_LINE", G_TYPE_BOOLEAN, TRUE, "NAMES_ON_FIRST_LINE", G_TYPE_BOOLEAN, TRUE); if (options) gda_set_merge_with_set (local_options, options); tmp = gda_data_model_export_to_string (model, GDA_DATA_MODEL_IO_TEXT_TABLE, NULL, 0, NULL, 0, local_options); g_object_unref (local_options); if (GDA_IS_DATA_SELECT (model)) { gchar *tmp2, *tmp3; gdouble etime; g_object_get ((GObject*) model, "execution-delay", &etime, NULL); tmp2 = g_strdup_printf ("%s: %.03f s", _("Execution delay"), etime); tmp3 = g_strdup_printf ("%s\n%s", tmp, tmp2); g_free (tmp); g_free (tmp2); return tmp3; } else return tmp; } else if (format & BASE_TOOL_OUTPUT_FORMAT_XML) return gda_data_model_export_to_string (model, GDA_DATA_MODEL_IO_DATA_ARRAY_XML, NULL, 0, NULL, 0, NULL); else if (format & BASE_TOOL_OUTPUT_FORMAT_CSV) { gchar *retval; GdaSet *optexp; optexp = make_options_set_from_string ("csv", options); retval = gda_data_model_export_to_string (model, GDA_DATA_MODEL_IO_TEXT_SEPARATED, NULL, 0, NULL, 0, optexp); if (optexp) g_object_unref (optexp); return retval; } else if (format & BASE_TOOL_OUTPUT_FORMAT_HTML) { xmlBufferPtr buffer; xmlNodePtr top, div, table, node, row_node, col_node, header, meta; gint ncols, nrows, i, j; gchar *str; top = xmlNewNode (NULL, BAD_CAST "html"); header = xmlNewChild (top, NULL, BAD_CAST "head", NULL); meta = xmlNewChild (header, NULL, BAD_CAST "meta", NULL); xmlSetProp (meta, BAD_CAST "http-equiv", BAD_CAST "content-type"); xmlSetProp (meta, BAD_CAST "content", BAD_CAST "text/html; charset=UTF-8"); div = xmlNewChild (top, NULL, BAD_CAST "body", NULL); table = xmlNewChild (div, NULL, BAD_CAST "table", NULL); xmlSetProp (table, BAD_CAST "border", BAD_CAST "1"); if (g_object_get_data (G_OBJECT (model), "name")) xmlNewTextChild (table, NULL, BAD_CAST "caption", g_object_get_data (G_OBJECT (model), "name")); ncols = gda_data_model_get_n_columns (model); nrows = gda_data_model_get_n_rows (model); row_node = xmlNewChild (table, NULL, BAD_CAST "tr", NULL); for (j = 0; j < ncols; j++) { const gchar *cstr; cstr = gda_data_model_get_column_title (model, j); col_node = xmlNewTextChild (row_node, NULL, BAD_CAST "th", BAD_CAST cstr); xmlSetProp (col_node, BAD_CAST "align", BAD_CAST "center"); } for (i = 0; i < nrows; i++) { row_node = xmlNewChild (table, NULL, BAD_CAST "tr", NULL); xmlSetProp (row_node, BAD_CAST "valign", BAD_CAST "top"); for (j = 0; j < ncols; j++) { const GValue *value; value = gda_data_model_get_value_at (model, j, i, NULL); if (!value) { col_node = xmlNewChild (row_node, NULL, BAD_CAST "td", BAD_CAST "ERROR"); xmlSetProp (col_node, BAD_CAST "align", BAD_CAST "left"); } else { str = gda_value_stringify (value); col_node = xmlNewTextChild (row_node, NULL, BAD_CAST "td", BAD_CAST str); xmlSetProp (col_node, BAD_CAST "align", BAD_CAST "left"); g_free (str); } } } node = xmlNewChild (div, NULL, BAD_CAST "p", NULL); str = g_strdup_printf (ngettext ("(%d row)", "(%d rows)", nrows), nrows); xmlNodeSetContent (node, BAD_CAST str); g_free (str); buffer = xmlBufferCreate (); xmlNodeDump (buffer, NULL, top, 0, 1); str = g_strdup ((gchar *) xmlBufferContent (buffer)); xmlBufferFree (buffer); xmlFreeNode (top); return str; } else TO_IMPLEMENT; return NULL; }
static void selection_changed_cb (GtkTreeSelection *select, BrowserConnectionsList *clist) { GtkTreeModel *model; GtkTreeIter iter; BrowserConnection *bcnc = NULL; const GdaDsnInfo *cncinfo = NULL; if (gtk_tree_selection_get_selected (select, &model, &iter)) { gtk_tree_model_get (model, &iter, COLUMN_BCNC, &bcnc, -1); cncinfo = browser_connection_get_information (bcnc); g_object_unref (bcnc); gtk_widget_set_sensitive (_clist->priv->close_cnc_button, TRUE); } else gtk_widget_set_sensitive (_clist->priv->close_cnc_button, FALSE); if (clist->priv->cnc_params_editor) { gtk_widget_destroy (clist->priv->cnc_params_editor); clist->priv->cnc_params_editor = NULL; } if (cncinfo && cncinfo->provider) { /* create GdaSet for parameters to display */ GdaSet *dset; GdaHolder *holder; dset = gda_set_new_inline (1, "PROVIDER_NAME", G_TYPE_STRING, cncinfo->provider); holder = GDA_HOLDER (dset->holders->data); g_object_set (G_OBJECT (holder), "name", _("Database provider"), NULL); GdaProviderInfo *pinfo; pinfo = gda_config_get_provider_info (cncinfo->provider); if (pinfo && pinfo->dsn_params) gda_set_merge_with_set (dset, pinfo->dsn_params); holder = gda_holder_new_inline (G_TYPE_STRING, "GDA_BROWSER_DICT_FILE", _("In memory")); g_object_set (G_OBJECT (holder), "name", _("Dictionary file"), "description", _("File used to store any information associated\n" "to this connection (favorites, descriptions, ...)"), NULL); gda_set_add_holder (dset, holder); g_object_unref (holder); if (bcnc) { const gchar *dict_file_name; dict_file_name = browser_connection_get_dictionary_file (bcnc); if (dict_file_name) gda_set_set_holder_value (dset, NULL, "GDA_BROWSER_DICT_FILE", dict_file_name); } /* create form */ GtkWidget *wid; wid = gdaui_basic_form_new (dset); g_object_set ((GObject*) wid, "show-actions", FALSE, NULL); gdaui_basic_form_entry_set_editable (GDAUI_BASIC_FORM (wid), NULL, FALSE); gtk_grid_attach (clist->priv->layout_grid, wid, 1, 2, 1, 1); gtk_widget_show (wid); clist->priv->cnc_params_editor = wid; /* fill GdaSet's parameters with values */ if (cncinfo->cnc_string) { gchar **array = NULL; array = g_strsplit (cncinfo->cnc_string, ";", 0); if (array) { gint index = 0; gchar *tok; gchar *value; gchar *name; for (index = 0; array[index]; index++) { name = strtok_r (array [index], "=", &tok); if (name) value = strtok_r (NULL, "=", &tok); else value = NULL; if (name && value) { GdaHolder *param; gda_rfc1738_decode (name); gda_rfc1738_decode (value); param = gda_set_get_holder (dset, name); if (param) g_assert (gda_holder_set_value_str (param, NULL, value, NULL)); } } g_strfreev (array); } } g_object_unref (dset); } }
/** * base_tool_output_result_to_string: * @res: a #ToolCommandResult * @format: a #ToolOutputFormat format specification * @stream: (allow-none): a stream which the returned string will be put to, or %NULL * @options: (allow-none): a #GdaSet containing options, or %NULL * * Converts @res to a string * * Returns: (transfer full): a new string */ gchar * base_tool_output_result_to_string (ToolCommandResult *res, ToolOutputFormat format, FILE *stream, GdaSet *options) { switch (res->type) { case BASE_TOOL_COMMAND_RESULT_DATA_MODEL: return base_tool_output_data_model_to_string (res->u.model, format, stream, options); case BASE_TOOL_COMMAND_RESULT_SET: { GSList *list; GString *string; xmlNodePtr node; xmlBufferPtr buffer; gchar *str; if (format & BASE_TOOL_OUTPUT_FORMAT_DEFAULT) { string = g_string_new (""); for (list = res->u.set->holders; list; list = list->next) { const GValue *value; gchar *tmp; const gchar *cstr; GdaHolder *h; h = GDA_HOLDER (list->data); cstr = gda_holder_get_id (h); value = gda_holder_get_value (h); if (!strcmp (cstr, "IMPACTED_ROWS")) { g_string_append_printf (string, "%s: ", _("Number of rows impacted")); tmp = gda_value_stringify (value); g_string_append_printf (string, "%s", tmp); g_free (tmp); } else if (!strcmp (cstr, "EXEC_DELAY")) { g_string_append_printf (string, "%s: ", _("Execution delay")); gdouble etime; etime = g_value_get_double (value); g_string_append_printf (string, "%.03f s", etime); } else { tmp = g_markup_escape_text (cstr, -1); g_string_append_printf (string, "%s: ", tmp); g_free (tmp); tmp = gda_value_stringify (value); g_string_append_printf (string, "%s", tmp); g_free (tmp); } g_string_append (string, "\n"); } str = string->str; g_string_free (string, FALSE); return str; } else if (format & BASE_TOOL_OUTPUT_FORMAT_XML) { buffer = xmlBufferCreate (); node = xmlNewNode (NULL, BAD_CAST "parameters"); for (list = res->u.set->holders; list; list = list->next) { const GValue *value; xmlNodePtr pnode, vnode; pnode = xmlNewNode (NULL, BAD_CAST "parameter"); xmlAddChild (node, pnode); xmlSetProp (pnode, BAD_CAST "name", BAD_CAST gda_holder_get_id (GDA_HOLDER (list->data))); value = gda_holder_get_value (GDA_HOLDER (list->data)); vnode = gda_value_to_xml (value); xmlAddChild (pnode, vnode); } xmlNodeDump (buffer, NULL, node, 0, 1); str = g_strdup ((gchar *) xmlBufferContent (buffer)); xmlBufferFree (buffer); xmlFreeNode (node); return str; } else if (format & BASE_TOOL_OUTPUT_FORMAT_HTML) { buffer = xmlBufferCreate (); node = xmlNewNode (NULL, BAD_CAST "ul"); for (list = res->u.set->holders; list; list = list->next) { const GValue *value; xmlNodePtr pnode, vnode; pnode = xmlNewNode (NULL, BAD_CAST "li"); xmlAddChild (node, pnode); xmlSetProp (pnode, BAD_CAST "name", BAD_CAST gda_holder_get_id (GDA_HOLDER (list->data))); value = gda_holder_get_value (GDA_HOLDER (list->data)); vnode = gda_value_to_xml (value); xmlAddChild (pnode, vnode); } xmlNodeDump (buffer, NULL, node, 0, 1); str = g_strdup ((gchar *) xmlBufferContent (buffer)); xmlBufferFree (buffer); xmlFreeNode (node); return str; } else if (format & BASE_TOOL_OUTPUT_FORMAT_CSV) { string = g_string_new (""); for (list = res->u.set->holders; list; list = list->next) { const GValue *value; gchar *tmp; const gchar *cstr; GdaHolder *h; h = GDA_HOLDER (list->data); cstr = gda_holder_get_id (h); value = gda_holder_get_value (h); if (!strcmp (cstr, "IMPACTED_ROWS")) { g_string_append_printf (string, "\"%s\",", _("Number of rows impacted")); tmp = gda_value_stringify (value); g_string_append_printf (string, "\"%s\"", tmp); g_free (tmp); } else if (!strcmp (cstr, "EXEC_DELAY")) { g_string_append_printf (string, "\"%s\",", _("Execution delay")); gdouble etime; etime = g_value_get_double (value); g_string_append_printf (string, "\"%.03f s\"", etime); } else { tmp = g_markup_escape_text (cstr, -1); g_string_append_printf (string, "\"%s\",", tmp); g_free (tmp); tmp = gda_value_stringify (value); g_string_append_printf (string, "\"%s\"", tmp); g_free (tmp); } g_string_append (string, "\n"); } str = string->str; g_string_free (string, FALSE); return str; } else { TO_IMPLEMENT; return NULL; } } case BASE_TOOL_COMMAND_RESULT_TREE: { GdaSet *options2, *merge = NULL; options2 = g_object_get_data ((GObject*) res->u.tree, "BASE_TOOL_OUTPUT_OPTIONS"); if (options && options2) { merge = gda_set_copy (options2); gda_set_merge_with_set (merge, options); } gchar *tmp; tmp = tree_to_string (res->u.tree, format, stream, merge ? merge : (options ? options : options2)); if (merge) g_object_unref (merge); return tmp; } case BASE_TOOL_COMMAND_RESULT_TXT: { xmlNodePtr node; xmlBufferPtr buffer; gchar *str; if ((format & BASE_TOOL_OUTPUT_FORMAT_DEFAULT) || (format & BASE_TOOL_OUTPUT_FORMAT_CSV)) return g_strdup (res->u.txt->str); else if (format & BASE_TOOL_OUTPUT_FORMAT_XML) { buffer = xmlBufferCreate (); node = xmlNewNode (NULL, BAD_CAST "txt"); xmlNodeSetContent (node, BAD_CAST res->u.txt->str); xmlNodeDump (buffer, NULL, node, 0, 1); str = g_strdup ((gchar *) xmlBufferContent (buffer)); xmlBufferFree (buffer); xmlFreeNode (node); return str; } else if (format & BASE_TOOL_OUTPUT_FORMAT_HTML) { buffer = xmlBufferCreate (); node = xmlNewNode (NULL, BAD_CAST "p"); xmlNodeSetContent (node, BAD_CAST res->u.txt->str); xmlNodeDump (buffer, NULL, node, 0, 1); str = g_strdup ((gchar *) xmlBufferContent (buffer)); xmlBufferFree (buffer); xmlFreeNode (node); return str; } else { TO_IMPLEMENT; return NULL; } } case BASE_TOOL_COMMAND_RESULT_EMPTY: return g_strdup (""); case BASE_TOOL_COMMAND_RESULT_MULTIPLE: { GSList *list; GString *string = NULL; gchar *str; for (list = res->u.multiple_results; list; list = list->next) { ToolCommandResult *tres = (ToolCommandResult*) list->data; gchar *tmp; tmp = base_tool_output_result_to_string (tres, format & BASE_TOOL_OUTPUT_FORMAT_COLOR_TERM ? TRUE : FALSE, stream, options); if (!string) string = g_string_new (tmp); else { g_string_append_c (string, '\n'); g_string_append (string, tmp); } g_free (tmp); } if (string) { str = string->str; g_string_free (string, FALSE); } else str = g_strdup (""); return str; } case BASE_TOOL_COMMAND_RESULT_HELP: { if (format & BASE_TOOL_OUTPUT_FORMAT_XML) { xmlBufferPtr buffer; gchar *str; buffer = xmlBufferCreate (); xmlNodeDump (buffer, NULL, res->u.xml_node, 0, 1); str = g_strdup ((gchar *) xmlBufferContent (buffer)); xmlBufferFree (buffer); return str; } else if (format & BASE_TOOL_OUTPUT_FORMAT_HTML) { TO_IMPLEMENT; return NULL; } else { gint width = -1; gboolean term_color; if (format & BASE_TOOL_OUTPUT_FORMAT_DEFAULT) base_tool_input_get_size (&width, NULL); term_color = format & BASE_TOOL_OUTPUT_FORMAT_COLOR_TERM ? TRUE : FALSE; return base_tool_help_to_string (res, width, term_color); } break; } default: g_assert_not_reached (); return NULL; } }