26 #include <glib/gstdio.h> 28 #include <libgda/libgda.h> 33 #define _(String) dgettext (GETTEXT_PACKAGE, String) 34 #define ACCESS_METHOD "gda" 35 #define LIBGDA_DIR ".qofgda" 36 #define GDA_DBNAME "gda-database-name" 37 #define GDA_USERNAME "gda-username" 38 #define GDA_PASSWORD "gda-password" 39 #define GDA_DATASOURCE "qof-gda-source" 54 GdaClient * client_pool;
55 GdaConnection * connection;
59 gchar * undo_trans, * commit_trans;
65 const gchar *fullpath;
66 const gchar * table_name;
68 gchar * data_source_name;
69 gchar * provider_name;
70 gchar * database_name;
71 gchar * source_description;
85 QofErrorId err_delete, err_insert, err_update, err_create;
89 qgda_determine_file_type (
const gchar * path)
100 QGdaBackend *qgda_be;
102 qgda_be = (QGdaBackend *) be;
109 if (!inst->
param->param_setfcn)
111 qgda_be->gda_err = NULL;
114 if (!qgda_be->sql_str)
116 LEAVE (
" null string");
119 DEBUG (
" sql_str=%s", qgda_be->sql_str);
120 qgda_be->command = gda_command_new (qgda_be->sql_str, GDA_COMMAND_TYPE_SQL,
121 GDA_COMMAND_OPTION_STOP_ON_ERRORS);
122 gda_connection_execute_non_select_command (qgda_be->connection,
123 qgda_be->command, NULL, &qgda_be->gda_err);
124 if (qgda_be->gda_err)
126 qof_error_set_be (be, qgda_be->err_update);
127 qgda_be->error = TRUE;
128 PERR (
" error on modify:%s", qgda_be->err);
130 g_error_free (qgda_be->gda_err);
131 qgda_be->gda_err = NULL;
135 g_free (qgda_be->sql_str);
136 qgda_be->error = FALSE;
141 create_tables (
QofObject * obj, gpointer user_data)
143 QGdaBackend * qgda_be;
148 qgda_be = (QGdaBackend*)user_data;
150 if (!gda_connection_is_opened (qgda_be->connection))
153 (_(
"GDA: No connection available."), FALSE));
154 qgda_be->error = TRUE;
155 PERR (
" no connection to gda available");
158 qgda_be->gda_err = NULL;
160 qgda_be->command = gda_command_new (str, GDA_COMMAND_TYPE_SQL,
161 GDA_COMMAND_OPTION_STOP_ON_ERRORS);
162 gda_connection_execute_non_select_command (qgda_be->connection,
163 qgda_be->command, NULL, &qgda_be->gda_err);
164 if (qgda_be->gda_err)
169 msg = g_strdup_printf (_(
"GDA: Error: %s"), qgda_be->gda_err->message);
171 qgda_be->error = TRUE;
172 g_error_free (qgda_be->gda_err);
177 gda_command_free (qgda_be->command);
181 create_data_source (QGdaBackend * qgda_be)
183 gchar * cnc_string, * msg;
185 GdaProviderInfo * prov;
189 if (!qgda_be->data_source_name)
192 (_(
"GDA: Missing data source name."), FALSE));
193 LEAVE (
" empty data source name");
196 qgda_be->gda_err = NULL;
197 prov = gda_config_get_provider_by_name (qgda_be->provider_name);
201 msg = g_strdup_printf (_(
"GDA Provider '%s' could not be found"),
202 qgda_be->provider_name);
205 LEAVE (
" provider '%s' not found", qgda_be->provider_name);
208 cnc_string = g_strconcat (
"DB_DIR=", qgda_be->gdahome,
";DB_NAME=",
209 qgda_be->database_name, NULL);
212 GdaServerOperation * prepare;
213 gboolean modify_global_config, save_data_source, test;
214 prepare = gda_client_prepare_create_database (qgda_be->client_pool,
215 qgda_be->data_source_name, qgda_be->provider_name);
216 test = gda_client_perform_create_database (qgda_be->client_pool, prepare, NULL);
218 PINFO (
"performed creation of new database ok");
220 PERR (
"creation of new database failed");
221 modify_global_config = gda_config_can_modify_global_config ();
223 gda_config_has_section (
"/apps/libgda/Datasources/QOF_DEBUG");
224 modify_global_config = gda_config_can_modify_global_config ();
225 save_data_source = gda_config_save_data_source (qgda_be->data_source_name,
226 qgda_be->provider_name, cnc_string,
227 qgda_be->source_description, qgda_be->username,
228 qgda_be->password, modify_global_config);
229 g_return_val_if_fail (save_data_source, FALSE);
231 qgda_be->connection = gda_client_open_connection
232 (qgda_be->client_pool, qgda_be->data_source_name,
233 NULL, NULL, GDA_CONNECTION_OPTIONS_NONE, &qgda_be->gda_err);
234 if (!qgda_be->connection)
239 msg = g_strdup_printf
240 (_(
"GDA: Failed to connect to the data source '%s'. " 241 "The GDA error was '%s'."), qgda_be->data_source_name,
242 qgda_be->gda_err->message);
245 qgda_be->error = TRUE;
247 PERR (
"connect request failed, removing %s", qgda_be->data_source_name);
248 g_message (
"connect request failed, removing %s", qgda_be->data_source_name);
249 gda_config_remove_data_source (qgda_be->data_source_name);
251 g_error_free (qgda_be->gda_err);
257 LEAVE (
" created data source for %s, %s, %s, %s",
258 qgda_be->data_source_name,
259 qgda_be->provider_name, cnc_string,
266 gchar *book_path, gboolean ignore_lock,
267 gboolean create_if_nonexistent)
269 QGdaBackend *qgda_be;
270 GdaDataSourceInfo * source;
274 PINFO (
" gda session start");
275 qgda_be = (QGdaBackend*)be;
276 be->
fullpath = g_strdup (book_path);
277 qgda_be->gda_err = NULL;
278 if(book_path == NULL)
281 (_(
"GDA: No data source path specified."), FALSE));
282 qgda_be->error = TRUE;
291 ret = g_stat (g_get_home_dir(), &lg);
295 (_(
"GDA: Unable to locate your home directory."),
297 qgda_be->error = TRUE;
298 LEAVE (
" unable to use stat on home_dir.");
301 qgda_be->gdahome = g_strconcat (g_get_home_dir(),
"/", LIBGDA_DIR, NULL);
302 if (!S_ISDIR (lg.st_mode) || lg.st_size == 0)
303 ret = g_mkdir_with_parents (qgda_be->gdahome, 0700);
307 (_(
"GDA: Unable to create a .libgda directory " 308 "within your home directory."), FALSE));
309 qgda_be->error = TRUE;
310 LEAVE (
" unable to create '%s' 0700", qgda_be->gdahome);
314 if (qgda_be->data_source_name)
317 qgda_be->book = qof_session_get_book (session);
318 PINFO (
"name=%s", qgda_be->data_source_name);
319 PINFO (
"provider=%s", qgda_be->provider_name);
321 source = gda_config_find_data_source
322 (qgda_be->data_source_name);
323 if (!source && create_if_nonexistent)
325 DEBUG (
" no source, creating . . .");
326 created = create_data_source (qgda_be);
328 if (!source && !created)
331 (_(
"GDA: No data source found at '%s' - Try loading data " 332 "from another file and write to gda: again to create the " 333 "GDA data source."), TRUE));
334 DEBUG (
" no source but set not to create.");
335 qgda_be->error = TRUE;
339 PINFO (
" trying for a connection");
341 qgda_be->connection = gda_client_open_connection
342 (qgda_be->client_pool, qgda_be->data_source_name,
343 NULL, NULL, GDA_CONNECTION_OPTIONS_DONT_SHARE, &qgda_be->gda_err);
344 if (qgda_be->connection)
346 PINFO (
" appear to be connected.");
354 msg = g_strdup_printf (
355 _(
"GDA encountered an error '%s' using data source '%s'."),
356 qgda_be->gda_err->message, qgda_be->data_source_name);
358 PERR (
" failed to connect to GDA: '%s'", msg);
359 qgda_be->error = TRUE;
362 g_error_free (qgda_be->gda_err);
364 PERR (
"connect request failed, removing %s", qgda_be->data_source_name);
366 g_message (
"connect request failed, removing %s", qgda_be->data_source_name);
367 gda_config_remove_data_source (qgda_be->data_source_name);
373 load_entities (gpointer value, gpointer user_data)
375 gint column_id, row_id;
377 QGdaBackend * qgda_be;
379 qgda_be = (QGdaBackend*)user_data;
380 dm = (GdaDataModel*)value;
383 qgda_be->error = TRUE;
384 DEBUG (
" empty data model on load");
387 for (column_id = 0; column_id < gda_data_model_get_n_columns (dm);
389 g_print(
"%s\t", gda_data_model_get_column_title (dm, column_id));
391 for (row_id = 0; row_id < gda_data_model_get_n_rows (dm); row_id++) {
392 for (column_id = 0; column_id < gda_data_model_get_n_columns (dm);
397 qgda_be->gda_value = (GValue*)gda_data_model_get_value_at
398 (dm, column_id, row_id);
399 str = gda_value_stringify (qgda_be->gda_value);
400 g_print (
"%s\t", str);
409 qgda_class_foreach (
QofObject * obj, gpointer data)
411 QGdaBackend *qgda_be;
413 qgda_be = (QGdaBackend*)data;
414 qgda_be->gda_err = NULL;
415 qgda_be->sql_str = g_strdup_printf(
"SELECT * FROM %s;", obj->e_type);
416 PINFO (
" sql=%s", qgda_be->sql_str);
417 qgda_be->command = gda_command_new (qgda_be->sql_str,
418 GDA_COMMAND_TYPE_SQL, GDA_COMMAND_OPTION_STOP_ON_ERRORS);
419 qgda_be->entities = gda_connection_execute_command (qgda_be->connection,
420 qgda_be->command, NULL, &qgda_be->gda_err);
421 if (qgda_be->gda_err)
422 g_error_free (qgda_be->gda_err);
423 g_list_foreach (qgda_be->entities, load_entities, qgda_be);
424 gda_command_free (qgda_be->command);
430 QGdaBackend *qgda_be;
432 qgda_be = (QGdaBackend*)be;
436 qgda_be->book = book;
441 qgda_check_entity (
QofEntity * ent, gpointer data)
444 QGdaBackend * qgda_be;
447 qgda_be = (QGdaBackend*) data;
454 qgda_be->sql_str = g_strdup_printf
455 (
"SELECT * FROM %s where guid = \"%s\";", ent->e_type, gstr);
456 qgda_be->dirty_list = NULL;
459 qgda_be->exists = FALSE;
463 qgda_write_foreach (
QofObject * obj, gpointer data)
465 QGdaBackend *qgda_be;
467 qgda_be = (QGdaBackend*)data;
468 qgda_be->gda_err = NULL;
477 QGdaBackend *qgda_be;
479 g_return_if_fail (be);
480 qgda_be = (QGdaBackend *) be;
481 qgda_be->book = book;
489 QGdaBackend *qgda_be;
491 qgda_be = (QGdaBackend*)be;
495 PINFO (
"removing %s", qgda_be->data_source_name);
496 gda_config_remove_data_source (qgda_be->data_source_name);
497 gda_client_close_all_connections (qgda_be->client_pool);
498 g_object_unref(G_OBJECT(qgda_be->client_pool));
505 QGdaBackend *qgda_be;
507 qgda_be = (QGdaBackend*)be;
517 QGdaBackend * qgda_be;
519 qgda_be = (QGdaBackend *) data;
520 g_return_if_fail (qgda_be);
523 qgda_be->database_name = g_strdup (option->
value);
524 PINFO (
" database name = %s", qgda_be->database_name);
528 qgda_be->username = g_strdup (option->
value);
529 PINFO (
" username=%s", qgda_be->username);
534 qgda_be->password = g_strdup (option->
value);
538 qgda_be->data_source_name = g_strdup (option->
value);
545 QGdaBackend *qgda_be;
548 qgda_be = (QGdaBackend *) be;
549 g_return_if_fail (qgda_be);
558 QGdaBackend *qgda_be;
563 qgda_be = (QGdaBackend *) be;
564 g_return_val_if_fail (qgda_be, NULL);
569 _(
"Name of the database to use.");
571 _(
"Override the default database name with " 572 "a name of your own choice.");
574 option->
value = (gpointer) qgda_be->database_name;
580 _(
"The username to use to access this data source.");
582 _(
"The username specified in the configuration of this " 583 "data source that provides write access to the data.");
585 option->
value = (gpointer) qgda_be->username;
591 _(
"Password to use with the username.");
593 _(
"The password that is to be used with the specified " 596 option->
value = (gpointer) qgda_be->password;
602 _(
"Name of this data source.");
604 _(
"The name of this data source as specified " 605 "in the GDA configuration.");
607 option->
value = (gpointer) qgda_be->password;
615 qgda_backend_new (
void)
617 QGdaBackend *qgda_be;
621 qgda_be = g_new0(QGdaBackend, 1);
623 qof_backend_init(be);
624 gda_init (PACKAGE,
"0.1", 0, NULL);
625 qgda_be->client_pool = gda_client_new ();
627 qgda_be->err_delete =
629 qgda_be->err_create =
631 qgda_be->err_insert =
633 qgda_be->err_update =
637 be->session_end = qgda_session_end;
638 be->destroy_backend = qgda_destroy_backend;
639 be->load = qgda_db_load;
643 be->commit = qgda_modify;
646 be->compile_query = NULL;
648 be->free_query = NULL;
649 be->run_query = NULL;
652 be->events_pending = NULL;
653 be->process_events = NULL;
655 be->sync = qgda_write_db;
656 be->load_config = load_config;
657 be->get_config = get_config;
661 qgda_be->data_source_name =
"QOF_DEBUG";
662 qgda_be->database_name =
"DB_DIR=/home/neil/";
663 qgda_be->provider_name =
"SQLite";
664 qgda_be->source_description =
"QOF GDA debug data";
681 bindtextdomain (PACKAGE, LOCALE_DIR);
QofErrorId qof_error_register(const gchar *err_message, gboolean use_file)
Generate and register a new error.
gboolean(* save_may_clobber_data)(QofBackend *)
#define PERR(format, args...)
#define PINFO(format, args...)
void qof_backend_register_provider(QofBackendProvider *)
#define QOF_OBJECT_VERSION
void qof_object_foreach(QofIdTypeConst type_name, QofBook *book, QofEntityForeachCB cb, gpointer user_data)
const gchar * description
gboolean partial_book_supported
Partial QofBook handler.
gint32 QofErrorId
The ID of this error.
gchar * qof_sql_object_create_table(QofObject *obj)
Build a SQL 'CREATE' statement for this object.
struct _KvpFrame KvpFrame
KvpFrame * qof_backend_complete_frame(QofBackend *be)
#define LEAVE(format, args...)
#define GUID_ENCODING_LENGTH
gchar * qof_sql_entity_update(QofEntity *ent)
Build a SQL 'UPDATE' statement for the current entity parameter.
gboolean qof_book_not_saved(QofBook *book)
void qof_backend_prepare_option(QofBackend *be, QofBackendOption *option)
void qof_backend_option_foreach(KvpFrame *config, QofBackendOptionCB cb, gpointer data)
void(* provider_free)(QofBackendProvider *)
#define DEBUG(format, args...)
QofBackend *(* backend_new)(void)
const gchar * option_name
void qof_event_unregister_handler(gint handler_id)
Unregister an event handler.
gchar * guid_to_string_buff(const GUID *guid, gchar *buff)
void qof_sql_entity_set_kvp_exists(gboolean exist)
Set or clear a flag that the KVP table exists or not.
Private QOF SQL generation routines.
const gchar * access_method
static void qgda_session_begin(QofBackend *be, QofSession *session, const gchar *book_path, gboolean ignore_lock, gboolean create_if_nonexistent)
gboolean(* check_data_type)(const gchar *)
Distinguish two providers with same access method.
const GUID * qof_entity_get_guid(QofEntity *ent)
gint safe_strcmp(const gchar *da, const gchar *db)
const gchar * provider_name
void qof_gda_provider_init(void)
Initialises the libgda2 QOF backend.
#define ENTER(format, args...)
void qof_object_foreach_type(QofForeachTypeCB cb, gpointer user_data)
const gchar * QofLogModule
Public interface of qof-backend-gda.
void qof_backend_prepare_frame(QofBackend *be)