gchar * tests_common_set_serialize (GdaSet *set) { GString *string; gchar *str, *json; GSList *list; string = g_string_new ("{"); /* holders */ if (set->holders) { g_string_append (string, "\"holders\":["); for (list = set->holders; list; list = list->next) { if (list != set->holders) g_string_append_c (string, ','); str = tests_common_holder_serialize (GDA_HOLDER (list->data)); g_string_append (string, str); g_free (str); } g_string_append_c (string, ']'); } /* set description */ g_object_get (G_OBJECT (set), "id", &str, NULL); if (str) { g_string_append (string, "\"id\":"); json = _json_quote_string (str); g_string_append (string, json); g_free (json); g_free (str); } g_object_get (G_OBJECT (set), "name", &str, NULL); if (str) { g_string_append (string, ",\"name\":"); json = _json_quote_string (str); g_string_append (string, json); g_free (json); g_free (str); } g_object_get (G_OBJECT (set), "description", &str, NULL); if (str) { g_string_append (string, ",\"descr\":"); json = _json_quote_string (str); g_string_append (string, json); g_free (json); g_free (str); } /* public data */ if (set->nodes_list) { g_string_append (string, ",\"nodes\":["); for (list = set->nodes_list; list; list = list->next) { GdaSetNode *node = (GdaSetNode*) list->data; if (list != set->nodes_list) g_string_append_c (string, ','); g_string_append_c (string, '{'); g_string_append_printf (string, "\"holder\":%d", g_slist_index (set->holders, gda_set_node_get_holder (node))); GdaDataModel *source_model; source_model = gda_set_node_get_data_model (node); if (source_model) { g_string_append (string, ",\"source_model\":"); if (g_object_get_data (G_OBJECT (source_model), "name")) json = _json_quote_string (g_object_get_data (G_OBJECT (source_model), "name")); else { str = gda_data_model_export_to_string (source_model, GDA_DATA_MODEL_IO_TEXT_SEPARATED, NULL, 0, NULL, 0, NULL); json = _json_quote_string (str); g_free (str); } g_string_append (string, json); g_free (json); g_string_append (string, ",\"source_column\":"); g_string_append_printf (string, "\"%d\"", gda_set_node_get_source_column (node)); /* FIXME: node->hint */ } g_string_append_c (string, '}'); } g_string_append_c (string, ']'); } if (set->sources_list) { g_string_append (string, ",\"sources\":["); for (list = set->sources_list; list; list = list->next) { GdaSetSource *source = (GdaSetSource*) list->data; if (list != set->sources_list) g_string_append_c (string, ','); g_string_append_c (string, '{'); g_string_append (string, "\"model\":"); GdaDataModel *data_model; data_model = gda_set_source_get_data_model (source); if (g_object_get_data (G_OBJECT (data_model), "name")) json = _json_quote_string (g_object_get_data (G_OBJECT (data_model), "name")); else { str = gda_data_model_export_to_string (data_model, GDA_DATA_MODEL_IO_TEXT_SEPARATED, NULL, 0, NULL, 0, NULL); json = _json_quote_string (str); g_free (str); } g_string_append (string, json); g_free (json); g_string_append (string, ",\"nodes\":["); GSList *nodes; for (nodes = gda_set_source_get_nodes (source); nodes; nodes = nodes->next) { if (nodes != gda_set_source_get_nodes (source)) g_string_append_c (string, ','); g_string_append_printf (string, "%d", g_slist_index (set->nodes_list, nodes->data)); } g_string_append_c (string, ']'); g_string_append_c (string, '}'); } g_string_append_c (string, ']'); } g_string_append_c (string, '}'); str = string->str; g_string_free (string, FALSE); return str; }
/** * 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; }