[libgda] SQLite provider: added new functions to use from SQL
- From: Vivien Malerba <vivien src gnome org>
- To: svn-commits-list gnome org
- Subject: [libgda] SQLite provider: added new functions to use from SQL
- Date: Mon, 29 Jun 2009 20:05:42 +0000 (UTC)
commit 016d38c6d9b1d91424d63ef6518e08bbb52d5ca0
Author: Vivien Malerba <malerba gnome-db org>
Date: Mon Jun 29 21:50:29 2009 +0200
SQLite provider: added new functions to use from SQL
the new functions can be used to display binary data into
strings, similar to the hex()'s SQLite function.
libgda/sqlite/gda-sqlite-provider.c | 141 +++++++++++++++++++++++++++++++++++
1 files changed, 141 insertions(+), 0 deletions(-)
---
diff --git a/libgda/sqlite/gda-sqlite-provider.c b/libgda/sqlite/gda-sqlite-provider.c
index d24cd08..54ae9ee 100644
--- a/libgda/sqlite/gda-sqlite-provider.c
+++ b/libgda/sqlite/gda-sqlite-provider.c
@@ -268,6 +268,10 @@ static void gda_sqlite_free_cnc_data (SqliteConnectionData *cdata);
* extending SQLite with our own functions
*/
static void scalar_gda_file_exists_func (sqlite3_context *context, int argc, sqlite3_value **argv);
+static void scalar_gda_hex_print_func (sqlite3_context *context, int argc, sqlite3_value **argv);
+static void scalar_gda_hex_print_func2 (sqlite3_context *context, int argc, sqlite3_value **argv);
+static void scalar_gda_hex_func (sqlite3_context *context, int argc, sqlite3_value **argv);
+static void scalar_gda_hex_func2 (sqlite3_context *context, int argc, sqlite3_value **argv);
typedef struct {
char *name;
int nargs;
@@ -276,6 +280,10 @@ typedef struct {
} ScalarFunction;
static ScalarFunction scalars[] = {
{"gda_file_exists", 1, NULL, scalar_gda_file_exists_func},
+ {"gda_hex_print", 1, NULL, scalar_gda_hex_print_func},
+ {"gda_hex_print", 2, NULL, scalar_gda_hex_print_func2},
+ {"gda_hex", 1, NULL, scalar_gda_hex_func},
+ {"gda_hex", 2, NULL, scalar_gda_hex_func2},
};
@@ -2562,6 +2570,139 @@ scalar_gda_file_exists_func (sqlite3_context *context, int argc, sqlite3_value *
}
static void
+scalar_gda_hex_print_func (sqlite3_context *context, int argc, sqlite3_value **argv)
+{
+ GdaBinary *bin;
+ GdaDataHandler *dh;
+ GValue *value;
+ gchar *str;
+
+ if (argc != 1) {
+ sqlite3_result_error (context, _("Function requires one argument"), -1);
+ return;
+ }
+
+ bin = g_new0 (GdaBinary, 1);
+ bin->data = (guchar*) sqlite3_value_blob (argv [0]);
+ if (!bin->data) {
+ g_free (bin);
+ sqlite3_result_null (context);
+ return;
+ }
+ bin->binary_length = sqlite3_value_bytes (argv [0]);
+ gda_value_take_binary ((value = gda_value_new (GDA_TYPE_BINARY)), bin);
+ dh = gda_get_default_handler (GDA_TYPE_BINARY);
+ str = gda_data_handler_get_str_from_value (dh, value);
+
+ bin->data = NULL;
+ bin->binary_length = 0;
+ gda_value_free (value);
+ sqlite3_result_text (context, str, -1, g_free);
+}
+
+static void
+scalar_gda_hex_print_func2 (sqlite3_context *context, int argc, sqlite3_value **argv)
+{
+ GdaBinary *bin;
+ GdaDataHandler *dh;
+ GValue *value;
+ gchar *str;
+ gint size;
+
+ if (argc != 2) {
+ sqlite3_result_error (context, _("Function requires two arguments"), -1);
+ return;
+ }
+
+ bin = g_new0 (GdaBinary, 1);
+ bin->data = (guchar*) sqlite3_value_blob (argv [0]);
+ if (!bin->data) {
+ g_free (bin);
+ sqlite3_result_null (context);
+ return;
+ }
+ bin->binary_length = sqlite3_value_bytes (argv [0]);
+ gda_value_take_binary ((value = gda_value_new (GDA_TYPE_BINARY)), bin);
+ dh = gda_get_default_handler (GDA_TYPE_BINARY);
+ str = gda_data_handler_get_str_from_value (dh, value);
+
+ bin->data = NULL;
+ bin->binary_length = 0;
+ gda_value_free (value);
+
+ size = sqlite3_value_int (argv [1]);
+
+ sqlite3_result_text (context, str, -1, g_free);
+}
+
+static void
+scalar_gda_hex_func (sqlite3_context *context, int argc, sqlite3_value **argv)
+{
+ guchar *data;
+ gint length;
+ GString *string;
+ gint i;
+
+ if (argc != 1) {
+ sqlite3_result_error (context, _("Function requires one argument"), -1);
+ return;
+ }
+
+ data = (guchar*) sqlite3_value_blob (argv [0]);
+ if (!data) {
+ sqlite3_result_null (context);
+ return;
+ }
+
+ length = sqlite3_value_bytes (argv [0]);
+ string = g_string_new ("");
+ for (i = 0; i < length; i++) {
+ if ((i > 0) && (i % 4 == 0))
+ g_string_append_c (string, ' ');
+ g_string_append_printf (string, "%02x", data [i]);
+ }
+
+ sqlite3_result_text (context, string->str, -1, g_free);
+ g_string_free (string, FALSE);
+}
+
+static void
+scalar_gda_hex_func2 (sqlite3_context *context, int argc, sqlite3_value **argv)
+{
+ guchar *data;
+ gint length;
+ GString *string;
+ gint i;
+ gint size;
+
+ if (argc != 2) {
+ sqlite3_result_error (context, _("Function requires two arguments"), -1);
+ return;
+ }
+
+ data = (guchar*) sqlite3_value_blob (argv [0]);
+ if (!data) {
+ sqlite3_result_null (context);
+ return;
+ }
+
+ length = sqlite3_value_bytes (argv [0]);
+ size = sqlite3_value_int (argv [1]);
+
+ string = g_string_new ("");
+ for (i = 0; (i < length) && (string->len < (size / 2) * 2 + 2); i++) {
+ if ((i > 0) && (i % 4 == 0))
+ g_string_append_c (string, ' ');
+ g_string_append_printf (string, "%02x", data [i]);
+ }
+
+ if (string->len > size)
+ string->str[size] = 0;
+ sqlite3_result_text (context, string->str, -1, g_free);
+ g_string_free (string, FALSE);
+}
+
+static void
gda_sqlite_free_cnc_data (SqliteConnectionData *cdata)
{
if (!cdata)
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]