[gnome-db] export to csv
- From: Andrea Zagli <azagli libero it>
- To: gnome-db list <gnome-db-list gnome org>
- Subject: [gnome-db] export to csv
- Date: Mon, 12 Jul 2010 18:42:13 +0200
- i think that could be useful an additional parameter (or an option)
to gda_data_model_export_to_file that allow to make the first line of
the file the list of fields name; so i prepared the patch attached
named fields_name_header.patch
- i don't know if so for every database, but when the field is of type
date (or time or timestamp) and it is null postgresql wants in csv
file a zero-lenght string; so i prepared another patch (in attach
named null_date.patch) (it makes use of the two functions that i send
2 days ago)
PS: i don't know if it is the right way to send you/make a patch...
diff --git a/libgda/gda-data-model.c b/libgda/gda-data-model.c
index 70ffd79..2c9ac5e 100644
--- a/libgda/gda-data-model.c
+++ b/libgda/gda-data-model.c
@@ -1050,10 +1050,13 @@ gda_data_model_export_to_string (GdaDataModel *model, GdaDataModelIOFormat forma
}
case GDA_DATA_MODEL_IO_TEXT_SEPARATED: {
+ gchar *retval;
gchar sep = ',';
gchar quote = '"';
gboolean field_quote = TRUE;
+ g_return_val_if_fail (GDA_IS_DATA_MODEL (model), NULL);
+
if (options) {
GdaHolder *holder;
@@ -1094,25 +1097,61 @@ gda_data_model_export_to_string (GdaDataModel *model, GdaDataModelIOFormat forma
else
g_warning (_("The '%s' parameter must hold a boolean value, ignored."), "FIELD_QUOTE");
}
+
+ holder = gda_set_get_holder (options, "FIELDS_NAME");
+ if (holder) {
+ const GValue *value;
+ value = gda_holder_get_value (holder);
+ if (value && (G_VALUE_TYPE (value) == G_TYPE_BOOLEAN))
+ {
+ gint col;
+ gint *rcols;
+ gint rnb_cols;
+
+ if (cols)
+ {
+ rcols = (gint *)cols;
+ rnb_cols = nb_cols;
+ }
+ else
+ {
+ gint i;
+
+ rnb_cols = gda_data_model_get_n_columns (model);
+ rcols = g_new (gint, rnb_cols);
+ for (i = 0; i < rnb_cols; i++)
+ rcols[i] = i;
+ }
+
+ retval = g_strdup ("");
+ for (col = 0; col < rnb_cols; col++)
+ {
+ retval = g_strconcat (retval, g_strdup_printf ("%c", quote), gda_data_model_get_column_name (model, rcols[col]), g_strdup_printf ("%c", quote), g_strdup_printf ("%c", sep), NULL);
+ }
+ if (g_strcmp0 (retval, "") != 0)
+ {
+ retval[strlen (retval) - 1] = '\n';
+ }
+ }
+ else
+ g_warning (_("The '%s' parameter must hold a boolean value, ignored."), "FIELDS_NAME");
+ }
}
+ if (!retval) retval = g_strdup ("");
if (cols)
- return export_to_text_separated (model, cols, nb_cols, rows, nb_rows, sep, quote, field_quote);
+ retval = g_strconcat (retval, export_to_text_separated (model, cols, nb_cols, rows, nb_rows, sep, quote, field_quote), NULL);
else {
- gchar *retval;
gint *rcols, rnb_cols, i;
- g_return_val_if_fail (GDA_IS_DATA_MODEL (model), NULL);
-
rnb_cols = gda_data_model_get_n_columns (model);
rcols = g_new (gint, rnb_cols);
for (i = 0; i < rnb_cols; i++)
rcols[i] = i;
- retval = export_to_text_separated (model, rcols, rnb_cols, rows, nb_rows, sep, quote, field_quote);
- g_free (rcols);
-
- return retval;
+ retval = g_strconcat (retval, export_to_text_separated (model, rcols, rnb_cols, rows, nb_rows, sep, quote, field_quote), NULL);
+ g_free (rcols);
}
+ return retval;
}
default:
diff --git a/libgda/gda-data-model.c b/libgda/gda-data-model.c
index 70ffd79..ad4a746 100644
--- a/libgda/gda-data-model.c
+++ b/libgda/gda-data-model.c
@@ -1229,18 +1268,52 @@ export_to_text_separated (GdaDataModel *model, const gint *cols, gint nb_cols, c
else {
gchar *tmp;
gsize len, size;
-
- tmp = gda_value_stringify (value);
- len = strlen (tmp);
- size = 2 * len + 3;
- txt = g_new (gchar, size);
-
- len = csv_write2 (txt, size, tmp, len, quote);
- txt [len] = 0;
- if (!field_quotes) {
- txt [len - 1] = 0;
- memmove (txt, txt+1, len);
+ GdaColumn *gdacol;
+ GType colgtype;
+
+ tmp = NULL;
+
+ gdacol = gda_data_model_describe_column (model, cols[c]);
+ colgtype = gda_column_get_g_type (gdacol);
+ if (colgtype == GDA_TYPE_TIMESTAMP
+ || colgtype == G_TYPE_DATE
+ || colgtype == GDA_TYPE_TIME) {
+ if (!gda_value_is_null (value)) {
+ if (gda_value_isa (value, GDA_TYPE_TIMESTAMP)) {
+ const GdaTimestamp *tt;
+ tt = (const GdaTimestamp *)gda_value_get_timestamp (value);
+ if (gda_timestamp_valid (tt)) {
+ tmp = gda_value_stringify (value);
+ }
+ } else if (gda_value_isa (value, G_TYPE_DATE)) {
+ tmp = gda_value_stringify (value);
+ } else if (gda_value_isa (value, GDA_TYPE_TIME)) {
+ const GdaTime *tt;
+ tt = (const GdaTime *)gda_value_get_time (value);
+ if (gda_time_valid (tt)) {
+ tmp = gda_value_stringify (value);
+ }
+ }
+ }
+ }
+ else {
+ tmp = gda_value_stringify (value);
+ }
+
+ if (tmp != NULL) {
+ len = strlen (tmp);
+ size = 2 * len + 3;
+ txt = g_new (gchar, size);
+
+ len = csv_write2 (txt, size, tmp, len, quote);
+ txt [len] = 0;
+ if (!field_quotes) {
+ txt [len - 1] = 0;
+ memmove (txt, txt+1, len);
+ }
}
+ else
+ txt = g_strdup ("");
}
if (c > 0)
str = g_string_append_c (str, sep);
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]