diff --git a/gnumeric-1.6.3-gda3.patch b/gnumeric-1.6.3-gda3.patch new file mode 100644 index 0000000..d3b00ac --- /dev/null +++ b/gnumeric-1.6.3-gda3.patch @@ -0,0 +1,384 @@ +--- gnumeric-1.6.3/configure.in.orig 2007-05-01 18:21:36.000000000 -0400 ++++ gnumeric-1.6.3/configure.in 2007-05-01 18:22:54.000000000 -0400 +@@ -369,11 +369,11 @@ + fi + ) + if test "$try_gda" = "true"; then +- PKG_CHECK_MODULES(GDA, [libgda-2.0 >= 1.3.0], ++ PKG_CHECK_MODULES(GDA, [libgda-3.0 >= 1.3.0], + [gda_msg=yes], + [gda_msg="NO. libgda problem"]) + if test "$gda_msg" = "yes"; then +- PKG_CHECK_MODULES(GNOMEDB, [libgnomedb-2.0 >= 1.3.0], ++ PKG_CHECK_MODULES(GNOMEDB, [libgnomedb-3.0 >= 1.3.0], + [gnomedb_msg="yes"], + [gnomedb_msg="NO. libgnomedb problem"]) + if test "$gnomedb_msg" = "yes"; then +--- gnumeric-1.6.3/plugins/gda/plugin-gda.c.orig 2007-05-01 18:52:12.000000000 -0400 ++++ gnumeric-1.6.3/plugins/gda/plugin-gda.c 2007-05-01 19:01:11.000000000 -0400 +@@ -1,6 +1,8 @@ ++/* vim: set sw=8: -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */ + /* Interface Gnumeric to Databases + * Copyright (C) 1998,1999 Michael Lausch + * Copyright (C) 2000-2002 Rodrigo Moya ++ * Copyright (C) 2006 Vivien Malerba + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Library General Public +@@ -20,6 +22,7 @@ + #include + #include + #include ++#include + #ifdef HAVE_LIBGNOMEDB + #include + #include +@@ -28,18 +31,116 @@ + #include "func.h" + #include "expr.h" + #include "value.h" ++#include "workbook.h" ++#include "sheet.h" + #include "gnm-i18n.h" + #include + #include ++#include ++#include + #include + + GNM_PLUGIN_MODULE_HEADER; + +-static GdaClient* connection_pool = NULL; ++static GdaClient *connection_pool = NULL; ++static gboolean libgda_init_done = FALSE; ++static GHashTable *cnc_hash = NULL; ++ ++static GnmValue * ++gnm_value_new_from_gda (GValue const *gval, ++ GODateConventions const *date_conv) ++{ ++ GnmValue *res; ++ GType t; ++ ++ if (NULL == gval) ++ return value_new_empty (); ++ ++ g_return_val_if_fail (G_IS_VALUE (gval), value_new_empty ()); ++ ++ t = G_VALUE_TYPE (gval); ++ if (t == GDA_TYPE_SHORT) ++ return value_new_int (gda_value_get_short (gval)); ++ if (t == GDA_TYPE_USHORT) ++ return value_new_int (gda_value_get_ushort (gval)); ++ if (t == G_TYPE_DATE) { ++ res = value_new_int (datetime_g_to_serial ( ++ (GDate const *) g_value_get_boxed (gval), date_conv)); ++ value_set_fmt (res, go_format_default_date ()); ++ return res; ++ } ++ ++ if (t == GDA_TYPE_TIME) { ++ GdaTime const *time = gda_value_get_time (gval); ++ res = value_new_float ( (time->hour + ++ (time->minute + ++ time->second / 60.) / 60.) / 24.), ++ value_set_fmt (res, go_format_default_time ()); ++ return res; ++ } ++ ++ switch (t) { ++ case G_TYPE_BOOLEAN : ++ return value_new_bool (g_value_get_boolean (gval)); ++ ++ case G_TYPE_DOUBLE : ++ return value_new_float (g_value_get_double (gval)); ++ case G_TYPE_FLOAT : ++ return value_new_float (g_value_get_float (gval)); ++#if 0 ++ case G_TYPE_INT64 : /* g_value_get_int64 (gval) */ ++ case G_TYPE_UINT64 : /* g_value_get_uint64 (gval) */ ++#endif ++ case G_TYPE_INT : ++ return value_new_int (g_value_get_int (gval)); ++ case G_TYPE_UINT : ++ return value_new_int (g_value_get_uint (gval)); ++ ++#if 0 ++ /* No way to represent a timezone, leave it as a string for now */ ++ case GDA_TYPE_TIMESTAMP: ++#endif ++#if 0 ++ /* Do we want to consider nested arrays ?? ++ * The rest of the system is not strong enough yet. */ ++ case GDA_TYPE_LIST : { ++ GList const *ptr; ++ for (ptr = gda_value_get_list (gval) ; NULL != ptr ; ptr = ptr->next) { ++ } ++ return array; ++ } ++#endif ++ ++#if 0 ++ /* Use the default gvalue conversions for these */ ++ case G_TYPE_CHAR : ++ case G_TYPE_UCHAR : ++ case G_TYPE_STRING : ++ case GDA_TYPE_GEOMETRIC_POINT : ++ case GDA_TYPE_BINARY : ++ ++ /* this is stored as a string, let gda handle it */ ++ case GDA_TYPE_NUMERIC : ++#endif ++ default : ++ break; ++ } ++ ++ if (g_value_type_transformable (G_VALUE_TYPE (gval), G_TYPE_STRING)) { ++ GValue str = { 0 }; ++ g_value_init (&str, G_TYPE_STRING); ++ if (g_value_transform (gval, &str)) ++ return value_new_string (g_value_get_string (&str)); ++ g_value_unset (&str); ++ } ++ ++ return value_new_empty (); ++} + + static GnmValue * + display_recordset (GdaDataModel *recset, FunctionEvalInfo *ei) + { ++ GODateConventions const *date_conv; + GnmValue* array = NULL; + gint col; + gint row; +@@ -48,8 +149,8 @@ + + g_return_val_if_fail (GDA_IS_DATA_MODEL (recset), NULL); + +- fieldcount = gda_data_model_get_n_columns (GDA_DATA_MODEL (recset)); +- rowcount = gda_data_model_get_n_rows (GDA_DATA_MODEL (recset)); ++ fieldcount = gda_data_model_get_n_columns (recset); ++ rowcount = gda_data_model_get_n_rows (recset); + + /* convert the GdaDataModel in an array */ + if (rowcount <= 0) +@@ -58,31 +159,75 @@ + if (rowcount >= SHEET_MAX_ROWS) + return value_new_error (ei->pos, _("Too much data returned")); + ++ date_conv = workbook_date_conv (ei->pos->sheet->workbook); + array = value_new_array_empty (fieldcount, rowcount); + for (row = 0; row < rowcount; row++) { + for (col = 0; col < fieldcount; col++) { +- gchar *str; +- const GdaValue *value; +- +- value = gda_data_model_get_value_at (GDA_DATA_MODEL (recset), +- col, row); +- str = gda_value_stringify ((GdaValue *) value); +- value_array_set (array, +- col, +- row, +- value_new_string(str)); +- +- g_free (str); ++ value_array_set (array, col, row, ++ gnm_value_new_from_gda ( ++ gda_data_model_get_value_at (recset, col, row), ++ date_conv)); + } + } + + return array; + } + ++/* ++ * Key structure and hash functions for that structure ++ */ ++typedef struct { ++ gchar *dsn; ++ gchar *user; ++ gchar *pass; ++} CncKey; ++ ++static guint ++cnc_key_hash_func (CncKey *key) ++{ ++ guint retval = 0; ++ ++ if (key->dsn) ++ retval = g_str_hash (key->dsn); ++ if (key->user) ++ retval = (retval << 4) + g_str_hash (key->user); ++ if (key->pass) ++ retval = (retval << 4) + g_str_hash (key->pass); ++ ++ return retval; ++} ++ ++static gboolean ++cnc_key_equal_func (CncKey *key1, CncKey *key2) ++{ ++ if ((key1->dsn && !key2->dsn) || ++ (!key1->dsn && key2->dsn) || ++ (key1->dsn && key2->dsn && strcmp (key1->dsn, key2->dsn))) ++ return FALSE; ++ if ((key1->user && !key2->user) || ++ (!key1->user && key2->user) || ++ (key1->user && key2->user && strcmp (key1->user, key2->user))) ++ return FALSE; ++ if ((key1->pass && !key2->pass) || ++ (!key1->pass && key2->pass) || ++ (key1->pass && key2->pass && strcmp (key1->pass, key2->pass))) ++ return FALSE; ++ return TRUE; ++} ++ ++static void ++cnc_key_free (CncKey *key) ++{ ++ g_free (key->dsn); ++ g_free (key->user); ++ g_free (key->pass); ++ g_free (key); ++} ++ + static GdaConnection * + open_connection (const gchar *dsn, const gchar *user, const gchar *password, GdaConnectionOptions options) + { +- GdaConnection *cnc; ++ GdaConnection *cnc = NULL; + gchar *real_dsn, *real_user, *real_password; + #ifdef HAVE_LIBGNOMEDB + GtkWidget *dialog, *login; +@@ -91,44 +236,77 @@ + + /* initialize connection pool if first time */ + if (!GDA_IS_CLIENT (connection_pool)) { ++ if (!libgda_init_done) { ++ gda_init (NULL, NULL, 0, NULL); ++ libgda_init_done = TRUE; ++ } + connection_pool = gda_client_new (); + if (!connection_pool) + return NULL; + } + +-#ifdef HAVE_LIBGNOMEDB +- dialog = gnome_db_login_dialog_new (_("Database Connection")); +- login = gnome_db_login_dialog_get_login_widget (GNOME_DB_LOGIN_DIALOG (dialog)); ++ /* try to find a cnc object if we already have one */ ++ if (!cnc_hash) ++ cnc_hash = g_hash_table_new_full ((GHashFunc) cnc_key_hash_func, ++ (GEqualFunc) cnc_key_equal_func, ++ (GDestroyNotify) cnc_key_free, ++ (GDestroyNotify) g_object_unref); ++ else { ++ CncKey key; ++ ++ key.dsn = (gchar *) dsn; ++ key.user = (gchar *) user; ++ key.pass = (gchar *) password; + +- gnome_db_login_set_dsn (GNOME_DB_LOGIN (login), dsn); +- gnome_db_login_set_username (GNOME_DB_LOGIN (login), user); +- gnome_db_login_set_password (GNOME_DB_LOGIN (login), password); +- +- if (gnome_db_login_dialog_run (GNOME_DB_LOGIN_DIALOG (dialog))) { +- real_dsn = g_strdup (gnome_db_login_get_dsn (GNOME_DB_LOGIN (login))); +- real_user = g_strdup (gnome_db_login_get_username (GNOME_DB_LOGIN (login))); +- real_password = g_strdup (gnome_db_login_get_password (GNOME_DB_LOGIN (login))); +- +- gtk_widget_destroy (dialog); +- } else { +- gtk_widget_destroy (dialog); +- return NULL; ++ cnc = g_hash_table_lookup (cnc_hash, &key); + } +-#else +- real_dsn = g_strdup (dsn); +- real_user = g_strdup (user); +- real_password = g_strdup (password); +-#endif + +- cnc = gda_client_open_connection (connection_pool, real_dsn, real_user, real_password, options, &error); + if (!cnc) { +- g_warning ("Libgda error: %s\n", error->message); +- g_error_free (error); +- } ++ CncKey *key; + +- g_free (real_dsn); +- g_free (real_user); +- g_free (real_password); ++#ifdef HAVE_LIBGNOMEDB ++ dialog = gnome_db_login_dialog_new (_("Database Connection")); ++ login = gnome_db_login_dialog_get_login_widget (GNOME_DB_LOGIN_DIALOG (dialog)); ++ ++ gnome_db_login_set_dsn (GNOME_DB_LOGIN (login), dsn); ++ gnome_db_login_set_username (GNOME_DB_LOGIN (login), user); ++ gnome_db_login_set_password (GNOME_DB_LOGIN (login), password); ++ ++ if (gnome_db_login_dialog_run (GNOME_DB_LOGIN_DIALOG (dialog))) { ++ real_dsn = g_strdup (gnome_db_login_get_dsn (GNOME_DB_LOGIN (login))); ++ real_user = g_strdup (gnome_db_login_get_username (GNOME_DB_LOGIN (login))); ++ real_password = g_strdup (gnome_db_login_get_password (GNOME_DB_LOGIN (login))); ++ ++ gtk_widget_destroy (dialog); ++ } else { ++ gtk_widget_destroy (dialog); ++ return NULL; ++ } ++#else ++ real_dsn = g_strdup (dsn); ++ real_user = g_strdup (user); ++ real_password = g_strdup (password); ++#endif ++ ++ cnc = gda_client_open_connection (connection_pool, real_dsn, real_user, real_password, options, &error); ++ if (!cnc) { ++ g_warning ("Libgda error: %s\n", error->message); ++ g_error_free (error); ++ } ++ ++ g_free (real_dsn); ++ g_free (real_user); ++ g_free (real_password); ++ ++ 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); ++ } + + return cnc; + } +@@ -293,7 +471,13 @@ + } + + 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", "dsn,username,password,sql", ++ help_execSQL, &gnumeric_execSQL, NULL, NULL, NULL ++ }, ++ { ++ "readDBTable", "ssss", "dsn,username,password,table", ++ help_readDBTable, &gnumeric_readDBTable, NULL, NULL, NULL ++ }, + {NULL} + }; +--- gnumeric-1.6.3/plugins/gnome-db/plugin-gnomedb.c.orig 2005-03-03 02:50:56.000000000 -0500 ++++ gnumeric-1.6.3/plugins/gnome-db/plugin-gnomedb.c 2007-05-01 19:02:19.000000000 -0400 +@@ -1,5 +1,5 @@ + #include +-#include ++#include + #include + + #include diff --git a/gnumeric.spec b/gnumeric.spec index b32fa19..7d7e544 100644 --- a/gnumeric.spec +++ b/gnumeric.spec @@ -1,7 +1,7 @@ Name: gnumeric Epoch: 1 Version: 1.6.3 -Release: 6%{?dist} +Release: 7%{?dist} Summary: Spreadsheet program for GNOME Group: Applications/Productivity License: GPL @@ -10,6 +10,7 @@ Source: ftp://ftp.gnome.org/pub/GNOME/sources/%{name}/1.2/%{name}-%{ve Patch0: gnumeric-1.6.1-desktop.patch Patch1: gnumeric-1.4.1-excelcrash.patch Patch2: gnumeric-1.6.3-helppath.patch +Patch3: gnumeric-1.6.3-gda3.patch BuildRoot: %{_tmppath}/%{name}-%{version}-root BuildRequires: desktop-file-utils >= 0.9 BuildRequires: libgnomeui-devel >= 2.4.0 @@ -18,7 +19,7 @@ BuildRequires: python-devel BuildRequires: libgsf-gnome-devel >= 1.13.2 BuildRequires: automake autoconf libtool BuildRequires: intltool scrollkeeper gettext -BuildRequires: libgnomedb-devel >= 1.0.4 +BuildRequires: libgnomedb-devel >= 3.0.0 BuildRequires: pygtk2-devel >= 2.6.0 BuildRequires: goffice-devel >= 0.2.0 BuildRequires: guile-devel @@ -49,6 +50,7 @@ develop gnumeric-based applications. %patch0 -p1 -b .desktop %patch1 -p1 -b .excelcrash %patch2 -p1 -b .helppath +%patch3 -p1 -b .gda3 chmod -x plugins/excel/rc4.? @@ -71,9 +73,7 @@ unset GCONF_DISABLE_MAKEFILE_SCHEMA_INSTALL mkdir -p $RPM_BUILD_ROOT%{_datadir}/applications desktop-file-install --vendor fedora --delete-original \ --dir $RPM_BUILD_ROOT%{_datadir}/applications \ - --add-category X-Fedora \ --add-category Office \ - --add-category Application \ --add-category Spreadsheet \ $RPM_BUILD_ROOT%{_datadir}/applications/*.desktop @@ -83,22 +83,22 @@ mv $RPM_BUILD_ROOT/usr/share/pixmaps/gnome-%{name}.png \ $RPM_BUILD_ROOT/usr/share/icons/hicolor/48x48/apps/%{name}.png #remove unused mime type icons -rm -rf $RPM_BUILD_ROOT/%{_datadir}/pixmaps/gnome-application-*.png -rm -rf $RPM_BUILD_ROOT/%{_datadir}/pixmaps/%{name}-gnome-application-*.png +rm $RPM_BUILD_ROOT/%{_datadir}/pixmaps/gnome-application-*.png +rm $RPM_BUILD_ROOT/%{_datadir}/pixmaps/%{name}/gnome-application-*.png #remove spurious .ico thing -rm -rf $RPM_BUILD_ROOT/usr/share/pixmaps/win32-%{name}.ico -rm -rf $RPM_BUILD_ROOT/usr/share/pixmaps/%{name}/win32-%{name}.ico +rm $RPM_BUILD_ROOT/usr/share/pixmaps/win32-%{name}.ico +rm $RPM_BUILD_ROOT/usr/share/pixmaps/%{name}/win32-%{name}.ico #remove scrollkeeper stuff rm -rf $RPM_BUILD_ROOT/var #remove .la files -rm -rf $RPM_BUILD_ROOT/%{_libdir}/libspreadsheet.la -rm -rf $RPM_BUILD_ROOT/%{_libdir}/%{name}/%{version}/plugins/*/*.la +rm $RPM_BUILD_ROOT/%{_libdir}/libspreadsheet.la +rm $RPM_BUILD_ROOT/%{_libdir}/%{name}/%{version}/plugins/*/*.la #remove bogus mc stuff -rm -rf $RPM_BUILD_ROOT/%{_datadir}/mc +rm -r $RPM_BUILD_ROOT/%{_datadir}/mc %clean @@ -168,6 +168,9 @@ fi %changelog +* Sun May 27 2007 Hans de Goede 1:1.6.3-7 +- Build against new libgda + libgnomedb + * Mon Feb 19 2007 Hans de Goede 1:1.6.3-6 - Change BuildRequires: libgsf-devel to libgsf-gnome-devel to fix rawhide build