Exemplo n.º 1
0
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;
}
Exemplo n.º 2
0
/**
 * 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;
}