/** * gda_data_handler_get_default: * @for_type: a #GType type * * Obtain a pointer to a #GdaDataHandler which can manage #GValue values of type @for_type. The returned * data handler will be adapted to use the current locale information (for example dates will be formatted * taking into account the locale). * * The returned pointer is %NULL if there is no default data handler available for the @for_type data type * * Returns: (transfer none): a #GdaDataHandler which must not be modified or destroyed. * * Since: 4.2.3 */ GdaDataHandler * gda_data_handler_get_default (GType for_type) { static GMutex mutex; static GHashTable *hash = NULL; GdaDataHandler *dh; g_mutex_lock (&mutex); if (!hash) { hash = g_hash_table_new_full (gtype_hash, gtype_equal, NULL, (GDestroyNotify) g_object_unref); g_hash_table_insert (hash, (gpointer) G_TYPE_INT64, gda_handler_numerical_new ()); g_hash_table_insert (hash, (gpointer) G_TYPE_UINT64, gda_handler_numerical_new ()); g_hash_table_insert (hash, (gpointer) GDA_TYPE_BINARY, gda_handler_bin_new ()); g_hash_table_insert (hash, (gpointer) GDA_TYPE_BLOB, gda_handler_bin_new ()); g_hash_table_insert (hash, (gpointer) G_TYPE_BOOLEAN, gda_handler_boolean_new ()); g_hash_table_insert (hash, (gpointer) G_TYPE_DATE, gda_handler_time_new ()); g_hash_table_insert (hash, (gpointer) G_TYPE_DOUBLE, gda_handler_numerical_new ()); g_hash_table_insert (hash, (gpointer) G_TYPE_INT, gda_handler_numerical_new ()); g_hash_table_insert (hash, (gpointer) GDA_TYPE_NUMERIC, gda_handler_numerical_new ()); g_hash_table_insert (hash, (gpointer) G_TYPE_FLOAT, gda_handler_numerical_new ()); g_hash_table_insert (hash, (gpointer) GDA_TYPE_SHORT, gda_handler_numerical_new ()); g_hash_table_insert (hash, (gpointer) GDA_TYPE_USHORT, gda_handler_numerical_new ()); g_hash_table_insert (hash, (gpointer) G_TYPE_STRING, gda_handler_string_new ()); g_hash_table_insert (hash, (gpointer) GDA_TYPE_TIME, gda_handler_time_new ()); g_hash_table_insert (hash, (gpointer) GDA_TYPE_TIMESTAMP, gda_handler_time_new ()); g_hash_table_insert (hash, (gpointer) G_TYPE_DATE_TIME, gda_handler_time_new ()); g_hash_table_insert (hash, (gpointer) G_TYPE_CHAR, gda_handler_numerical_new ()); g_hash_table_insert (hash, (gpointer) G_TYPE_UCHAR, gda_handler_numerical_new ()); g_hash_table_insert (hash, (gpointer) G_TYPE_ULONG, gda_handler_numerical_new ()); g_hash_table_insert (hash, (gpointer) G_TYPE_LONG, gda_handler_numerical_new ()); g_hash_table_insert (hash, (gpointer) G_TYPE_GTYPE, gda_handler_type_new ()); g_hash_table_insert (hash, (gpointer) G_TYPE_UINT, gda_handler_numerical_new ()); } g_mutex_unlock (&mutex); dh = g_hash_table_lookup (hash, (gpointer) for_type); return dh; }
/* * value_to_node * * Converts @value to a string */ static xmlNodePtr value_to_node (GdaReportEngine *engine, G_GNUC_UNUSED RunContext *context, const GValue *value, GdaSet *options) { xmlNodePtr retnode = NULL; GdaHolder *converter = NULL; if (options) converter = gda_set_get_holder (options, "converter"); if (!value || gda_value_is_null (value)) retnode = xmlNewText (BAD_CAST ""); else if ((G_VALUE_TYPE (value) == GDA_TYPE_BINARY) || (G_VALUE_TYPE (value) == GDA_TYPE_BLOB)) { TO_IMPLEMENT; retnode = xmlNewText (BAD_CAST _("Binary data")); } else { GdaDataHandler *dh; gchar *str; if (!data_handlers) { /* initialize the internal data handlers */ data_handlers = g_hash_table_new_full (gtype_hash, gtype_equal, NULL, (GDestroyNotify) g_object_unref); g_hash_table_insert (data_handlers, (gpointer) G_TYPE_INT64, gda_handler_numerical_new ()); g_hash_table_insert (data_handlers, (gpointer) G_TYPE_UINT64, gda_handler_numerical_new ()); g_hash_table_insert (data_handlers, (gpointer) G_TYPE_BOOLEAN, gda_handler_boolean_new ()); g_hash_table_insert (data_handlers, (gpointer) G_TYPE_DATE, gda_handler_time_new ()); g_hash_table_insert (data_handlers, (gpointer) G_TYPE_DOUBLE, gda_handler_numerical_new ()); g_hash_table_insert (data_handlers, (gpointer) G_TYPE_INT, gda_handler_numerical_new ()); g_hash_table_insert (data_handlers, (gpointer) GDA_TYPE_NUMERIC, gda_handler_numerical_new ()); g_hash_table_insert (data_handlers, (gpointer) G_TYPE_FLOAT, gda_handler_numerical_new ()); g_hash_table_insert (data_handlers, (gpointer) GDA_TYPE_SHORT, gda_handler_numerical_new ()); g_hash_table_insert (data_handlers, (gpointer) GDA_TYPE_USHORT, gda_handler_numerical_new ()); g_hash_table_insert (data_handlers, (gpointer) G_TYPE_STRING, gda_handler_string_new ()); g_hash_table_insert (data_handlers, (gpointer) GDA_TYPE_TIME, gda_handler_time_new ()); g_hash_table_insert (data_handlers, (gpointer) GDA_TYPE_TIMESTAMP, gda_handler_time_new ()); g_hash_table_insert (data_handlers, (gpointer) G_TYPE_CHAR, gda_handler_numerical_new ()); g_hash_table_insert (data_handlers, (gpointer) G_TYPE_UCHAR, gda_handler_numerical_new ()); g_hash_table_insert (data_handlers, (gpointer) G_TYPE_ULONG, gda_handler_numerical_new ()); g_hash_table_insert (data_handlers, (gpointer) G_TYPE_LONG, gda_handler_numerical_new ()); g_hash_table_insert (data_handlers, (gpointer) G_TYPE_GTYPE, gda_handler_type_new ()); g_hash_table_insert (data_handlers, (gpointer) G_TYPE_UINT, gda_handler_numerical_new ()); } gboolean converted = FALSE; dh = g_hash_table_lookup (data_handlers, (gpointer) G_VALUE_TYPE (value)); if (dh) str = gda_data_handler_get_str_from_value (dh, value); else str = gda_value_stringify (value); if (converter) { const GValue *cvalue; cvalue = gda_holder_get_value (converter); if ((G_VALUE_TYPE (cvalue) == G_TYPE_STRING) && g_value_get_string (cvalue)) { gchar **array; array = g_strsplit (g_value_get_string (cvalue), "::", 0); if (array[0] && !strcmp (array[0], "richtext")) { if (array[1] && !strcmp (array[1], "docbook")) { retnode = xmlNewNode (NULL, BAD_CAST "para"); parse_rich_text_to_docbook (engine, retnode, str); converted = TRUE; } else if (array[1] && !strcmp (array[1], "html")) { retnode = xmlNewNode (NULL, BAD_CAST "p"); parse_rich_text_to_html (engine, retnode, str); converted = TRUE; } } } } if (!converted) retnode = xmlNewText (BAD_CAST (str ? str : "")); g_free (str); } return retnode; }