[gnumeric] gda: bring back gda support.
- From: Morten Welinder <mortenw src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [gnumeric] gda: bring back gda support.
- Date: Fri, 16 Aug 2013 19:44:53 +0000 (UTC)
commit f97cc58635b32d9206aeaa90429e71bf066434dd
Author: Morten Welinder <terra gnome org>
Date: Fri Aug 16 15:44:35 2013 -0400
gda: bring back gda support.
NEWS | 3 +
configure.ac | 5 +-
plugins/gda/plugin-gda.c | 202 +++++++++++++++++++++++++++++----------------
3 files changed, 134 insertions(+), 76 deletions(-)
---
diff --git a/NEWS b/NEWS
index b18f5c4..fe39cde 100644
--- a/NEWS
+++ b/NEWS
@@ -23,6 +23,9 @@ Andreas:
* Use current GTK style when printing sheet object widgets from Gnumeric. [#705684]
* Scale tiny buttonssheet objects when printing. [#705689]
+Dmitry Matveev:
+ * Bring back gda support. [#604690]
+
Jean:
* Fix text wrap inside sheet objects. [#704417]
* Fix export of scatter/bubble plots to xls. [#705311]
diff --git a/configure.ac b/configure.ac
index 7866581..9deb17e 100644
--- a/configure.ac
+++ b/configure.ac
@@ -331,12 +331,9 @@ AC_ARG_WITH(gda,
fi
)
if test "$try_gda" = true; then
- PKG_CHECK_MODULES(GDA, [libgda-4.0 >= 4.1.1],
+ PKG_CHECK_MODULES(GDA, [libgda-5.0 >= 5.0.0, libgda-ui-5.0 >= 5.0.0],
[gda_msg=yes],
[gda_msg="NO. libgda problem"])
- AC_CHECK_HEADER(libgda/control-center/gdaui-login-dialog.h,
- [],
- [gda_msg="NO. libgda problem"])
if test "$gda_msg" = yes; then
PKG_CHECK_MODULES(GNOMEDB, [libgnomedb-4.0 >= 3.99.6],
[gnomedb_msg="yes"],
diff --git a/plugins/gda/plugin-gda.c b/plugins/gda/plugin-gda.c
index a5ca753..b2def50 100644
--- a/plugins/gda/plugin-gda.c
+++ b/plugins/gda/plugin-gda.c
@@ -3,6 +3,7 @@
* Copyright (C) 1998,1999 Michael Lausch
* Copyright (C) 2000-2002 Rodrigo Moya
* Copyright (C) 2006 Vivien Malerba
+ * Copyright (C) 2013 Dmitry Matveev
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Library General Public
@@ -22,7 +23,8 @@
#include <gnumeric-config.h>
#include <gnumeric.h>
#include <libgda/libgda.h>
-#include <libgda/control-center/gdaui-login-dialog.h>
+#include <libgda-ui/libgda-ui.h>
+#include <libgda-ui/gdaui-login.h>
#include <sql-parser/gda-sql-parser.h>
#include <string.h>
@@ -161,11 +163,12 @@ display_recordset (GdaDataModel *recset, GnmFuncEvalInfo *ei)
for (col = 0; col < fieldcount; col++) {
const GValue *cv;
cv = gda_data_model_get_value_at (recset, col, row, NULL);
- if (!cv)
+ if (!cv) {
+ value_release (array);
return value_new_error (ei->pos, _("Can't obtain data"));
+ }
value_array_set (array, col, row,
- gnm_value_new_from_gda (cv,
- date_conv));
+ gnm_value_new_from_gda (cv, date_conv));
}
}
@@ -196,6 +199,14 @@ cnc_key_hash_func (CncKey *key)
return retval;
}
+static void
+cnc_key_fill (CncKey *key, const gchar *dsn, const gchar *user, const gchar *pass)
+{
+ key->dsn = g_strdup (dsn ? dsn : "");
+ key->user = g_strdup (user ? user : "");
+ key->pass = g_strdup (pass ? pass : "");
+}
+
static gboolean
cnc_key_equal_func (CncKey *key1, CncKey *key2)
{
@@ -223,16 +234,82 @@ cnc_key_free (CncKey *key)
g_free (key);
}
+static gchar *
+build_gdadsn_auth_info (const gchar *user, const gchar *pass)
+{
+ gchar *result = NULL;
+
+ if (user && strlen (user) > 0 && pass && strlen (pass) > 0) {
+ gchar *tmp1 = gda_rfc1738_encode (user);
+ gchar *tmp2 = gda_rfc1738_encode (pass);
+ result = g_strdup_printf ("USERNAME=%s;PASSWORD=%s", tmp1, tmp2);
+ g_free (tmp1);
+ g_free (tmp2);
+ }
+
+ return result;
+}
+
+static gboolean
+query_connection_info (const gchar *dsn, const gchar *user, const gchar *password,
+ gchar **chosen_dsn, gchar **auth_string)
+{
+ GtkWidget *dialog, *login, *box;
+ GdaDsnInfo *existing;
+ gboolean retval = FALSE;
+
+ /* FIXME: pass a pointer to parent window */
+ dialog = gtk_dialog_new_with_buttons(_("Database Connection"),
+ NULL,
+ GTK_DIALOG_MODAL,
+ GTK_STOCK_OK,
+ GTK_RESPONSE_ACCEPT,
+ GTK_STOCK_CANCEL,
+ GTK_RESPONSE_REJECT,
+ NULL);
+
+ login = gdaui_login_new (NULL);
+
+ box = gtk_dialog_get_content_area (GTK_DIALOG (dialog));
+ gtk_box_pack_start (GTK_BOX (box), login, TRUE, TRUE, 0);
+ gtk_widget_show (login);
+
+ existing = gda_config_get_dsn_info (dsn);
+ if (existing) {
+ GdaDsnInfo supplied = *existing;
+ gchar *auth = build_gdadsn_auth_info (user, password);
+
+ if (auth)
+ supplied.auth_string = auth;
+
+ gdaui_login_set_connection_information (GDAUI_LOGIN(login), &supplied);
+ g_free (auth);
+ }
+
+ if (gtk_dialog_run (GTK_DIALOG (dialog)) == GTK_RESPONSE_ACCEPT) {
+ const GdaDsnInfo *info = gdaui_login_get_connection_information (GDAUI_LOGIN (login));
+ if (info) {
+ if (info->name)
+ *chosen_dsn = g_strdup (info->name);
+ if (info->auth_string)
+ *auth_string = g_strdup (info->auth_string);
+ retval = TRUE;
+ }
+ }
+
+ gtk_widget_destroy (dialog);
+ return retval;
+}
+
static GdaConnection *
open_connection (const gchar *dsn, const gchar *user, const gchar *password, GdaConnectionOptions options)
{
GdaConnection *cnc = NULL;
- gchar *real_dsn, *real_user, *real_password;
GError *error = NULL;
/* initialize connection pool if first time */
if (!libgda_init_done) {
- gda_init ();
+ gdaui_init ();
libgda_init_done = TRUE;
}
@@ -243,62 +320,54 @@ open_connection (const gchar *dsn, const gchar *user, const gchar *password, Gda
(GDestroyNotify) cnc_key_free,
(GDestroyNotify) g_object_unref);
else {
- CncKey key;
-
- key.dsn = (gchar *) dsn;
- key.user = (gchar *) user;
- key.pass = (gchar *) password;
-
- cnc = g_hash_table_lookup (cnc_hash, &key);
+ CncKey *key = g_new0 (CncKey, 1);
+ cnc_key_fill (key, dsn, user, password);
+ cnc = g_hash_table_lookup (cnc_hash, key);
+ cnc_key_free (key);
}
if (!cnc) {
- CncKey *key;
- gchar *auth, *tmp1, *tmp2;
-
- GtkWidget *dialog = gdaui_login_dialog_new (_("Database Connection"), NULL); /* FIXME:
pass a pointer to parent window */
- GnomeDbLogin *login = gdaui_login_dialog_get_login_widget (GDAUI_LOGIN_DIALOG (dialog));
- gnome_db_login_set_dsn (login, dsn);
- gnome_db_login_set_username (login, user);
- gnome_db_login_set_password (login, password);
- if (gdaui_login_dialog_run (GDAUI_LOGIN_DIALOG (dialog))) {
- real_dsn = g_strdup (gdauilogin_get_dsn (login));
- real_user = g_strdup (gdauilogin_get_username (login));
- real_password = g_strdup (gdauilogin_get_password (login));
- gtk_widget_destroy (dialog);
- } else {
- gtk_widget_destroy (dialog);
- return NULL;
- }
- tmp1 = gda_rfc1738_encode (real_user);
- tmp2 = gda_rfc1738_encode (real_password);
- auth = g_strdup_printf ("USERNAME=%s;PASSWORD=%s", tmp1, tmp2);
- g_free (tmp1);
- g_free (tmp2);
- cnc = gda_connection_open_from_dsn (real_dsn, auth, options, &error);
- if (!cnc) {
- g_warning ("Libgda error: %s\n", error->message);
- g_error_free (error);
+ gchar *chosen_dsn = NULL, *auth_string = NULL;
+
+ if (query_connection_info (dsn, user, password, &chosen_dsn, &auth_string) && chosen_dsn) {
+ cnc = gda_connection_open_from_dsn (chosen_dsn, auth_string, options, &error);
+ if (!cnc) {
+ g_warning ("Libgda error: %s\n", error->message);
+ g_error_free (error);
+ } else {
+ gchar *real_user = NULL, *real_pass = NULL;
+ CncKey *key = g_new0 (CncKey, 1);
+
+ if (auth_string) {
+ GdaQuarkList *ql = gda_quark_list_new_from_string (auth_string);
+ real_user = g_strdup (gda_quark_list_find (ql, "USERNAME"));
+ real_pass = g_strdup (gda_quark_list_find (ql, "PASSWORD"));
+ gda_quark_list_free (ql);
+ }
+
+ cnc_key_fill (key, chosen_dsn, real_user, real_pass);
+ g_hash_table_insert (cnc_hash, key, cnc);
+ g_free (real_user);
+ g_free (real_pass);
+ }
}
- g_free (real_dsn);
- g_free (real_user);
- g_free (real_password);
- g_free (auth);
-
- key = g_new0 (CncKey, 1);
- if (dsn)
- key->dsn = g_strdup (dsn);
- if (user)
- key->user = g_strdup (user);
- if (password)
- key->pass = g_strdup (password);
- g_hash_table_insert (cnc_hash, key, cnc);
+ g_free (chosen_dsn);
+ g_free (auth_string);
}
return cnc;
}
+static GnmValue *
+conn_error (GnmFuncEvalInfo *ei, const gchar *dsn_name)
+{
+ gchar *tmp = g_strdup_printf (_("Error: could not open connection to %s"), dsn_name);
+ GnmValue *ret = value_new_error(ei->pos, tmp);
+ g_free (tmp);
+ return ret;
+}
+
/*
* execSQL function
*/
@@ -340,9 +409,8 @@ gnumeric_execSQL (GnmFuncEvalInfo *ei, GnmValue const * const *args)
return value_new_error (ei->pos, _("Format: execSQL(dsn,user,password,sql)"));
cnc = open_connection (dsn_name, user_name, password, GDA_CONNECTION_OPTIONS_READ_ONLY);
- if (!GDA_IS_CONNECTION (cnc)) {
- return value_new_error(ei->pos, _("Error: could not open connection to %s"));
- }
+ if (!GDA_IS_CONNECTION (cnc))
+ return conn_error (ei, dsn_name);
/* execute command */
parser = gda_connection_create_parser (cnc);
@@ -418,9 +486,8 @@ gnumeric_readDBTable (GnmFuncEvalInfo *ei, GnmValue const * const *args)
return value_new_error (ei->pos, _("Format: readDBTable(dsn,user,password,table)"));
cnc = open_connection (dsn_name, user_name, password, GDA_CONNECTION_OPTIONS_READ_ONLY);
- if (!GDA_IS_CONNECTION (cnc)) {
- return value_new_error(ei->pos, _("Error: could not open connection to %s"));
- }
+ if (!GDA_IS_CONNECTION (cnc))
+ return conn_error (ei, dsn_name);
/* execute command */
parser = gda_connection_create_parser (cnc);
@@ -466,12 +533,9 @@ view_data_sources (GnmAction const *action, WorkbookControl *wbc)
argv[0] = gda_get_application_exec_path ("gda-control-center");
argv[1] = NULL;
if (!g_spawn_async (NULL, argv, NULL, G_SPAWN_SEARCH_PATH, NULL, NULL, NULL, NULL)) {
- char *msg = g_strdup_printf (
- _("Could not run GNOME database configuration tool ('%s')"),
- argv[0]);
- go_gtk_notice_dialog (wbcg_toplevel (WBC_GTK (wbc)),
- GTK_MESSAGE_INFO, msg);
- g_free (msg);
+ go_gtk_notice_dialog (wbcg_toplevel (WBC_GTK (wbc)), GTK_MESSAGE_INFO,
+ _("Could not run GNOME database configuration tool ('%s')"),
+ argv[0]);
}
g_free (argv[0]);
}
@@ -490,13 +554,7 @@ ModulePluginUIActions const gdaif_ui_actions[] = {
};
GnmFuncDescriptor gdaif_functions[] = {
- {
- "execSQL", "ssss", "dsn,username,password,sql",
- help_execSQL, &gnumeric_execSQL, NULL, NULL, NULL
- },
- {
- "readDBTable", "ssss", "dsn,username,password,table",
- help_readDBTable, &gnumeric_readDBTable, NULL, NULL, NULL
- },
+ { "execSQL", "ssss", help_execSQL, gnumeric_execSQL, NULL },
+ { "readDBTable", "ssss", help_readDBTable, gnumeric_readDBTable, NULL },
{NULL}
};
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]