/** * 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; }
/** * gda_server_provider_handler_use_default: (skip) * @provider: a server provider * @type: a #GType * * Reserved to database provider's implementations. This method defines a default data handler for * @provider, and returns that #GdaDataHandler. * * Returns: (transfer none): a #GdaDataHandler, or %NULL * * Since: 5.2 */ GdaDataHandler * gda_server_provider_handler_use_default (GdaServerProvider *provider, GType type) { GdaDataHandler *dh = NULL; g_return_val_if_fail (GDA_IS_SERVER_PROVIDER (provider), NULL); if ((type == G_TYPE_INT64) || (type == G_TYPE_UINT64) || (type == G_TYPE_DOUBLE) || (type == G_TYPE_INT) || (type == GDA_TYPE_NUMERIC) || (type == G_TYPE_FLOAT) || (type == GDA_TYPE_SHORT) || (type == GDA_TYPE_USHORT) || (type == G_TYPE_CHAR) || (type == G_TYPE_UCHAR) || (type == G_TYPE_UINT) || (type == G_TYPE_LONG) || (type == G_TYPE_ULONG)) { dh = gda_server_provider_handler_find (provider, NULL, type, NULL); if (!dh) { dh = gda_handler_numerical_new (); gda_server_provider_handler_declare (provider, dh, NULL, G_TYPE_INT64, NULL); gda_server_provider_handler_declare (provider, dh, NULL, G_TYPE_UINT64, NULL); gda_server_provider_handler_declare (provider, dh, NULL, G_TYPE_DOUBLE, NULL); gda_server_provider_handler_declare (provider, dh, NULL, G_TYPE_INT, NULL); gda_server_provider_handler_declare (provider, dh, NULL, GDA_TYPE_NUMERIC, NULL); gda_server_provider_handler_declare (provider, dh, NULL, G_TYPE_FLOAT, NULL); gda_server_provider_handler_declare (provider, dh, NULL, GDA_TYPE_SHORT, NULL); gda_server_provider_handler_declare (provider, dh, NULL, GDA_TYPE_USHORT, NULL); gda_server_provider_handler_declare (provider, dh, NULL, G_TYPE_CHAR, NULL); gda_server_provider_handler_declare (provider, dh, NULL, G_TYPE_UCHAR, NULL); gda_server_provider_handler_declare (provider, dh, NULL, G_TYPE_UINT, NULL); gda_server_provider_handler_declare (provider, dh, NULL, G_TYPE_ULONG, NULL); gda_server_provider_handler_declare (provider, dh, NULL, G_TYPE_LONG, NULL); g_object_unref (dh); } } else if ((type == GDA_TYPE_BINARY) || (type == GDA_TYPE_BLOB)) { /* no default binary data handler, it's too database specific */ dh = NULL; } else if (type == G_TYPE_BOOLEAN) { dh = gda_server_provider_handler_find (provider, NULL, type, NULL); if (!dh) { dh = gda_handler_boolean_new (); gda_server_provider_handler_declare (provider, dh, NULL, G_TYPE_BOOLEAN, NULL); g_object_unref (dh); } } else if ((type == GDA_TYPE_TIME) || (type == GDA_TYPE_TIMESTAMP) || (type == G_TYPE_DATE)) { /* no default time related data handler, it's too database specific */ dh = NULL; } else if (type == G_TYPE_STRING) { dh = gda_server_provider_handler_find (provider, NULL, type, NULL); if (!dh) { dh = gda_handler_string_new (); gda_server_provider_handler_declare (provider, dh, NULL, G_TYPE_STRING, NULL); g_object_unref (dh); } } else if (type == G_TYPE_GTYPE) { dh = gda_server_provider_handler_find (provider, NULL, type, NULL); if (!dh) { dh = gda_handler_type_new (); gda_server_provider_handler_declare (provider, dh, NULL, G_TYPE_GTYPE, NULL); g_object_unref (dh); } } return dh; }