26 #include <glib/gstdio.h>
28 #include <libgda/libgda.h>
32 #define _(String) dgettext (GETTEXT_PACKAGE, String)
33 #define ACCESS_METHOD "gda"
34 #define LIBGDA_DIR ".qofgda"
35 #define GDA_DBNAME "gda-database-name"
36 #define GDA_USERNAME "gda-username"
37 #define GDA_PASSWORD "gda-password"
38 #define GDA_DATASOURCE "qof-gda-source"
50 GdaClient * client_pool;
51 GdaConnection * connection;
56 gchar * undo_trans, * commit_trans;
58 const GdaColumn *gda_param;
63 const gchar *fullpath;
64 const gchar * table_name;
67 gchar * data_source_name;
68 gchar * provider_name;
69 gchar * database_name;
70 gchar * source_description;
82 qgda_determine_file_type (
const gchar * path)
101 p = gda_column_new();
102 gda_column_set_allow_null (p, TRUE);
103 gda_column_set_g_type (p, G_TYPE_NONE);
105 gda_column_set_g_type (p, G_TYPE_STRING);
108 gda_column_set_g_type (p, G_TYPE_STRING);
109 gda_column_set_allow_null (p, FALSE);
110 gda_column_set_primary_key (p, TRUE);
113 gda_column_set_g_type (p, G_TYPE_STRING);
117 gda_column_set_g_type (p, G_TYPE_DOUBLE);
119 gda_column_set_g_type (p, G_TYPE_DATE);
121 gda_column_set_g_type (p, G_TYPE_BOOLEAN);
123 gda_column_set_g_type (p, G_TYPE_INT);
125 gda_column_set_g_type (p, G_TYPE_INT64);
129 if (gda_column_get_g_type (p) == G_TYPE_NONE)
138 convert_params (
QofParam * param, gpointer user_data)
141 QGdaBackend * qgda_be;
143 qgda_be = (QGdaBackend*)user_data;
148 p = qoftype_to_gdafield (param->param_type);
151 DEBUG (
" unsupported QofParam: %s %s",
152 param->param_name, param->param_type);
155 gda_column_set_name (p, param->param_name);
156 gda_column_set_table (p, qgda_be->table_name);
157 qgda_be->field_list = g_slist_append (qgda_be->field_list, p);
158 PINFO (
" name=%s table=%s type=%s", param->param_name,
159 qgda_be->table_name, param->param_type);
163 build_table (gpointer value, gpointer user_data)
165 QGdaBackend * qgda_be;
166 GdaParameterList * plist;
171 qgda_be = (QGdaBackend*)user_data;
172 if (!gda_connection_is_opened (qgda_be->connection))
175 PERR (
" no connection to gda available");
178 PINFO (
" length=%d", g_slist_length(qgda_be->field_list));
179 c = g_slist_length(qgda_be->field_list);
188 text = g_strdup (
"create table ... ");
190 qgda_be->command = gda_command_new (text, GDA_COMMAND_TYPE_SQL,
191 GDA_COMMAND_OPTION_STOP_ON_ERRORS);
192 gda_connection_execute_non_select_command (qgda_be->connection,
193 qgda_be->command, plist, &qgda_err);
198 g_clear_error (&qgda_err);
200 gda_command_free (qgda_be->command);
205 create_tables (
QofObject * obj, gpointer user_data)
207 QGdaBackend * qgda_be;
209 qgda_be = (QGdaBackend*)user_data;
210 if (qgda_be->field_list)
211 g_slist_free (qgda_be->field_list);
212 qgda_be->field_list = NULL;
213 qgda_be->table_name = obj->e_type;
216 g_slist_foreach (qgda_be->field_list, build_table, qgda_be);
220 create_data_source (QGdaBackend * qgda_be)
224 GdaProviderInfo * prov;
228 if (!qgda_be->data_source_name)
231 (_(
"GDA: Missing data source name."), FALSE));
232 LEAVE (
" empty data source name");
235 prov = gda_config_get_provider_by_name (qgda_be->provider_name);
240 msg = g_strdup_printf (_(
"GDA Provider '%s' could not be found"),
241 qgda_be->provider_name);
244 LEAVE (
" provider '%s' not found", qgda_be->provider_name);
249 cnc_string = g_strdup (
"URI=/home/neil/gda-test.db");
251 gda_config_save_data_source (qgda_be->data_source_name,
252 qgda_be->provider_name, cnc_string,
253 qgda_be->source_description, qgda_be->username,
254 qgda_be->password, TRUE);
258 LEAVE (
" created data source for %s, %s, %s, %s",
259 qgda_be->data_source_name,
260 qgda_be->provider_name, cnc_string,
267 gchar *book_path, gboolean ignore_lock,
268 gboolean create_if_nonexistent)
270 QGdaBackend *qgda_be;
276 PINFO (
" gda session start");
277 qgda_be = (QGdaBackend*)be;
278 be->
fullpath = g_strdup (book_path);
279 if(book_path == NULL)
282 (_(
"GDA: No data source path specified."), FALSE));
283 qgda_be->error = TRUE;
293 ret = g_stat (g_get_home_dir(), &lg);
297 (_(
"GDA: Unable to locate your home directory."),
299 qgda_be->error = TRUE;
300 LEAVE (
" unable to use stat on home_dir.");
303 gdahome = g_strconcat (g_get_home_dir(),
304 "/", LIBGDA_DIR, NULL);
305 if (!S_ISDIR (lg.st_mode) || lg.st_size == 0)
306 ret = g_mkdir_with_parents (gdahome, 0700);
310 (_(
"GDA: Unable to create a .libgda directory "
311 "within your home directory."), FALSE));
312 qgda_be->error = TRUE;
313 LEAVE (
" unable to create '%s' 0700", gdahome);
320 GdaDataSourceInfo * source;
324 source = gda_config_find_data_source
325 (qgda_be->data_source_name);
326 if (!source && create_if_nonexistent)
328 DEBUG (
" no source, creating . . .");
329 created = create_data_source (qgda_be);
331 if (!source && !created)
334 (_(
"GDA: No data source found at '%s' - "
335 "Try loading data from another file "
336 "and write to gda: again to create the "
337 "GDA data source."), TRUE));
338 DEBUG (
" no source but set not to create.");
339 qgda_be->error = TRUE;
343 PINFO (
" trying for a connection");
345 qgda_be->connection = gda_client_open_connection
346 (qgda_be->client_pool, qgda_be->data_source_name,
347 NULL, NULL, GDA_CONNECTION_OPTIONS_DONT_SHARE, &qgda_err);
348 if (qgda_be->connection)
350 PINFO (
" appear to be connected.");
358 msg = g_strdup_printf (
359 _(
"GDA encountered an error '%s' using data source '%s'."),
360 qgda_err->message, qgda_be->data_source_name);
362 PERR (
" failed to connect to GDA: '%s'", msg);
363 qgda_be->error = TRUE;
369 load_entities (gpointer value, gpointer user_data)
371 gint column_id, row_id;
373 QGdaBackend * qgda_be;
375 qgda_be = (QGdaBackend*)user_data;
376 dm = (GdaDataModel*)value;
379 qgda_be->error = TRUE;
380 DEBUG (
" empty data model on load");
383 for (column_id = 0; column_id < gda_data_model_get_n_columns (dm);
385 g_print(
"%s\t", gda_data_model_get_column_title (dm, column_id));
387 for (row_id = 0; row_id < gda_data_model_get_n_rows (dm); row_id++) {
388 for (column_id = 0; column_id < gda_data_model_get_n_columns (dm);
393 qgda_be->gda_value = (GValue*)gda_data_model_get_value_at
394 (dm, column_id, row_id);
395 str = gda_value_stringify (qgda_be->gda_value);
396 g_print (
"%s\t", str);
405 qgda_class_foreach (
QofObject * obj, gpointer data)
407 QGdaBackend *qgda_be;
411 qgda_be = (QGdaBackend*)data;
412 qgda_be->sql_str = g_strdup_printf(
413 "SELECT * FROM %s;", obj->e_type);
414 PINFO (
" sql=%s", qgda_be->sql_str);
415 qgda_be->command = gda_command_new (qgda_be->sql_str,
416 GDA_COMMAND_TYPE_SQL, GDA_COMMAND_OPTION_STOP_ON_ERRORS);
417 qgda_be->entities = gda_connection_execute_command (qgda_be->connection,
418 qgda_be->command, NULL, &qgda_err);
419 g_list_foreach (qgda_be->entities, load_entities, qgda_be);
420 gda_command_free (qgda_be->command);
426 QGdaBackend *qgda_be;
428 qgda_be = (QGdaBackend*)be;
432 qgda_be->book = book;
445 QGdaBackend *qgda_be;
447 qgda_be = (QGdaBackend*)be;
449 g_object_unref(G_OBJECT(qgda_be->dm));
450 gda_client_close_all_connections (qgda_be->client_pool);
456 QGdaBackend *qgda_be;
458 qgda_be = (QGdaBackend*)be;
460 g_object_unref(G_OBJECT(qgda_be->client_pool));
470 QGdaBackend * qgda_be;
472 qgda_be = (QGdaBackend *) data;
473 g_return_if_fail (qgda_be);
476 qgda_be->database_name = g_strdup (option->
value);
477 PINFO (
" database name = %s", qgda_be->database_name);
481 qgda_be->username = g_strdup (option->
value);
482 PINFO (
" username=%s", qgda_be->username);
487 qgda_be->password = g_strdup (option->
value);
491 qgda_be->data_source_name = g_strdup (option->
value);
498 QGdaBackend *qgda_be;
501 qgda_be = (QGdaBackend *) be;
502 g_return_if_fail (qgda_be);
511 QGdaBackend *qgda_be;
518 qgda_be = (QGdaBackend *) be;
519 g_return_val_if_fail (qgda_be, NULL);
524 _(
"Name of the database to use.");
526 _(
"Override the default database name with "
527 "a name of your own choice.");
529 option->
value = (gpointer) qgda_be->database_name;
535 _(
"The username to use to access this data source.");
537 _(
"The username specified in the configuration of this "
538 "data source that provides write access to the data.");
540 option->
value = (gpointer) qgda_be->username;
546 _(
"Password to use with the username.");
548 _(
"The password that is to be used with the specified "
551 option->
value = (gpointer) qgda_be->password;
557 _(
"Name of this data source.");
559 _(
"The name of this data source as specified "
560 "in the GDA configuration.");
562 option->
value = (gpointer) qgda_be->password;
570 qgda_backend_new (
void)
572 QGdaBackend *qgda_be;
576 qgda_be = g_new0(QGdaBackend, 1);
579 gda_init (PACKAGE,
"0.1", 0, NULL);
580 qgda_be->client_pool = gda_client_new ();
582 be->session_begin = qgda_session_begin;
584 be->session_end = qgda_session_end;
585 be->destroy_backend = qgda_destroy_backend;
586 be->load = qgda_db_load;
590 be->commit = qgda_modify;
593 be->compile_query = NULL;
595 be->free_query = NULL;
596 be->run_query = NULL;
599 be->events_pending = NULL;
600 be->process_events = NULL;
602 be->sync = qgda_write_db;
603 be->load_config = load_config;
604 be->get_config = get_config;
608 qgda_be->data_source_name =
"QOF_DEBUG";
609 qgda_be->database_name =
"URI=/home/neil/test.gda";
610 qgda_be->provider_name =
"XML";
611 qgda_be->source_description =
"QOF GDA debug data";
628 bindtextdomain (PACKAGE, LOCALE_DIR);