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 (®istering);
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 (®istering);
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, ¶ms, 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, ¶ms, &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