1 /*
2  * Copyright (C) 2001 - 2002 Carlos Perelló Marín <carlos@gnome-db.org>
3  * Copyright (C) 2001 - 2003 Rodrigo Moya <rodrigo@gnome-db.org>
4  * Copyright (C) 2002 - 2003 Gonzalo Paniagua Javier <gonzalo@src.gnome.org>
5  * Copyright (C) 2004 Benjamin Otte <in7y118@public.uni-hamburg.de>
6  * Copyright (C) 2004 J.H.M. Dassen (Ray) <jdassen@debian.org>
7  * Copyright (C) 2004 Julio M. Merino Vidal <jmmv@menta.net>
8  * Copyright (C) 2004 Jürg Billeter <j@bitron.ch>
9  * Copyright (C) 2004 Nikolai Weibull <ruby-gnome2-devel-en-list@pcppopper.org>
10  * Copyright (C) 2005 Denis Fortin <denis.fortin@free.fr>
11  * Copyright (C) 2005 - 2013 Vivien Malerba <malerba@gnome-db.org>
12  * Copyright (C) 2005 Álvaro Peña <alvaropg@telefonica.net>
13  * Copyright (C) 2008 - 2009 Bas Driessen <bas.driessen@xobas.com>
14  * Copyright (C) 2008 - 2011 Murray Cumming <murrayc@murrayc.com>
15  * Copyright (C) 2009 Armin Burgmeier <armin@openismus.com>
16  * Copyright (C) 2010 David King <davidk@openismus.com>
17  * Copyright (C) 2011 Daniel Espinosa <despinosa@src.gnome.org>
18  * Copyright (C) 2011 Marek Černocký <marek@manet.cz>
19  *
20  * This library is free software; you can redistribute it and/or
21  * modify it under the terms of the GNU Lesser General Public
22  * License as published by the Free Software Foundation; either
23  * version 2 of the License, or (at your option) any later version.
24  *
25  * This library is distributed in the hope that it will be useful,
26  * but WITHOUT ANY WARRANTY; without even the implied warranty of
27  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
28  * Lesser General Public License for more details.
29  *
30  * You should have received a copy of the GNU Lesser General Public
31  * License along with this library; if not, write to the
32  * Free Software Foundation, Inc., 51 Franklin St, Fifth Floor,
33  * Boston, MA  02110-1301, USA.
34  */
35 
36 #undef GDA_DISABLE_DEPRECATED
37 #include <stdlib.h>
38 #include <errno.h>
39 #include <string.h>
40 #include <glib/gi18n-lib.h>
41 #include <glib/gstdio.h>
42 #include <libgda/gda-data-model-array.h>
43 #include <libgda/gda-data-model-private.h>
44 #include <libgda/gda-util.h>
45 #include <libgda/gda-server-provider-extra.h>
46 #include <libgda/gda-server-operation-private.h>
47 #include "gda-sqlite.h"
48 #include "gda-sqlite-provider.h"
49 #include "gda-sqlite-recordset.h"
50 #include "gda-sqlite-ddl.h"
51 #include "gda-sqlite-util.h"
52 #include "gda-sqlite-meta.h"
53 #include "gda-sqlite-handler-bin.h"
54 #include "gda-sqlite-handler-boolean.h"
55 #include "gda-sqlite-blob-op.h"
56 #include <libgda/gda-connection-private.h>
57 #include <libgda/binreloc/gda-binreloc.h>
58 #include <libgda/gda-set.h>
59 #include <libgda/gda-statement-extra.h>
60 #include <sql-parser/gda-sql-parser.h>
61 #include <stdio.h>
62 #include "xml_embedded.h" /* this one is dynamically generated */
63 #define _GDA_PSTMT(x) ((GdaPStmt*)(x))
64 #include <libgda/gda-debug-macros.h>
65 
66 #define FILE_EXTENSION ".db"
67 static gchar *get_table_nth_column_name (GdaConnection *cnc, const gchar *table_name, gint pos);
68 
69 /* TMP */
70 typedef struct {
71 	GdaSqlStatement *stmt;
72 	gchar   *db;
73 	gchar   *table;
74 	gchar   *column;
75 	gboolean free_column; /* set to %TRUE if @column has been dynamically allocated */
76 	GdaBlob *blob;
77 } PendingBlob;
78 
79 static PendingBlob*
make_pending_blob(GdaConnection * cnc,GdaStatement * stmt,GdaHolder * holder,GError ** error)80 make_pending_blob (GdaConnection *cnc, GdaStatement *stmt, GdaHolder *holder, GError **error)
81 {
82 	PendingBlob *pb = NULL;
83 	GdaSqlStatement *sqlst;
84 	const gchar *hname;
85 
86 	g_return_val_if_fail (GDA_IS_STATEMENT (stmt), NULL);
87 	g_return_val_if_fail (GDA_IS_HOLDER (holder), NULL);
88 	hname = gda_holder_get_id (holder);
89 	g_return_val_if_fail (hname && *hname, NULL);
90 
91 	g_object_get (G_OBJECT (stmt), "structure", &sqlst, NULL);
92 	g_return_val_if_fail (sqlst, NULL);
93 
94 	switch (sqlst->stmt_type) {
95 	case GDA_SQL_STATEMENT_INSERT: {
96 		GdaSqlStatementInsert *istmt = (GdaSqlStatementInsert*) sqlst->contents;
97 		gint pos = -1;
98 		GSList *vll;
99 		for (vll = istmt->values_list; vll && (pos == -1); vll = vll->next) {
100 			GSList *vlist;
101 			gint p;
102 			for (p = 0, vlist = (GSList *) vll->data;
103 			     vlist;
104 			     p++, vlist = vlist->next) {
105 				GdaSqlExpr *expr = (GdaSqlExpr *) vlist->data;
106 				if (!expr->param_spec)
107 					continue;
108 				if (expr->param_spec->name &&
109 				    !strcmp (expr->param_spec->name, hname)) {
110 					pos = p;
111 					break;
112 				}
113 			}
114 		}
115 		if (pos == -1) {
116 			g_set_error (error, GDA_SERVER_PROVIDER_ERROR,
117 				     GDA_SERVER_PROVIDER_INTERNAL_ERROR,
118 				     _("Parameter '%s' not found is statement"), hname);
119 			goto out;
120 		}
121 		GdaSqlField *field;
122 		field = g_slist_nth_data (istmt->fields_list, pos);
123 		if (field) {
124 			pb = g_new0 (PendingBlob, 1);
125 			pb->table = istmt->table->table_name;
126 			pb->column = field->field_name;
127 			pb->free_column = FALSE;
128 		}
129 		else if (istmt->fields_list) {
130 			g_set_error (error, GDA_SERVER_PROVIDER_ERROR,
131 				     GDA_SERVER_PROVIDER_INTERNAL_ERROR,
132 				     _("No column name to associate to parameter '%s'"),
133 				     hname);
134 			goto out;
135 		}
136 		else {
137 			gchar *fname;
138 			fname = get_table_nth_column_name (cnc, istmt->table->table_name, pos);
139 			if (fname) {
140 				pb = g_new0 (PendingBlob, 1);
141 				pb->table = istmt->table->table_name;
142 				pb->column = fname;
143 				pb->free_column = TRUE;
144 			}
145 			else {
146 				g_set_error (error, GDA_SERVER_PROVIDER_ERROR,
147 					     GDA_SERVER_PROVIDER_INTERNAL_ERROR,
148 					     _("No column name to associate to parameter '%s'"),
149 					     hname);
150 				goto out;
151 			}
152 		}
153 
154 		break;
155 	}
156 	case GDA_SQL_STATEMENT_UPDATE: {
157 		GdaSqlStatementUpdate *ustmt = (GdaSqlStatementUpdate*) sqlst->contents;
158 		gint pos = -1;
159 		GSList *vlist;
160 		gint p;
161 		for (p = 0, vlist = ustmt->expr_list;
162 		     vlist;
163 		     p++, vlist = vlist->next) {
164 			GdaSqlExpr *expr = (GdaSqlExpr *) vlist->data;
165 			if (!expr->param_spec)
166 				continue;
167 			if (expr->param_spec->name &&
168 			    !strcmp (expr->param_spec->name, hname)) {
169 				pos = p;
170 				break;
171 			}
172 		}
173 		if (pos == -1) {
174 			g_set_error (error, GDA_SERVER_PROVIDER_ERROR,
175 				     GDA_SERVER_PROVIDER_INTERNAL_ERROR,
176 				     _("Parameter '%s' not found is statement"), hname);
177 			goto out;
178 		}
179 		GdaSqlField *field;
180 		field = g_slist_nth_data (ustmt->fields_list, pos);
181 		if (field) {
182 			pb = g_new0 (PendingBlob, 1);
183 			pb->table = ustmt->table->table_name;
184 			pb->column = field->field_name;
185 			pb->free_column = FALSE;
186 		}
187 		if (ustmt->fields_list) {
188 			g_set_error (error, GDA_SERVER_PROVIDER_ERROR,
189 				     GDA_SERVER_PROVIDER_INTERNAL_ERROR,
190 				     _("No column name to associate to parameter '%s'"),
191 				     hname);
192 			goto out;
193 		}
194 		else {
195 			gchar *fname;
196 			fname = get_table_nth_column_name (cnc, ustmt->table->table_name, pos);
197 			if (fname) {
198 				pb = g_new0 (PendingBlob, 1);
199 				pb->table = ustmt->table->table_name;
200 				pb->column = fname;
201 				pb->free_column = TRUE;
202 			}
203 			else {
204 				g_set_error (error, GDA_SERVER_PROVIDER_ERROR,
205 					     GDA_SERVER_PROVIDER_INTERNAL_ERROR,
206 					     _("No column name to associate to parameter '%s'"),
207 					     hname);
208 				goto out;
209 			}
210 		}
211 		break;
212 	}
213 	default:
214 		g_set_error (error, GDA_SERVER_PROVIDER_ERROR,
215 			     GDA_SERVER_PROVIDER_NON_SUPPORTED_ERROR,
216 			     "%s",_("Binding a BLOB for this type of statement is not supported"));
217 		goto out;
218 	}
219 
220  out:
221 	if (pb)
222 		pb->stmt = sqlst;
223 	else
224 		gda_sql_statement_free (sqlst);
225 	return pb;
226 }
227 
228 static void
pending_blobs_free_list(GSList * blist)229 pending_blobs_free_list (GSList *blist)
230 {
231 	if (!blist)
232 		return;
233 	GSList *l;
234 	for (l = blist; l; l = l->next) {
235 		PendingBlob *pb = (PendingBlob*) l->data;
236 		if (pb->stmt)
237 			gda_sql_statement_free (pb->stmt);
238 		if (pb->free_column)
239 			g_free (pb->column);
240 		g_free (pb);
241 	}
242 
243 	g_slist_free (blist);
244 }
245 
246 /* TMP */
247 
248 /*
249  * GObject methods
250  */
251 static void gda_sqlite_provider_class_init (GdaSqliteProviderClass *klass);
252 static void gda_sqlite_provider_init       (GdaSqliteProvider *provider,
253 					    GdaSqliteProviderClass *klass);
254 static GObjectClass *parent_class = NULL;
255 
256 /*
257  * GdaServerProvider's virtual methods
258  */
259 /* connection management */
260 static gboolean            gda_sqlite_provider_open_connection (GdaServerProvider *provider, GdaConnection *cnc,
261 								GdaQuarkList *params, GdaQuarkList *auth,
262 								guint *task_id,
263 								GdaServerProviderAsyncCallback async_cb, gpointer cb_data);
264 static gboolean            gda_sqlite_provider_close_connection (GdaServerProvider *provider, GdaConnection *cnc);
265 static const gchar        *gda_sqlite_provider_get_server_version (GdaServerProvider *provider, GdaConnection *cnc);
266 static const gchar        *gda_sqlite_provider_get_database (GdaServerProvider *provider, GdaConnection *cnc);
267 
268 /* DDL operations */
269 static gboolean            gda_sqlite_provider_supports_operation (GdaServerProvider *provider, GdaConnection *cnc,
270 								   GdaServerOperationType type, GdaSet *options);
271 static GdaServerOperation *gda_sqlite_provider_create_operation (GdaServerProvider *provider, GdaConnection *cnc,
272 								 GdaServerOperationType type,
273 								 GdaSet *options, GError **error);
274 static gchar              *gda_sqlite_provider_render_operation (GdaServerProvider *provider, GdaConnection *cnc,
275 								 GdaServerOperation *op, GError **error);
276 
277 static gboolean            gda_sqlite_provider_perform_operation (GdaServerProvider *provider, GdaConnection *cnc,
278 								  GdaServerOperation *op, guint *task_id,
279 								  GdaServerProviderAsyncCallback async_cb,
280 								  gpointer cb_data, GError **error);
281 /* transactions */
282 static gboolean            gda_sqlite_provider_begin_transaction (GdaServerProvider *provider, GdaConnection *cnc,
283 								  const gchar *name, GdaTransactionIsolation level,
284 								  GError **error);
285 static gboolean            gda_sqlite_provider_commit_transaction (GdaServerProvider *provider, GdaConnection *cnc,
286 								   const gchar *name, GError **error);
287 static gboolean            gda_sqlite_provider_rollback_transaction (GdaServerProvider *provider, GdaConnection * cnc,
288 								     const gchar *name, GError **error);
289 static gboolean            gda_sqlite_provider_add_savepoint (GdaServerProvider *provider, GdaConnection *cnc,
290 							      const gchar *name, GError **error);
291 static gboolean            gda_sqlite_provider_rollback_savepoint (GdaServerProvider *provider, GdaConnection *cnc,
292 								   const gchar *name, GError **error);
293 static gboolean            gda_sqlite_provider_delete_savepoint (GdaServerProvider *provider, GdaConnection *cnc,
294 								 const gchar *name, GError **error);
295 
296 /* information retrieval */
297 static const gchar        *gda_sqlite_provider_get_version (GdaServerProvider *provider);
298 static gboolean            gda_sqlite_provider_supports (GdaServerProvider *provider, GdaConnection *cnc,
299 							 GdaConnectionFeature feature);
300 
301 static const gchar        *gda_sqlite_provider_get_name (GdaServerProvider *provider);
302 
303 static GdaDataHandler     *gda_sqlite_provider_get_data_handler (GdaServerProvider *provider, GdaConnection *cnc,
304 								 GType g_type, const gchar *dbms_type);
305 
306 static const gchar*        gda_sqlite_provider_get_default_dbms_type (GdaServerProvider *provider, GdaConnection *cnc,
307 								      GType type);
308 /* statements */
309 static GdaSqlParser        *gda_sqlite_provider_create_parser (GdaServerProvider *provider, GdaConnection *cnc);
310 static gchar               *gda_sqlite_provider_statement_to_sql  (GdaServerProvider *provider, GdaConnection *cnc,
311 								   GdaStatement *stmt, GdaSet *params,
312 								   GdaStatementSqlFlag flags,
313 								   GSList **params_used, GError **error);
314 static gboolean             gda_sqlite_provider_statement_prepare (GdaServerProvider *provider, GdaConnection *cnc,
315 								   GdaStatement *stmt, GError **error);
316 static GObject             *gda_sqlite_provider_statement_execute (GdaServerProvider *provider, GdaConnection *cnc,
317 								   GdaStatement *stmt, GdaSet *params,
318 								   GdaStatementModelUsage model_usage,
319 								   GType *col_types, GdaSet **last_inserted_row,
320 								   guint *task_id, GdaServerProviderExecCallback async_cb,
321 								   gpointer cb_data, GError **error);
322 static GdaSqlStatement     *gda_sqlite_statement_rewrite          (GdaServerProvider *provider, GdaConnection *cnc,
323 								   GdaStatement *stmt, GdaSet *params, GError **error);
324 
325 /* string escaping */
326 static gchar               *gda_sqlite_provider_escape_string (GdaServerProvider *provider, GdaConnection *cnc,
327 							       const gchar *string);
328 static gchar               *gda_sqlite_provider_unescape_string (GdaServerProvider *provider, GdaConnection *cnc,
329 								 const gchar *string);
330 
331 /*
332  * private connection data destroy
333  */
334 static void gda_sqlite_free_cnc_data (SqliteConnectionData *cdata);
335 
336 /*
337  * extending SQLite with our own functions  and collations
338  */
339 static void scalar_gda_file_exists_func (sqlite3_context *context, int argc, sqlite3_value **argv);
340 static void scalar_gda_hex_print_func (sqlite3_context *context, int argc, sqlite3_value **argv);
341 static void scalar_gda_hex_print_func2 (sqlite3_context *context, int argc, sqlite3_value **argv);
342 static void scalar_gda_hex_func (sqlite3_context *context, int argc, sqlite3_value **argv);
343 static void scalar_gda_hex_func2 (sqlite3_context *context, int argc, sqlite3_value **argv);
344 static void scalar_rmdiacr (sqlite3_context *context, int argc, sqlite3_value **argv);
345 static void scalar_lower (sqlite3_context *context, int argc, sqlite3_value **argv);
346 static void scalar_upper (sqlite3_context *context, int argc, sqlite3_value **argv);
347 typedef struct {
348 	char     *name;
349 	int       nargs;
350 	gpointer  user_data; /* retrieve it in func. implementations using sqlite3_user_data() */
351 	void    (*xFunc)(sqlite3_context*,int,sqlite3_value**);
352 } ScalarFunction;
353 static ScalarFunction scalars[] = {
354 	{"gda_file_exists", 1, NULL, scalar_gda_file_exists_func},
355 	{"gda_hex_print", 1, NULL, scalar_gda_hex_print_func},
356 	{"gda_hex_print", 2, NULL, scalar_gda_hex_print_func2},
357 	{"gda_hex", 1, NULL, scalar_gda_hex_func},
358 	{"gda_hex", 2, NULL, scalar_gda_hex_func2},
359 	{"gda_rmdiacr", 1, NULL, scalar_rmdiacr},
360 	{"gda_rmdiacr", 2, NULL, scalar_rmdiacr},
361 	{"gda_lower", 1, NULL, scalar_lower},
362 	{"gda_upper", 1, NULL, scalar_upper},
363 };
364 
365 /* Regexp handling */
366 static void scalar_regexp_func (sqlite3_context *context, int argc, sqlite3_value **argv);
367 static void scalar_regexp_match_func (sqlite3_context *context, int argc, sqlite3_value **argv);
368 
369 static ScalarFunction regexp_functions[] = {
370 	{"regexp", 2, NULL, scalar_regexp_func},
371 	{"regexp", 3, NULL, scalar_regexp_func},
372 	{"regexp_match", 2, NULL, scalar_regexp_match_func},
373 	{"regexp_match", 3, NULL, scalar_regexp_match_func}
374 };
375 
376 /* Collations */
377 static int locale_collate_func (G_GNUC_UNUSED void *pArg, int nKey1, const void *pKey1,
378 				int nKey2, const void *pKey2);
379 static int dcase_collate_func (G_GNUC_UNUSED void *pArg, int nKey1, const void *pKey1,
380 			       int nKey2, const void *pKey2);
381 typedef struct {
382 	char     *name;
383 	int     (*xFunc)(void *, int, const void *, int, const void *);
384 } CollationFunction;
385 static CollationFunction collation_functions[] = {
386 	{"LOCALE", locale_collate_func},
387 	{"DCASE", dcase_collate_func}
388 };
389 
390 /*
391  * Prepared internal statements
392  */
393 static GMutex init_mutex;
394 static GdaStatement **internal_stmt = NULL;
395 
396 typedef enum {
397 	INTERNAL_PRAGMA_INDEX_LIST,
398 	INTERNAL_PRAGMA_INDEX_INFO,
399 	INTERNAL_PRAGMA_FK_LIST,
400 	INTERNAL_PRAGMA_TABLE_INFO,
401 	INTERNAL_SELECT_A_TABLE_ROW,
402 	INTERNAL_SELECT_ALL_TABLES,
403 	INTERNAL_SELECT_A_TABLE,
404 	INTERNAL_PRAGMA_PROC_LIST,
405 	INTERNAL_PRAGMA_EMPTY_RESULT,
406 
407 	INTERNAL_BEGIN,
408 	INTERNAL_BEGIN_NAMED,
409 	INTERNAL_COMMIT,
410 	INTERNAL_COMMIT_NAMED,
411 	INTERNAL_ROLLBACK,
412 	INTERNAL_ROLLBACK_NAMED,
413 
414 	INTERNAL_ADD_SAVEPOINT,
415 	INTERNAL_ROLLBACK_SAVEPOINT,
416 	INTERNAL_RELEASE_SAVEPOINT
417 } InternalStatementItem;
418 
419 static gchar *internal_sql[] = {
420 	"PRAGMA index_list(##tblname::string)",
421 	"PRAGMA index_info(##idxname::string)",
422 	"PRAGMA foreign_key_list (##tblname::string)",
423 	"PRAGMA table_info (##tblname::string)",
424 	"SELECT * FROM ##tblname::string LIMIT 1",
425 	"SELECT name as 'Table', 'system' as 'Owner', ' ' as 'Description', sql as 'Definition' FROM (SELECT * FROM sqlite_master UNION ALL SELECT * FROM sqlite_temp_master) WHERE type = ##type::string AND name not like 'sqlite_%%' ORDER BY name",
426 	"SELECT name as 'Table', 'system' as 'Owner', ' ' as 'Description', sql as 'Definition' FROM (SELECT * FROM sqlite_master UNION ALL SELECT * FROM sqlite_temp_master) WHERE type = ##type::string AND name = ##tblname::string AND name not like 'sqlite_%%' ORDER BY name",
427 	"PRAGMA proc_list",
428 	"PRAGMA empty_result_callbacks = ON",
429 
430 	"BEGIN TRANSACTION",
431 	"BEGIN TRANSACTION ##name::string",
432 	"COMMIT TRANSACTION",
433 	"COMMIT TRANSACTION ##name::string",
434 	"ROLLBACK TRANSACTION",
435 	"ROLLBACK TRANSACTION ##name::string",
436 
437 	"SAVEPOINT ##name::string",
438 	"ROLLBACK TO ##name::string",
439 	"RELEASE ##name::string"
440 };
441 
442 static gchar *
get_table_nth_column_name(GdaConnection * cnc,const gchar * table_name,gint pos)443 get_table_nth_column_name (GdaConnection *cnc, const gchar *table_name, gint pos)
444 {
445 	static GdaSet *params_set = NULL;
446 	GdaDataModel *model;
447 	gchar *fname = NULL;
448 
449 	g_assert (table_name);
450 	params_set = gda_set_new_inline (1, "tblname", G_TYPE_STRING, table_name);
451 	model = gda_connection_statement_execute_select (cnc,
452 							 internal_stmt[INTERNAL_PRAGMA_TABLE_INFO],
453 							 params_set, NULL);
454 	g_object_unref (params_set);
455 	if (model) {
456 		const GValue *cvalue;
457 		cvalue = gda_data_model_get_value_at (model, 1, pos, NULL);
458 		if (cvalue)
459 			fname = g_value_dup_string (cvalue);
460 		g_object_unref (model);
461 	}
462 	return fname;
463 }
464 
465 /*
466  * GdaSqliteProvider class implementation
467  */
468 
469 static void
gda_sqlite_provider_class_init(GdaSqliteProviderClass * klass)470 gda_sqlite_provider_class_init (GdaSqliteProviderClass *klass)
471 {
472 	GdaServerProviderClass *provider_class = GDA_SERVER_PROVIDER_CLASS (klass);
473 
474 	parent_class = g_type_class_peek_parent (klass);
475 
476 	provider_class->get_version = gda_sqlite_provider_get_version;
477 	provider_class->get_server_version = gda_sqlite_provider_get_server_version;
478 	provider_class->get_name = gda_sqlite_provider_get_name;
479 	provider_class->supports_feature = gda_sqlite_provider_supports;
480 
481 	provider_class->get_data_handler = gda_sqlite_provider_get_data_handler;
482 	provider_class->get_def_dbms_type = gda_sqlite_provider_get_default_dbms_type;
483 
484 	provider_class->create_connection = NULL;
485 	provider_class->identifier_quote = _gda_sqlite_identifier_quote;
486 	provider_class->open_connection = gda_sqlite_provider_open_connection;
487 	provider_class->close_connection = gda_sqlite_provider_close_connection;
488 	provider_class->get_database = gda_sqlite_provider_get_database;
489 
490 	provider_class->supports_operation = gda_sqlite_provider_supports_operation;
491         provider_class->create_operation = gda_sqlite_provider_create_operation;
492         provider_class->render_operation = gda_sqlite_provider_render_operation;
493         provider_class->perform_operation = gda_sqlite_provider_perform_operation;
494 
495 	provider_class->begin_transaction = gda_sqlite_provider_begin_transaction;
496 	provider_class->commit_transaction = gda_sqlite_provider_commit_transaction;
497 	provider_class->rollback_transaction = gda_sqlite_provider_rollback_transaction;
498 	provider_class->add_savepoint = gda_sqlite_provider_add_savepoint;
499 	provider_class->rollback_savepoint = gda_sqlite_provider_rollback_savepoint;
500 	provider_class->delete_savepoint = gda_sqlite_provider_delete_savepoint;
501 
502 	provider_class->create_parser = gda_sqlite_provider_create_parser;
503 	provider_class->statement_to_sql = gda_sqlite_provider_statement_to_sql;
504 	provider_class->statement_prepare = gda_sqlite_provider_statement_prepare;
505 	provider_class->statement_execute = gda_sqlite_provider_statement_execute;
506 	provider_class->statement_rewrite = gda_sqlite_statement_rewrite;
507 
508 	provider_class->escape_string = gda_sqlite_provider_escape_string;
509 	provider_class->unescape_string = gda_sqlite_provider_unescape_string;
510 
511 	memset (&(provider_class->meta_funcs), 0, sizeof (GdaServerProviderMeta));
512 	provider_class->meta_funcs._info = _gda_sqlite_meta__info;
513 	provider_class->meta_funcs._btypes = _gda_sqlite_meta__btypes;
514 	provider_class->meta_funcs._udt = _gda_sqlite_meta__udt;
515 	provider_class->meta_funcs.udt = _gda_sqlite_meta_udt;
516 	provider_class->meta_funcs._udt_cols = _gda_sqlite_meta__udt_cols;
517 	provider_class->meta_funcs.udt_cols = _gda_sqlite_meta_udt_cols;
518 	provider_class->meta_funcs._enums = _gda_sqlite_meta__enums;
519 	provider_class->meta_funcs.enums = _gda_sqlite_meta_enums;
520 	provider_class->meta_funcs._domains = _gda_sqlite_meta__domains;
521 	provider_class->meta_funcs.domains = _gda_sqlite_meta_domains;
522 	provider_class->meta_funcs._constraints_dom = _gda_sqlite_meta__constraints_dom;
523 	provider_class->meta_funcs.constraints_dom = _gda_sqlite_meta_constraints_dom;
524 	provider_class->meta_funcs._el_types = _gda_sqlite_meta__el_types;
525 	provider_class->meta_funcs.el_types = _gda_sqlite_meta_el_types;
526 	provider_class->meta_funcs._collations = _gda_sqlite_meta__collations;
527 	provider_class->meta_funcs.collations = _gda_sqlite_meta_collations;
528 	provider_class->meta_funcs._character_sets = _gda_sqlite_meta__character_sets;
529 	provider_class->meta_funcs.character_sets = _gda_sqlite_meta_character_sets;
530 	provider_class->meta_funcs._schemata = _gda_sqlite_meta__schemata;
531 	provider_class->meta_funcs.schemata = _gda_sqlite_meta_schemata;
532 	provider_class->meta_funcs._tables_views = _gda_sqlite_meta__tables_views;
533 	provider_class->meta_funcs.tables_views = _gda_sqlite_meta_tables_views;
534 	provider_class->meta_funcs._columns = _gda_sqlite_meta__columns;
535 	provider_class->meta_funcs.columns = _gda_sqlite_meta_columns;
536 	provider_class->meta_funcs._view_cols = _gda_sqlite_meta__view_cols;
537 	provider_class->meta_funcs.view_cols = _gda_sqlite_meta_view_cols;
538 	provider_class->meta_funcs._constraints_tab = _gda_sqlite_meta__constraints_tab;
539 	provider_class->meta_funcs.constraints_tab = _gda_sqlite_meta_constraints_tab;
540 	provider_class->meta_funcs._constraints_ref = _gda_sqlite_meta__constraints_ref;
541 	provider_class->meta_funcs.constraints_ref = _gda_sqlite_meta_constraints_ref;
542 	provider_class->meta_funcs._key_columns = _gda_sqlite_meta__key_columns;
543 	provider_class->meta_funcs.key_columns = _gda_sqlite_meta_key_columns;
544 	provider_class->meta_funcs._check_columns = _gda_sqlite_meta__check_columns;
545 	provider_class->meta_funcs.check_columns = _gda_sqlite_meta_check_columns;
546 	provider_class->meta_funcs._triggers = _gda_sqlite_meta__triggers;
547 	provider_class->meta_funcs.triggers = _gda_sqlite_meta_triggers;
548 	provider_class->meta_funcs._routines = _gda_sqlite_meta__routines;
549 	provider_class->meta_funcs.routines = _gda_sqlite_meta_routines;
550 	provider_class->meta_funcs._routine_col = _gda_sqlite_meta__routine_col;
551 	provider_class->meta_funcs.routine_col = _gda_sqlite_meta_routine_col;
552 	provider_class->meta_funcs._routine_par = _gda_sqlite_meta__routine_par;
553 	provider_class->meta_funcs.routine_par = _gda_sqlite_meta_routine_par;
554 	provider_class->meta_funcs._indexes_tab = _gda_sqlite_meta__indexes_tab;
555         provider_class->meta_funcs.indexes_tab = _gda_sqlite_meta_indexes_tab;
556         provider_class->meta_funcs._index_cols = _gda_sqlite_meta__index_cols;
557         provider_class->meta_funcs.index_cols = _gda_sqlite_meta_index_cols;
558 
559 	/* SQLite doe not support distributed transactions */
560 	provider_class->xa_funcs = NULL;
561 
562 	/* If SQLite was not compiled with the SQLITE_THREADSAFE flag, then it is not
563 	 * considered thread safe, and we limit the usage of the provider from the current thread */
564 	if (! SQLITE3_CALL (sqlite3_threadsafe) ()) {
565 		gda_log_message ("SQLite was not compiled with the SQLITE_THREADSAFE flag, "
566 				 "only one thread can access the provider");
567 		provider_class->limiting_thread = GDA_SERVER_PROVIDER_UNDEFINED_LIMITING_THREAD;
568 	}
569 	else
570 		provider_class->limiting_thread = NULL;
571 }
572 
573 static void
gda_sqlite_provider_init(GdaSqliteProvider * sqlite_prv,G_GNUC_UNUSED GdaSqliteProviderClass * klass)574 gda_sqlite_provider_init (GdaSqliteProvider *sqlite_prv, G_GNUC_UNUSED GdaSqliteProviderClass *klass)
575 {
576 	g_mutex_lock (&init_mutex);
577 
578 	if (!internal_stmt) {
579 		/* configure multi threading environment */
580 		SQLITE3_CALL (sqlite3_config) (SQLITE_CONFIG_SERIALIZED);
581 
582 		InternalStatementItem i;
583 		GdaSqlParser *parser;
584 		parser = gda_server_provider_internal_get_parser ((GdaServerProvider*) sqlite_prv);
585 
586 		internal_stmt = g_new0 (GdaStatement *, sizeof (internal_sql) / sizeof (gchar*));
587 		for (i = INTERNAL_PRAGMA_INDEX_LIST; i < sizeof (internal_sql) / sizeof (gchar*); i++) {
588 			internal_stmt[i] = gda_sql_parser_parse_string (parser, internal_sql[i], NULL, NULL);
589 			if (!internal_stmt[i])
590 				g_error ("Could not parse internal statement: %s\n", internal_sql[i]);
591 		}
592 	}
593 
594 	/* meta data init */
595 	_gda_sqlite_provider_meta_init ((GdaServerProvider*) sqlite_prv);
596 
597 	g_mutex_unlock (&init_mutex);
598 }
599 
600 GType
gda_sqlite_provider_get_type(void)601 gda_sqlite_provider_get_type (void)
602 {
603 	static GType type = 0;
604 
605 	if (G_UNLIKELY (type == 0)) {
606 		static GMutex registering;
607 		static GTypeInfo info = {
608 			sizeof (GdaSqliteProviderClass),
609 			(GBaseInitFunc) NULL,
610 			(GBaseFinalizeFunc) NULL,
611 			(GClassInitFunc) gda_sqlite_provider_class_init,
612 			NULL, NULL,
613 			sizeof (GdaSqliteProvider),
614 			0,
615 			(GInstanceInitFunc) gda_sqlite_provider_init,
616 			0
617 		};
618 		g_mutex_lock (&registering);
619 		if (type == 0) {
620 #ifdef WITH_BDBSQLITE
621 			type = g_type_register_static (GDA_TYPE_SERVER_PROVIDER, CLASS_PREFIX "Provider", &info, 0);
622 #else
623   #ifdef STATIC_SQLITE
624 			type = g_type_register_static (GDA_TYPE_SERVER_PROVIDER, CLASS_PREFIX "Provider", &info, 0);
625   #else
626     #ifdef HAVE_SQLITE
627 			GModule *module2;
628 
629 			module2 = find_sqlite_library ("libsqlite3");
630 			if (module2)
631 				load_symbols (module2);
632 			if (s3r)
633 				type = g_type_register_static (GDA_TYPE_SERVER_PROVIDER, CLASS_PREFIX "Provider", &info, 0);
634 			else
635 				g_warning (_("Can't find libsqlite3." G_MODULE_SUFFIX " file."));
636     #else
637 			type = g_type_register_static (GDA_TYPE_SERVER_PROVIDER, CLASS_PREFIX "Provider", &info, 0);
638     #endif
639   #endif
640 #endif
641 		}
642 		g_mutex_unlock (&registering);
643 	}
644 
645 	return type;
646 }
647 
648 /*
649  * Get provider name request
650  */
651 static const gchar *
gda_sqlite_provider_get_name(G_GNUC_UNUSED GdaServerProvider * provider)652 gda_sqlite_provider_get_name (G_GNUC_UNUSED GdaServerProvider *provider)
653 {
654 	return PNAME;
655 }
656 
657 /*
658  * Get provider's version
659  */
660 static const gchar *
gda_sqlite_provider_get_version(G_GNUC_UNUSED GdaServerProvider * provider)661 gda_sqlite_provider_get_version (G_GNUC_UNUSED GdaServerProvider *provider)
662 {
663 	return PACKAGE_VERSION;
664 }
665 
666 typedef enum {
667 	CASE_UP,
668 	CASE_DOWN,
669 	CASE_UNCHANGED
670 } CaseModif;
671 
672 gchar *
remove_diacritics_and_change_case(const gchar * str,gssize len,CaseModif cmod)673 remove_diacritics_and_change_case (const gchar *str, gssize len, CaseModif cmod)
674 {
675 	gchar *retval = NULL;
676 
677 	if (str) {
678 		GString* string;
679 		gchar *normstr, *ptr;
680 
681 		normstr = g_utf8_normalize (str, len, G_NORMALIZE_NFD);
682 		string = g_string_new ("");
683 		ptr = normstr;
684 		while (ptr) {
685 			gunichar c;
686 			c = g_utf8_get_char (ptr);
687 			if (c != '\0') {
688 				if (!g_unichar_ismark(c)) {
689 					switch (cmod) {
690 					case CASE_UP:
691 						c = g_unichar_toupper (c);
692 						break;
693 					case CASE_DOWN:
694 						c = g_unichar_tolower (c);
695 						break;
696 					case CASE_UNCHANGED:
697 						break;
698 					}
699 					g_string_append_unichar (string, c);
700 				}
701 				ptr = g_utf8_next_char (ptr);
702 			}
703 			else
704 				break;
705 		}
706 
707 		retval = g_string_free (string, FALSE);
708 		g_free (normstr);
709 	}
710 
711 	return retval;
712 }
713 
714 
715 /*
716  * Open connection request
717  */
718 static gboolean
gda_sqlite_provider_open_connection(GdaServerProvider * provider,GdaConnection * cnc,GdaQuarkList * params,G_GNUC_UNUSED GdaQuarkList * auth,G_GNUC_UNUSED guint * task_id,GdaServerProviderAsyncCallback async_cb,G_GNUC_UNUSED gpointer cb_data)719 gda_sqlite_provider_open_connection (GdaServerProvider *provider, GdaConnection *cnc,
720 				     GdaQuarkList *params, G_GNUC_UNUSED GdaQuarkList *auth,
721 				     G_GNUC_UNUSED guint *task_id, GdaServerProviderAsyncCallback async_cb, G_GNUC_UNUSED gpointer cb_data)
722 {
723 	gchar *filename = NULL;
724 	const gchar *dirname = NULL, *dbname = NULL;
725 	const gchar *is_virtual = NULL;
726 	const gchar *append_extension = NULL;
727 	const gchar *use_extra_functions = NULL, *with_fk = NULL, *regexp, *locale_collate, *extensions;
728 	gint errmsg;
729 	SqliteConnectionData *cdata;
730 	gchar *dup = NULL;
731 	static GMutex cnc_mutex;
732 #ifdef SQLITE_HAS_CODEC
733 	const gchar *passphrase = NULL;
734 #endif
735 
736 	g_return_val_if_fail (GDA_IS_SQLITE_PROVIDER (provider), FALSE);
737 	g_return_val_if_fail (GDA_IS_CONNECTION (cnc), FALSE);
738 
739 	if (async_cb) {
740 		gda_connection_add_event_string (cnc, _("Provider does not support asynchronous connection open"));
741                 return FALSE;
742 	}
743 
744 	g_mutex_lock (&cnc_mutex);
745 
746 	/* get all parameters received */
747 	dirname = gda_quark_list_find (params, "DB_DIR");
748 	if (!dirname)
749 		dirname="."; /* default to current directory */
750 	dbname = gda_quark_list_find (params, "DB_NAME");
751 	append_extension = gda_quark_list_find (params, "APPEND_DB_EXTENSION");
752 	is_virtual = gda_quark_list_find (params, "_IS_VIRTUAL");
753 	with_fk = gda_quark_list_find (params, "FK");
754 	use_extra_functions = gda_quark_list_find (params, "EXTRA_FUNCTIONS");
755 	if (!use_extra_functions)
756 		use_extra_functions = gda_quark_list_find (params, "LOAD_GDA_FUNCTIONS");
757 
758 	regexp = gda_quark_list_find (params, "REGEXP");
759 	locale_collate = gda_quark_list_find (params, "EXTRA_COLLATIONS");
760 	extensions = gda_quark_list_find (params, "EXTENSIONS");
761 
762 	if (! is_virtual) {
763 		if (!dbname) {
764 			const gchar *str;
765 
766 			str = gda_quark_list_find (params, "URI");
767 			if (!str) {
768 				gda_connection_add_event_string (cnc,
769 								 _("The connection string must contain DB_DIR and DB_NAME values"));
770 				g_mutex_unlock (&cnc_mutex);
771 				return FALSE;
772 			}
773 			else {
774 				gint len = strlen (str);
775 				gint elen = strlen (FILE_EXTENSION);
776 
777 				if (g_str_has_suffix (str, FILE_EXTENSION)) {
778 					gchar *ptr;
779 
780 					dup = g_strdup (str);
781 					dup [len-elen] = 0;
782 					for (ptr = dup + (len - elen - 1); (ptr >= dup) && (*ptr != G_DIR_SEPARATOR); ptr--);
783 					dbname = ptr;
784 					if (*ptr == G_DIR_SEPARATOR)
785 						dbname ++;
786 
787 					if ((*ptr == G_DIR_SEPARATOR) && (ptr > dup)) {
788 						dirname = dup;
789 						while ((ptr >= dup) && (*ptr != G_DIR_SEPARATOR))
790 							ptr--;
791 						*ptr = 0;
792 					}
793 				}
794 				if (!dbname) {
795 					gda_connection_add_event_string (cnc,
796 									 _("The connection string format has changed: replace URI with "
797 									   "DB_DIR (the path to the database file) and DB_NAME "
798 									   "(the database file without the '%s' at the end)."), FILE_EXTENSION);
799 					g_free (dup);
800 					g_mutex_unlock (&cnc_mutex);
801 					return FALSE;
802 				}
803 				else
804 					g_warning (_("The connection string format has changed: replace URI with "
805 						     "DB_DIR (the path to the database file) and DB_NAME "
806 						     "(the database file without the '%s' at the end)."), FILE_EXTENSION);
807 			}
808 		}
809 
810 		if (! g_ascii_strcasecmp (dbname,":memory:"))
811 			/* we have an in memory database */
812 			filename = g_strdup (":memory:");
813 		else if (! g_ascii_strcasecmp (dbname,"__gda_tmp"))
814 			/* we have an in memory database */
815 			filename = NULL/*g_strdup ("")*/;
816 		else {
817 			if (!g_file_test (dirname, G_FILE_TEST_EXISTS | G_FILE_TEST_IS_DIR)) {
818 				gda_connection_add_event_string (cnc,
819 								 _("The DB_DIR part of the connection string must point "
820 								   "to a valid directory"));
821 				g_free (dup);
822 				g_mutex_unlock (&cnc_mutex);
823 				return FALSE;
824 			}
825 
826 			/* try first with the file extension */
827 			gchar *tmp, *f1, *f2;
828 			if (!append_extension ||
829 			    (append_extension && ((*append_extension == 't') || (*append_extension == 'T'))))
830 				tmp = g_strdup_printf ("%s%s", dbname, FILE_EXTENSION);
831 			else
832 				tmp = g_strdup (dbname);
833 			f1 = g_build_filename (dirname, tmp, NULL);
834 			g_free (tmp);
835 			f2 = g_build_filename (dirname, dbname, NULL);
836 			if (g_file_test (f1, G_FILE_TEST_EXISTS)) {
837 				filename = f1;
838 				f1 = NULL;
839 			}
840 			else if (g_file_test (f2, G_FILE_TEST_EXISTS)) {
841 				filename = f2;
842 				f2 = NULL;
843 			}
844 			else {
845 				filename = f1;
846 				f1 = NULL;
847 			}
848 			g_free (f1);
849 			g_free (f2);
850 			g_free (dup);
851 		}
852 	}
853 
854 	cdata = g_new0 (SqliteConnectionData, 1);
855 	cdata->gdacnc = cnc;
856 	g_object_add_weak_pointer (G_OBJECT (cnc), (gpointer*) &(cdata->gdacnc));
857 
858 	if (filename)
859 		cdata->file = filename;
860 
861 	errmsg = SQLITE3_CALL (sqlite3_open) (filename, &cdata->connection);
862 
863 	if (errmsg != SQLITE_OK) {
864 		gda_connection_add_event_string (cnc, SQLITE3_CALL (sqlite3_errmsg) (cdata->connection));
865 		gda_sqlite_free_cnc_data (cdata);
866 
867 		g_mutex_unlock (&cnc_mutex);
868 		return FALSE;
869 	}
870 
871 #ifdef SQLITE_HAS_CODEC
872   /* TODO Fix this compiler warning: the address of 'sqlite3_key' will always evaluate as 'true' */
873   /* We disable this warning in the meantime with -Wno-address */
874 
875 	if (auth)
876 		passphrase = gda_quark_list_find (auth, "PASSWORD");
877 
878 	if (passphrase && *passphrase && SQLITE3_CALL (sqlite3_key)) {
879 		errmsg = SQLITE3_CALL (sqlite3_key) (cdata->connection, (void*) passphrase, strlen (passphrase));
880 		if (errmsg != SQLITE_OK) {
881 			gda_connection_add_event_string (cnc, _("Wrong encryption passphrase"));
882 			gda_sqlite_free_cnc_data (cdata);
883 			g_mutex_unlock (&cnc_mutex);
884 			return FALSE;
885 		}
886 	}
887 #endif
888 
889 	gda_connection_internal_set_provider_data (cnc, cdata, (GDestroyNotify) gda_sqlite_free_cnc_data);
890 
891 	/* use extended result codes */
892 	SQLITE3_CALL (sqlite3_extended_result_codes) (cdata->connection, 1);
893 
894 	/* allow a busy timeout of 500 ms */
895 	SQLITE3_CALL (sqlite3_busy_timeout) (cdata->connection, 500);
896 
897 	/* allow loading extensions using SELECT load_extension ()... */
898 	if (extensions && ((*extensions == 't') || (*extensions == 'T'))) {
899 		if (SQLITE3_CALL (sqlite3_enable_load_extension))
900 			SQLITE3_CALL (sqlite3_enable_load_extension) (cdata->connection, 1);
901 		else {
902 			gda_connection_add_event_string (cnc, _("Extension loading is not supported"));
903 			gda_sqlite_free_cnc_data (cdata);
904 			g_mutex_unlock (&cnc_mutex);
905 			return FALSE;
906 		}
907 	}
908 
909 	/* try to prepare all the internal statements */
910 	InternalStatementItem i;
911 	for (i = INTERNAL_PRAGMA_INDEX_LIST; i < sizeof (internal_sql) / sizeof (gchar*); i++)
912 		gda_connection_statement_prepare (cnc, internal_stmt[i], NULL);
913 
914 	/* set SQLite library options */
915 	GObject *obj;
916 	GError *lerror = NULL;
917 	obj = gda_connection_statement_execute (cnc, internal_stmt[INTERNAL_PRAGMA_EMPTY_RESULT],
918 						NULL, GDA_STATEMENT_MODEL_RANDOM_ACCESS, NULL, &lerror);
919 	if (!obj) {
920 		gda_connection_add_event_string (cnc,
921 						 _("Could not set empty_result_callbacks SQLite option: %s"),
922 						 lerror && lerror->message ? lerror->message : _("no detail"));
923 		g_clear_error (&lerror);
924 	}
925 	else
926 		g_object_unref (obj);
927 
928 	/* make sure the internals are completely initialized now */
929 	{
930 		gchar **data = NULL;
931 		gint ncols;
932 		gint nrows;
933 		gint status;
934 		gchar *errmsg;
935 
936 		status = SQLITE3_CALL (sqlite3_get_table) (cdata->connection, "SELECT name"
937 							   " FROM (SELECT * FROM sqlite_master UNION ALL "
938 							   "       SELECT * FROM sqlite_temp_master)",
939 							   &data,
940 							   &nrows,
941 							   &ncols,
942 							   &errmsg);
943 		if (status == SQLITE_OK)
944 			SQLITE3_CALL (sqlite3_free_table) (data);
945 		else {
946 			gda_connection_add_event_string (cnc, errmsg);
947 			SQLITE3_CALL (sqlite3_free) (errmsg);
948 			gda_sqlite_free_cnc_data (cdata);
949 			gda_connection_internal_set_provider_data (cnc, NULL, (GDestroyNotify) gda_sqlite_free_cnc_data);
950 			g_mutex_unlock (&cnc_mutex);
951 			return FALSE;
952 		}
953 	}
954 
955 	/* set connection parameters */
956 	gboolean enforce_fk = TRUE;
957 	if (with_fk && ((*with_fk == 'f') || (*with_fk == 'F')))
958 		enforce_fk = FALSE;
959 	int res;
960 	sqlite3_stmt *pStmt;
961 	if (enforce_fk)
962 		res = SQLITE3_CALL (sqlite3_prepare) (cdata->connection,
963 						      "PRAGMA foreign_keys = ON", -1,
964 						      &pStmt, NULL);
965 	else
966 		res = SQLITE3_CALL (sqlite3_prepare) (cdata->connection,
967 						      "PRAGMA foreign_keys = OFF", -1,
968 						      &pStmt, NULL);
969 
970 	if (res != SQLITE_OK) {
971 		if (with_fk) {
972 			gda_sqlite_free_cnc_data (cdata);
973 			gda_connection_internal_set_provider_data (cnc, NULL,
974 							(GDestroyNotify) gda_sqlite_free_cnc_data);
975 			g_mutex_unlock (&cnc_mutex);
976 			return FALSE;
977 		}
978 	}
979 	else {
980 		res = SQLITE3_CALL (sqlite3_step) (pStmt);
981 		SQLITE3_CALL (sqlite3_reset) (pStmt);
982 		SQLITE3_CALL (sqlite3_finalize) (pStmt);
983 		if (res != SQLITE_DONE) {
984 			if (with_fk) {
985 				gda_sqlite_free_cnc_data (cdata);
986 				gda_connection_internal_set_provider_data (cnc, NULL,
987 							(GDestroyNotify) gda_sqlite_free_cnc_data);
988 				g_mutex_unlock (&cnc_mutex);
989 				return FALSE;
990 			}
991 		}
992 #ifdef GDA_DEBUG_NO
993 		else {
994 			if (enforce_fk)
995 				g_print ("SQLite provider enforces foreign keys.\n");
996 			else
997 				g_print ("SQLite provider does not enforce foreign keys.\n");
998 		}
999 #endif
1000 	}
1001 
1002 	if (!use_extra_functions || ((*use_extra_functions == 't') || (*use_extra_functions == 'T'))) {
1003 		gsize i;
1004 
1005 		for (i = 0; i < sizeof (scalars) / sizeof (ScalarFunction); i++) {
1006 			ScalarFunction *func = (ScalarFunction *) &(scalars [i]);
1007 			gint res = SQLITE3_CALL (sqlite3_create_function) (cdata->connection,
1008 									   func->name, func->nargs,
1009 									   SQLITE_UTF8, func->user_data,
1010 									   func->xFunc, NULL, NULL);
1011 			if (res != SQLITE_OK) {
1012 				gda_connection_add_event_string (cnc, _("Could not register function '%s'"),
1013 								 func->name);
1014 				gda_sqlite_free_cnc_data (cdata);
1015 				gda_connection_internal_set_provider_data (cnc, NULL, (GDestroyNotify) gda_sqlite_free_cnc_data);
1016 				g_mutex_unlock (&cnc_mutex);
1017 				return FALSE;
1018 			}
1019 		}
1020 	}
1021 
1022 	if (!regexp || ((*regexp == 't') || (*regexp == 'T'))) {
1023 		gsize i;
1024 
1025 		for (i = 0; i < sizeof (regexp_functions) / sizeof (ScalarFunction); i++) {
1026 			ScalarFunction *func = (ScalarFunction *) &(regexp_functions [i]);
1027 			gint res = SQLITE3_CALL (sqlite3_create_function) (cdata->connection,
1028 									   func->name, func->nargs,
1029 									   SQLITE_UTF8, func->user_data,
1030 									   func->xFunc, NULL, NULL);
1031 			if (res != SQLITE_OK) {
1032 				gda_connection_add_event_string (cnc, _("Could not register function '%s'"),
1033 								 func->name);
1034 				gda_sqlite_free_cnc_data (cdata);
1035 				gda_connection_internal_set_provider_data (cnc, NULL, (GDestroyNotify) gda_sqlite_free_cnc_data);
1036 				g_mutex_unlock (&cnc_mutex);
1037 				return FALSE;
1038 			}
1039 		}
1040 	}
1041 
1042 	if (! locale_collate || ((*locale_collate == 't') || (*locale_collate == 'T'))) {
1043 		gsize i;
1044 		for (i = 0; i < sizeof (collation_functions) / sizeof (CollationFunction); i++) {
1045 			CollationFunction *func = (CollationFunction*) &(collation_functions [i]);
1046 			gint res;
1047 			res = SQLITE3_CALL (sqlite3_create_collation) (cdata->connection, func->name,
1048 								       SQLITE_UTF8, NULL, func->xFunc);
1049 			if (res != SQLITE_OK) {
1050 				gda_connection_add_event_string (cnc,
1051 								 _("Could not define the %s collation"),
1052 								 func->name);
1053 				gda_sqlite_free_cnc_data (cdata);
1054 				gda_connection_internal_set_provider_data (cnc, NULL, (GDestroyNotify) gda_sqlite_free_cnc_data);
1055 				g_mutex_unlock (&cnc_mutex);
1056 				return FALSE;
1057 			}
1058 		}
1059 	}
1060 
1061 	if (SQLITE3_CALL (sqlite3_threadsafe) ())
1062 		g_object_set (G_OBJECT (cnc), "thread-owner", NULL, NULL);
1063 	else
1064 		g_object_set (G_OBJECT (cnc), "thread-owner", g_thread_self (), NULL);
1065 
1066 	g_mutex_unlock (&cnc_mutex);
1067 	return TRUE;
1068 }
1069 
1070 static int
locale_collate_func(G_GNUC_UNUSED void * pArg,int nKey1,const void * pKey1,int nKey2,const void * pKey2)1071 locale_collate_func (G_GNUC_UNUSED void *pArg,
1072 		     int nKey1, const void *pKey1,
1073 		     int nKey2, const void *pKey2)
1074 {
1075 	gchar *tmp1, *tmp2;
1076 	int res;
1077 	tmp1 = g_utf8_collate_key ((gchar*) pKey1, nKey1);
1078 	tmp2 = g_utf8_collate_key ((gchar*) pKey2, nKey2);
1079 	res = strcmp (tmp1, tmp2);
1080 	g_free (tmp1);
1081 	g_free (tmp2);
1082 	return res;
1083 }
1084 
1085 static int
dcase_collate_func(G_GNUC_UNUSED void * pArg,int nKey1,const void * pKey1,int nKey2,const void * pKey2)1086 dcase_collate_func (G_GNUC_UNUSED void *pArg,
1087 		    int nKey1, const void *pKey1,
1088 		    int nKey2, const void *pKey2)
1089 {
1090 	gchar *tmp1, *tmp2;
1091 	int res;
1092 	tmp1 = remove_diacritics_and_change_case ((gchar*) pKey1, nKey1, CASE_DOWN);
1093 	tmp2 = remove_diacritics_and_change_case ((gchar*) pKey2, nKey2, CASE_DOWN);
1094 	res = strcmp (tmp1, tmp2);
1095 	g_free (tmp1);
1096 	g_free (tmp2);
1097 	return res;
1098 }
1099 
1100 /*
1101  * Close connection request
1102  */
1103 static gboolean
gda_sqlite_provider_close_connection(GdaServerProvider * provider,GdaConnection * cnc)1104 gda_sqlite_provider_close_connection (GdaServerProvider *provider, GdaConnection *cnc)
1105 {
1106 	g_return_val_if_fail (GDA_IS_CONNECTION (cnc), FALSE);
1107 	g_return_val_if_fail (gda_connection_get_provider (cnc) == provider, FALSE);
1108 
1109 	/* nothing specific to do: sqlite3_close() is called when SqliteConnectionData is destroyed */
1110 	return TRUE;
1111 }
1112 
1113 /*
1114  * Server version request
1115  */
1116 static const gchar *
gda_sqlite_provider_get_server_version(GdaServerProvider * provider,GdaConnection * cnc)1117 gda_sqlite_provider_get_server_version (GdaServerProvider *provider, GdaConnection *cnc)
1118 {
1119 	static GMutex mutex;
1120 	static gchar *version_string = NULL;
1121 
1122 	g_return_val_if_fail (GDA_IS_CONNECTION (cnc), FALSE);
1123 	g_return_val_if_fail (gda_connection_get_provider (cnc) == provider, NULL);
1124 
1125 	g_mutex_lock (&mutex);
1126 	if (!version_string)
1127 		version_string = g_strdup_printf ("SQLite version %s", SQLITE_VERSION);
1128 	g_mutex_unlock (&mutex);
1129 
1130 	return (const gchar *) version_string;
1131 }
1132 
1133 /*
1134  * Get database request
1135  */
1136 static const gchar *
gda_sqlite_provider_get_database(GdaServerProvider * provider,GdaConnection * cnc)1137 gda_sqlite_provider_get_database (GdaServerProvider *provider, GdaConnection *cnc)
1138 {
1139 	SqliteConnectionData *cdata;
1140 
1141 	g_return_val_if_fail (GDA_IS_CONNECTION (cnc), NULL);
1142 	g_return_val_if_fail (gda_connection_get_provider (cnc) == provider, NULL);
1143 
1144 	cdata = (SqliteConnectionData*) gda_connection_internal_get_provider_data (cnc);
1145 	if (!cdata)
1146 		return NULL;
1147 	return cdata->file;
1148 }
1149 
1150 /*
1151  * Support operation request
1152  */
1153 static gboolean
gda_sqlite_provider_supports_operation(G_GNUC_UNUSED GdaServerProvider * provider,G_GNUC_UNUSED GdaConnection * cnc,GdaServerOperationType type,G_GNUC_UNUSED GdaSet * options)1154 gda_sqlite_provider_supports_operation (G_GNUC_UNUSED GdaServerProvider *provider, G_GNUC_UNUSED GdaConnection *cnc,
1155 					GdaServerOperationType type, G_GNUC_UNUSED GdaSet *options)
1156 {
1157         switch (type) {
1158         case GDA_SERVER_OPERATION_CREATE_DB:
1159         case GDA_SERVER_OPERATION_DROP_DB:
1160 
1161         case GDA_SERVER_OPERATION_CREATE_TABLE:
1162         case GDA_SERVER_OPERATION_DROP_TABLE:
1163         case GDA_SERVER_OPERATION_RENAME_TABLE:
1164 
1165         case GDA_SERVER_OPERATION_ADD_COLUMN:
1166 
1167         case GDA_SERVER_OPERATION_CREATE_INDEX:
1168         case GDA_SERVER_OPERATION_DROP_INDEX:
1169 
1170         case GDA_SERVER_OPERATION_CREATE_VIEW:
1171         case GDA_SERVER_OPERATION_DROP_VIEW:
1172 		return TRUE;
1173         default:
1174                 return FALSE;
1175         }
1176 }
1177 
1178 /*
1179  * Create operation request
1180  */
1181 static GdaServerOperation *
gda_sqlite_provider_create_operation(GdaServerProvider * provider,G_GNUC_UNUSED GdaConnection * cnc,GdaServerOperationType type,G_GNUC_UNUSED GdaSet * options,GError ** error)1182 gda_sqlite_provider_create_operation (GdaServerProvider *provider, G_GNUC_UNUSED GdaConnection *cnc,
1183 				      GdaServerOperationType type,
1184 				      G_GNUC_UNUSED GdaSet *options, GError **error)
1185 {
1186         gchar *file;
1187         GdaServerOperation *op;
1188         gchar *str;
1189 	gchar *dir;
1190 
1191         file = g_strdup_printf (PNAME "_specs_%s.xml", gda_server_operation_op_type_to_string (type));
1192         str = g_utf8_strdown (file, -1);
1193         g_free (file);
1194 
1195 	dir = gda_gbr_get_file_path (GDA_DATA_DIR, LIBGDA_ABI_NAME, NULL);
1196         file = gda_server_provider_find_file (provider, dir, str);
1197 	g_free (dir);
1198 
1199         if (! file) {
1200 		const gchar *contents;
1201 		contents = emb_get_file (str);
1202 		if (contents) {
1203 			op = _gda_server_operation_new_from_string (type, contents);
1204 			return op;
1205 		}
1206 		else {
1207 			g_set_error (error, GDA_SERVER_OPERATION_ERROR,
1208 				     GDA_SERVER_OPERATION_XML_ERROR,
1209 				     _("Missing spec. file '%s'"), str);
1210 			g_free (str);
1211 			return NULL;
1212 		}
1213         }
1214 
1215         g_free (str);
1216 
1217         op = gda_server_operation_new (type, file);
1218         g_free (file);
1219 
1220         return op;
1221 }
1222 
1223 /*
1224  * Render operation request
1225  */
1226 static gchar *
gda_sqlite_provider_render_operation(GdaServerProvider * provider,GdaConnection * cnc,GdaServerOperation * op,GError ** error)1227 gda_sqlite_provider_render_operation (GdaServerProvider *provider, GdaConnection *cnc,
1228 				      GdaServerOperation *op, GError **error)
1229 {
1230         gchar *sql = NULL;
1231         gchar *file;
1232         gchar *str;
1233 	gchar *dir;
1234 
1235 	/* test @op's validity */
1236 	file = g_strdup_printf (PNAME "_specs_%s.xml",
1237 				gda_server_operation_op_type_to_string (gda_server_operation_get_op_type (op)));
1238         str = g_utf8_strdown (file, -1);
1239         g_free (file);
1240 
1241 	dir = gda_gbr_get_file_path (GDA_DATA_DIR, LIBGDA_ABI_NAME, NULL);
1242         file = gda_server_provider_find_file (provider, dir, str);
1243 	g_free (dir);
1244 
1245         if (! file) {
1246 		const gchar *contents;
1247 		contents = emb_get_file (str);
1248 		if (!contents) {
1249 			g_set_error (error, GDA_SERVER_OPERATION_ERROR,
1250 				     GDA_SERVER_OPERATION_XML_ERROR,
1251 				     _("Missing spec. file '%s'"), str);
1252 			g_free (str);
1253 			return NULL;
1254 		}
1255 		/* else: TO_IMPLEMENT */
1256         }
1257 	else {
1258 		g_free (str);
1259 		if (!gda_server_operation_is_valid (op, file, error)) {
1260 			g_free (file);
1261 			return NULL;
1262 		}
1263 		g_free (file);
1264 	}
1265 
1266 	/* actual rendering */
1267         switch (gda_server_operation_get_op_type (op)) {
1268         case GDA_SERVER_OPERATION_CREATE_DB:
1269         case GDA_SERVER_OPERATION_DROP_DB:
1270 		sql = NULL;
1271                 break;
1272         case GDA_SERVER_OPERATION_CREATE_TABLE:
1273                 sql = _gda_sqlite_render_CREATE_TABLE (provider, cnc, op, error);
1274                 break;
1275         case GDA_SERVER_OPERATION_DROP_TABLE:
1276                 sql = _gda_sqlite_render_DROP_TABLE (provider, cnc, op, error);
1277                 break;
1278         case GDA_SERVER_OPERATION_RENAME_TABLE:
1279                 sql = _gda_sqlite_render_RENAME_TABLE (provider, cnc, op, error);
1280                 break;
1281         case GDA_SERVER_OPERATION_ADD_COLUMN:
1282                 sql = _gda_sqlite_render_ADD_COLUMN (provider, cnc, op, error);
1283                 break;
1284         case GDA_SERVER_OPERATION_CREATE_INDEX:
1285                 sql = _gda_sqlite_render_CREATE_INDEX (provider, cnc, op, error);
1286                 break;
1287         case GDA_SERVER_OPERATION_DROP_INDEX:
1288                 sql = _gda_sqlite_render_DROP_INDEX (provider, cnc, op, error);
1289                 break;
1290         case GDA_SERVER_OPERATION_CREATE_VIEW:
1291                 sql = _gda_sqlite_render_CREATE_VIEW (provider, cnc, op, error);
1292                 break;
1293         case GDA_SERVER_OPERATION_DROP_VIEW:
1294                 sql = _gda_sqlite_render_DROP_VIEW (provider, cnc, op, error);
1295                 break;
1296 
1297         default:
1298                 g_assert_not_reached ();
1299         }
1300         return sql;
1301 }
1302 
1303 /*
1304  * Perform operation request
1305  */
1306 static gboolean
gda_sqlite_provider_perform_operation(GdaServerProvider * provider,GdaConnection * cnc,GdaServerOperation * op,G_GNUC_UNUSED guint * task_id,GdaServerProviderAsyncCallback async_cb,G_GNUC_UNUSED gpointer cb_data,GError ** error)1307 gda_sqlite_provider_perform_operation (GdaServerProvider *provider, GdaConnection *cnc,
1308                                       GdaServerOperation *op, G_GNUC_UNUSED guint *task_id, GdaServerProviderAsyncCallback async_cb,
1309 				       G_GNUC_UNUSED gpointer cb_data, GError **error)
1310 {
1311         GdaServerOperationType optype;
1312 
1313 	if (async_cb) {
1314 		g_set_error (error, GDA_SERVER_PROVIDER_ERROR, GDA_SERVER_PROVIDER_METHOD_NON_IMPLEMENTED_ERROR,
1315 			      "%s", _("Provider does not support asynchronous server operation"));
1316                 return FALSE;
1317 	}
1318 
1319         optype = gda_server_operation_get_op_type (op);
1320 	switch (optype) {
1321 	case GDA_SERVER_OPERATION_CREATE_DB: {
1322 		const GValue *value;
1323 		const gchar *dbname = NULL, *append_extension = NULL;
1324 		const gchar *dir = NULL;
1325 		SqliteConnectionData *cdata;
1326 		gint errmsg;
1327 		gchar *filename, *tmp;
1328 		gboolean retval = TRUE;
1329 
1330 		value = gda_server_operation_get_value_at (op, "/DB_DEF_P/DB_NAME");
1331                 if (value && G_VALUE_HOLDS (value, G_TYPE_STRING) && g_value_get_string (value))
1332                         dbname = g_value_get_string (value);
1333 		value = gda_server_operation_get_value_at (op, "/DB_DEF_P/APPEND_DB_EXTENSION");
1334                 if (value && G_VALUE_HOLDS (value, G_TYPE_STRING) && g_value_get_string (value))
1335                         append_extension = g_value_get_string (value);
1336 		value = gda_server_operation_get_value_at (op, "/DB_DEF_P/DB_DIR");
1337                 if (value && G_VALUE_HOLDS (value, G_TYPE_STRING) && g_value_get_string (value))
1338                         dir = g_value_get_string (value);
1339 
1340 		if (!append_extension ||
1341 		    (append_extension && ((*append_extension == 't') || (*append_extension == 'T'))))
1342 			tmp = g_strdup_printf ("%s%s", dbname, FILE_EXTENSION);
1343 		else
1344 			tmp = g_strdup (dbname);
1345 		filename = g_build_filename (dir, tmp, NULL);
1346 		g_free (tmp);
1347 
1348 		cdata = g_new0 (SqliteConnectionData, 1);
1349 		errmsg = SQLITE3_CALL (sqlite3_open) (filename, &cdata->connection);
1350 		g_free (filename);
1351 
1352 		if (errmsg != SQLITE_OK) {
1353 			g_set_error (error, GDA_SERVER_PROVIDER_ERROR,
1354 				     GDA_SERVER_PROVIDER_PREPARE_STMT_ERROR,
1355 				     "%s", SQLITE3_CALL (sqlite3_errmsg) (cdata->connection));
1356 			retval = FALSE;
1357 		}
1358 
1359 #ifdef SQLITE_HAS_CODEC
1360 		value = gda_server_operation_get_value_at (op, "/DB_DEF_P/PASSWORD");
1361 		if (value && G_VALUE_HOLDS (value, G_TYPE_STRING) &&
1362 		    g_value_get_string (value) &&
1363 		    *g_value_get_string (value) &&
1364 		    SQLITE3_CALL (sqlite3_key)) {
1365 			const gchar *passphrase = g_value_get_string (value);
1366 			errmsg = SQLITE3_CALL (sqlite3_key) (cdata->connection, (void*) passphrase,
1367 							     strlen (passphrase));
1368 			if (errmsg != SQLITE_OK) {
1369 				g_set_error (error, GDA_SERVER_PROVIDER_ERROR,
1370 					     GDA_SERVER_PROVIDER_INTERNAL_ERROR,
1371 					     "%s", SQLITE3_CALL (sqlite3_errmsg) (cdata->connection));
1372 				retval = FALSE;
1373 			}
1374 			else {
1375 				/* create some contents */
1376 				int res;
1377 				sqlite3_stmt *pStmt;
1378 				res = SQLITE3_CALL (sqlite3_prepare) (cdata->connection,
1379 								      "CREATE TABLE data (id int)", -1,
1380 								      &pStmt, NULL);
1381 
1382 				if (res != SQLITE_OK) {
1383 					g_set_error (error, GDA_SERVER_PROVIDER_ERROR,
1384 						     GDA_SERVER_PROVIDER_INTERNAL_ERROR,
1385 						     "%s",
1386 						     _("Error initializing database with passphrase"));
1387 					retval = FALSE;
1388 					goto outcontents;
1389 				}
1390 				res = SQLITE3_CALL (sqlite3_step) (pStmt);
1391 				SQLITE3_CALL (sqlite3_reset) (pStmt);
1392 				SQLITE3_CALL (sqlite3_finalize) (pStmt);
1393 				if (res != SQLITE_DONE) {
1394 					g_set_error (error, GDA_SERVER_PROVIDER_ERROR,
1395 						     GDA_SERVER_PROVIDER_INTERNAL_ERROR,
1396 						     "%s",
1397 						     _("Error initializing database with passphrase"));
1398 					retval = FALSE;
1399 					goto outcontents;
1400 					/* end */
1401 				}
1402 
1403 				res = SQLITE3_CALL (sqlite3_prepare) (cdata->connection,
1404 								      "DROP TABLE data", -1,
1405 								      &pStmt, NULL);
1406 
1407 				if (res != SQLITE_OK) {
1408 					g_set_error (error, GDA_SERVER_PROVIDER_ERROR,
1409 						     GDA_SERVER_PROVIDER_INTERNAL_ERROR,
1410 						     "%s",
1411 						     _("Error initializing database with passphrase"));
1412 					retval = FALSE;
1413 					goto outcontents;
1414 				}
1415 				res = SQLITE3_CALL (sqlite3_step) (pStmt);
1416 				SQLITE3_CALL (sqlite3_reset) (pStmt);
1417 				SQLITE3_CALL (sqlite3_finalize) (pStmt);
1418 				if (res != SQLITE_DONE) {
1419 					g_set_error (error, GDA_SERVER_PROVIDER_ERROR,
1420 						     GDA_SERVER_PROVIDER_INTERNAL_ERROR,
1421 						     "%s",
1422 						     _("Error initializing database with passphrase"));
1423 					retval = FALSE;
1424 					goto outcontents;
1425 					/* end */
1426 				}
1427 			outcontents:
1428 				;
1429 			}
1430 		}
1431 #endif
1432 		gda_sqlite_free_cnc_data (cdata);
1433 
1434 		return retval;
1435         }
1436 	case GDA_SERVER_OPERATION_DROP_DB: {
1437 		const GValue *value;
1438 		const gchar *dbname = NULL;
1439 		const gchar *dir = NULL;
1440 		gboolean retval = TRUE;
1441 
1442 		value = gda_server_operation_get_value_at (op, "/DB_DESC_P/DB_NAME");
1443                 if (value && G_VALUE_HOLDS (value, G_TYPE_STRING) && g_value_get_string (value))
1444                         dbname = g_value_get_string (value);
1445 		value = gda_server_operation_get_value_at (op, "/DB_DESC_P/DB_DIR");
1446                 if (value && G_VALUE_HOLDS (value, G_TYPE_STRING) && g_value_get_string (value))
1447                         dir = g_value_get_string (value);
1448 
1449 		if (dbname && dir) {
1450 			gchar *filename, *tmp;
1451 			tmp = g_strdup_printf ("%s%s", dbname, FILE_EXTENSION);
1452 			filename = (gchar *) g_build_filename (dir, tmp, NULL);
1453 			g_free (tmp);
1454 
1455 			if (g_unlink (filename)) {
1456 				g_set_error (error, GDA_SERVER_PROVIDER_ERROR, GDA_SERVER_PROVIDER_OPERATION_ERROR,
1457 					      "%s", g_strerror (errno));
1458 				retval = FALSE;
1459 			}
1460 			g_free (filename);
1461 		}
1462 		else {
1463 			g_set_error (error, GDA_SERVER_PROVIDER_ERROR, GDA_SERVER_PROVIDER_OPERATION_ERROR,
1464 				      "%s", _("Missing database name or directory"));
1465 			retval = FALSE;
1466 		}
1467 
1468 		return retval;
1469 	}
1470         default:
1471                 /* use the SQL from the provider to perform the action */
1472 		return gda_server_provider_perform_operation_default (provider, cnc, op, error);
1473 	}
1474 }
1475 
1476 /*
1477  * Begin transaction request
1478  */
1479 static gboolean
gda_sqlite_provider_begin_transaction(GdaServerProvider * provider,GdaConnection * cnc,const gchar * name,G_GNUC_UNUSED GdaTransactionIsolation level,GError ** error)1480 gda_sqlite_provider_begin_transaction (GdaServerProvider *provider, GdaConnection *cnc,
1481 				       const gchar *name, G_GNUC_UNUSED GdaTransactionIsolation level,
1482 				       GError **error)
1483 {
1484 	gboolean status = TRUE;
1485 
1486 	g_return_val_if_fail (GDA_IS_CONNECTION (cnc), FALSE);
1487 	g_return_val_if_fail (gda_connection_get_provider (cnc) == provider, FALSE);
1488 
1489 	if (gda_connection_get_options (cnc) & GDA_CONNECTION_OPTIONS_READ_ONLY) {
1490 		gda_connection_add_event_string (cnc, _("Transactions are not supported in read-only mode"));
1491 		return FALSE;
1492 	}
1493 
1494 	if (name) {
1495 		static GMutex mutex;
1496 		static GdaSet *params_set = NULL;
1497 		g_mutex_lock (&mutex);
1498 		if (!params_set)
1499 			params_set = gda_set_new_inline (1, "name", G_TYPE_STRING, name);
1500 		else if (! gda_set_set_holder_value (params_set, error, "name", name))
1501 			status = FALSE;
1502 		if (status && gda_connection_statement_execute_non_select (cnc, internal_stmt[INTERNAL_BEGIN_NAMED],
1503 									   params_set, NULL, error) == -1)
1504 			status = FALSE;
1505 		g_mutex_unlock (&mutex);
1506 	}
1507 	else {
1508 		if (gda_connection_statement_execute_non_select (cnc, internal_stmt[INTERNAL_BEGIN],
1509 								 NULL, NULL, error) == -1)
1510 			status = FALSE;
1511 	}
1512 
1513 	/*g_print ("%s(%p) => %s\n", __FUNCTION__, cnc, status ? "TRUE" : "FALSE");*/
1514 	return status;
1515 }
1516 
1517 /*
1518  * Commit transaction request
1519  */
1520 static gboolean
gda_sqlite_provider_commit_transaction(GdaServerProvider * provider,GdaConnection * cnc,const gchar * name,GError ** error)1521 gda_sqlite_provider_commit_transaction (GdaServerProvider *provider, GdaConnection *cnc,
1522 					const gchar *name, GError **error)
1523 {
1524 	gboolean status = TRUE;
1525 
1526 	g_return_val_if_fail (GDA_IS_CONNECTION (cnc), FALSE);
1527 	g_return_val_if_fail (gda_connection_get_provider (cnc) == provider, FALSE);
1528 
1529 	if (name) {
1530 		static GMutex mutex;
1531 		static GdaSet *params_set = NULL;
1532 		g_mutex_lock (&mutex);
1533 		if (!params_set)
1534 			params_set = gda_set_new_inline (1, "name", G_TYPE_STRING, name);
1535 		else if (!gda_set_set_holder_value (params_set, error, "name", name))
1536 			status = FALSE;
1537 		if (status && gda_connection_statement_execute_non_select (cnc, internal_stmt[INTERNAL_COMMIT_NAMED],
1538 									   params_set, NULL, error) == -1)
1539 			status = FALSE;
1540 		g_mutex_unlock (&mutex);
1541 	}
1542 	else {
1543 		if (gda_connection_statement_execute_non_select (cnc, internal_stmt[INTERNAL_COMMIT],
1544 								 NULL, NULL, error) == -1)
1545 			status = FALSE;
1546 	}
1547 
1548 	/*g_print ("%s(%p) => %s\n", __FUNCTION__, cnc, status ? "TRUE" : "FALSE");*/
1549 	return status;
1550 }
1551 
1552 /*
1553  * Rollback transaction request
1554  */
1555 static gboolean
gda_sqlite_provider_rollback_transaction(GdaServerProvider * provider,GdaConnection * cnc,const gchar * name,GError ** error)1556 gda_sqlite_provider_rollback_transaction (GdaServerProvider *provider,
1557 					  GdaConnection *cnc,
1558 					  const gchar *name, GError **error)
1559 {
1560 	gboolean status = TRUE;
1561 
1562 	g_return_val_if_fail (GDA_IS_CONNECTION (cnc), FALSE);
1563 	g_return_val_if_fail (gda_connection_get_provider (cnc) == provider, FALSE);
1564 
1565 	if (name) {
1566 		static GMutex mutex;
1567 		static GdaSet *params_set = NULL;
1568 		g_mutex_lock (&mutex);
1569 		if (!params_set)
1570 			params_set = gda_set_new_inline (1, "name", G_TYPE_STRING, name);
1571 		else if (! gda_set_set_holder_value (params_set, error, "name", name))
1572 			status = FALSE;
1573 		if (status && gda_connection_statement_execute_non_select (cnc, internal_stmt[INTERNAL_ROLLBACK_NAMED],
1574 									   params_set, NULL, error) == -1)
1575 			status = FALSE;
1576 		g_mutex_unlock (&mutex);
1577 	}
1578 	else {
1579 		if (gda_connection_statement_execute_non_select (cnc, internal_stmt[INTERNAL_ROLLBACK],
1580 								 NULL, NULL, error) == -1)
1581 			status = FALSE;
1582 	}
1583 
1584 	/*g_print ("%s(%p) => %s\n", __FUNCTION__, cnc, status ? "TRUE" : "FALSE");*/
1585 	return status;
1586 }
1587 
1588 static gboolean
gda_sqlite_provider_add_savepoint(GdaServerProvider * provider,GdaConnection * cnc,const gchar * name,GError ** error)1589 gda_sqlite_provider_add_savepoint (GdaServerProvider *provider, GdaConnection *cnc,
1590 				   const gchar *name, GError **error)
1591 {
1592 	gboolean status = TRUE;
1593 
1594 	g_return_val_if_fail (GDA_IS_CONNECTION (cnc), FALSE);
1595 	g_return_val_if_fail (gda_connection_get_provider (cnc) == provider, FALSE);
1596 	g_return_val_if_fail (name && *name, FALSE);
1597 
1598 	static GMutex mutex;
1599 	static GdaSet *params_set = NULL;
1600 	g_mutex_lock (&mutex);
1601 	if (!params_set)
1602 		params_set = gda_set_new_inline (1, "name", G_TYPE_STRING, name);
1603 	else if (! gda_set_set_holder_value (params_set, error, "name", name))
1604 		status = FALSE;
1605 	if (status && gda_connection_statement_execute_non_select (cnc, internal_stmt[INTERNAL_ADD_SAVEPOINT],
1606 								   params_set, NULL, error) == -1)
1607 		status = FALSE;
1608 	g_mutex_unlock (&mutex);
1609 
1610 	/*g_print ("%s(%p) => %s\n", __FUNCTION__, cnc, status ? "TRUE" : "FALSE");*/
1611 	return status;
1612 }
1613 
1614 static gboolean
gda_sqlite_provider_rollback_savepoint(GdaServerProvider * provider,GdaConnection * cnc,const gchar * name,GError ** error)1615 gda_sqlite_provider_rollback_savepoint (GdaServerProvider *provider, GdaConnection *cnc,
1616 					const gchar *name, GError **error)
1617 {
1618 	gboolean status = TRUE;
1619 
1620 	g_return_val_if_fail (GDA_IS_CONNECTION (cnc), FALSE);
1621 	g_return_val_if_fail (gda_connection_get_provider (cnc) == provider, FALSE);
1622 	g_return_val_if_fail (name && *name, FALSE);
1623 
1624 	static GMutex mutex;
1625 	static GdaSet *params_set = NULL;
1626 	g_mutex_lock (&mutex);
1627 	if (!params_set)
1628 		params_set = gda_set_new_inline (1, "name", G_TYPE_STRING, name);
1629 	else if (! gda_set_set_holder_value (params_set, error, "name", name))
1630 		status = FALSE;
1631 	if (status && gda_connection_statement_execute_non_select (cnc, internal_stmt[INTERNAL_ROLLBACK_SAVEPOINT],
1632 								   params_set, NULL, error) == -1)
1633 		status = FALSE;
1634 	g_mutex_unlock (&mutex);
1635 
1636 	/*g_print ("%s(%p) => %s\n", __FUNCTION__, cnc, status ? "TRUE" : "FALSE");*/
1637 	return status;
1638 }
1639 
1640 static gboolean
gda_sqlite_provider_delete_savepoint(GdaServerProvider * provider,GdaConnection * cnc,const gchar * name,GError ** error)1641 gda_sqlite_provider_delete_savepoint (GdaServerProvider *provider, GdaConnection *cnc,
1642 				      const gchar *name, GError **error)
1643 {
1644 	gboolean status = TRUE;
1645 
1646 	g_return_val_if_fail (GDA_IS_CONNECTION (cnc), FALSE);
1647 	g_return_val_if_fail (gda_connection_get_provider (cnc) == provider, FALSE);
1648 	g_return_val_if_fail (name && *name, FALSE);
1649 
1650 	static GMutex mutex;
1651 	static GdaSet *params_set = NULL;
1652 	g_mutex_lock (&mutex);
1653 	if (!params_set)
1654 		params_set = gda_set_new_inline (1, "name", G_TYPE_STRING, name);
1655 	else if (! gda_set_set_holder_value (params_set, error, "name", name))
1656 		status = FALSE;
1657 	if (status && gda_connection_statement_execute_non_select (cnc, internal_stmt[INTERNAL_RELEASE_SAVEPOINT],
1658 								   params_set, NULL, error) == -1)
1659 		status = FALSE;
1660 	g_mutex_unlock (&mutex);
1661 
1662 	/*g_print ("%s(%p) => %s\n", __FUNCTION__, cnc, status ? "TRUE" : "FALSE");*/
1663 	return status;
1664 }
1665 
1666 /*
1667  * Feature support request
1668  */
1669 static gboolean
gda_sqlite_provider_supports(GdaServerProvider * provider,GdaConnection * cnc,GdaConnectionFeature feature)1670 gda_sqlite_provider_supports (GdaServerProvider *provider,
1671 			      GdaConnection *cnc,
1672 			      GdaConnectionFeature feature)
1673 {
1674 	if (cnc) {
1675 		g_return_val_if_fail (GDA_IS_CONNECTION (cnc), FALSE);
1676 		g_return_val_if_fail (gda_connection_get_provider (cnc) == provider, FALSE);
1677 	}
1678 
1679 	switch (feature) {
1680 	case GDA_CONNECTION_FEATURE_SQL :
1681 	case GDA_CONNECTION_FEATURE_TRANSACTIONS :
1682 	case GDA_CONNECTION_FEATURE_AGGREGATES :
1683 	case GDA_CONNECTION_FEATURE_INDEXES :
1684 	case GDA_CONNECTION_FEATURE_TRIGGERS :
1685 	case GDA_CONNECTION_FEATURE_VIEWS :
1686 	case GDA_CONNECTION_FEATURE_PROCEDURES :
1687 		return TRUE;
1688 	case GDA_CONNECTION_FEATURE_MULTI_THREADING:
1689 		return SQLITE3_CALL (sqlite3_threadsafe) () ? TRUE : FALSE;
1690 	default:
1691 		return FALSE;
1692 	}
1693 }
1694 
1695 /*
1696  * Get data handler request
1697  */
1698 static GdaDataHandler *
gda_sqlite_provider_get_data_handler(GdaServerProvider * provider,GdaConnection * cnc,GType type,const gchar * dbms_type)1699 gda_sqlite_provider_get_data_handler (GdaServerProvider *provider, GdaConnection *cnc,
1700 				      GType type, const gchar *dbms_type)
1701 {
1702 	GdaDataHandler *dh = NULL;
1703 
1704 	if (cnc) {
1705 		g_return_val_if_fail (GDA_IS_CONNECTION (cnc), FALSE);
1706 		g_return_val_if_fail (gda_connection_get_provider (cnc) == provider, FALSE);
1707 	}
1708 
1709 	if (type == G_TYPE_INVALID) {
1710 		TO_IMPLEMENT; /* use @dbms_type */
1711 		dh = NULL;
1712 	}
1713 	else if (type == G_TYPE_STRING) {
1714 		dh = gda_server_provider_handler_find (provider, cnc, type, NULL);
1715 		if (!dh) {
1716 			dh = gda_handler_string_new_with_provider (provider, cnc);
1717 			if (dh) {
1718 				gda_server_provider_handler_declare (provider, dh, cnc, G_TYPE_STRING, NULL);
1719 				g_object_unref (dh);
1720 			}
1721 		}
1722 	}
1723 	else if (type == GDA_TYPE_BINARY) {
1724 		dh = gda_server_provider_handler_find (provider, cnc, type, NULL);
1725 		if (!dh) {
1726 			dh = _gda_sqlite_handler_bin_new ();
1727 			if (dh) {
1728 				gda_server_provider_handler_declare (provider, dh, cnc, GDA_TYPE_BINARY, NULL);
1729 				g_object_unref (dh);
1730 			}
1731 		}
1732 	}
1733 	else if ((type == GDA_TYPE_TIME) ||
1734 		 (type == GDA_TYPE_TIMESTAMP) ||
1735 		 (type == G_TYPE_DATE)) {
1736 		dh = gda_server_provider_handler_find (provider, NULL, type, NULL);
1737 		if (!dh) {
1738 			dh = gda_handler_time_new ();
1739 			/* SQLite format is 'YYYY-MM-DD HH:MM:SS.SSS' */
1740 			gda_handler_time_set_sql_spec (GDA_HANDLER_TIME (dh), G_DATE_YEAR, G_DATE_MONTH,
1741 						       G_DATE_DAY, '-', FALSE);
1742 			gda_handler_time_set_str_spec (GDA_HANDLER_TIME (dh), G_DATE_YEAR, G_DATE_MONTH,
1743 						       G_DATE_DAY, '-', FALSE);
1744 			gda_server_provider_handler_declare (provider, dh, NULL, GDA_TYPE_TIME, NULL);
1745 			gda_server_provider_handler_declare (provider, dh, NULL, GDA_TYPE_TIMESTAMP, NULL);
1746 			gda_server_provider_handler_declare (provider, dh, NULL, G_TYPE_DATE, NULL);
1747 			g_object_unref (dh);
1748 		}
1749 	}
1750 	else if (type == G_TYPE_BOOLEAN) {
1751 		dh = gda_server_provider_handler_find (provider, cnc, type, NULL);
1752 		if (!dh) {
1753 			dh = _gda_sqlite_handler_boolean_new ();
1754 			if (dh) {
1755 				gda_server_provider_handler_declare (provider, dh, cnc, G_TYPE_BOOLEAN, NULL);
1756 				g_object_unref (dh);
1757 			}
1758 		}
1759 	}
1760 	else
1761 		dh = gda_server_provider_handler_use_default (provider, type);
1762 
1763 	return dh;
1764 }
1765 
1766 /*
1767  * Get default DBMS type request
1768  */
1769 static const gchar*
gda_sqlite_provider_get_default_dbms_type(G_GNUC_UNUSED GdaServerProvider * provider,G_GNUC_UNUSED GdaConnection * cnc,GType type)1770 gda_sqlite_provider_get_default_dbms_type (G_GNUC_UNUSED GdaServerProvider *provider, G_GNUC_UNUSED GdaConnection *cnc, GType type)
1771 {
1772 	if ((type == G_TYPE_INT64) ||
1773 	    (type == G_TYPE_INT) ||
1774 	    (type == GDA_TYPE_SHORT) ||
1775 	    (type == GDA_TYPE_USHORT) ||
1776 	    (type == G_TYPE_CHAR) ||
1777 	    (type == G_TYPE_UCHAR) ||
1778 	    (type == G_TYPE_ULONG) ||
1779 	    (type == G_TYPE_LONG) ||
1780 	    (type == G_TYPE_UINT) ||
1781 	    (type == G_TYPE_UINT64))
1782 		return "integer";
1783 
1784 	if (type == GDA_TYPE_BINARY)
1785 		return "blob";
1786 
1787 	if (type == G_TYPE_BOOLEAN)
1788 		return "boolean";
1789 
1790 	if ((type == GDA_TYPE_GEOMETRIC_POINT) ||
1791 	    (type == G_TYPE_OBJECT) ||
1792 	    (type == G_TYPE_STRING) ||
1793 	    (type == G_TYPE_INVALID))
1794 		return "string";
1795 
1796 	if ((type == G_TYPE_DOUBLE) ||
1797 	    (type == GDA_TYPE_NUMERIC) ||
1798 	    (type == G_TYPE_FLOAT))
1799 		return "real";
1800 
1801 	if (type == GDA_TYPE_TIME)
1802 		return "time";
1803 	if (type == GDA_TYPE_TIMESTAMP)
1804 		return "timestamp";
1805 	if (type == G_TYPE_DATE)
1806 		return "date";
1807 
1808 	if ((type == GDA_TYPE_NULL) ||
1809 	    (type == G_TYPE_GTYPE))
1810 		return NULL;
1811 
1812 	return "text";
1813 }
1814 
1815 /*
1816  * Create parser request
1817  */
1818 static GdaSqlParser *
gda_sqlite_provider_create_parser(G_GNUC_UNUSED GdaServerProvider * provider,G_GNUC_UNUSED GdaConnection * cnc)1819 gda_sqlite_provider_create_parser (G_GNUC_UNUSED GdaServerProvider *provider, G_GNUC_UNUSED GdaConnection *cnc)
1820 {
1821 	return (GdaSqlParser*) g_object_new (GDA_TYPE_SQL_PARSER, "tokenizer-flavour", GDA_SQL_PARSER_FLAVOUR_SQLITE, NULL);
1822 }
1823 
1824 
1825 /*
1826  * GdaStatement to SQL request
1827  */
1828 static gchar *sqlite_render_compound (GdaSqlStatementCompound *stmt, GdaSqlRenderingContext *context, GError **error);
1829 
1830 static gchar *sqlite_render_operation (GdaSqlOperation *op, GdaSqlRenderingContext *context, GError **error);
1831 static gchar *sqlite_render_expr (GdaSqlExpr *expr, GdaSqlRenderingContext *context,
1832 				  gboolean *is_default, gboolean *is_null,
1833 				  GError **error);
1834 static gchar *sqlite_render_distinct (GdaSqlStatementSelect *stmt,
1835 				      GdaSqlRenderingContext *context, GError **error);
1836 
1837 static gchar *
gda_sqlite_provider_statement_to_sql(GdaServerProvider * provider,GdaConnection * cnc,GdaStatement * stmt,GdaSet * params,GdaStatementSqlFlag flags,GSList ** params_used,GError ** error)1838 gda_sqlite_provider_statement_to_sql (GdaServerProvider *provider, GdaConnection *cnc,
1839 				      GdaStatement *stmt, GdaSet *params, GdaStatementSqlFlag flags,
1840 				      GSList **params_used, GError **error)
1841 {
1842 	gchar *str;
1843 	GdaSqlRenderingContext context;
1844 
1845 	g_return_val_if_fail (GDA_IS_STATEMENT (stmt), NULL);
1846 	if (cnc) {
1847 		g_return_val_if_fail (GDA_IS_CONNECTION (cnc), NULL);
1848 		g_return_val_if_fail (gda_connection_get_provider (cnc) == provider, NULL);
1849 	}
1850 
1851 	memset (&context, 0, sizeof (context));
1852 	context.provider = provider;
1853 	context.cnc = cnc;
1854 	context.params = params;
1855 	context.flags = flags;
1856 	context.render_operation = (GdaSqlRenderingFunc) sqlite_render_operation; /* specific REGEXP rendering */
1857 	context.render_compound = (GdaSqlRenderingFunc) sqlite_render_compound; /* don't surround each SELECT with parenthesis, EXCEPT ALL and INTERSECT ALL are not supported */
1858 	context.render_expr = sqlite_render_expr; /* render "FALSE" as 0 and TRUE as 1 */
1859 	context.render_distinct = (GdaSqlRenderingFunc) sqlite_render_distinct; /* DISTINCT ON (...) is not supported */
1860 
1861 	str = gda_statement_to_sql_real (stmt, &context, error);
1862 
1863 	if (str) {
1864 		if (params_used)
1865 			*params_used = context.params_used;
1866 		else
1867 			g_slist_free (context.params_used);
1868 	}
1869 	else {
1870 		if (params_used)
1871 			*params_used = NULL;
1872 		g_slist_free (context.params_used);
1873 	}
1874 	return str;
1875 }
1876 
1877 /*
1878  * The difference with the default implementation is that DISTINCT ON (...) is not supported
1879  */
1880 static gchar *
sqlite_render_distinct(GdaSqlStatementSelect * stmt,GdaSqlRenderingContext * context,GError ** error)1881 sqlite_render_distinct (GdaSqlStatementSelect *stmt, GdaSqlRenderingContext *context, GError **error)
1882 {
1883 	if (stmt->distinct) {
1884 		if (stmt->distinct_expr) {
1885 			g_set_error (error, GDA_SERVER_PROVIDER_ERROR,
1886 				     GDA_SERVER_PROVIDER_NON_SUPPORTED_ERROR,
1887 				     "%s", _("SQLite does not support specifying fields to apply DISTINCT clause on"));
1888 			return NULL;
1889 		}
1890 		else {
1891 			gchar *tmp;
1892 			tmp = g_strdup ("DISTINCT\n");
1893 			if (! (context->flags & GDA_STATEMENT_SQL_PRETTY))
1894 				tmp [8] = 0;
1895 			return tmp;
1896 		}
1897 	}
1898 	else
1899 		return NULL;
1900 }
1901 
1902 /*
1903  * The difference with the default implementation is to avoid surrounding each SELECT with parenthesis
1904  * and that EXCEPT ALL and INTERSECT ALL are not supported
1905  */
1906 static gchar *
sqlite_render_compound(GdaSqlStatementCompound * stmt,GdaSqlRenderingContext * context,GError ** error)1907 sqlite_render_compound (GdaSqlStatementCompound *stmt, GdaSqlRenderingContext *context, GError **error)
1908 {
1909 	GString *string;
1910 	gchar *str;
1911 	GSList *list;
1912 
1913 	g_return_val_if_fail (stmt, NULL);
1914 	g_return_val_if_fail (GDA_SQL_ANY_PART (stmt)->type == GDA_SQL_ANY_STMT_COMPOUND, NULL);
1915 
1916 	string = g_string_new ("");
1917 
1918 	for (list = stmt->stmt_list; list; list = list->next) {
1919 		GdaSqlStatement *sqlstmt = (GdaSqlStatement*) list->data;
1920 		if (list != stmt->stmt_list) {
1921 			switch (stmt->compound_type) {
1922 			case GDA_SQL_STATEMENT_COMPOUND_UNION:
1923 				g_string_append (string, " UNION ");
1924 				break;
1925 			case GDA_SQL_STATEMENT_COMPOUND_UNION_ALL:
1926 				g_string_append (string, " UNION ALL ");
1927 				break;
1928 			case GDA_SQL_STATEMENT_COMPOUND_INTERSECT:
1929 				g_string_append (string, " INTERSECT ");
1930 				break;
1931 			case GDA_SQL_STATEMENT_COMPOUND_INTERSECT_ALL:
1932 				g_set_error (error, GDA_SERVER_PROVIDER_ERROR,
1933 					     GDA_SERVER_PROVIDER_NON_SUPPORTED_ERROR,
1934 					     _("'%s' compound not supported by SQLite"),
1935 					     "INTERSECT ALL");
1936 				goto err;
1937 				break;
1938 			case GDA_SQL_STATEMENT_COMPOUND_EXCEPT:
1939 				g_string_append (string, " EXCEPT ");
1940 				break;
1941 			case GDA_SQL_STATEMENT_COMPOUND_EXCEPT_ALL:
1942 				g_set_error (error, GDA_SERVER_PROVIDER_ERROR,
1943 					     GDA_SERVER_PROVIDER_NON_SUPPORTED_ERROR,
1944 					     _("'%s' compound not supported by SQLite"),
1945 					     "EXCEPT ALL");
1946 				goto err;
1947 				break;
1948 			default:
1949 				g_assert_not_reached ();
1950 			}
1951 		}
1952 		switch (sqlstmt->stmt_type) {
1953 		case GDA_SQL_ANY_STMT_SELECT:
1954 			str = context->render_select (GDA_SQL_ANY_PART (sqlstmt->contents), context, error);
1955 			if (!str) goto err;
1956 			g_string_append (string, str);
1957 			g_free (str);
1958 			break;
1959 		case GDA_SQL_ANY_STMT_COMPOUND:
1960 			str = context->render_compound (GDA_SQL_ANY_PART (sqlstmt->contents), context, error);
1961 			if (!str) goto err;
1962 			g_string_append (string, str);
1963 			g_free (str);
1964 			break;
1965 		default:
1966 			g_assert_not_reached ();
1967 		}
1968 	}
1969 
1970 	str = string->str;
1971 	g_string_free (string, FALSE);
1972 	return str;
1973 
1974  err:
1975 	g_string_free (string, TRUE);
1976 	return NULL;
1977 }
1978 
1979 /* The difference with the default implementation is specific REGEXP rendering */
1980 static gchar *
sqlite_render_operation(GdaSqlOperation * op,GdaSqlRenderingContext * context,GError ** error)1981 sqlite_render_operation (GdaSqlOperation *op, GdaSqlRenderingContext *context, GError **error)
1982 {
1983 	gchar *str;
1984 	GSList *list;
1985 	GSList *sql_list; /* list of SqlOperand */
1986 	GString *string;
1987 	gchar *multi_op = NULL;
1988 
1989 	typedef struct {
1990 		gchar    *sql;
1991 		gboolean  is_null;
1992 		gboolean  is_default;
1993 		gboolean  is_composed;
1994 	} SqlOperand;
1995 #define SQL_OPERAND(x) ((SqlOperand*)(x))
1996 
1997 	g_return_val_if_fail (op, NULL);
1998 	g_return_val_if_fail (GDA_SQL_ANY_PART (op)->type == GDA_SQL_ANY_SQL_OPERATION, NULL);
1999 
2000 	/* can't have:
2001 	 *  - op->operands == NULL
2002 	 *  - incorrect number of operands
2003 	 */
2004 	if (!gda_sql_any_part_check_structure (GDA_SQL_ANY_PART (op), error)) return NULL;
2005 
2006 	/* render operands */
2007 	for (list = op->operands, sql_list = NULL; list; list = list->next) {
2008 		SqlOperand *sqlop = g_new0 (SqlOperand, 1);
2009 		GdaSqlExpr *expr = (GdaSqlExpr*) list->data;
2010 		str = context->render_expr (expr, context, &(sqlop->is_default), &(sqlop->is_null), error);
2011 		if (!str) {
2012 			g_free (sqlop);
2013 			goto out;
2014 		}
2015 		sqlop->sql = str;
2016 		if (expr->cond || expr->case_s || expr->select)
2017 			sqlop->is_composed = TRUE;
2018 		sql_list = g_slist_prepend (sql_list, sqlop);
2019 	}
2020 	sql_list = g_slist_reverse (sql_list);
2021 
2022 	str = NULL;
2023 	switch (op->operator_type) {
2024 	case GDA_SQL_OPERATOR_TYPE_EQ:
2025 		if (SQL_OPERAND (sql_list->next->data)->is_null)
2026 			str = g_strdup_printf ("%s IS NULL", SQL_OPERAND (sql_list->data)->sql);
2027 		else
2028 			str = g_strdup_printf ("%s = %s", SQL_OPERAND (sql_list->data)->sql, SQL_OPERAND (sql_list->next->data)->sql);
2029 		break;
2030 	case GDA_SQL_OPERATOR_TYPE_IS:
2031 		str = g_strdup_printf ("%s IS %s", SQL_OPERAND (sql_list->data)->sql, SQL_OPERAND (sql_list->next->data)->sql);
2032 		break;
2033 	case GDA_SQL_OPERATOR_TYPE_LIKE:
2034 		str = g_strdup_printf ("%s LIKE %s", SQL_OPERAND (sql_list->data)->sql, SQL_OPERAND (sql_list->next->data)->sql);
2035 		break;
2036 	case GDA_SQL_OPERATOR_TYPE_NOTLIKE:
2037 		str = g_strdup_printf ("%s NOT LIKE %s", SQL_OPERAND (sql_list->data)->sql, SQL_OPERAND (sql_list->next->data)->sql);
2038 		break;
2039 	case GDA_SQL_OPERATOR_TYPE_ILIKE:
2040 	case GDA_SQL_OPERATOR_TYPE_NOTILIKE:
2041 		g_set_error (error, GDA_STATEMENT_ERROR, GDA_STATEMENT_SYNTAX_ERROR,
2042 			     "%s", _("ILIKE operation not supported"));
2043 		goto out;
2044 		break;
2045 	case GDA_SQL_OPERATOR_TYPE_GT:
2046 		str = g_strdup_printf ("%s > %s", SQL_OPERAND (sql_list->data)->sql, SQL_OPERAND (sql_list->next->data)->sql);
2047 		break;
2048 	case GDA_SQL_OPERATOR_TYPE_LT:
2049 		str = g_strdup_printf ("%s < %s", SQL_OPERAND (sql_list->data)->sql, SQL_OPERAND (sql_list->next->data)->sql);
2050 		break;
2051 	case GDA_SQL_OPERATOR_TYPE_GEQ:
2052 		str = g_strdup_printf ("%s >= %s", SQL_OPERAND (sql_list->data)->sql, SQL_OPERAND (sql_list->next->data)->sql);
2053 		break;
2054 	case GDA_SQL_OPERATOR_TYPE_LEQ:
2055 		str = g_strdup_printf ("%s <= %s", SQL_OPERAND (sql_list->data)->sql, SQL_OPERAND (sql_list->next->data)->sql);
2056 		break;
2057 	case GDA_SQL_OPERATOR_TYPE_DIFF:
2058 		str = g_strdup_printf ("%s != %s", SQL_OPERAND (sql_list->data)->sql, SQL_OPERAND (sql_list->next->data)->sql);
2059 		break;
2060 	case GDA_SQL_OPERATOR_TYPE_REGEXP:
2061 		str = g_strdup_printf ("regexp (%s, %s)", SQL_OPERAND (sql_list->next->data)->sql, SQL_OPERAND (sql_list->data)->sql);
2062 		break;
2063 	case GDA_SQL_OPERATOR_TYPE_REGEXP_CI:
2064 		str = g_strdup_printf ("regexp (%s, %s, 'i')", SQL_OPERAND (sql_list->next->data)->sql,
2065 				       SQL_OPERAND (sql_list->data)->sql);
2066 		break;
2067 	case GDA_SQL_OPERATOR_TYPE_NOT_REGEXP_CI:
2068 		str = g_strdup_printf ("NOT regexp (%s, %s, 'i')", SQL_OPERAND (sql_list->next->data)->sql,
2069 				       SQL_OPERAND (sql_list->data)->sql);
2070 	case GDA_SQL_OPERATOR_TYPE_SIMILAR:
2071 		/* does not exist in SQLite => error */
2072 		break;
2073 	case GDA_SQL_OPERATOR_TYPE_NOT_REGEXP:
2074 		str = g_strdup_printf ("NOT regexp (%s, %s)", SQL_OPERAND (sql_list->next->data)->sql,
2075 				       SQL_OPERAND (sql_list->data)->sql);
2076 		break;
2077 	case GDA_SQL_OPERATOR_TYPE_REM:
2078 		str = g_strdup_printf ("%s %% %s", SQL_OPERAND (sql_list->data)->sql, SQL_OPERAND (sql_list->next->data)->sql);
2079 		break;
2080 	case GDA_SQL_OPERATOR_TYPE_DIV:
2081 		str = g_strdup_printf ("%s / %s", SQL_OPERAND (sql_list->data)->sql, SQL_OPERAND (sql_list->next->data)->sql);
2082 		break;
2083 	case GDA_SQL_OPERATOR_TYPE_BITAND:
2084 		str = g_strdup_printf ("%s & %s", SQL_OPERAND (sql_list->data)->sql, SQL_OPERAND (sql_list->next->data)->sql);
2085 		break;
2086 	case GDA_SQL_OPERATOR_TYPE_BITOR:
2087 		str = g_strdup_printf ("%s | %s", SQL_OPERAND (sql_list->data)->sql, SQL_OPERAND (sql_list->next->data)->sql);
2088 		break;
2089 	case GDA_SQL_OPERATOR_TYPE_BETWEEN:
2090 		str = g_strdup_printf ("%s BETWEEN %s AND %s", SQL_OPERAND (sql_list->data)->sql,
2091 				       SQL_OPERAND (sql_list->next->data)->sql,
2092 				       SQL_OPERAND (sql_list->next->next->data)->sql);
2093 		break;
2094 	case GDA_SQL_OPERATOR_TYPE_ISNULL:
2095 		str = g_strdup_printf ("%s IS NULL", SQL_OPERAND (sql_list->data)->sql);
2096 		break;
2097 	case GDA_SQL_OPERATOR_TYPE_ISNOTNULL:
2098 		str = g_strdup_printf ("%s IS NOT NULL", SQL_OPERAND (sql_list->data)->sql);
2099 		break;
2100 	case GDA_SQL_OPERATOR_TYPE_BITNOT:
2101 		str = g_strdup_printf ("~ %s", SQL_OPERAND (sql_list->data)->sql);
2102 		break;
2103 	case GDA_SQL_OPERATOR_TYPE_NOT:
2104 		str = g_strdup_printf ("NOT %s", SQL_OPERAND (sql_list->data)->sql);
2105 		break;
2106 	case GDA_SQL_OPERATOR_TYPE_IN:
2107 	case GDA_SQL_OPERATOR_TYPE_NOTIN: {
2108 		gboolean add_p = TRUE;
2109 		if (sql_list->next && !(sql_list->next->next) &&
2110 		    *(SQL_OPERAND (sql_list->next->data)->sql)=='(')
2111 			add_p = FALSE;
2112 
2113 		string = g_string_new (SQL_OPERAND (sql_list->data)->sql);
2114 		if (op->operator_type == GDA_SQL_OPERATOR_TYPE_IN)
2115 			g_string_append (string, " IN ");
2116 		else
2117 			g_string_append (string, " NOT IN ");
2118 		if (add_p)
2119 			g_string_append_c (string, '(');
2120 		for (list = sql_list->next; list; list = list->next) {
2121 			if (list != sql_list->next)
2122 				g_string_append (string, ", ");
2123 			g_string_append (string, SQL_OPERAND (list->data)->sql);
2124 		}
2125 		if (add_p)
2126 			g_string_append_c (string, ')');
2127 		str = string->str;
2128 		g_string_free (string, FALSE);
2129 		break;
2130 	}
2131 	case GDA_SQL_OPERATOR_TYPE_CONCAT:
2132 		multi_op = "||";
2133 		break;
2134 	case GDA_SQL_OPERATOR_TYPE_PLUS:
2135 		multi_op = "+";
2136 		break;
2137 	case GDA_SQL_OPERATOR_TYPE_MINUS:
2138 		multi_op = "-";
2139 		break;
2140 	case GDA_SQL_OPERATOR_TYPE_STAR:
2141 		multi_op = "*";
2142 		break;
2143 	case GDA_SQL_OPERATOR_TYPE_AND:
2144 		multi_op = "AND";
2145 		break;
2146 	case GDA_SQL_OPERATOR_TYPE_OR:
2147 		multi_op = "OR";
2148 		break;
2149 	default:
2150 		g_assert_not_reached ();
2151 		break;
2152 	}
2153 
2154 	if (multi_op) {
2155 		if (!sql_list->next) {
2156 			/* 1 operand only */
2157 			string = g_string_new ("");
2158 			g_string_append_printf (string, "%s %s", multi_op, SQL_OPERAND (sql_list->data)->sql);
2159 		}
2160 		else {
2161 			/* 2 or more operands */
2162 			if (SQL_OPERAND (sql_list->data)->is_composed) {
2163 				string = g_string_new ("(");
2164 				g_string_append (string, SQL_OPERAND (sql_list->data)->sql);
2165 				g_string_append_c (string, ')');
2166 			}
2167 			else
2168 				string = g_string_new (SQL_OPERAND (sql_list->data)->sql);
2169 			for (list = sql_list->next; list; list = list->next) {
2170 				g_string_append_printf (string, " %s ", multi_op);
2171 				if (SQL_OPERAND (list->data)->is_composed) {
2172 					g_string_append_c (string, '(');
2173 					g_string_append (string, SQL_OPERAND (list->data)->sql);
2174 					g_string_append_c (string, ')');
2175 				}
2176 				else
2177 					g_string_append (string, SQL_OPERAND (list->data)->sql);
2178 			}
2179 		}
2180 		str = string->str;
2181 		g_string_free (string, FALSE);
2182 	}
2183 
2184  out:
2185 	for (list = sql_list; list; list = list->next) {
2186 		g_free (((SqlOperand*)list->data)->sql);
2187 		g_free (list->data);
2188 	}
2189 	g_slist_free (sql_list);
2190 
2191 	return str;
2192 }
2193 
2194 /*
2195  * The difference with the default implementation is to render TRUE and FALSE as 0 and 1
2196  */
2197 static gchar *
sqlite_render_expr(GdaSqlExpr * expr,GdaSqlRenderingContext * context,gboolean * is_default,gboolean * is_null,GError ** error)2198 sqlite_render_expr (GdaSqlExpr *expr, GdaSqlRenderingContext *context, gboolean *is_default,
2199 		    gboolean *is_null, GError **error)
2200 {
2201 	GString *string;
2202 	gchar *str = NULL;
2203 
2204 	g_return_val_if_fail (expr, NULL);
2205 	g_return_val_if_fail (GDA_SQL_ANY_PART (expr)->type == GDA_SQL_ANY_EXPR, NULL);
2206 
2207 	if (is_default)
2208 		*is_default = FALSE;
2209 	if (is_null)
2210 		*is_null = FALSE;
2211 
2212 	/* can't have:
2213 	 *  - expr->cast_as && expr->param_spec
2214 	 */
2215 	if (!gda_sql_any_part_check_structure (GDA_SQL_ANY_PART (expr), error)) return NULL;
2216 
2217 	string = g_string_new ("");
2218 	if (expr->param_spec) {
2219 		str = context->render_param_spec (expr->param_spec, expr, context, is_default, is_null, error);
2220 		if (!str) goto err;
2221 	}
2222 	else if (expr->value) {
2223 		if (G_VALUE_TYPE (expr->value) == G_TYPE_STRING) {
2224 			/* specific treatment for strings, see documentation about GdaSqlExpr's value attribute */
2225 			const gchar *vstr;
2226 			vstr = g_value_get_string (expr->value);
2227 			if (vstr) {
2228 				if (expr->value_is_ident) {
2229 					gchar **ids_array;
2230 					gint i;
2231 					GString *string = NULL;
2232 					GdaConnectionOptions cncoptions = 0;
2233 					if (context->cnc)
2234 						g_object_get (G_OBJECT (context->cnc), "options", &cncoptions, NULL);
2235 					ids_array = gda_sql_identifier_split (vstr);
2236 					if (!ids_array)
2237 						str = g_strdup (vstr);
2238 					else if (!(ids_array[0])) goto err;
2239 					else {
2240 						for (i = 0; ids_array[i]; i++) {
2241 							gchar *tmp;
2242 							if (!string)
2243 								string = g_string_new ("");
2244 							else
2245 								g_string_append_c (string, '.');
2246 							tmp = gda_sql_identifier_quote (ids_array[i], context->cnc,
2247 											context->provider, FALSE,
2248 											cncoptions & GDA_CONNECTION_OPTIONS_SQL_IDENTIFIERS_CASE_SENSITIVE);
2249 							g_string_append (string, tmp);
2250 							g_free (tmp);
2251 						}
2252 						g_strfreev (ids_array);
2253 						str = g_string_free (string, FALSE);
2254 					}
2255 				}
2256 				else {
2257 					/* we don't have an identifier */
2258 					if (!g_ascii_strcasecmp (vstr, "default")) {
2259 						if (is_default)
2260 							*is_default = TRUE;
2261 						str = g_strdup ("DEFAULT");
2262 					}
2263 					else if (!g_ascii_strcasecmp (vstr, "FALSE")) {
2264 						g_free (str);
2265 						str = g_strdup ("0");
2266 					}
2267 					else if (!g_ascii_strcasecmp (vstr, "TRUE")) {
2268 						g_free (str);
2269 						str = g_strdup ("1");
2270 					}
2271 					else
2272 						str = g_strdup (vstr);
2273 				}
2274 			}
2275 			else {
2276 				str = g_strdup ("NULL");
2277 				if (is_null)
2278 					*is_null = TRUE;
2279 			}
2280 		}
2281 		if (!str) {
2282 			/* use a GdaDataHandler to render the value as valid SQL */
2283 			GdaDataHandler *dh;
2284 			if (context->cnc) {
2285 				GdaServerProvider *prov;
2286 				prov = gda_connection_get_provider (context->cnc);
2287 				dh = gda_server_provider_get_data_handler_g_type (prov, context->cnc,
2288 										  G_VALUE_TYPE (expr->value));
2289 				if (!dh) goto err;
2290 			}
2291 			else
2292 				dh = gda_data_handler_get_default (G_VALUE_TYPE (expr->value));
2293 
2294 			if (dh)
2295 				str = gda_data_handler_get_sql_from_value (dh, expr->value);
2296 			else
2297 				str = gda_value_stringify (expr->value);
2298 			if (!str) goto err;
2299 		}
2300 	}
2301 	else if (expr->func) {
2302 		str = context->render_function (GDA_SQL_ANY_PART (expr->func), context, error);
2303 		if (!str) goto err;
2304 	}
2305 	else if (expr->cond) {
2306 		gchar *tmp;
2307 		tmp = context->render_operation (GDA_SQL_ANY_PART (expr->cond), context, error);
2308 		if (!tmp) goto err;
2309 		str = NULL;
2310 		if (GDA_SQL_ANY_PART (expr)->parent) {
2311 			if (GDA_SQL_ANY_PART (expr)->parent->type == GDA_SQL_ANY_STMT_SELECT) {
2312 				GdaSqlStatementSelect *selst;
2313 				selst = (GdaSqlStatementSelect*) (GDA_SQL_ANY_PART (expr)->parent);
2314 				if ((expr == selst->where_cond) ||
2315 				    (expr == selst->having_cond))
2316 					str = tmp;
2317 			}
2318 			else if (GDA_SQL_ANY_PART (expr)->parent->type == GDA_SQL_ANY_STMT_DELETE) {
2319 				GdaSqlStatementDelete *delst;
2320 				delst = (GdaSqlStatementDelete*) (GDA_SQL_ANY_PART (expr)->parent);
2321 				if (expr == delst->cond)
2322 					str = tmp;
2323 			}
2324 			else if (GDA_SQL_ANY_PART (expr)->parent->type == GDA_SQL_ANY_STMT_UPDATE) {
2325 				GdaSqlStatementUpdate *updst;
2326 				updst = (GdaSqlStatementUpdate*) (GDA_SQL_ANY_PART (expr)->parent);
2327 				if (expr == updst->cond)
2328 					str = tmp;
2329 			}
2330 		}
2331 
2332 		if (!str) {
2333 			str = g_strconcat ("(", tmp, ")", NULL);
2334 			g_free (tmp);
2335 		}
2336 	}
2337 	else if (expr->select) {
2338 		gchar *str1;
2339 		if (GDA_SQL_ANY_PART (expr->select)->type == GDA_SQL_ANY_STMT_SELECT)
2340 			str1 = context->render_select (GDA_SQL_ANY_PART (expr->select), context, error);
2341 		else if (GDA_SQL_ANY_PART (expr->select)->type == GDA_SQL_ANY_STMT_COMPOUND)
2342 			str1 = context->render_compound (GDA_SQL_ANY_PART (expr->select), context, error);
2343 		else
2344 			g_assert_not_reached ();
2345 		if (!str1) goto err;
2346 
2347 		if (! GDA_SQL_ANY_PART (expr)->parent ||
2348 		    (GDA_SQL_ANY_PART (expr)->parent->type != GDA_SQL_ANY_SQL_FUNCTION)) {
2349 			str = g_strconcat ("(", str1, ")", NULL);
2350 			g_free (str1);
2351 		}
2352 		else
2353 			str = str1;
2354 	}
2355 	else if (expr->case_s) {
2356 		str = context->render_case (GDA_SQL_ANY_PART (expr->case_s), context, error);
2357 		if (!str) goto err;
2358 	}
2359 	else {
2360 		if (is_null)
2361 			*is_null = TRUE;
2362 		str = g_strdup ("NULL");
2363 	}
2364 
2365 	if (!str) goto err;
2366 
2367 	if (expr->cast_as)
2368 		g_string_append_printf (string, "CAST (%s AS %s)", str, expr->cast_as);
2369 	else
2370 		g_string_append (string, str);
2371 	g_free (str);
2372 
2373 	str = string->str;
2374 	g_string_free (string, FALSE);
2375 	return str;
2376 
2377  err:
2378 	g_string_free (string, TRUE);
2379 	return NULL;
2380 }
2381 
2382 /*
2383  * Statement prepare request
2384  */
2385 static GdaSqlitePStmt *real_prepare (GdaServerProvider *provider, GdaConnection *cnc, GdaStatement *stmt, GError **error);
2386 static gboolean
gda_sqlite_provider_statement_prepare(GdaServerProvider * provider,GdaConnection * cnc,GdaStatement * stmt,GError ** error)2387 gda_sqlite_provider_statement_prepare (GdaServerProvider *provider, GdaConnection *cnc,
2388 				       GdaStatement *stmt, GError **error)
2389 {
2390 	GdaSqlitePStmt *ps;
2391 
2392 	g_return_val_if_fail (GDA_IS_CONNECTION (cnc), FALSE);
2393 	g_return_val_if_fail (gda_connection_get_provider (cnc) == provider, FALSE);
2394 	g_return_val_if_fail (GDA_IS_STATEMENT (stmt), FALSE);
2395 
2396 	/* fetch prepares stmt if already done */
2397 	ps = (GdaSqlitePStmt *) gda_connection_get_prepared_statement (cnc, stmt);
2398 	if (ps)
2399 		return TRUE;
2400 
2401 	ps = real_prepare (provider, cnc, stmt, error);
2402 	if (!ps)
2403 		return FALSE;
2404 	else {
2405 		gda_connection_add_prepared_statement (cnc, stmt, (GdaPStmt *) ps);
2406 		g_object_unref (ps);
2407 		return TRUE;
2408 	}
2409 }
2410 
2411 /*
2412  * Creates a new GdaStatement, as a copy of @stmt, and adds new OID columns, one for each table involved
2413  * in the SELECT
2414  * The GHashTable created (as @out_hash) contains:
2415  *  - key = table name
2416  *  - value = column number in the SELECT (use GPOINTER_TO_INT)
2417  *
2418  * This step is required for BLOBs which needs to table's ROWID to be opened. The extra columns
2419  * won't appear in the final result set.
2420  */
2421 static GdaStatement *
add_oid_columns(GdaStatement * stmt,GHashTable ** out_hash,gint * out_nb_cols_added)2422 add_oid_columns (GdaStatement *stmt, GHashTable **out_hash, gint *out_nb_cols_added)
2423 {
2424 	GHashTable *hash = NULL;
2425 	GdaStatement *nstmt;
2426 	GdaSqlStatement *sqlst;
2427 	GdaSqlStatementSelect *sst;
2428 	gint nb_cols_added = 0;
2429 	gint add_index;
2430 	GSList *list;
2431 
2432 	*out_hash = NULL;
2433 	*out_nb_cols_added = 0;
2434 
2435 	GdaSqlStatementType type;
2436 	type = gda_statement_get_statement_type (stmt);
2437 	if (type == GDA_SQL_STATEMENT_COMPOUND) {
2438 		return g_object_ref (stmt);
2439 	}
2440 	else if (type != GDA_SQL_STATEMENT_SELECT) {
2441 		return g_object_ref (stmt);
2442 	}
2443 
2444 	g_object_get (G_OBJECT (stmt), "structure", &sqlst, NULL);
2445 	g_assert (sqlst);
2446 	hash = g_hash_table_new_full (g_str_hash, g_str_equal, g_free, NULL);
2447 	sst = (GdaSqlStatementSelect*) sqlst->contents;
2448 
2449 	if (!sst->from || sst->distinct) {
2450 		gda_sql_statement_free (sqlst);
2451 		return g_object_ref (stmt);
2452 	}
2453 
2454 	/* if there is an ORDER BY test if we can alter it */
2455 	if (sst->order_by) {
2456 		for (list = sst->order_by; list; list = list->next) {
2457 			GdaSqlSelectOrder *order = (GdaSqlSelectOrder*) list->data;
2458 			if (order->expr && order->expr->value &&
2459 			    (G_VALUE_TYPE (order->expr->value) != G_TYPE_STRING)) {
2460 				gda_sql_statement_free (sqlst);
2461 				return g_object_ref (stmt);
2462 			}
2463 		}
2464 	}
2465 
2466 	add_index = 0;
2467 	for (list = sst->from->targets; list; list = list->next) {
2468 		GdaSqlSelectTarget *target = (GdaSqlSelectTarget*) list->data;
2469 		GdaSqlSelectField *field;
2470 
2471 		if (!target->table_name)
2472 			continue;
2473 
2474 		/* add a field */
2475 		field = gda_sql_select_field_new (GDA_SQL_ANY_PART (sst));
2476 		sst->expr_list = g_slist_insert (sst->expr_list, field, add_index);
2477 
2478 		field->expr = gda_sql_expr_new (GDA_SQL_ANY_PART (field));
2479 
2480 		gchar *str, *tmp;
2481 		const gchar *name;
2482 		if (target->as)
2483 			name = target->as;
2484 		else
2485 			name = target->table_name;
2486 
2487 		tmp = gda_sql_identifier_quote (name, NULL, NULL, FALSE, FALSE);
2488 		str = g_strdup_printf ("%s.rowid", tmp);
2489 		g_free (tmp);
2490 		g_value_take_string ((field->expr->value = gda_value_new (G_TYPE_STRING)), str);
2491 
2492 		/* add to hash table */
2493 		add_index++;
2494 		g_hash_table_insert (hash, gda_sql_identifier_prepare_for_compare (g_strdup (name)),
2495 				     GINT_TO_POINTER (add_index)); /* ADDED 1 to column number,
2496 								    * don't forget to remove 1 when using */
2497 		if (target->as)
2498 			g_hash_table_insert (hash, gda_sql_identifier_prepare_for_compare (g_strdup (target->table_name)),
2499 					     GINT_TO_POINTER (add_index)); /* ADDED 1 to column number,
2500 									    * don't forget to remove 1 when using */
2501 		nb_cols_added ++;
2502 	}
2503 
2504 	/* if there is an ORDER BY which uses numbers, then also alter that */
2505 	if (sst->order_by) {
2506 		for (list = sst->order_by; list; list = list->next) {
2507 			GdaSqlSelectOrder *order = (GdaSqlSelectOrder*) list->data;
2508 			if (order->expr && order->expr->value) {
2509 				long i;
2510 				const gchar *cstr;
2511 				gchar *endptr = NULL;
2512 				cstr = g_value_get_string (order->expr->value);
2513 				i = strtol (cstr, (char **) &endptr, 10);
2514 				if (!endptr || !(*endptr)) {
2515 					i += nb_cols_added;
2516 					endptr = g_strdup_printf ("%ld", i);
2517 					g_value_take_string (order->expr->value, endptr);
2518 				}
2519 			}
2520 		}
2521 	}
2522 
2523 	/* prepare return */
2524 	nstmt = (GdaStatement*) g_object_new (GDA_TYPE_STATEMENT, "structure", sqlst, NULL);
2525 	gda_sql_statement_free (sqlst);
2526 	/*g_print ("%s(): Added %d columns: %s\n", __FUNCTION__, nb_cols_added, gda_statement_to_sql (nstmt, NULL, NULL));*/
2527 
2528 	*out_hash = hash;
2529 	*out_nb_cols_added = nb_cols_added;
2530 
2531 	return nstmt;
2532 }
2533 
2534 static GdaSqlitePStmt *
real_prepare(GdaServerProvider * provider,GdaConnection * cnc,GdaStatement * stmt,GError ** error)2535 real_prepare (GdaServerProvider *provider, GdaConnection *cnc, GdaStatement *stmt, GError **error)
2536 {
2537 	int status;
2538 	SqliteConnectionData *cdata;
2539 	sqlite3_stmt *sqlite_stmt;
2540 	gchar *sql;
2541 	const char *left;
2542 	GdaSqlitePStmt *ps;
2543 	GdaSet *params = NULL;
2544 	GSList *used_params = NULL;
2545 
2546 	GdaStatement *real_stmt;
2547 	GHashTable *hash;
2548 	gint nb_rows_added;
2549 
2550 	/* get SQLite's private data */
2551 	cdata = (SqliteConnectionData*) gda_connection_internal_get_provider_data_error (cnc, error);
2552 	if (!cdata)
2553 		return NULL;
2554 
2555 	/* render as SQL understood by SQLite */
2556 	if (! gda_statement_get_parameters (stmt, &params, error))
2557 		return NULL;
2558 
2559 	real_stmt = add_oid_columns (stmt, &hash, &nb_rows_added);
2560 	sql = gda_sqlite_provider_statement_to_sql (provider, cnc, real_stmt, params, GDA_STATEMENT_SQL_PARAMS_AS_QMARK,
2561 						    &used_params, error);
2562 	if (!sql)
2563 		goto out_err;
2564 
2565 	/* prepare statement */
2566 	status = SQLITE3_CALL (sqlite3_prepare_v2) (cdata->connection, sql, -1, &sqlite_stmt, &left);
2567 	if (status != SQLITE_OK) {
2568 		g_set_error (error, GDA_SERVER_PROVIDER_ERROR, GDA_SERVER_PROVIDER_PREPARE_STMT_ERROR,
2569 			     "%s", SQLITE3_CALL (sqlite3_errmsg) (cdata->connection));
2570 		goto out_err;
2571 	}
2572 
2573 	if (left && (*left != 0))
2574 		g_warning ("SQlite SQL: %s (REMAIN:%s)\n", sql, left);
2575 
2576 	/* make a list of the parameter names used in the statement */
2577 	GSList *param_ids = NULL;
2578 	if (used_params) {
2579 		GSList *list;
2580 		for (list = used_params; list; list = list->next) {
2581 			const gchar *cid;
2582 			cid = gda_holder_get_id (GDA_HOLDER (list->data));
2583 			if (cid) {
2584 				param_ids = g_slist_append (param_ids, g_strdup (cid));
2585 				/*g_print ("PREPARATION: param ID: %s\n", cid);*/
2586 			}
2587 			else {
2588 				g_set_error (error, GDA_SERVER_PROVIDER_ERROR, GDA_SERVER_PROVIDER_PREPARE_STMT_ERROR,
2589 					      "%s", _("Unnamed parameter is not allowed in prepared statements"));
2590 				g_slist_foreach (param_ids, (GFunc) g_free, NULL);
2591 				g_slist_free (param_ids);
2592 				goto out_err;
2593 			}
2594 		}
2595 		g_slist_free (used_params);
2596 	}
2597 	if (params)
2598 		g_object_unref (params);
2599 
2600 	/* create a prepared statement object */
2601 	ps = _gda_sqlite_pstmt_new (sqlite_stmt);
2602 	gda_pstmt_set_gda_statement (_GDA_PSTMT (ps), stmt);
2603 	_GDA_PSTMT (ps)->param_ids = param_ids;
2604 	_GDA_PSTMT (ps)->sql = sql;
2605 	ps->rowid_hash = hash;
2606 	ps->nb_rowid_columns = nb_rows_added;
2607 	g_object_unref (real_stmt);
2608 	/*g_print ("%s(%s) => GdaSqlitePStmt %p\n", __FUNCTION__, sql, ps);*/
2609 	return ps;
2610 
2611  out_err:
2612 	if (hash)
2613 		g_hash_table_destroy (hash);
2614 	g_object_unref (real_stmt);
2615 	if (used_params)
2616 		g_slist_free (used_params);
2617 	if (params)
2618 		g_object_unref (params);
2619 	g_free (sql);
2620 	return NULL;
2621 }
2622 
2623 #define MAKE_LAST_INSERTED_SET_ID "__gda"
2624 static void
lir_stmt_reset_cb(GdaStatement * stmt,G_GNUC_UNUSED gpointer data)2625 lir_stmt_reset_cb (GdaStatement *stmt, G_GNUC_UNUSED gpointer data)
2626 {
2627 	/* get rid of the SELECT statement used in make_last_inserted_set() */
2628 	g_object_set_data ((GObject*) stmt, MAKE_LAST_INSERTED_SET_ID, NULL);
2629 }
2630 
2631 static GdaSet *
make_last_inserted_set(GdaConnection * cnc,GdaStatement * stmt,sqlite3_int64 last_id)2632 make_last_inserted_set (GdaConnection *cnc, GdaStatement *stmt, sqlite3_int64 last_id)
2633 {
2634 	GError *lerror = NULL;
2635 
2636 	GdaStatement *statement;
2637 	statement = g_object_get_data ((GObject*) stmt, MAKE_LAST_INSERTED_SET_ID);
2638 	if (!statement) {
2639 		/* analyze @stmt */
2640 		GdaSqlStatement *sql_insert;
2641 		GdaSqlStatementInsert *insert;
2642 		if (gda_statement_get_statement_type (stmt) != GDA_SQL_STATEMENT_INSERT)
2643 			/* unable to compute anything */
2644 			return NULL;
2645 		g_object_get (G_OBJECT (stmt), "structure", &sql_insert, NULL);
2646 		g_assert (sql_insert);
2647 		insert = (GdaSqlStatementInsert *) sql_insert->contents;
2648 
2649 		/* build corresponding SELECT statement */
2650 		GdaSqlStatementSelect *select;
2651 		GdaSqlSelectTarget *target;
2652 		GdaSqlStatement *sql_statement = gda_sql_statement_new (GDA_SQL_STATEMENT_SELECT);
2653 
2654 		select = (GdaSqlStatementSelect*) sql_statement->contents;
2655 
2656 		/* FROM */
2657 		select->from = gda_sql_select_from_new (GDA_SQL_ANY_PART (select));
2658 		target = gda_sql_select_target_new (GDA_SQL_ANY_PART (select->from));
2659 		gda_sql_select_from_take_new_target (select->from, target);
2660 
2661 		/* Filling in the target */
2662 		GValue *value;
2663 		g_value_set_string ((value = gda_value_new (G_TYPE_STRING)), insert->table->table_name);
2664 		gda_sql_select_target_take_table_name (target, value);
2665 		gda_sql_statement_free (sql_insert);
2666 
2667 		/* selected fields */
2668 		GdaSqlSelectField *field;
2669 		GSList *fields_list = NULL;
2670 
2671 		field = gda_sql_select_field_new (GDA_SQL_ANY_PART (select));
2672 		g_value_set_string ((value = gda_value_new (G_TYPE_STRING)), "*");
2673 		gda_sql_select_field_take_star_value (field, value);
2674 		fields_list = g_slist_append (fields_list, field);
2675 
2676 		gda_sql_statement_select_take_expr_list (sql_statement, fields_list);
2677 
2678 		/* WHERE */
2679 		GdaSqlExpr *where, *expr;
2680 		GdaSqlOperation *cond;
2681 		where = gda_sql_expr_new (GDA_SQL_ANY_PART (select));
2682 		cond = gda_sql_operation_new (GDA_SQL_ANY_PART (where));
2683 		where->cond = cond;
2684 		cond->operator_type = GDA_SQL_OPERATOR_TYPE_EQ;
2685 		expr = gda_sql_expr_new (GDA_SQL_ANY_PART (cond));
2686 		g_value_set_string ((value = gda_value_new (G_TYPE_STRING)), "rowid");
2687 		expr->value = value;
2688 		cond->operands = g_slist_append (NULL, expr);
2689 
2690 		GdaSqlParamSpec *pspec = g_new0 (GdaSqlParamSpec, 1);
2691 		pspec->name = g_strdup ("lid");
2692 		pspec->g_type = G_TYPE_INT64;
2693 		pspec->nullok = TRUE;
2694 		pspec->is_param = TRUE;
2695 		expr = gda_sql_expr_new (GDA_SQL_ANY_PART (cond));
2696 		expr->param_spec = pspec;
2697 		cond->operands = g_slist_append (cond->operands, expr);
2698 
2699 		gda_sql_statement_select_take_where_cond (sql_statement, where);
2700 
2701 		if (gda_sql_statement_check_structure (sql_statement, &lerror) == FALSE) {
2702 			g_warning (_("Can't build SELECT statement to get last inserted row: %s"),
2703 				   lerror && lerror->message ? lerror->message : _("No detail"));
2704 			if (lerror)
2705 				g_error_free (lerror);
2706 			gda_sql_statement_free (sql_statement);
2707 			return NULL;
2708 		}
2709 		statement = g_object_new (GDA_TYPE_STATEMENT, "structure", sql_statement, NULL);
2710 		gda_sql_statement_free (sql_statement);
2711 
2712 		GdaSet *params;
2713 		if (! gda_statement_get_parameters (statement, &params, &lerror)) {
2714 			g_warning (_("Can't build SELECT statement to get last inserted row: %s"),
2715 				   lerror && lerror->message ? lerror->message : _("No detail"));
2716 			if (lerror)
2717 				g_error_free (lerror);
2718 			g_object_unref (statement);
2719 			return NULL;
2720 		}
2721 
2722 		g_object_set_data_full ((GObject*) stmt, MAKE_LAST_INSERTED_SET_ID, statement, g_object_unref);
2723 		g_object_set_data_full ((GObject*) stmt, MAKE_LAST_INSERTED_SET_ID "P", params, g_object_unref);
2724 		g_signal_connect (stmt, "reset",
2725 				  G_CALLBACK (lir_stmt_reset_cb), NULL);
2726 	}
2727 
2728 	/* execute SELECT statement */
2729 	GdaDataModel *model;
2730 	GdaSet *params;
2731 	params = g_object_get_data ((GObject*) stmt, MAKE_LAST_INSERTED_SET_ID "P");
2732 	g_assert (params);
2733 	g_assert (gda_set_set_holder_value (params, NULL, "lid", last_id));
2734         model = gda_connection_statement_execute_select (cnc, statement, params, NULL);
2735         if (!model) {
2736 		/* may have failed if the table has the WITHOUT ROWID optimization
2737 		 * see: https://www.sqlite.org/withoutrowid.html
2738 		 */
2739 		return NULL;
2740         }
2741 	else {
2742 		GdaSet *set = NULL;
2743 		GSList *holders = NULL;
2744 		gint nrows, ncols, i;
2745 
2746 		nrows = gda_data_model_get_n_rows (model);
2747 		if (nrows <= 0) {
2748 			g_warning (_("SELECT statement to get last inserted row did not return any row"));
2749 			return NULL;
2750 		}
2751 		else if (nrows > 1) {
2752 			g_warning (_("SELECT statement to get last inserted row returned too many (%d) rows"),
2753 				   nrows);
2754 			return NULL;
2755 		}
2756 		ncols = gda_data_model_get_n_columns (model);
2757 		for (i = 0; i < ncols; i++) {
2758 			GdaHolder *h;
2759 			GdaColumn *col;
2760 			gchar *id;
2761 			const GValue *cvalue;
2762 			col = gda_data_model_describe_column (model, i);
2763 			h = gda_holder_new (gda_column_get_g_type (col));
2764 			id = g_strdup_printf ("+%d", i);
2765 			g_object_set (G_OBJECT (h), "id", id,
2766 				      "name", gda_column_get_name (col), NULL);
2767 			g_free (id);
2768 			cvalue = gda_data_model_get_value_at (model, i, 0, NULL);
2769 			if (!cvalue || !gda_holder_set_value (h, cvalue, NULL)) {
2770 				if (holders) {
2771 					g_slist_foreach (holders, (GFunc) g_object_unref, NULL);
2772 					g_slist_free (holders);
2773 					holders = NULL;
2774 				}
2775 				break;
2776 			}
2777 			holders = g_slist_prepend (holders, h);
2778 		}
2779 		g_object_unref (model);
2780 
2781 		if (holders) {
2782 			holders = g_slist_reverse (holders);
2783 			set = gda_set_new_read_only (holders);
2784 			g_slist_foreach (holders, (GFunc) g_object_unref, NULL);
2785 			g_slist_free (holders);
2786 		}
2787 
2788 		return set;
2789 	}
2790 }
2791 
2792 /*
2793  * This function opens any blob which has been inserted or updated as a ZERO blob (the blob currently
2794  * only contains zeros) and fills its contents with the blob passed as parameter when executing the statement.
2795  *
2796  * @blobs_list is freed here
2797  */
2798 static GdaConnectionEvent *
fill_blob_data(GdaConnection * cnc,GdaSet * params,SqliteConnectionData * cdata,GdaSqlitePStmt * pstmt,GSList * blobs_list,GError ** error)2799 fill_blob_data (GdaConnection *cnc, GdaSet *params,
2800 		SqliteConnectionData *cdata, GdaSqlitePStmt *pstmt, GSList *blobs_list, GError **error)
2801 {
2802 	if (!blobs_list)
2803 		/* nothing to do */
2804 		return NULL;
2805 
2806 	const gchar *cstr = NULL;
2807 	GdaStatement *stmt;
2808 	sqlite3_int64 rowid = -1;
2809 	GdaDataModel *model = NULL;
2810 	GError *lerror = NULL;
2811 
2812 	/* get single ROWID or a list of ROWID */
2813 	stmt = gda_pstmt_get_gda_statement (GDA_PSTMT (pstmt));
2814 	if (!stmt) {
2815 		g_set_error (&lerror, GDA_SERVER_PROVIDER_ERROR,
2816 			     GDA_SERVER_PROVIDER_INTERNAL_ERROR, "%s",
2817 			     _("Prepared statement has no associated GdaStatement"));
2818 		goto blobs_out;
2819 	}
2820 	if (gda_statement_get_statement_type (stmt) == GDA_SQL_STATEMENT_INSERT) {
2821 		rowid = SQLITE3_CALL (sqlite3_last_insert_rowid) (cdata->connection);
2822 	}
2823 	else if (gda_statement_get_statement_type (stmt) == GDA_SQL_STATEMENT_UPDATE) {
2824 		GdaSqlStatement *sel_stmt;
2825 		GdaSqlStatementSelect *sst;
2826 		sel_stmt = gda_compute_select_statement_from_update (stmt, &lerror);
2827 		if (!sel_stmt)
2828 			goto blobs_out;
2829 		sst = (GdaSqlStatementSelect*) sel_stmt->contents;
2830 		GdaSqlSelectField *oidfield;
2831 		oidfield = gda_sql_select_field_new (GDA_SQL_ANY_PART (sst));
2832 		sst->expr_list = g_slist_prepend (NULL, oidfield);
2833 		oidfield->expr = gda_sql_expr_new (GDA_SQL_ANY_PART (oidfield));
2834 		g_value_set_string ((oidfield->expr->value = gda_value_new (G_TYPE_STRING)), "rowid");
2835 
2836 		GdaStatement *select;
2837 		select = (GdaStatement *) g_object_new (GDA_TYPE_STATEMENT, "structure", sel_stmt, NULL);
2838 		gda_sql_statement_free (sel_stmt);
2839 		model = gda_connection_statement_execute_select (cnc, select, params, &lerror);
2840 		if (!model) {
2841 			g_object_unref (select);
2842 			goto blobs_out;
2843 		}
2844 		g_object_unref (select);
2845 	}
2846 
2847 	/* actual blob filling */
2848 	GSList *list;
2849 	for (list = blobs_list; list; list = list->next) {
2850 		PendingBlob *pb = (PendingBlob*) list->data;
2851 
2852 		if (rowid >= 0) {
2853 			/*g_print ("Filling BLOB @ %s.%s.%s, rowID %ld\n", pb->db, pb->table, pb->column, rowid);*/
2854 			GdaSqliteBlobOp *bop;
2855 			bop = (GdaSqliteBlobOp*) _gda_sqlite_blob_op_new (cdata, pb->db, pb->table, pb->column, rowid);
2856 			if (!bop) {
2857 				cstr =  _("Can't create SQLite BLOB handle");
2858 				goto blobs_out;
2859 			}
2860 			if (gda_blob_op_write (GDA_BLOB_OP (bop), pb->blob, 0) < 0) {
2861 				cstr =  _("Can't write to SQLite's BLOB");
2862 				g_object_unref (bop);
2863 				goto blobs_out;
2864 			}
2865 			g_object_unref (bop);
2866 		}
2867 		else if (model) {
2868 			gint nrows, i;
2869 			nrows = gda_data_model_get_n_rows (model);
2870 			for (i = 0; i < nrows; i++) {
2871 				const GValue *cvalue;
2872 				cvalue = gda_data_model_get_value_at (model, 0, i, &lerror);
2873 				if (!cvalue) {
2874 					g_object_unref (model);
2875 					goto blobs_out;
2876 				}
2877 				if (G_VALUE_TYPE (cvalue) == G_TYPE_INT64)
2878 					rowid = g_value_get_int64 (cvalue);
2879 				else if (G_VALUE_TYPE (cvalue) == G_TYPE_INT)
2880 					rowid = g_value_get_int (cvalue);
2881 				else {
2882 					g_set_error (&lerror, GDA_SERVER_PROVIDER_ERROR,
2883 						     GDA_SERVER_PROVIDER_INTERNAL_ERROR,
2884 						     _("Can't obtain SQLite BLOB handle (reported type is '%s'), "
2885 						       "please report this bug to "
2886 						       "http://bugzilla.gnome.org/ for the \"libgda\" product."),
2887 						       g_type_name (G_VALUE_TYPE (cvalue)));
2888 					g_object_unref (model);
2889 					goto blobs_out;
2890 				}
2891 				GdaSqliteBlobOp *bop;
2892 				bop = (GdaSqliteBlobOp*) _gda_sqlite_blob_op_new (cdata, pb->db, pb->table, pb->column, rowid);
2893 				if (!bop) {
2894 					cstr =  _("Can't create SQLite BLOB handle");
2895 					g_object_unref (model);
2896 					goto blobs_out;
2897 				}
2898 				if (gda_blob_op_write (GDA_BLOB_OP (bop), pb->blob, 0) < 0) {
2899 					cstr =  _("Can't write to SQLite's BLOB");
2900 					g_object_unref (bop);
2901 					g_object_unref (model);
2902 					goto blobs_out;
2903 				}
2904 				g_object_unref (bop);
2905 			}
2906 			g_object_unref (model);
2907 		}
2908 		else
2909 			cstr = _("Can't identify the ROWID of the blob to fill");
2910 	}
2911 
2912  blobs_out:
2913 	pending_blobs_free_list (blobs_list);
2914 
2915 	if (cstr) {
2916 		GdaConnectionEvent *event;
2917 		event = gda_connection_point_available_event (cnc, GDA_CONNECTION_EVENT_ERROR);
2918 		gda_connection_event_set_description (event, cstr);
2919 		g_set_error (error, GDA_SERVER_PROVIDER_ERROR,
2920 			     GDA_SERVER_PROVIDER_DATA_ERROR, "%s", cstr);
2921 		return event;
2922 	}
2923 	if (lerror) {
2924 		GdaConnectionEvent *event;
2925 		event = gda_connection_point_available_event (cnc, GDA_CONNECTION_EVENT_ERROR);
2926 		gda_connection_event_set_description (event, lerror->message ? lerror->message : _("No detail"));
2927 		g_propagate_error (error, lerror);
2928 		return event;
2929 	}
2930 	return NULL;
2931 }
2932 
2933 /*
2934  * Execute statement request
2935  */
2936 static GObject *
gda_sqlite_provider_statement_execute(GdaServerProvider * provider,GdaConnection * cnc,GdaStatement * stmt,GdaSet * params,GdaStatementModelUsage model_usage,GType * col_types,GdaSet ** last_inserted_row,guint * task_id,GdaServerProviderExecCallback async_cb,gpointer cb_data,GError ** error)2937 gda_sqlite_provider_statement_execute (GdaServerProvider *provider, GdaConnection *cnc,
2938 				       GdaStatement *stmt, GdaSet *params,
2939 				       GdaStatementModelUsage model_usage,
2940 				       GType *col_types, GdaSet **last_inserted_row,
2941 				       guint *task_id, GdaServerProviderExecCallback async_cb,
2942 				       gpointer cb_data, GError **error)
2943 {
2944 	GdaSqlitePStmt *ps;
2945 	SqliteConnectionData *cdata;
2946 	gboolean new_ps = FALSE;
2947 	gboolean allow_noparam;
2948 	gboolean empty_rs = FALSE; /* TRUE when @allow_noparam is TRUE and there is a problem with @params
2949 				      => resulting data model will be empty (0 row) */
2950 
2951 	g_return_val_if_fail (GDA_IS_CONNECTION (cnc), NULL);
2952 	g_return_val_if_fail (gda_connection_get_provider (cnc) == provider, NULL);
2953 	g_return_val_if_fail (GDA_IS_STATEMENT (stmt), NULL);
2954 
2955 	if (async_cb) {
2956 		g_set_error (error, GDA_SERVER_PROVIDER_ERROR, GDA_SERVER_PROVIDER_METHOD_NON_IMPLEMENTED_ERROR,
2957 			      "%s", _("Provider does not support asynchronous statement execution"));
2958                 return NULL;
2959 	}
2960 
2961 	allow_noparam = (model_usage & GDA_STATEMENT_MODEL_ALLOW_NOPARAM) &&
2962 		(gda_statement_get_statement_type (stmt) == GDA_SQL_STATEMENT_SELECT);
2963 
2964 	if (last_inserted_row)
2965 		*last_inserted_row = NULL;
2966 
2967 	/* get SQLite's private data */
2968 	cdata = (SqliteConnectionData*) gda_connection_internal_get_provider_data_error (cnc, error);
2969 	if (!cdata)
2970 		return NULL;
2971 
2972 	/* get/create new prepared statement */
2973 	ps = (GdaSqlitePStmt *) gda_connection_get_prepared_statement (cnc, stmt);
2974 	if (!ps) {
2975 		if (!gda_sqlite_provider_statement_prepare (provider, cnc, stmt, NULL)) {
2976 			/* try to use the SQL when parameters are rendered with their values, using GMT for timezones  */
2977 			gchar *sql;
2978 			int status;
2979 			sqlite3_stmt *sqlite_stmt;
2980 			char *left;
2981 
2982 			sql = gda_sqlite_provider_statement_to_sql (provider, cnc, stmt, params,
2983 								    GDA_STATEMENT_SQL_TIMEZONE_TO_GMT, NULL, error);
2984 			if (!sql)
2985 				return NULL;
2986 
2987 			status = SQLITE3_CALL (sqlite3_prepare_v2) (cdata->connection, sql, -1,
2988 								    &sqlite_stmt, (const char**) &left);
2989 			if (status != SQLITE_OK) {
2990 				g_set_error (error, GDA_SERVER_PROVIDER_ERROR, GDA_SERVER_PROVIDER_PREPARE_STMT_ERROR,
2991 					     "%s", SQLITE3_CALL (sqlite3_errmsg) (cdata->connection));
2992 				g_free (sql);
2993 				return NULL;
2994 			}
2995 
2996 			if (left && (*left != 0)) {
2997 				g_warning ("SQlite SQL: %s (REMAIN:%s)\n", sql, left);
2998 				*left = 0;
2999 			}
3000 
3001 			/* create a SQLitePreparedStatement */
3002 			ps = _gda_sqlite_pstmt_new (sqlite_stmt);
3003 			_GDA_PSTMT (ps)->sql = sql;
3004 
3005 			new_ps = TRUE;
3006 		}
3007 		else
3008 			ps = (GdaSqlitePStmt *) gda_connection_get_prepared_statement (cnc, stmt);
3009 	}
3010 	else if (ps->stmt_used) {
3011 		/* Don't use @ps => prepare stmt again */
3012 		GdaSqlitePStmt *nps;
3013 		nps = real_prepare (provider, cnc, stmt, error);
3014 		if (!nps)
3015 			return NULL;
3016 		gda_pstmt_copy_contents ((GdaPStmt *) ps, (GdaPStmt *) nps);
3017 		ps = nps;
3018 		new_ps = TRUE;
3019 	}
3020 
3021 	/* check that prepared stmt is not NULL, to avoid a crash */
3022 	if (!ps->sqlite_stmt) {
3023 		GdaConnectionEvent *event;
3024 		const char *errmsg;
3025 
3026 		errmsg = _("Empty statement");
3027 		event = gda_connection_point_available_event (cnc, GDA_CONNECTION_EVENT_ERROR);
3028 		gda_connection_event_set_description (event, errmsg);
3029 		gda_connection_add_event (cnc, event);
3030 		gda_connection_del_prepared_statement (cnc, stmt);
3031 		g_set_error (error, GDA_SERVER_PROVIDER_ERROR, GDA_SERVER_PROVIDER_EMPTY_STMT_ERROR,
3032 			      "%s", errmsg);
3033 		if (new_ps)
3034 			g_object_unref (ps);
3035 		return NULL;
3036 	}
3037 
3038 	/* reset prepared stmt */
3039 	if ((SQLITE3_CALL (sqlite3_reset) (ps->sqlite_stmt) != SQLITE_OK) ||
3040 	    (SQLITE3_CALL (sqlite3_clear_bindings) (ps->sqlite_stmt) != SQLITE_OK)) {
3041 		GdaConnectionEvent *event;
3042 		const char *errmsg;
3043 
3044 		errmsg = SQLITE3_CALL (sqlite3_errmsg) (cdata->connection);
3045 		event = gda_connection_point_available_event (cnc, GDA_CONNECTION_EVENT_ERROR);
3046 		gda_connection_event_set_description (event, errmsg);
3047 		gda_connection_add_event (cnc, event);
3048 		gda_connection_del_prepared_statement (cnc, stmt);
3049 		g_set_error (error, GDA_SERVER_PROVIDER_ERROR, GDA_SERVER_PROVIDER_PREPARE_STMT_ERROR,
3050 			      "%s", errmsg);
3051 		if (new_ps)
3052 			g_object_unref (ps);
3053 		return NULL;
3054 	}
3055 
3056 	/* bind statement's parameters */
3057 	GSList *list;
3058 	GdaConnectionEvent *event = NULL;
3059 	int i;
3060 	GSList *blobs_list = NULL; /* list of PendingBlob structures */
3061 
3062 	for (i = 1, list = _GDA_PSTMT (ps)->param_ids; list; list = list->next, i++) {
3063 		const gchar *pname = (gchar *) list->data;
3064 		GdaHolder *h = NULL;
3065 
3066 		if (!params) {
3067 			event = gda_connection_point_available_event (cnc, GDA_CONNECTION_EVENT_ERROR);
3068 			gda_connection_event_set_description (event, _("Missing parameter(s) to execute query"));
3069 			g_set_error (error, GDA_SERVER_PROVIDER_ERROR,
3070 				     GDA_SERVER_PROVIDER_MISSING_PARAM_ERROR,
3071 				      "%s", _("Missing parameter(s) to execute query"));
3072 			break;
3073 		}
3074 
3075 		h = gda_set_get_holder (params, pname);
3076 		if (!h) {
3077 			gchar *tmp = gda_alphanum_to_text (g_strdup (pname + 1));
3078 			if (tmp) {
3079 				h = gda_set_get_holder (params, tmp);
3080 				g_free (tmp);
3081 			}
3082 		}
3083 		if (!h) {
3084 			if (allow_noparam) {
3085 				/* bind param to NULL */
3086 				SQLITE3_CALL (sqlite3_bind_null) (ps->sqlite_stmt, i);
3087 				empty_rs = TRUE;
3088 				continue;
3089 			}
3090 			else {
3091 
3092 				gchar *str;
3093 				str = g_strdup_printf (_("Missing parameter '%s' to execute query"), pname);
3094 				event = gda_connection_point_available_event (cnc, GDA_CONNECTION_EVENT_ERROR);
3095 				gda_connection_event_set_description (event, str);
3096 				g_set_error (error, GDA_SERVER_PROVIDER_ERROR,
3097 					     GDA_SERVER_PROVIDER_MISSING_PARAM_ERROR, "%s", str);
3098 				g_free (str);
3099 				break;
3100 			}
3101 		}
3102 
3103 		if (!gda_holder_is_valid (h)) {
3104 			if (allow_noparam) {
3105 				/* bind param to NULL */
3106 				SQLITE3_CALL (sqlite3_bind_null) (ps->sqlite_stmt, i);
3107 				empty_rs = TRUE;
3108 				continue;
3109 			}
3110 			else {
3111 				gchar *str;
3112 				str = g_strdup_printf (_("Parameter '%s' is invalid"), pname);
3113 				event = gda_connection_point_available_event (cnc, GDA_CONNECTION_EVENT_ERROR);
3114 				gda_connection_event_set_description (event, str);
3115 				g_set_error (error, GDA_SERVER_PROVIDER_ERROR,
3116 					     GDA_SERVER_PROVIDER_MISSING_PARAM_ERROR, "%s", str);
3117 				g_free (str);
3118 				break;
3119 			}
3120 		}
3121 		else if (gda_holder_value_is_default (h) && !gda_holder_get_value (h)) {
3122 			/* create a new GdaStatement to handle all default values and execute it instead */
3123 			GdaSqlStatement *sqlst;
3124 			GError *lerror = NULL;
3125 			sqlst = gda_statement_rewrite_for_default_values (stmt, params, TRUE, &lerror);
3126 			if (!sqlst) {
3127 				event = gda_connection_point_available_event (cnc,
3128 									      GDA_CONNECTION_EVENT_ERROR);
3129 				gda_connection_event_set_description (event, lerror && lerror->message ?
3130 								      lerror->message :
3131 								      _("Can't rewrite statement handle default values"));
3132 				g_propagate_error (error, lerror);
3133 				break;
3134 			}
3135 
3136 			GdaStatement *rstmt;
3137 			GObject *res;
3138 			rstmt = g_object_new (GDA_TYPE_STATEMENT, "structure", sqlst, NULL);
3139 			gda_sql_statement_free (sqlst);
3140 			if (new_ps)
3141 				g_object_unref (ps);
3142 			pending_blobs_free_list (blobs_list);
3143 			res = gda_sqlite_provider_statement_execute (provider, cnc,
3144 								     rstmt, params,
3145 								     model_usage,
3146 								     col_types, last_inserted_row,
3147 								     task_id,
3148 								     async_cb, cb_data, error);
3149 			g_object_unref (rstmt);
3150 			return res;
3151 		}
3152 
3153 		const GValue *value = gda_holder_get_value (h);
3154 		/*g_print ("BINDING param '%s' to GdaHolder %p, valued to [%s]\n", pname, h, gda_value_stringify (value));*/
3155 		if (!value || gda_value_is_null (value)) {
3156 			GdaStatement *rstmt;
3157 			if (! gda_rewrite_statement_for_null_parameters (stmt, params, &rstmt, error))
3158 				SQLITE3_CALL (sqlite3_bind_null) (ps->sqlite_stmt, i);
3159 			else if (!rstmt)
3160 				return NULL;
3161 			else {
3162 				/* The strategy here is to execute @rstmt using its prepared
3163 				 * statement, but with common data from @ps. Beware that
3164 				 * the @param_ids attribute needs to be retained (i.e. it must not
3165 				 * be the one copied from @ps) */
3166 				GObject *obj;
3167 				GdaSqlitePStmt *tps;
3168 				GdaPStmt *gtps;
3169 				GSList *prep_param_ids, *copied_param_ids;
3170 				if (!gda_sqlite_provider_statement_prepare (provider, cnc,
3171 									    rstmt, error))
3172 					return NULL;
3173 				tps = (GdaSqlitePStmt *)
3174 					gda_connection_get_prepared_statement (cnc, rstmt);
3175 				gtps = (GdaPStmt *) tps;
3176 
3177 				/* keep @param_ids to avoid being cleared by gda_pstmt_copy_contents() */
3178 				prep_param_ids = gtps->param_ids;
3179 				gtps->param_ids = NULL;
3180 
3181 				/* actual copy */
3182 				gda_pstmt_copy_contents ((GdaPStmt *) ps, (GdaPStmt *) tps);
3183 
3184 				/* restore previous @param_ids */
3185 				copied_param_ids = gtps->param_ids;
3186 				gtps->param_ids = prep_param_ids;
3187 
3188 				/* execute */
3189 				obj = gda_sqlite_provider_statement_execute (provider, cnc,
3190 									     rstmt, params,
3191 									     model_usage,
3192 									     col_types,
3193 									     last_inserted_row,
3194 									     task_id, async_cb,
3195 									     cb_data, error);
3196 				/* clear original @param_ids and restore copied one */
3197 				g_slist_foreach (prep_param_ids, (GFunc) g_free, NULL);
3198 				g_slist_free (prep_param_ids);
3199 
3200 				gtps->param_ids = copied_param_ids;
3201 
3202 				/*if (GDA_IS_DATA_MODEL (obj))
3203 				  gda_data_model_dump ((GdaDataModel*) obj, NULL);*/
3204 
3205 				g_object_unref (rstmt);
3206 
3207 				if (new_ps)
3208 					g_object_unref (ps);
3209 				pending_blobs_free_list (blobs_list);
3210 				return obj;
3211 			}
3212 		}
3213 		else if (G_VALUE_TYPE (value) == G_TYPE_STRING)
3214 			SQLITE3_CALL (sqlite3_bind_text) (ps->sqlite_stmt, i,
3215 							  g_value_get_string (value), -1, SQLITE_TRANSIENT);
3216 		else if (G_VALUE_TYPE (value) == G_TYPE_INT)
3217 			SQLITE3_CALL (sqlite3_bind_int) (ps->sqlite_stmt, i, g_value_get_int (value));
3218 		else if (G_VALUE_TYPE (value) == G_TYPE_LONG)
3219 			SQLITE3_CALL (sqlite3_bind_int) (ps->sqlite_stmt, i, g_value_get_long (value));
3220 		else if (G_VALUE_TYPE (value) == G_TYPE_DOUBLE)
3221 			SQLITE3_CALL (sqlite3_bind_double) (ps->sqlite_stmt, i, g_value_get_double (value));
3222 		else if (G_VALUE_TYPE (value) == G_TYPE_FLOAT)
3223 			SQLITE3_CALL (sqlite3_bind_double) (ps->sqlite_stmt, i, g_value_get_float (value));
3224 		else if (G_VALUE_TYPE (value) == G_TYPE_UINT)
3225 			SQLITE3_CALL (sqlite3_bind_int) (ps->sqlite_stmt, i, g_value_get_uint (value));
3226 		else if (G_VALUE_TYPE (value) == G_TYPE_BOOLEAN)
3227 			SQLITE3_CALL (sqlite3_bind_int) (ps->sqlite_stmt, i, g_value_get_boolean (value) ? 1 : 0);
3228 		else if (G_VALUE_TYPE (value) == G_TYPE_INT64)
3229 			SQLITE3_CALL (sqlite3_bind_int64) (ps->sqlite_stmt, i, g_value_get_int64 (value));
3230 		else if (G_VALUE_TYPE (value) == G_TYPE_UINT64)
3231 			SQLITE3_CALL (sqlite3_bind_int64) (ps->sqlite_stmt, i, g_value_get_uint64 (value));
3232 		else if (G_VALUE_TYPE (value) == GDA_TYPE_SHORT)
3233 			SQLITE3_CALL (sqlite3_bind_int) (ps->sqlite_stmt, i, gda_value_get_short (value));
3234 		else if (G_VALUE_TYPE (value) == GDA_TYPE_USHORT)
3235 			SQLITE3_CALL (sqlite3_bind_int) (ps->sqlite_stmt, i, gda_value_get_ushort (value));
3236 		else if (G_VALUE_TYPE (value) == G_TYPE_CHAR)
3237 			SQLITE3_CALL (sqlite3_bind_int) (ps->sqlite_stmt, i, g_value_get_schar (value));
3238 		else if (G_VALUE_TYPE (value) == G_TYPE_UCHAR)
3239 			SQLITE3_CALL (sqlite3_bind_int) (ps->sqlite_stmt, i, g_value_get_uchar (value));
3240 		else if (G_VALUE_TYPE (value) == GDA_TYPE_BLOB) {
3241 			glong blob_len;
3242 			GdaBlob *blob = (GdaBlob*) gda_value_get_blob (value);
3243 			const gchar *str = NULL;
3244 
3245 			/* force reading the complete BLOB into memory */
3246 			if (blob->op)
3247 				blob_len = gda_blob_op_get_length (blob->op);
3248 			else
3249 				blob_len = ((GdaBinary*) blob)->binary_length;
3250 			if (blob_len < 0)
3251 				str = _("Can't get BLOB's length");
3252 			else if (blob_len >= G_MAXINT)
3253 				str = _("BLOB is too big");
3254 
3255 			if (str) {
3256 				event = gda_connection_point_available_event (cnc, GDA_CONNECTION_EVENT_ERROR);
3257 				gda_connection_event_set_description (event, str);
3258 				g_set_error (error, GDA_SERVER_PROVIDER_ERROR,
3259 					     GDA_SERVER_PROVIDER_DATA_ERROR, "%s", str);
3260 				break;
3261 			}
3262 
3263 			PendingBlob *pb;
3264 			GError *lerror = NULL;
3265 			pb = make_pending_blob (cnc, stmt, h, &lerror);
3266 			if (!pb) {
3267 				event = gda_connection_point_available_event (cnc, GDA_CONNECTION_EVENT_ERROR);
3268 				gda_connection_event_set_description (event,
3269 				   lerror && lerror->message ? lerror->message : _("No detail"));
3270 
3271 				g_propagate_error (error, lerror);
3272 				break;
3273 			}
3274 			pb->blob = blob;
3275 			blobs_list = g_slist_prepend (blobs_list, pb);
3276 
3277 			if (SQLITE3_CALL (sqlite3_bind_zeroblob) (ps->sqlite_stmt, i, (int) blob_len) !=
3278 			    SQLITE_OK) {
3279 				event = gda_connection_point_available_event (cnc, GDA_CONNECTION_EVENT_ERROR);
3280 				gda_connection_event_set_description (event,
3281 				   lerror && lerror->message ? lerror->message : _("No detail"));
3282 
3283 				g_propagate_error (error, lerror);
3284 				break;
3285 			}
3286 		}
3287 		else if (G_VALUE_TYPE (value) == GDA_TYPE_BINARY) {
3288 			GdaBinary *bin = (GdaBinary *) gda_value_get_binary (value);
3289 			SQLITE3_CALL (sqlite3_bind_blob) (ps->sqlite_stmt, i,
3290 							  bin->data, bin->binary_length, SQLITE_TRANSIENT);
3291 		}
3292 		else if (G_VALUE_TYPE (value) == GDA_TYPE_TIME) {
3293 			GString *string;
3294 			GdaTime *gtime;
3295 			gboolean tofree = FALSE;
3296 
3297 			gtime = (GdaTime *) gda_value_get_time (value);
3298 
3299 			string = g_string_new ("");
3300 			if (gtime->timezone != GDA_TIMEZONE_INVALID) {
3301 				/* SQLite cant' store timezone information, so if timezone information is
3302 				 * provided, we do our best and convert it to GMT */
3303 				gtime = gda_time_copy (gtime);
3304 				tofree = TRUE;
3305 				gda_time_change_timezone (gtime, 0);
3306 			}
3307 
3308 			g_string_append_printf (string, "%02u:%02u:%02u",
3309 						gtime->hour,
3310 						gtime->minute,
3311 						gtime->second);
3312 			if (gtime->fraction > 0)
3313 				g_string_append_printf (string, ".%lu", gtime->fraction);
3314 
3315 			if (tofree)
3316 				gda_time_free (gtime);
3317 			SQLITE3_CALL (sqlite3_bind_text) (ps->sqlite_stmt, i, g_string_free (string, FALSE), -1, g_free);
3318 		}
3319 		else if (G_VALUE_TYPE (value) == G_TYPE_DATE) {
3320 			gchar *str;
3321 			const GDate *ts;
3322 
3323 			ts = g_value_get_boxed (value);
3324 			str = g_strdup_printf ("%4d-%02d-%02d", g_date_get_year (ts),
3325 					       g_date_get_month (ts), g_date_get_day (ts));
3326 			SQLITE3_CALL (sqlite3_bind_text) (ps->sqlite_stmt, i, str, -1, g_free);
3327 		}
3328 		else if (G_VALUE_TYPE (value) == GDA_TYPE_TIMESTAMP) {
3329 			GString *string;
3330 			GdaTimestamp *timestamp;
3331 			gboolean tofree = FALSE;
3332 
3333 			timestamp = (GdaTimestamp *) gda_value_get_timestamp (value);
3334 
3335 			string = g_string_new ("");
3336 			if (timestamp->timezone != GDA_TIMEZONE_INVALID) {
3337 				/* SQLite cant' store timezone information, so if timezone information is
3338 				 * provided, we do our best and convert it to GMT */
3339 				timestamp = gda_timestamp_copy (timestamp);
3340 				tofree = TRUE;
3341 				gda_timestamp_change_timezone (timestamp, 0);
3342 			}
3343 
3344 			g_string_append_printf (string, "%04u-%02u-%02u %02u:%02u:%02u",
3345 						timestamp->year,
3346 						timestamp->month,
3347 						timestamp->day,
3348 						timestamp->hour,
3349 						timestamp->minute,
3350 						timestamp->second);
3351 			if (timestamp->fraction > 0)
3352 				g_string_append_printf (string, ".%lu", timestamp->fraction);
3353 
3354 			if (tofree)
3355 				gda_timestamp_free (timestamp);
3356 
3357 			SQLITE3_CALL (sqlite3_bind_text) (ps->sqlite_stmt, i, g_string_free (string, FALSE), -1, g_free);
3358 		}
3359 		else if (G_VALUE_TYPE (value) == GDA_TYPE_NUMERIC) {
3360 			const GdaNumeric *gdan;
3361 
3362 			gdan = gda_value_get_numeric (value);
3363 			SQLITE3_CALL (sqlite3_bind_text) (ps->sqlite_stmt, i, gda_numeric_get_string((GdaNumeric*)gdan), -1, SQLITE_TRANSIENT);
3364 		}
3365 		else {
3366 			gchar *str;
3367 			str = g_strdup_printf (_("Non handled data type '%s'"),
3368 					       g_type_name (G_VALUE_TYPE (value)));
3369 			event = gda_connection_point_available_event (cnc, GDA_CONNECTION_EVENT_ERROR);
3370 			gda_connection_event_set_description (event, str);
3371 			g_set_error (error, GDA_SERVER_PROVIDER_ERROR,
3372 				     GDA_SERVER_PROVIDER_MISSING_PARAM_ERROR, "%s", str);
3373 			g_free (str);
3374 			break;
3375 		}
3376 	}
3377 
3378 	if (event) {
3379 		gda_connection_add_event (cnc, event);
3380 		if (new_ps)
3381 			g_object_unref (ps);
3382 		pending_blobs_free_list (blobs_list);
3383 		return NULL;
3384 	}
3385 
3386 	/* add a connection event */
3387 	event = gda_connection_point_available_event (cnc, GDA_CONNECTION_EVENT_COMMAND);
3388         gda_connection_event_set_description (event, _GDA_PSTMT (ps)->sql);
3389         gda_connection_add_event (cnc, event);
3390 
3391 	/* treat prepared and bound statement */
3392 	if (! g_ascii_strncasecmp (_GDA_PSTMT (ps)->sql, "SELECT", 6) ||
3393             ! g_ascii_strncasecmp (_GDA_PSTMT (ps)->sql, "PRAGMA", 6) ||
3394             ! g_ascii_strncasecmp (_GDA_PSTMT (ps)->sql, "EXPLAIN", 7)) {
3395 		GObject *data_model;
3396 		GdaDataModelAccessFlags flags;
3397 
3398 		if (model_usage & GDA_STATEMENT_MODEL_RANDOM_ACCESS)
3399 			flags = GDA_DATA_MODEL_ACCESS_RANDOM;
3400 		else if (model_usage & GDA_DATA_MODEL_ACCESS_CURSOR_BACKWARD)
3401 			flags = GDA_DATA_MODEL_ACCESS_RANDOM;
3402 		else
3403 			flags = GDA_DATA_MODEL_ACCESS_CURSOR_FORWARD;
3404 
3405                 data_model = (GObject *) _gda_sqlite_recordset_new (cnc, ps, params, flags, col_types, empty_rs);
3406 		GError **exceptions;
3407 		exceptions = gda_data_model_get_exceptions (GDA_DATA_MODEL (data_model));
3408 		if (exceptions && exceptions[0]) {
3409 			GError *e;
3410 			e = g_error_copy (exceptions[0]);
3411 			event = gda_connection_point_available_event (cnc, GDA_CONNECTION_EVENT_ERROR);
3412 			gda_connection_event_set_description (event, e->message ? e->message : _("No detail"));
3413 			g_propagate_error (error, e);
3414 			g_object_unref (data_model);
3415 			return NULL;
3416 		}
3417 		else {
3418 			gda_connection_internal_statement_executed (cnc, stmt, params, NULL);
3419 			if (new_ps)
3420 				g_object_unref (ps);
3421 			pending_blobs_free_list (blobs_list);
3422 			return data_model;
3423 		}
3424         }
3425 	else {
3426                 int status, changes;
3427                 sqlite3 *handle;
3428 		gboolean transaction_started = FALSE;
3429 
3430 		if (blobs_list) {
3431 			GError *lerror = NULL;
3432 			if (! _gda_sqlite_check_transaction_started (cdata->gdacnc,
3433 								     &transaction_started, &lerror)) {
3434 				const gchar *errmsg = _("Could not start transaction to create BLOB");
3435 				event = gda_connection_point_available_event (cnc,
3436 									      GDA_CONNECTION_EVENT_ERROR);
3437 				if (lerror) {
3438 					gda_connection_event_set_description (event,
3439 									      lerror && lerror->message ?
3440 									      lerror->message : errmsg);
3441 					g_propagate_error (error, lerror);
3442 				}
3443 				else {
3444 					gda_connection_event_set_description (event, errmsg);
3445 					g_set_error (error, GDA_SERVER_PROVIDER_ERROR,
3446 						     GDA_SERVER_PROVIDER_STATEMENT_EXEC_ERROR, "%s", errmsg);
3447 				}
3448 				if (new_ps)
3449 					g_object_unref (ps);
3450 				pending_blobs_free_list (blobs_list);
3451 				return NULL;
3452 			}
3453 		}
3454 
3455                 /* actually execute the command */
3456                 handle = SQLITE3_CALL (sqlite3_db_handle) (ps->sqlite_stmt);
3457                 status = SQLITE3_CALL (sqlite3_step) (ps->sqlite_stmt);
3458                 changes = SQLITE3_CALL (sqlite3_changes) (handle);
3459                 if (status != SQLITE_DONE) {
3460                         if (SQLITE3_CALL (sqlite3_errcode) (handle) != SQLITE_OK) {
3461 				const char *errmsg;
3462                                 SQLITE3_CALL (sqlite3_reset) (ps->sqlite_stmt);
3463 
3464 				errmsg = SQLITE3_CALL (sqlite3_errmsg) (handle);
3465                                 event = gda_connection_point_available_event (cnc, GDA_CONNECTION_EVENT_ERROR);
3466                                 gda_connection_event_set_description (event, errmsg);
3467 				g_set_error (error, GDA_SERVER_PROVIDER_ERROR,
3468 					     GDA_SERVER_PROVIDER_STATEMENT_EXEC_ERROR, "%s", errmsg);
3469 
3470                                 gda_connection_add_event (cnc, event);
3471 				gda_connection_internal_statement_executed (cnc, stmt, params, event);
3472 				if (new_ps)
3473 					g_object_unref (ps);
3474 				pending_blobs_free_list (blobs_list);
3475 				if (transaction_started)
3476 					gda_connection_rollback_transaction (cdata->gdacnc, NULL, NULL);
3477 				return NULL;
3478                         }
3479 			else {
3480 				/* could be SQLITE_SCHEMA if database schema has changed and
3481 				 * changes are incompatible with statement */
3482 				TO_IMPLEMENT;
3483 				if (new_ps)
3484 					g_object_unref (ps);
3485 				pending_blobs_free_list (blobs_list);
3486 				if (transaction_started)
3487 					gda_connection_rollback_transaction (cdata->gdacnc, NULL, NULL);
3488 				return NULL;
3489 			}
3490                 }
3491                 else {
3492 			/* fill blobs's data */
3493 			event = fill_blob_data (cnc, params, cdata, ps, blobs_list, error);
3494 			if (event) {
3495 				/* an error occurred */
3496 				SQLITE3_CALL (sqlite3_reset) (ps->sqlite_stmt);
3497 				if (new_ps)
3498 					g_object_unref (ps);
3499 				if (transaction_started)
3500 					gda_connection_rollback_transaction (cdata->gdacnc, NULL, NULL);
3501 				return NULL;
3502 			}
3503 			else if (transaction_started)
3504 				gda_connection_commit_transaction (cdata->gdacnc, NULL, NULL);
3505 
3506 			gchar *str = NULL;
3507 			gboolean count_changes = FALSE;
3508 
3509                         if (! g_ascii_strncasecmp (_GDA_PSTMT (ps)->sql, "DELETE", 6)) {
3510 				count_changes = TRUE;
3511                                 str = g_strdup_printf ("DELETE %d (see SQLite documentation for a \"DELETE * FROM table\" query)",
3512                                                        changes);
3513 			}
3514                         else if (! g_ascii_strncasecmp (_GDA_PSTMT (ps)->sql, "INSERT", 6)) {
3515 				sqlite3_int64 last_id;
3516 				count_changes = TRUE;
3517 				last_id = SQLITE3_CALL (sqlite3_last_insert_rowid) (handle);
3518 				str = g_strdup_printf ("INSERT %lld %d", last_id, changes);
3519 				if (last_inserted_row)
3520 					*last_inserted_row = make_last_inserted_set (cnc, stmt, last_id);
3521 			}
3522 			else if (!g_ascii_strncasecmp (_GDA_PSTMT (ps)->sql, "UPDATE", 6)) {
3523 				count_changes = TRUE;
3524 				str = g_strdup_printf ("UPDATE %d", changes);
3525 			}
3526 			else if (*(_GDA_PSTMT (ps)->sql)) {
3527 				gchar *tmp = g_ascii_strup (_GDA_PSTMT (ps)->sql, -1);
3528 				for (str = tmp; *str && (*str != ' ') && (*str != '\t') &&
3529 					     (*str != '\n'); str++);
3530 				*str = 0;
3531 				if (changes > 0) {
3532 					str = g_strdup_printf ("%s %d", tmp,
3533 							       changes);
3534 					g_free (tmp);
3535 				}
3536 				else
3537 					str = tmp;
3538 			}
3539 
3540 			if (str) {
3541                                 event = gda_connection_point_available_event (cnc, GDA_CONNECTION_EVENT_NOTICE);
3542                                 gda_connection_event_set_description (event, str);
3543                                 g_free (str);
3544                                 gda_connection_add_event (cnc, event);
3545                         }
3546 			gda_connection_internal_statement_executed (cnc, stmt, params, event);
3547 			SQLITE3_CALL (sqlite3_reset) (ps->sqlite_stmt);
3548 			if (new_ps)
3549 				g_object_unref (ps);
3550 
3551 			GObject *set;
3552 			if (count_changes) {
3553 				GdaHolder *holder;
3554 				GValue *value;
3555 				GSList *list;
3556 
3557 				holder = gda_holder_new (G_TYPE_INT);
3558 				g_object_set ((GObject*) holder, "id", "IMPACTED_ROWS", NULL);
3559 				g_value_set_int ((value = gda_value_new (G_TYPE_INT)), changes);
3560 				gda_holder_take_value (holder, value, NULL);
3561 				list = g_slist_append (NULL, holder);
3562 				set = (GObject*) gda_set_new_read_only (list);
3563 				g_slist_free (list);
3564 				g_object_unref (holder);
3565 			}
3566 			else
3567 				set = (GObject*) gda_set_new_read_only (NULL);
3568 
3569 			return set;
3570 		}
3571 	}
3572 }
3573 
3574 /*
3575  * Rewrites a statement in case some parameters in @params are set to DEFAULT, for INSERT or UPDATE statements
3576  *
3577  * Removes any default value inserted or updated
3578  */
3579 static GdaSqlStatement *
gda_sqlite_statement_rewrite(GdaServerProvider * provider,GdaConnection * cnc,GdaStatement * stmt,GdaSet * params,GError ** error)3580 gda_sqlite_statement_rewrite (GdaServerProvider *provider, GdaConnection *cnc,
3581 			      GdaStatement *stmt, GdaSet *params, GError **error)
3582 {
3583 	if (cnc) {
3584 		g_return_val_if_fail (GDA_IS_CONNECTION (cnc), NULL);
3585 		g_return_val_if_fail (gda_connection_get_provider (cnc) == provider, NULL);
3586 	}
3587 	return gda_statement_rewrite_for_default_values (stmt, params, TRUE, error);
3588 }
3589 
3590 /*
3591  * SQLite's extra functions' implementations
3592  */
3593 static void
scalar_gda_file_exists_func(sqlite3_context * context,int argc,sqlite3_value ** argv)3594 scalar_gda_file_exists_func (sqlite3_context *context, int argc, sqlite3_value **argv)
3595 {
3596 	const gchar *path;
3597 
3598 	if (argc != 1) {
3599 		SQLITE3_CALL (sqlite3_result_error) (context, _("Function requires one argument"), -1);
3600 		return;
3601 	}
3602 
3603 	path = (gchar *) SQLITE3_CALL (sqlite3_value_text) (argv [0]);
3604 	if (g_file_test (path, G_FILE_TEST_EXISTS))
3605 		SQLITE3_CALL (sqlite3_result_int) (context, 1);
3606 	else
3607 		SQLITE3_CALL (sqlite3_result_int) (context, 0);
3608 }
3609 
3610 
3611 static void
scalar_gda_hex_print_func(sqlite3_context * context,int argc,sqlite3_value ** argv)3612 scalar_gda_hex_print_func (sqlite3_context *context, int argc, sqlite3_value **argv)
3613 {
3614 	GdaBinary *bin;
3615 	GdaDataHandler *dh;
3616 	GValue *value;
3617 	gchar *str;
3618 
3619 	if (argc != 1) {
3620 		SQLITE3_CALL (sqlite3_result_error) (context, _("Function requires one argument"), -1);
3621 		return;
3622 	}
3623 
3624 	bin = g_new0 (GdaBinary, 1);
3625 	bin->data = (guchar*) SQLITE3_CALL (sqlite3_value_blob) (argv [0]);
3626 	if (!bin->data) {
3627 		g_free (bin);
3628 		SQLITE3_CALL (sqlite3_result_null) (context);
3629 		return;
3630 	}
3631 	bin->binary_length = SQLITE3_CALL (sqlite3_value_bytes) (argv [0]);
3632 	gda_value_take_binary ((value = gda_value_new (GDA_TYPE_BINARY)), bin);
3633 	dh = gda_data_handler_get_default (GDA_TYPE_BINARY);
3634 	str = gda_data_handler_get_str_from_value (dh, value);
3635 
3636 	bin->data = NULL;
3637 	bin->binary_length = 0;
3638 	gda_value_free (value);
3639 	SQLITE3_CALL (sqlite3_result_text) (context, str, -1, g_free);
3640 }
3641 
3642 static void
scalar_gda_hex_print_func2(sqlite3_context * context,int argc,sqlite3_value ** argv)3643 scalar_gda_hex_print_func2 (sqlite3_context *context, int argc, sqlite3_value **argv)
3644 {
3645 	GdaBinary *bin;
3646 	GdaDataHandler *dh;
3647 	GValue *value;
3648 	gchar *str;
3649 	gint size;
3650 
3651 	if (argc != 2) {
3652 		SQLITE3_CALL (sqlite3_result_error) (context, _("Function requires two arguments"), -1);
3653 		return;
3654 	}
3655 
3656 	bin = g_new0 (GdaBinary, 1);
3657 	bin->data = (guchar*) SQLITE3_CALL (sqlite3_value_blob) (argv [0]);
3658 	if (!bin->data) {
3659 		g_free (bin);
3660 		SQLITE3_CALL (sqlite3_result_null) (context);
3661 		return;
3662 	}
3663 	bin->binary_length = SQLITE3_CALL (sqlite3_value_bytes) (argv [0]);
3664 	gda_value_take_binary ((value = gda_value_new (GDA_TYPE_BINARY)), bin);
3665 	dh = gda_data_handler_get_default (GDA_TYPE_BINARY);
3666 	str = gda_data_handler_get_str_from_value (dh, value);
3667 
3668 	bin->data = NULL;
3669 	bin->binary_length = 0;
3670 	gda_value_free (value);
3671 
3672 	size = SQLITE3_CALL (sqlite3_value_int) (argv [1]);
3673 
3674 	SQLITE3_CALL (sqlite3_result_text) (context, str, size, g_free);
3675 }
3676 
3677 static void
scalar_rmdiacr(sqlite3_context * context,int argc,sqlite3_value ** argv)3678 scalar_rmdiacr (sqlite3_context *context, int argc, sqlite3_value **argv)
3679 {
3680 	gchar *data, *tmp;
3681 	CaseModif ncase = CASE_UNCHANGED;
3682 
3683 	if (argc == 2) {
3684 		data = (gchar*) SQLITE3_CALL (sqlite3_value_text) (argv [1]);
3685 		if ((*data == 'u') || (*data == 'U'))
3686 			ncase = CASE_UP;
3687 		else if ((*data == 'l') || (*data == 'l'))
3688 			ncase = CASE_DOWN;
3689 	}
3690 	else if (argc != 1) {
3691 		SQLITE3_CALL (sqlite3_result_error) (context, _("Function requires one or two arguments"), -1);
3692 		return;
3693 	}
3694 
3695 	data = (gchar*) SQLITE3_CALL (sqlite3_value_text) (argv [0]);
3696 	if (!data) {
3697 		SQLITE3_CALL (sqlite3_result_null) (context);
3698 		return;
3699 	}
3700 
3701 	tmp = remove_diacritics_and_change_case (data, -1, ncase);
3702 	SQLITE3_CALL (sqlite3_result_text) (context, tmp, -1, g_free);
3703 }
3704 
3705 static void
scalar_lower(sqlite3_context * context,int argc,sqlite3_value ** argv)3706 scalar_lower (sqlite3_context *context, int argc, sqlite3_value **argv)
3707 {
3708 	gchar *data, *tmp;
3709 
3710 	if (argc != 1) {
3711 		SQLITE3_CALL (sqlite3_result_error) (context, _("Function requires one argument"), -1);
3712 		return;
3713 	}
3714 
3715 	data = (gchar*) SQLITE3_CALL (sqlite3_value_text) (argv [0]);
3716 	if (!data) {
3717 		SQLITE3_CALL (sqlite3_result_null) (context);
3718 		return;
3719 	}
3720 
3721 	tmp = g_utf8_strdown (data, -1);
3722 	SQLITE3_CALL (sqlite3_result_text) (context, tmp, -1, g_free);
3723 }
3724 
3725 static void
scalar_upper(sqlite3_context * context,int argc,sqlite3_value ** argv)3726 scalar_upper (sqlite3_context *context, int argc, sqlite3_value **argv)
3727 {
3728 	gchar *data, *tmp;
3729 
3730 	if (argc != 1) {
3731 		SQLITE3_CALL (sqlite3_result_error) (context, _("Function requires one argument"), -1);
3732 		return;
3733 	}
3734 
3735 	data = (gchar*) SQLITE3_CALL (sqlite3_value_text) (argv [0]);
3736 	if (!data) {
3737 		SQLITE3_CALL (sqlite3_result_null) (context);
3738 		return;
3739 	}
3740 
3741 	tmp = g_utf8_strup (data, -1);
3742 	SQLITE3_CALL (sqlite3_result_text) (context, tmp, -1, g_free);
3743 }
3744 
3745 static void
scalar_gda_hex_func(sqlite3_context * context,int argc,sqlite3_value ** argv)3746 scalar_gda_hex_func (sqlite3_context *context, int argc, sqlite3_value **argv)
3747 {
3748 	guchar *data;
3749 	gint length;
3750 	GString *string;
3751 	gint i;
3752 
3753 	if (argc != 1) {
3754 		SQLITE3_CALL (sqlite3_result_error) (context, _("Function requires one argument"), -1);
3755 		return;
3756 	}
3757 
3758 	data = (guchar*) SQLITE3_CALL (sqlite3_value_blob) (argv [0]);
3759 	if (!data) {
3760 		SQLITE3_CALL (sqlite3_result_null) (context);
3761 		return;
3762 	}
3763 
3764 	length = SQLITE3_CALL (sqlite3_value_bytes) (argv [0]);
3765 	string = g_string_new ("");
3766 	for (i = 0; i < length; i++) {
3767 		if ((i > 0) && (i % 4 == 0))
3768 			g_string_append_c (string, ' ');
3769 		g_string_append_printf (string, "%02x", data [i]);
3770 	}
3771 
3772 	SQLITE3_CALL (sqlite3_result_text) (context, string->str, -1, g_free);
3773 	g_string_free (string, FALSE);
3774 }
3775 
3776 static void
scalar_gda_hex_func2(sqlite3_context * context,int argc,sqlite3_value ** argv)3777 scalar_gda_hex_func2 (sqlite3_context *context, int argc, sqlite3_value **argv)
3778 {
3779 	guchar *data;
3780 	gint length;
3781 	GString *string;
3782 	gint i;
3783 	guint size;
3784 
3785 	if (argc != 2) {
3786 		SQLITE3_CALL (sqlite3_result_error) (context, _("Function requires two arguments"), -1);
3787 		return;
3788 	}
3789 
3790 	data = (guchar*) SQLITE3_CALL (sqlite3_value_blob) (argv [0]);
3791 	if (!data) {
3792 		SQLITE3_CALL (sqlite3_result_null) (context);
3793 		return;
3794 	}
3795 
3796 	length = SQLITE3_CALL (sqlite3_value_bytes) (argv [0]);
3797 	size = SQLITE3_CALL (sqlite3_value_int) (argv [1]);
3798 
3799 	string = g_string_new ("");
3800 	for (i = 0; (i < length) && (string->len < (size / 2) * 2 + 2); i++) {
3801 		if ((i > 0) && (i % 4 == 0))
3802 			g_string_append_c (string, ' ');
3803 		g_string_append_printf (string, "%02x", data [i]);
3804 	}
3805 
3806 	if (string->len > size)
3807 		string->str[size] = 0;
3808 	SQLITE3_CALL (sqlite3_result_text) (context, string->str, -1, g_free);
3809 	g_string_free (string, FALSE);
3810 }
3811 
3812 static void
scalar_regexp_func(sqlite3_context * context,int argc,sqlite3_value ** argv)3813 scalar_regexp_func (sqlite3_context *context, int argc, sqlite3_value **argv)
3814 {
3815 	GRegex *regex = NULL;
3816 	GError *error = NULL;
3817 	const gchar *str, *pattern, *options = NULL;
3818 	GRegexCompileFlags flags = G_REGEX_OPTIMIZE;
3819 	gboolean as_boolean = TRUE;
3820 
3821 #define MAX_DEFINED_REGEX 10
3822 	static GArray *re_array = NULL; /* array of signatures (pattern+option) */
3823 	static GHashTable *re_hash = NULL; /* hash of GRegex */
3824 
3825 	if ((argc != 2) && (argc != 3)) {
3826 		SQLITE3_CALL (sqlite3_result_error) (context, _("Function requires two or three arguments"), -1);
3827 		return;
3828 	}
3829 
3830 	str = (gchar*) SQLITE3_CALL (sqlite3_value_text) (argv [1]);
3831 	if (!str) {
3832 		SQLITE3_CALL (sqlite3_result_null) (context);
3833 		return;
3834 	}
3835 
3836 	pattern = (gchar*) SQLITE3_CALL (sqlite3_value_text) (argv [0]);
3837 	if (!pattern) {
3838 		SQLITE3_CALL (sqlite3_result_null) (context);
3839 		return;
3840 	}
3841 
3842 	if (argc == 3)
3843 		options = (gchar*) SQLITE3_CALL (sqlite3_value_text) (argv [2]);
3844 
3845 	if (options) {
3846 		const gchar *ptr;
3847 		for (ptr = options; *ptr; ptr++) {
3848 			switch (*ptr) {
3849 			case 'i':
3850 			case 'I':
3851 				flags |= G_REGEX_CASELESS;
3852 				break;
3853 			case 'm':
3854 			case 'M':
3855 				flags |= G_REGEX_MULTILINE;
3856 				break;
3857 			case 'v':
3858 			case 'V':
3859 				as_boolean = FALSE;
3860 				break;
3861 			}
3862 		}
3863 	}
3864 
3865 	GString *sig;
3866 	sig = g_string_new (pattern);
3867 	g_string_append_c (sig, 0x01);
3868 	if (options && *options)
3869 		g_string_append (sig, options);
3870 
3871 	if (re_hash)
3872 		regex = g_hash_table_lookup (re_hash, sig->str);
3873 	if (regex) {
3874 		/*g_print ("FOUND GRegex %p as [%s]\n", regex, sig->str);*/
3875 		g_string_free (sig, TRUE);
3876 	}
3877 	else {
3878 		regex = g_regex_new ((const gchar*) pattern, flags, 0, &error);
3879 		if (! regex) {
3880 			gda_log_error (_("SQLite regexp '%s' error:"), pattern,
3881 				       error && error->message ? error->message : _("Invalid regular expression"));
3882 			g_clear_error (&error);
3883 			if (as_boolean)
3884 				SQLITE3_CALL (sqlite3_result_int) (context, 0);
3885 			else
3886 				SQLITE3_CALL (sqlite3_result_null) (context);
3887 
3888 			g_string_free (sig, TRUE);
3889 			return;
3890 		}
3891 
3892 		if (!re_array) {
3893 			re_array = g_array_new (FALSE, FALSE, sizeof (gchar*));
3894 			re_hash = g_hash_table_new_full (g_str_hash, g_str_equal, g_free, (GDestroyNotify) g_regex_unref);
3895 		}
3896 		/*g_print ("ADDED new GRegex %p as [%s]\n", regex, sig->str);*/
3897 		g_hash_table_insert (re_hash, sig->str, regex);
3898 		g_array_prepend_val (re_array, sig->str);
3899 		g_string_free (sig, FALSE);
3900 		if (re_array->len > MAX_DEFINED_REGEX) {
3901 			/* get rid of the 'oldest' GRexex */
3902 			gchar *osig;
3903 			osig = g_array_index (re_array, gchar*, re_array->len - 1);
3904 			/*g_print ("REMOVED GRegex [%s]\n", osig);*/
3905 			g_hash_table_remove (re_hash, osig);
3906 			g_array_remove_index (re_array, re_array->len - 1);
3907 		}
3908 	}
3909 
3910 	if (as_boolean) {
3911 		if (g_regex_match (regex, str, 0, NULL))
3912 			SQLITE3_CALL (sqlite3_result_int) (context, 1);
3913 		else
3914 			SQLITE3_CALL (sqlite3_result_int) (context, 0);
3915 	}
3916 	else {
3917 		GMatchInfo *match_info;
3918 		g_regex_match (regex, str, 0, &match_info);
3919 		if (g_match_info_matches (match_info)) {
3920 			gchar *word = g_match_info_fetch (match_info, 0);
3921 			SQLITE3_CALL (sqlite3_result_text) (context, word, -1, g_free);
3922 		}
3923 		else
3924 			SQLITE3_CALL (sqlite3_result_null) (context);
3925 		g_match_info_free (match_info);
3926 	}
3927 }
3928 
3929 static void
scalar_regexp_match_func(sqlite3_context * context,int argc,sqlite3_value ** argv)3930 scalar_regexp_match_func (sqlite3_context *context, int argc, sqlite3_value **argv)
3931 {
3932 	if ((argc != 2) && (argc != 3)) {
3933 		SQLITE3_CALL (sqlite3_result_error) (context, _("Function requires two or three arguments"), -1);
3934 		return;
3935 	}
3936 
3937 	sqlite3_value **nargv;
3938 	nargv = g_new (sqlite3_value*, argc);
3939 	nargv[0] = argv[1];
3940 	nargv[1] = argv[0];
3941 	if (argc == 3)
3942 		nargv[2] = argv[2];
3943 	scalar_regexp_func (context, argc, nargv);
3944 	g_free (nargv);
3945 }
3946 
3947 static void
gda_sqlite_free_cnc_data(SqliteConnectionData * cdata)3948 gda_sqlite_free_cnc_data (SqliteConnectionData *cdata)
3949 {
3950 	if (!cdata)
3951 		return;
3952 
3953 	if (cdata->gdacnc)
3954 		g_object_remove_weak_pointer (G_OBJECT (cdata->gdacnc), (gpointer*) &(cdata->gdacnc));
3955 	if (cdata->connection)
3956 		SQLITE3_CALL (sqlite3_close) (cdata->connection);
3957 	g_free (cdata->file);
3958 	if (cdata->types_hash)
3959 		g_hash_table_destroy (cdata->types_hash);
3960 	if (cdata->types_array)
3961 		g_free (cdata->types_array);
3962 	g_free (cdata);
3963 }
3964 
3965 static gchar *
gda_sqlite_provider_escape_string(G_GNUC_UNUSED GdaServerProvider * provider,G_GNUC_UNUSED GdaConnection * cnc,const gchar * string)3966 gda_sqlite_provider_escape_string (G_GNUC_UNUSED GdaServerProvider *provider, G_GNUC_UNUSED GdaConnection *cnc, const gchar *string)
3967 {
3968 	gchar *ptr, *ret, *retptr;
3969 	gint size;
3970 
3971 	if (!string)
3972 		return NULL;
3973 
3974 	/* determination of the new string size */
3975 	ptr = (gchar *) string;
3976 	size = 1;
3977 	while (*ptr) {
3978 		if (*ptr == '\'')
3979 			size += 2;
3980 		else
3981 			size += 1;
3982 		ptr++;
3983 	}
3984 
3985 	ptr = (gchar *) string;
3986 	ret = g_new0 (gchar, size);
3987 	retptr = ret;
3988 	while (*ptr) {
3989 		if (*ptr == '\'') {
3990 			*retptr = '\'';
3991 			*(retptr+1) = *ptr;
3992 			retptr += 2;
3993 		}
3994 		else {
3995 			*retptr = *ptr;
3996 			retptr ++;
3997 		}
3998 		ptr++;
3999 	}
4000 	*retptr = '\0';
4001 
4002 	return ret;
4003 }
4004 
4005 gchar *
gda_sqlite_provider_unescape_string(G_GNUC_UNUSED GdaServerProvider * provider,G_GNUC_UNUSED GdaConnection * cnc,const gchar * string)4006 gda_sqlite_provider_unescape_string (G_GNUC_UNUSED GdaServerProvider *provider, G_GNUC_UNUSED GdaConnection *cnc, const gchar *string)
4007 {
4008 	glong total;
4009 	gchar *ptr;
4010 	gchar *retval;
4011 	glong offset = 0;
4012 
4013 	if (!string)
4014 		return NULL;
4015 
4016 	total = strlen (string);
4017 	retval = g_memdup (string, total+1);
4018 	ptr = (gchar *) retval;
4019 	while (offset < total) {
4020 		if (*ptr == '\'') {
4021 			if (*(ptr+1) == '\'') {
4022 				memmove (ptr+1, ptr+2, total - offset);
4023 				offset += 2;
4024 			}
4025 			else {
4026 				g_free (retval);
4027 				return NULL;
4028 			}
4029 		}
4030 		else
4031 			offset ++;
4032 
4033 		ptr++;
4034 	}
4035 
4036 	return retval;
4037 }
4038