? depcomp ? final.to_sql.patch.txt ? sql_escape.concept.txt ? value_to_sql_string.concept.txt ? libgda/gda-enum-types.c ? libgda/gda-enum-types.h ? libgda/s-enum-types-c ? libgda/s-enum-types-h ? providers/bdb/Makefile ? providers/bdb/Makefile.in Index: libgda/gda-connection.c =================================================================== RCS file: /cvs/gnome/libgda/libgda/gda-connection.c,v retrieving revision 1.69 diff -u -r1.69 gda-connection.c --- libgda/gda-connection.c 3 Mar 2005 13:16:40 -0000 1.69 +++ libgda/gda-connection.c 16 Mar 2005 12:54:32 -0000 @@ -1072,24 +1072,21 @@ /** - * gda_connection_escape_string + * gda_connection_value_to_sql_string * @cnc: a #GdaConnection object. - * @from: String to be escaped. - * @to: Buffer to save the escaped string to. + * @from: #GdaValue to convert from * - * Natively escapes string with \ slashes etc. + * Produces a fully quoted and escaped string from a GdaValue * - * Returns: %FALSE if the database does not support escaping.? + * Returns: escaped and quoted value or NULL if not supported. */ -gboolean -gda_connection_escape_string (GdaConnection *cnc, - const gchar *from, - gchar *to) +gchar * +gda_connection_value_to_sql_string (GdaConnection *cnc, + GdaValue *from) { g_return_val_if_fail (GDA_IS_CONNECTION (cnc), FALSE); g_return_val_if_fail (from != NULL, FALSE); - g_return_val_if_fail (to != NULL, FALSE); /* execute the command on the provider */ - return gda_server_provider_escape_string (cnc->priv->provider_obj, cnc, from, to); + return gda_server_provider_value_to_sql_string (cnc->priv->provider_obj, cnc, from); } Index: libgda/gda-connection.h =================================================================== RCS file: /cvs/gnome/libgda/libgda/gda-connection.h,v retrieving revision 1.47 diff -u -r1.47 gda-connection.h --- libgda/gda-connection.h 5 Feb 2005 04:49:01 -0000 1.47 +++ libgda/gda-connection.h 16 Mar 2005 12:54:32 -0000 @@ -122,8 +122,8 @@ gboolean gda_connection_rollback_transaction (GdaConnection *cnc, GdaTransaction *xaction); gboolean gda_connection_create_blob (GdaConnection *cnc, GdaBlob *blob); -gboolean gda_connection_escape_string (GdaConnection *cnc, const gchar *from, gchar *to); +gchar * gda_connection_value_to_sql_string (GdaConnection *cnc, GdaValue *from); const GList *gda_connection_get_errors (GdaConnection *cnc); typedef enum { Index: libgda/gda-server-provider.c =================================================================== RCS file: /cvs/gnome/libgda/libgda/gda-server-provider.c,v retrieving revision 1.38 diff -u -r1.38 gda-server-provider.c --- libgda/gda-server-provider.c 3 Mar 2005 10:10:00 -0000 1.38 +++ libgda/gda-server-provider.c 16 Mar 2005 12:54:36 -0000 @@ -80,7 +80,7 @@ klass->supports = NULL; klass->get_schema = NULL; klass->create_blob = _gda_server_provider_create_blob; - klass->escape_string = NULL; + klass->value_to_sql_string = NULL; } static void @@ -644,28 +644,25 @@ return CLASS (provider)->create_blob (provider, cnc, blob); } - + /** - * gda_server_provider_escape_string + * gda_server_provider_value_to_sql_string * @provider: a server provider. * @cnc: a #GdaConnection object. - * @from: String to be escaped. - * @to: Buffer to place the resulting escaped string. + * @from: #GdaValue to convert from * - * Natively escapes string with \ slashes etc. + * Produces a fully quoted and escaped string from a GdaValue * - * Returns: %FALSE if the database does not support escaping.? + * Returns: escaped and quoted value or NULL if not supported. */ -gboolean -gda_server_provider_escape_string (GdaServerProvider *provider, +gchar * +gda_server_provider_value_to_sql_string (GdaServerProvider *provider, GdaConnection *cnc, - const gchar *from, - gchar *to) + GdaValue *from) { g_return_val_if_fail (GDA_IS_SERVER_PROVIDER (provider), FALSE); g_return_val_if_fail (GDA_IS_CONNECTION (cnc), FALSE); g_return_val_if_fail (from != NULL, FALSE); - g_return_val_if_fail (to != NULL, FALSE); - return CLASS (provider)->escape_string (provider, cnc, from, to); + return CLASS (provider)->value_to_sql_string (provider, cnc, from); } Index: libgda/gda-server-provider.h =================================================================== RCS file: /cvs/gnome/libgda/libgda/gda-server-provider.h,v retrieving revision 1.25 diff -u -r1.25 gda-server-provider.h --- libgda/gda-server-provider.h 5 Feb 2005 04:49:01 -0000 1.25 +++ libgda/gda-server-provider.h 16 Mar 2005 12:54:37 -0000 @@ -128,10 +128,9 @@ GdaConnection *cnc, GdaBlob *blob); - gboolean (* escape_string) (GdaServerProvider *provider, + gchar * (* value_to_sql_string) (GdaServerProvider *provider, GdaConnection *cnc, - const gchar *from, - gchar *to); + GdaValue *from); }; @@ -210,10 +209,9 @@ GdaConnection *cnc, GdaBlob *blob); -gboolean gda_server_provider_escape_string (GdaServerProvider *provider, +gchar * gda_server_provider_value_to_sql_string (GdaServerProvider *provider, GdaConnection *cnc, - const gchar *from, - gchar *to); + GdaValue *from); G_END_DECLS Index: providers/mysql/gda-mysql-provider.c =================================================================== RCS file: /cvs/gnome/libgda/providers/mysql/gda-mysql-provider.c,v retrieving revision 1.64 diff -u -r1.64 gda-mysql-provider.c --- providers/mysql/gda-mysql-provider.c 3 Mar 2005 13:16:41 -0000 1.64 +++ providers/mysql/gda-mysql-provider.c 16 Mar 2005 12:55:42 -0000 @@ -119,10 +119,9 @@ GdaConnectionSchema schema, GdaParameterList *params); -static gboolean gda_mysql_provider_escape_string (GdaServerProvider *provider, +static gchar *gda_mysql_provider_value_to_sql_string (GdaServerProvider *provider, GdaConnection *cnc, - const gchar *from, - gchar *to); + GdaValue *from); static GObjectClass *parent_class = NULL; @@ -158,7 +157,7 @@ provider_class->rollback_transaction = gda_mysql_provider_rollback_transaction; provider_class->supports = gda_mysql_provider_supports; provider_class->get_schema = gda_mysql_provider_get_schema; - provider_class->escape_string = gda_mysql_provider_escape_string; + provider_class->value_to_sql_string = gda_mysql_provider_value_to_sql_string; } static void @@ -1608,25 +1607,61 @@ return NULL; } - -gboolean -gda_mysql_provider_escape_string (GdaServerProvider *provider, - GdaConnection *cnc, - const gchar *from, - gchar *to) +gchar * +gda_mysql_provider_value_to_sql_string ( + GdaServerProvider *provider, /* we dont actually use this!*/ + GdaConnection *cnc, + GdaValue *from) { - MYSQL *mysql; - GdaMysqlProvider *myprv = (GdaMysqlProvider *) provider; + gchar *val_str; + gchar *ret; - g_return_val_if_fail (GDA_IS_MYSQL_PROVIDER (myprv), FALSE); g_return_val_if_fail (GDA_IS_CONNECTION (cnc), FALSE); g_return_val_if_fail (from != NULL, FALSE); - g_return_val_if_fail (to != NULL, FALSE); + + val_str = gda_value_stringify (from); + if (!val_str) + return NULL; - mysql = g_object_get_data (G_OBJECT (cnc), OBJECT_DATA_MYSQL_HANDLE); - if (!mysql) { - gda_connection_add_error_string (cnc, _("Invalid MYSQL handle")); - return 0; + switch (from->type) { + case GDA_VALUE_TYPE_BIGINT : + case GDA_VALUE_TYPE_DOUBLE : + case GDA_VALUE_TYPE_INTEGER : + case GDA_VALUE_TYPE_NUMERIC : + case GDA_VALUE_TYPE_SINGLE : + case GDA_VALUE_TYPE_SMALLINT : + case GDA_VALUE_TYPE_TINYINT : + ret = g_strdup (val_str); + break; + case GDA_VALUE_TYPE_TIMESTAMP: + case GDA_VALUE_TYPE_DATE : + case GDA_VALUE_TYPE_TIME : + ret = g_strdup_printf ("\"%s\"", val_str); + break; + default: + { + MYSQL *mysql; + char *quoted; + mysql = g_object_get_data (G_OBJECT (cnc), OBJECT_DATA_MYSQL_HANDLE); + + if (!mysql) { + gda_connection_add_error_string (cnc, _("Invalid MYSQL handle")); + return NULL; + } + quoted = ret = g_malloc(strlen(val_str) * 2 + 3); + *quoted++ = '\''; + quoted += mysql_real_escape_string ( + mysql, quoted, val_str, strlen (val_str)); + + *quoted++ = '\''; + *quoted++ = '\0'; + ret = g_realloc(ret, quoted - ret + 1); + } + } - return mysql_real_escape_string (mysql, to, from, strlen (from)); + + g_free (val_str); + + return ret; } + Index: providers/mysql/gda-mysql-recordset.c =================================================================== RCS file: /cvs/gnome/libgda/providers/mysql/gda-mysql-recordset.c,v retrieving revision 1.34 diff -u -r1.34 gda-mysql-recordset.c --- providers/mysql/gda-mysql-recordset.c 3 Mar 2005 10:10:18 -0000 1.34 +++ providers/mysql/gda-mysql-recordset.c 16 Mar 2005 12:55:42 -0000 @@ -496,7 +496,12 @@ sql = g_string_append (sql, column_name); sql = g_string_append (sql, "`"); - sql_value = g_string_append (sql_value, gda_mysql_value_to_sql_string (gda_row_get_value ((GdaRow *) row, i))); + sql_value = g_string_append (sql_value, + gda_mysql_provider_value_to_sql_string ( + NULL, + priv_data->cnc, + gda_row_get_value ((GdaRow *) row, i)) + ); } /* concatenate SQL statement */ @@ -610,7 +615,11 @@ else column_name = gda_data_model_get_column_title (GDA_DATA_MODEL (model), colnum); - gchar *curval = gda_mysql_value_to_sql_string (gda_row_get_value ((GdaRow *) row, colnum)); + gchar *curval = gda_mysql_provider_value_to_sql_string ( + NULL, + priv_data->cnc, + gda_row_get_value ((GdaRow *) row, colnum) + ); /* unique column: we will use it as an index */ if (gda_field_attributes_get_primary_key (attrs) || Index: providers/mysql/utils.c =================================================================== RCS file: /cvs/gnome/libgda/providers/mysql/utils.c,v retrieving revision 1.9 diff -u -r1.9 utils.c --- providers/mysql/utils.c 31 Jan 2005 10:37:23 -0000 1.9 +++ providers/mysql/utils.c 16 Mar 2005 12:55:42 -0000 @@ -159,34 +159,4 @@ return g_strdup_printf ("text"); } - -gchar * -gda_mysql_value_to_sql_string (GdaValue *value) -{ - gchar *val_str; - gchar *ret; - - g_return_val_if_fail (value != NULL, NULL); - - val_str = gda_value_stringify (value); - if (!val_str) - return NULL; - - switch (value->type) { - case GDA_VALUE_TYPE_BIGINT : - case GDA_VALUE_TYPE_DOUBLE : - case GDA_VALUE_TYPE_INTEGER : - case GDA_VALUE_TYPE_NUMERIC : - case GDA_VALUE_TYPE_SINGLE : - case GDA_VALUE_TYPE_SMALLINT : - case GDA_VALUE_TYPE_TINYINT : - ret = g_strdup (val_str); - break; - default : - ret = g_strdup_printf ("\"%s\"", val_str); - } - - g_free (val_str); - - return ret; -} + \ No newline at end of file Index: providers/postgres/gda-postgres-provider.c =================================================================== RCS file: /cvs/gnome/libgda/providers/postgres/gda-postgres-provider.c,v retrieving revision 1.79 diff -u -r1.79 gda-postgres-provider.c --- providers/postgres/gda-postgres-provider.c 3 Mar 2005 13:16:41 -0000 1.79 +++ providers/postgres/gda-postgres-provider.c 16 Mar 2005 12:55:46 -0000 @@ -117,10 +117,10 @@ GdaConnection *cnc, GdaBlob *blob); -static gboolean gda_postgres_provider_escape_string (GdaServerProvider *provider, - GdaConnection *cnc, - const gchar *from, - gchar *to); +gchar * +gda_postgres_provider_value_to_sql_string (GdaServerProvider *provider, /* we dont actually use this!*/ + GdaConnection *cnc, + GdaValue *from); typedef struct { gchar *col_name; @@ -178,7 +178,7 @@ provider_class->supports = gda_postgres_provider_supports; provider_class->get_schema = gda_postgres_provider_get_schema; provider_class->create_blob = gda_postgres_provider_create_blob; - provider_class->escape_string = gda_postgres_provider_escape_string; + provider_class->value_to_sql_string = gda_postgres_provider_value_to_sql_string; } static void @@ -2505,16 +2505,57 @@ return gda_postgres_blob_create (blob, cnc); } -gboolean -gda_postgres_provider_escape_string (GdaServerProvider *provider, - GdaConnection *cnc, - const gchar *from, - gchar *to) +gchar * +gda_postgres_provider_value_to_sql_string ( + GdaServerProvider *provider, /* we dont actually use this!*/ + GdaConnection *cnc, + GdaValue *from) { - g_return_val_if_fail (GDA_IS_POSTGRES_PROVIDER (provider), FALSE); - g_return_val_if_fail (GDA_IS_CONNECTION (cnc), FALSE); - g_return_val_if_fail (from != NULL, FALSE); - g_return_val_if_fail (to != NULL, FALSE); + gchar *val_str; + gchar *ret; + + g_return_val_if_fail (from != NULL, NULL); + + val_str = gda_value_stringify (from); + if (!val_str) + return NULL; + + switch (from->type) { + case GDA_VALUE_TYPE_BIGINT : + case GDA_VALUE_TYPE_DOUBLE : + case GDA_VALUE_TYPE_INTEGER : + case GDA_VALUE_TYPE_NUMERIC : + case GDA_VALUE_TYPE_SINGLE : + case GDA_VALUE_TYPE_SMALLINT : + case GDA_VALUE_TYPE_TINYINT : + ret = g_strdup (val_str); + break; + case GDA_VALUE_TYPE_TIMESTAMP: + case GDA_VALUE_TYPE_DATE : + case GDA_VALUE_TYPE_TIME : + ret = g_strdup_printf ("\"%s\"", val_str); + break; + case GDA_VALUE_TYPE_BINARY: + { + int qlen; + char *quoted; + quoted = PQescapeBytea(val_str, (size_t) strlen(val_str), &qlen); + ret = g_strdup_printf ("\"%s\"", quoted); + PQfreemem(quoted); + break; + } + default : + { + char *quoted; + quoted = ret = g_malloc(strlen(val_str) * 2 + 3); + *quoted++ = '\''; + quoted += PQescapeString (quoted, val_str, (size_t) strlen (val_str)); + *quoted++ = '\''; + *quoted++ = '\0'; + ret = g_realloc(ret, quoted - ret + 1); + } + } + g_free (val_str); - return (unsigned long) PQescapeString (to, from, (size_t) strlen (from)); + return ret; }