static void field_changed_cb (GtkWidget *widget, GdauiDsnEditor *config) { if (widget == config->priv->wprovider) { /* replace the expander's contents */ const gchar *pname; pname = gdaui_provider_selector_get_provider (GDAUI_PROVIDER_SELECTOR (config->priv->wprovider)); _gdaui_provider_spec_editor_set_provider (GDAUI_PROVIDER_SPEC_EDITOR (config->priv->dsn_spec), pname); _gdaui_provider_auth_editor_set_provider (GDAUI_PROVIDER_AUTH_EDITOR (config->priv->dsn_auth), pname); GdaProviderInfo *pinfo; pinfo = gda_config_get_provider_info (pname); GdkPixbuf *pix; pix = support_create_pixbuf_for_provider (pinfo); if (pix) { gtk_image_set_from_pixbuf (GTK_IMAGE (config->priv->icon), pix); g_object_unref (pix); } else gtk_image_clear (GTK_IMAGE (config->priv->icon)); if (pinfo) gtk_widget_hide (config->priv->warning); else gtk_widget_show (config->priv->warning); } if (! config->priv->no_change_signal) g_signal_emit (config, gdaui_dsn_editor_signals[CHANGED], 0, NULL); }
/* * _gdaui_provider_auth_editor_set_provider * @auth: a #GdauiProviderAuthEditor widget * @provider: the provider to be used * * Updates the displayed fields in @auth to represent the required * and possible arguments that a connection to a database through * @provider would require */ void _gdaui_provider_auth_editor_set_provider (GdauiProviderAuthEditor *auth, const gchar *provider) { g_return_if_fail (GDAUI_IS_PROVIDER_AUTH_EDITOR (auth)); g_return_if_fail (auth->priv); auth->priv->pinfo = NULL; if (auth->priv->provider) g_free (auth->priv->provider); auth->priv->provider = NULL; auth->priv->auth_needed = FALSE; if (auth->priv->auth_widget) { gtk_widget_destroy (auth->priv->auth_widget); auth->priv->auth_widget = NULL; } if (provider) { auth->priv->pinfo = gda_config_get_provider_info (provider); if (auth->priv->pinfo) { auth->priv->provider = g_strdup (auth->priv->pinfo->id); if (auth->priv->pinfo->auth_params && auth->priv->pinfo->auth_params->holders) auth->priv->auth_needed = TRUE; } } if (auth->priv->auth_needed) { g_assert (auth->priv->pinfo); GdaSet *set; set = gda_set_copy (auth->priv->pinfo->auth_params); auth->priv->auth_widget = gdaui_basic_form_new (set); g_signal_connect (G_OBJECT (auth->priv->auth_widget), "holder-changed", G_CALLBACK (auth_form_changed), auth); g_object_unref (set); } if (auth->priv->auth_widget) { gtk_container_add (GTK_CONTAINER (auth), auth->priv->auth_widget); gtk_widget_show (auth->priv->auth_widget); if (auth->priv->labels_size_group) gdaui_basic_form_add_to_size_group (GDAUI_BASIC_FORM (auth->priv->auth_widget), auth->priv->labels_size_group, GDAUI_BASIC_FORM_LABELS); if (auth->priv->entries_size_group) gdaui_basic_form_add_to_size_group (GDAUI_BASIC_FORM (auth->priv->auth_widget), auth->priv->entries_size_group, GDAUI_BASIC_FORM_ENTRIES); } g_signal_emit_by_name (auth, "changed"); }
static void load_ldap_module (void) { if (ldap_prov_module) return; GdaProviderInfo *pinfo; pinfo = gda_config_get_provider_info ("Ldap"); if (!pinfo) return; ldap_prov_module = g_module_open (pinfo->location, 0); }
/* * Set up a connection. * * Optionnally the database can be created if the <upper_case_provider_name>_DBCREATE_PARAMS * environment variable exists. Examples are: * MYSQL_DBCREATE_PARAMS "HOST=localhost" * POSTGRESQL_DBCREATE_PARAMS "HOST=localhost;PORT=5432" * SQLITE_DBCREATE_PARAMS "DB_DIR=." * BERKELEY_DB_CNC_PARAMS "DB_NAME=gda_check_bdb.db" * * The connection is opened if the <upper_case_provider_name>_CNC_PARAMS environment variable exists. * For example: * MSACCESS_CNC_PARAMS "DB_DIR=/home/me/libgda/tests/providers;DB_NAME=gda_check_db" * ORACLE_CNC_PARAMS TNSNAME=//127.0.0.1 * * * If the <upper_case_provider_name>_DBCREATE_PARAMS is supplied, then its contents can be used * to complement the <upper_case_provider_name>_CNC_PARAMS. * * Returns: a GdaConnection if no error occurred */ GdaConnection * test_cnc_setup_connection (const gchar *provider, const gchar *dbname, GError **error) { GdaConnection *cnc = NULL; gchar *str, *upname; const gchar *db_params, *cnc_params; GdaProviderInfo *prov_info; GdaQuarkList *db_quark_list = NULL, *cnc_quark_list = NULL; gboolean db_created = FALSE; g_return_val_if_fail (dbname && *dbname, NULL); prov_info = gda_config_get_provider_info (provider); if (!prov_info) { g_set_error (error, TEST_ERROR, TEST_ERROR_GENERIC, "Provider '%s' not found", provider); return NULL; } /* create database if requested */ upname = prov_name_upcase (prov_info->id); str = g_strdup_printf ("%s_DBCREATE_PARAMS", upname); db_params = getenv (str); g_free (str); if (db_params) { GdaServerOperation *op; db_quark_list = gda_quark_list_new_from_string (db_params); op = gda_server_operation_prepare_drop_database (prov_info->id, dbname, NULL); gda_quark_list_foreach (db_quark_list, (GHFunc) db_create_quark_foreach_func, op); gda_server_operation_perform_drop_database (op, NULL, NULL); g_object_unref (op); op = gda_server_operation_prepare_create_database (prov_info->id, dbname, NULL); gda_quark_list_foreach (db_quark_list, (GHFunc) db_create_quark_foreach_func, op); if (!gda_server_operation_perform_create_database (op, NULL, error)) goto out; db_created = TRUE; } /* open connection to database */ cnc = test_cnc_open_connection (provider, dbname, error); out: if (cnc) { g_object_set_data_full (G_OBJECT (cnc), "dbname", g_strdup (dbname), g_free); g_object_set_data (G_OBJECT (cnc), "db_created", GINT_TO_POINTER (db_created)); g_print ("Connection now set up (%s)\n", db_created ? "database created" : "reusing database"); } return cnc; }
/** * gdaui_dsn_editor_need_authentication: */ gboolean gdaui_dsn_editor_need_authentication (GdauiDsnEditor *config) { const GdaDsnInfo *dsn_info; dsn_info = gdaui_dsn_editor_get_dsn (config); GdaProviderInfo *pinfo; pinfo = gda_config_get_provider_info (dsn_info->provider); if (pinfo && pinfo->auth_params && pinfo->auth_params->holders) return TRUE; else return FALSE; }
static void adapt_form_widget (GdauiProviderSpecEditor *spec) { /* destroy any previous widget */ if (spec->priv->form) { gtk_container_foreach (GTK_CONTAINER (spec), (GtkCallback) gtk_widget_destroy, NULL); spec->priv->form = NULL; } spec->priv->type = NO_PROVIDER; if (!spec->priv->provider) return; /* fetch DSN parameters */ GdaProviderInfo *pinfo; pinfo = gda_config_get_provider_info (spec->priv->provider); if (!pinfo) { g_warning (_("Unknown provider '%s'"), spec->priv->provider); return; } if (!pinfo->dsn_params) { g_warning (_("Provider '%s' does not report the required parameters for DSN"), spec->priv->provider); return; } /* create new widget */ GdaSet *dset; dset = gda_set_copy (pinfo->dsn_params); if (dset) { GtkWidget *wid; spec->priv->type = PROVIDER_FORM; wid = gdaui_basic_form_new (dset); g_object_set ((GObject*) wid, "show-actions", FALSE, NULL); g_object_unref (dset); spec->priv->form = wid; if (spec->priv->labels_size_group) gdaui_basic_form_add_to_size_group (GDAUI_BASIC_FORM (spec->priv->form), spec->priv->labels_size_group, GDAUI_BASIC_FORM_LABELS); if (spec->priv->entries_size_group) gdaui_basic_form_add_to_size_group (GDAUI_BASIC_FORM (spec->priv->form), spec->priv->entries_size_group, GDAUI_BASIC_FORM_ENTRIES); update_form_contents (spec); g_signal_connect (G_OBJECT (wid), "holder-changed", G_CALLBACK (dsn_form_changed), spec); gtk_widget_show (wid); gtk_container_add (GTK_CONTAINER (spec), wid); } }
int main (G_GNUC_UNUSED int argc, G_GNUC_UNUSED char **argv) { int number_failed = 0; gchar **env; const gchar *cnc_string; GError *error = NULL; env = g_get_environ (); cnc_string = g_environ_getenv (env, "MYSQL_CNC_PARAMS"); if (cnc_string == NULL) { g_message ("No enviroment variable MYSQL_CNC_PARAMS was set. No PostgreSQL provider tests will be performed." "Set this environment variable in order to get access to your server. Example: export MYSQL_CNC_PARAMS=\"DB_NAME=$MYSQL_DB;HOST=$MYSQL_HOST;USERNAME=$MYSQL_USER;PASSWORD=$MYSQL_PASSWORD\""); g_strfreev (env); return EXIT_SUCCESS; } gda_init (); pinfo = gda_config_get_provider_info (PROVIDER); if (!pinfo) { g_warning ("Could not find provider information for %s", PROVIDER); return EXIT_SUCCESS; } g_print ("Provider now tested: %s\n", pinfo->id); cnc = gda_connection_open_from_string (pinfo->id, cnc_string, NULL, GDA_CONNECTION_OPTIONS_NONE, &error); if (cnc == NULL) { g_warning ("Error opening connection: %s", error && error->message ? error->message : "No error was set"); return EXIT_FAILURE; } if (cnc) { number_failed += prov_test_common_check_timestamp (); number_failed += prov_test_common_check_meta_full (); number_failed += prov_test_common_check_meta_partial (); number_failed += prov_test_common_check_meta_partial2 (); number_failed += prov_test_common_check_meta_partial3 (); number_failed += prov_test_common_clean (); } if (! params_provided) return EXIT_SUCCESS; else { g_print ("Test %s\n", (number_failed == 0) ? "Ok" : "failed"); return (number_failed == 0) ? EXIT_SUCCESS : EXIT_FAILURE; } }
static gint forward_page_function (gint current_page, GdauiDsnAssistant *assistant) { switch (current_page) { case PAGE_START: return PAGE_GENERAL_INFO; case PAGE_GENERAL_INFO: if (assistant->priv->newdb_params) return PAGE_OPT_CREATE_DB; else return PAGE_CONNECT_INFO; case PAGE_OPT_CREATE_DB: if (gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (assistant->priv->choose_toggle))) return PAGE_CREATE_DB_INFO; else return PAGE_CONNECT_INFO; case PAGE_CREATE_DB_INFO: return PAGE_LAST; case PAGE_CONNECT_INFO: { GdaProviderInfo *pinfo; const gchar *provider; provider = gdaui_provider_selector_get_provider (GDAUI_PROVIDER_SELECTOR (assistant->priv->general_provider)); g_assert (provider); pinfo = gda_config_get_provider_info (provider); g_assert (pinfo); if (pinfo->auth_params && pinfo->auth_params->holders) return PAGE_AUTH_INFO; else return PAGE_LAST; } case PAGE_AUTH_INFO: return PAGE_LAST; case PAGE_LAST: break; default: g_assert_not_reached (); } return -1; }
int main (G_GNUC_UNUSED int argc, G_GNUC_UNUSED char **argv) { int number_failed = 0; fork_tests = FALSE; gchar **env; const gchar *cnc_string; env = g_get_environ (); cnc_string = g_environ_getenv (env, "POSTGRESQL_DBCREATE_PARAMS"); if (cnc_string == NULL) { g_message ("No enviroment variable POSTGRESQL_DBCREATE_PARAMS was set. No PostgreSQL provider tests will be performed." "Set this environment variable in order to get access to your server. Example: export POSTGRESQL_DBCREATE_PARAMS=\"HOST=postgres;ADM_LOGIN=$POSTGRES_USER;ADM_PASSWORD=$POSTGRES_PASSWORD\""); g_strfreev (env); return EXIT_SUCCESS; } gda_init (); pinfo = gda_config_get_provider_info (PROVIDER); if (!pinfo) { g_warning ("Could not find provider information for %s", PROVIDER); return EXIT_SUCCESS; } g_print ("============= Provider Meta Partial 1 Update now testing: %s =============\n", pinfo->id); number_failed = prov_test_common_setup (); if (cnc) { number_failed += prov_test_common_check_meta_partial (); number_failed += prov_test_common_clean (); } g_print ("Test %s\n", (number_failed == 0) ? "Ok" : "failed"); return (number_failed == 0) ? EXIT_SUCCESS : EXIT_FAILURE; }
/** * gdaui_dsn_editor_set_dsn * @editor: a #GdauiDsnEditor widget * @dsn_info: (allow-none): a #GdaDsnInfo pointer or %NULL * * * Requests that @editor update its contents with @dsn_info's contents */ void gdaui_dsn_editor_set_dsn (GdauiDsnEditor *editor, const GdaDsnInfo *dsn_info) { g_return_if_fail (GDAUI_IS_DSN_EDITOR (editor)); editor->priv->no_change_signal = TRUE; if (dsn_info) { GdaProviderInfo *pinfo; pinfo = gda_config_get_provider_info (dsn_info->provider); GdkPixbuf *pix; pix = support_create_pixbuf_for_provider (pinfo); if (pix) { gtk_image_set_from_pixbuf (GTK_IMAGE (editor->priv->icon), pix); g_object_unref (pix); } else gtk_image_clear (GTK_IMAGE (editor->priv->icon)); if (pinfo) gtk_widget_hide (editor->priv->warning); else gtk_widget_show (editor->priv->warning); gchar *tmp; tmp = g_markup_printf_escaped ("<big><b>%s</b></big>", dsn_info->name); gtk_label_set_markup (GTK_LABEL (editor->priv->wname), tmp); g_free (tmp); g_free (editor->priv->name); editor->priv->name = g_strdup (dsn_info->name); gdaui_provider_selector_set_provider (GDAUI_PROVIDER_SELECTOR (editor->priv->wprovider), dsn_info->provider); _gdaui_provider_spec_editor_set_provider (GDAUI_PROVIDER_SPEC_EDITOR (editor->priv->dsn_spec), dsn_info->provider); _gdaui_provider_spec_editor_set_specs (GDAUI_PROVIDER_SPEC_EDITOR (editor->priv->dsn_spec), dsn_info->cnc_string); gtk_text_buffer_set_text (gtk_text_view_get_buffer (GTK_TEXT_VIEW (editor->priv->wdesc)), dsn_info->description ? dsn_info->description : "", -1); _gdaui_provider_auth_editor_set_provider (GDAUI_PROVIDER_AUTH_EDITOR (editor->priv->dsn_auth), dsn_info->provider); _gdaui_provider_auth_editor_set_auth (GDAUI_PROVIDER_AUTH_EDITOR (editor->priv->dsn_auth), dsn_info->auth_string); gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (editor->priv->is_system), dsn_info->is_system); if (dsn_info->is_system && !gda_config_can_modify_system_config ()) { gtk_widget_set_sensitive (editor->priv->wprovider, FALSE); gtk_text_view_set_editable (GTK_TEXT_VIEW (editor->priv->wdesc), pinfo ? TRUE : FALSE); gtk_widget_set_sensitive (editor->priv->dsn_spec, FALSE); gtk_widget_set_sensitive (editor->priv->dsn_auth, FALSE); gtk_widget_set_sensitive (editor->priv->is_system, FALSE); } else { gtk_widget_set_sensitive (editor->priv->wprovider, pinfo ? TRUE : FALSE); gtk_text_view_set_editable (GTK_TEXT_VIEW (editor->priv->wdesc), pinfo ? TRUE : FALSE); gtk_widget_set_sensitive (editor->priv->dsn_spec, TRUE); gtk_widget_set_sensitive (editor->priv->dsn_auth, TRUE); gtk_widget_set_sensitive (editor->priv->is_system, pinfo && gda_config_can_modify_system_config () ? TRUE : FALSE); } } else { gtk_image_clear (GTK_IMAGE (editor->priv->icon)); gtk_label_set_text (GTK_LABEL (editor->priv->wname), ""); gdaui_provider_selector_set_provider (GDAUI_PROVIDER_SELECTOR (editor->priv->wprovider), NULL); _gdaui_provider_spec_editor_set_provider (GDAUI_PROVIDER_SPEC_EDITOR (editor->priv->dsn_spec), NULL); gtk_text_buffer_set_text (gtk_text_view_get_buffer (GTK_TEXT_VIEW (editor->priv->wdesc)), "", -1); _gdaui_provider_auth_editor_set_provider (GDAUI_PROVIDER_AUTH_EDITOR (editor->priv->dsn_auth), NULL); gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (editor->priv->is_system), FALSE); gtk_widget_set_sensitive (editor->priv->wprovider, FALSE); gtk_text_view_set_editable (GTK_TEXT_VIEW (editor->priv->wdesc), FALSE); gtk_widget_set_sensitive (editor->priv->dsn_spec, FALSE); gtk_widget_set_sensitive (editor->priv->dsn_auth, FALSE); gtk_widget_set_sensitive (editor->priv->is_system, FALSE); } editor->priv->no_change_signal = FALSE; g_signal_emit (editor, gdaui_dsn_editor_signals[CHANGED], 0, NULL); }
static void selection_changed_cb (GtkTreeSelection *select, BrowserConnectionsList *clist) { GtkTreeModel *model; GtkTreeIter iter; BrowserConnection *bcnc = NULL; const GdaDsnInfo *cncinfo = NULL; if (gtk_tree_selection_get_selected (select, &model, &iter)) { gtk_tree_model_get (model, &iter, COLUMN_BCNC, &bcnc, -1); cncinfo = browser_connection_get_information (bcnc); g_object_unref (bcnc); gtk_widget_set_sensitive (_clist->priv->close_cnc_button, TRUE); } else gtk_widget_set_sensitive (_clist->priv->close_cnc_button, FALSE); if (clist->priv->cnc_params_editor) { gtk_widget_destroy (clist->priv->cnc_params_editor); clist->priv->cnc_params_editor = NULL; } if (cncinfo && cncinfo->provider) { /* create GdaSet for parameters to display */ GdaSet *dset; GdaHolder *holder; dset = gda_set_new_inline (1, "PROVIDER_NAME", G_TYPE_STRING, cncinfo->provider); holder = GDA_HOLDER (dset->holders->data); g_object_set (G_OBJECT (holder), "name", _("Database provider"), NULL); GdaProviderInfo *pinfo; pinfo = gda_config_get_provider_info (cncinfo->provider); if (pinfo && pinfo->dsn_params) gda_set_merge_with_set (dset, pinfo->dsn_params); holder = gda_holder_new_inline (G_TYPE_STRING, "GDA_BROWSER_DICT_FILE", _("In memory")); g_object_set (G_OBJECT (holder), "name", _("Dictionary file"), "description", _("File used to store any information associated\n" "to this connection (favorites, descriptions, ...)"), NULL); gda_set_add_holder (dset, holder); g_object_unref (holder); if (bcnc) { const gchar *dict_file_name; dict_file_name = browser_connection_get_dictionary_file (bcnc); if (dict_file_name) gda_set_set_holder_value (dset, NULL, "GDA_BROWSER_DICT_FILE", dict_file_name); } /* create form */ GtkWidget *wid; wid = gdaui_basic_form_new (dset); g_object_set ((GObject*) wid, "show-actions", FALSE, NULL); gdaui_basic_form_entry_set_editable (GDAUI_BASIC_FORM (wid), NULL, FALSE); gtk_grid_attach (clist->priv->layout_grid, wid, 1, 2, 1, 1); gtk_widget_show (wid); clist->priv->cnc_params_editor = wid; /* fill GdaSet's parameters with values */ if (cncinfo->cnc_string) { gchar **array = NULL; array = g_strsplit (cncinfo->cnc_string, ";", 0); if (array) { gint index = 0; gchar *tok; gchar *value; gchar *name; for (index = 0; array[index]; index++) { name = strtok_r (array [index], "=", &tok); if (name) value = strtok_r (NULL, "=", &tok); else value = NULL; if (name && value) { GdaHolder *param; gda_rfc1738_decode (name); gda_rfc1738_decode (value); param = gda_set_get_holder (dset, name); if (param) g_assert (gda_holder_set_value_str (param, NULL, value, NULL)); } } g_strfreev (array); } } g_object_unref (dset); } }
static gboolean report_provider_status (GdaServerProvider *prov, GdaConnection *cnc) { gchar *header_str; HtmlFile *file = config->index; gboolean is_virt; typedef void (*AFunc) (void); typedef struct { const gchar *name; gboolean should_be; void (*func) (void); } ProvFunc; GdaServerProviderClass *pclass; if (prov && cnc && (prov != gda_connection_get_provider (cnc))) /* ignoring connection as it has a different provider */ return TRUE; g_assert (prov || cnc); /* section */ if (cnc) header_str = g_strdup_printf ("Report for connection '%s'", gda_connection_get_cnc_string (cnc)); else header_str = g_strdup_printf ("Report for '%s' provider", gda_server_provider_get_name (prov)); /* provider info */ if (!prov) prov = gda_connection_get_provider (cnc); is_virt = GDA_IS_VIRTUAL_PROVIDER (prov); pclass = (GdaServerProviderClass*) G_OBJECT_GET_CLASS (prov); ProvFunc fa[] = { {"get_name", TRUE, (AFunc) pclass->get_name}, {"get_version", TRUE, (AFunc) pclass->get_version}, {"get_server_version", TRUE, (AFunc) pclass->get_server_version}, {"supports_feature", TRUE, (AFunc) pclass->supports_feature}, {"get_data_handler", TRUE, (AFunc) pclass->get_data_handler}, {"get_def_dbms_type", TRUE, (AFunc) pclass->get_def_dbms_type}, {"escape_string", TRUE, (AFunc) pclass->escape_string}, {"unescape_string", TRUE, (AFunc) pclass->unescape_string}, {"open_connection", TRUE, (AFunc) pclass->open_connection}, {"close_connection", TRUE, (AFunc) pclass->close_connection}, {"supports_operation", is_virt ? FALSE : TRUE, (AFunc) pclass->supports_operation}, {"create_operation", FALSE, (AFunc) pclass->create_operation}, {"render_operation", FALSE, (AFunc) pclass->render_operation}, {"perform_operation", FALSE, (AFunc) pclass->perform_operation}, {"begin_transaction", FALSE, (AFunc) pclass->begin_transaction}, {"commit_transaction", FALSE, (AFunc) pclass->commit_transaction}, {"rollback_transaction", FALSE, (AFunc) pclass->rollback_transaction}, {"add_savepoint", FALSE, (AFunc) pclass->add_savepoint}, {"rollback_savepoint", FALSE, (AFunc) pclass->rollback_savepoint}, {"delete_savepoint", FALSE, (AFunc) pclass->delete_savepoint}, {"create_parser", FALSE, (AFunc) pclass->create_parser}, {"statement_to_sql", TRUE, (AFunc) pclass->statement_to_sql}, {"statement_prepare", TRUE, (AFunc) pclass->statement_prepare}, {"statement_execute", TRUE, (AFunc) pclass->statement_execute}, {"identifier_quote", TRUE, (AFunc) pclass->identifier_quote} }; ProvFunc md[] = { {"_info", TRUE, (AFunc) pclass->meta_funcs._info}, {"_btypes", TRUE, (AFunc) pclass->meta_funcs._btypes}, {"_udt", TRUE, (AFunc) pclass->meta_funcs._udt}, {"udt", TRUE, (AFunc) pclass->meta_funcs.udt}, {"_udt_cols", TRUE, (AFunc) pclass->meta_funcs._udt_cols}, {"udt_cols", TRUE, (AFunc) pclass->meta_funcs.udt_cols}, {"_enums", TRUE, (AFunc) pclass->meta_funcs._enums}, {"enums", TRUE, (AFunc) pclass->meta_funcs.enums}, {"_domains", TRUE, (AFunc) pclass->meta_funcs._domains}, {"domains", TRUE, (AFunc) pclass->meta_funcs.domains}, {"_constraints_dom", TRUE, (AFunc) pclass->meta_funcs._constraints_dom}, {"constraints_dom", TRUE, (AFunc) pclass->meta_funcs.constraints_dom}, {"_el_types", TRUE, (AFunc) pclass->meta_funcs._el_types}, {"el_types", TRUE, (AFunc) pclass->meta_funcs.el_types}, {"_collations", TRUE, (AFunc) pclass->meta_funcs._collations}, {"collations", TRUE, (AFunc) pclass->meta_funcs.collations}, {"_character_sets", TRUE, (AFunc) pclass->meta_funcs._character_sets}, {"character_sets", TRUE, (AFunc) pclass->meta_funcs.character_sets}, {"_schemata", TRUE, (AFunc) pclass->meta_funcs._schemata}, {"schemata", TRUE, (AFunc) pclass->meta_funcs.schemata}, {"_tables_views", TRUE, (AFunc) pclass->meta_funcs._tables_views}, {"tables_views", TRUE, (AFunc) pclass->meta_funcs.tables_views}, {"_columns", TRUE, (AFunc) pclass->meta_funcs._columns}, {"columns", TRUE, (AFunc) pclass->meta_funcs.columns}, {"_view_cols", TRUE, (AFunc) pclass->meta_funcs._view_cols}, {"view_cols", TRUE, (AFunc) pclass->meta_funcs.view_cols}, {"_constraints_tab", TRUE, (AFunc) pclass->meta_funcs._constraints_tab}, {"constraints_tab", TRUE, (AFunc) pclass->meta_funcs.constraints_tab}, {"_constraints_ref", TRUE, (AFunc) pclass->meta_funcs._constraints_ref}, {"constraints_ref", TRUE, (AFunc) pclass->meta_funcs.constraints_ref}, {"_key_columns", TRUE, (AFunc) pclass->meta_funcs._key_columns}, {"key_columns", TRUE, (AFunc) pclass->meta_funcs.key_columns}, {"_check_columns", TRUE, (AFunc) pclass->meta_funcs._check_columns}, {"check_columns", TRUE, (AFunc) pclass->meta_funcs.check_columns}, {"_triggers", TRUE, (AFunc) pclass->meta_funcs._triggers}, {"triggers", TRUE, (AFunc) pclass->meta_funcs.triggers}, {"_routines", TRUE, (AFunc) pclass->meta_funcs._routines}, {"routines", TRUE, (AFunc) pclass->meta_funcs.routines}, {"_routine_col", TRUE, (AFunc) pclass->meta_funcs._routine_col}, {"routine_col", TRUE, (AFunc) pclass->meta_funcs.routine_col}, {"_routine_par", TRUE, (AFunc) pclass->meta_funcs._routine_par}, {"routine_par", TRUE, (AFunc) pclass->meta_funcs.routine_par}, }; gboolean has_xa = gda_server_provider_supports_feature (prov, cnc, GDA_CONNECTION_FEATURE_XA_TRANSACTIONS); xmlNodePtr table, tr, td, span; GdaSqlParser *parser; GString *string; gsize i; GdaProviderInfo *pinfo; pinfo = gda_config_get_provider_info (gda_server_provider_get_name (prov)); g_assert (pinfo); table = xmlNewChild (file->body, NULL, BAD_CAST "table", NULL); xmlSetProp (table, BAD_CAST "width", BAD_CAST "100%"); tr = xmlNewChild (table, NULL, BAD_CAST "tr", NULL); td = xmlNewTextChild (tr, NULL, BAD_CAST "th", BAD_CAST header_str); xmlSetProp (td, BAD_CAST "colspan", BAD_CAST "4"); /* line 1 */ tr = xmlNewChild (table, NULL, BAD_CAST "tr", NULL); xmlNewChild (tr, NULL, BAD_CAST "td", BAD_CAST "Provider's name:"); td = xmlNewTextChild (tr, NULL, BAD_CAST "td", BAD_CAST gda_server_provider_get_name (prov)); xmlSetProp (td, BAD_CAST "width", (xmlChar*) "35%"); xmlNewChild (tr, NULL, BAD_CAST "td", BAD_CAST "Provider is virtual:"); td = xmlNewChild (tr, NULL, BAD_CAST "td", BAD_CAST (is_virt ? "Yes (uses the SQLite engine)" : "No")); xmlSetProp (td, BAD_CAST "width", (xmlChar*) "35%"); /* line 2 */ tr = xmlNewChild (table, NULL, BAD_CAST "tr", NULL); xmlNewChild (tr, NULL, BAD_CAST "td", BAD_CAST "Provider's version:"); xmlNewTextChild (tr, NULL, BAD_CAST "td", BAD_CAST gda_server_provider_get_version (prov)); xmlNewChild (tr, NULL, BAD_CAST "td", BAD_CAST "Provider's server version:"); xmlNewTextChild (tr, NULL, BAD_CAST "td", BAD_CAST (cnc ? gda_server_provider_get_server_version (prov, cnc) : "(non connected)")); /* line 3 */ tr = xmlNewChild (table, NULL, BAD_CAST "tr", NULL); xmlNewChild (tr, NULL, BAD_CAST "td", BAD_CAST "Provider's description:"); xmlNewTextChild (tr, NULL, BAD_CAST "td", BAD_CAST pinfo->description); xmlNewChild (tr, NULL, BAD_CAST "td", BAD_CAST "Filename:"); xmlNewTextChild (tr, NULL, BAD_CAST "td", BAD_CAST pinfo->location); /* line 4 */ parser = gda_server_provider_create_parser (prov, cnc); tr = xmlNewChild (table, NULL, BAD_CAST "tr", NULL); xmlNewChild (tr, NULL, BAD_CAST "td", BAD_CAST "Creates its own SQL parser:"); xmlNewChild (tr, NULL, BAD_CAST "td", BAD_CAST (parser ? "Yes" : "No")); if (parser) g_object_unref (parser); xmlNewChild (tr, NULL, BAD_CAST "td", BAD_CAST "Non implemented base methods:"); span = NULL; td = xmlNewChild (tr, NULL, BAD_CAST "td", NULL); for (i = 0; i < sizeof (fa) / sizeof (ProvFunc); i++) { gchar *str; ProvFunc *pf = &(fa[i]); if (pf->func) continue; if (span) str = g_strdup_printf (", %s()", pf->name); else str = g_strdup_printf ("%s()", pf->name); span = xmlNewTextChild (td, NULL, BAD_CAST "span", BAD_CAST str); g_free (str); if (pf->should_be) xmlSetProp (span, BAD_CAST "class", BAD_CAST "error"); } if (!span) xmlNodeSetContent (td, BAD_CAST "---"); /* line 5 */ tr = xmlNewChild (table, NULL, BAD_CAST "tr", NULL); xmlNewChild (tr, NULL, BAD_CAST "td", BAD_CAST "Non implemented meta data methods:"); span = NULL; td = xmlNewChild (tr, NULL, BAD_CAST "td", NULL); for (i = 0; i < sizeof (md) / sizeof (ProvFunc); i++) { gchar *str; ProvFunc *pf = &(md[i]); if (pf->func) continue; if (span) str = g_strdup_printf (", %s()", pf->name); else str = g_strdup_printf ("%s()", pf->name); span = xmlNewTextChild (td, NULL, BAD_CAST "span", BAD_CAST str); g_free (str); if (pf->should_be) xmlSetProp (span, BAD_CAST "class", BAD_CAST "error"); } if (!span) xmlNodeSetContent (td, BAD_CAST "---"); xmlNewChild (tr, NULL, BAD_CAST "td", BAD_CAST "Non implemented XA transactions:"); if (pclass->xa_funcs) { if (!has_xa) { td = xmlNewChild (tr, NULL, BAD_CAST "td", BAD_CAST "The provider has the 'xa_funcs' part but " "reports that distributed transactions are " "not supported."); xmlSetProp (td, BAD_CAST "class", BAD_CAST "warning"); } else { ProvFunc dt[] = { {"xa_start", TRUE, (AFunc) pclass->xa_funcs->xa_start}, {"xa_end", FALSE, (AFunc) pclass->xa_funcs->xa_end}, {"xa_prepare", TRUE, (AFunc) pclass->xa_funcs->xa_prepare}, {"xa_commit", TRUE, (AFunc) pclass->xa_funcs->xa_commit}, {"xa_rollback", TRUE, (AFunc) pclass->xa_funcs->xa_rollback}, {"xa_recover", TRUE, (AFunc) pclass->xa_funcs->xa_recover}, }; span = NULL; td = xmlNewChild (tr, NULL, BAD_CAST "td", NULL); for (i = 0; i < sizeof (dt) / sizeof (ProvFunc); i++) { gchar *str; ProvFunc *pf = &(dt[i]); if (pf->func) continue; if (span) str = g_strdup_printf (", %s()", pf->name); else str = g_strdup_printf ("%s()", pf->name); span = xmlNewTextChild (td, NULL, BAD_CAST "span", BAD_CAST str); g_free (str); if (pf->should_be) xmlSetProp (span, BAD_CAST "class", BAD_CAST "error"); } if (!span) xmlNodeSetContent (td, BAD_CAST "---"); } } else { if (has_xa) { td = xmlNewTextChild (tr, NULL, BAD_CAST "td", BAD_CAST "The provider does not have the 'xa_funcs' part but " "reports that distributed transactions are " "supported."); xmlSetProp (td, BAD_CAST "class", BAD_CAST "warning"); } else xmlNewChild (tr, NULL, BAD_CAST "td", BAD_CAST "---"); } /* line 6 */ tr = xmlNewChild (table, NULL, BAD_CAST "tr", NULL); xmlNewChild (tr, NULL, BAD_CAST "td", BAD_CAST "Connection's parameters:"); if (pinfo->dsn_params && pinfo->dsn_params->holders) { GSList *list; td = xmlNewChild (tr, NULL, BAD_CAST "td", NULL); for (list = pinfo->dsn_params->holders; list; list = list->next) { gchar *str, *descr; GdaHolder *holder = GDA_HOLDER (list->data); g_object_get (G_OBJECT (holder), "description", &descr, NULL); if (descr) str = g_strdup_printf ("%s: %s", gda_holder_get_id (holder), descr); else str = g_strdup (gda_holder_get_id (holder)); g_free (descr); xmlNewTextChild (td, NULL, BAD_CAST "div", BAD_CAST str); g_free (str); } } else { td = xmlNewChild (tr, NULL, BAD_CAST "td", BAD_CAST "None provided"); xmlSetProp (td, BAD_CAST "class", BAD_CAST "error"); } xmlNewChild (tr, NULL, BAD_CAST "td", BAD_CAST "Authentication's parameters:"); if (pinfo->auth_params) { GSList *list; if (pinfo->auth_params->holders) { td = xmlNewChild (tr, NULL, BAD_CAST "td", NULL); for (list = pinfo->auth_params->holders; list; list = list->next) { gchar *str, *descr; GdaHolder *holder = GDA_HOLDER (list->data); g_object_get (G_OBJECT (holder), "description", &descr, NULL); if (descr) str = g_strdup_printf ("%s: %s", gda_holder_get_id (holder), descr); else str = g_strdup (gda_holder_get_id (holder)); g_free (descr); xmlNewTextChild (td, NULL, BAD_CAST "div", BAD_CAST str); g_free (str); } } else td = xmlNewChild (tr, NULL, BAD_CAST "td", BAD_CAST "None required"); } else { td = xmlNewChild (tr, NULL, BAD_CAST "td", BAD_CAST "None provided"); xmlSetProp (td, BAD_CAST "class", BAD_CAST "error"); } /* line 7 */ GdaConnectionFeature f; string = NULL; tr = xmlNewChild (table, NULL, BAD_CAST "tr", NULL); xmlNewChild (tr, NULL, BAD_CAST "td", BAD_CAST "Supported features:"); for (f = 0; f < GDA_CONNECTION_FEATURE_LAST; f++) { if (gda_server_provider_supports_feature (prov, cnc, f)) { GEnumValue *ev; ev = g_enum_get_value ((GEnumClass *) g_type_class_ref (GDA_TYPE_CONNECTION_FEATURE), f); if (!string) string = g_string_new (ev->value_name); else g_string_append_printf (string, ", %s", ev->value_name); } } if (string) { xmlNewTextChild (tr, NULL, BAD_CAST "td", BAD_CAST string->str); g_string_free (string, TRUE); } else xmlNewChild (tr, NULL, BAD_CAST "td", BAD_CAST "---"); string = NULL; xmlNewChild (tr, NULL, BAD_CAST "td", BAD_CAST "Unsupported features:"); for (f = 0; f < GDA_CONNECTION_FEATURE_LAST; f++) { if (!gda_server_provider_supports_feature (prov, cnc, f)) { GEnumValue *ev; ev = g_enum_get_value ((GEnumClass *) g_type_class_ref (GDA_TYPE_CONNECTION_FEATURE), f); if (!string) string = g_string_new (ev->value_name); else g_string_append_printf (string, ", %s", ev->value_name); } } if (string) { xmlNewTextChild (tr, NULL, BAD_CAST "td", BAD_CAST string->str); g_string_free (string, TRUE); } else xmlNewChild (tr, NULL, BAD_CAST "td", BAD_CAST "---"); g_free (header_str); return TRUE; }
static void assistant_applied_cb (GtkAssistant *assist, G_GNUC_UNUSED gpointer data) { gboolean allok = TRUE; GString *cnc_string = NULL; GdauiDsnAssistant *assistant = (GdauiDsnAssistant *) assist; g_return_if_fail (GDAUI_IS_DSN_ASSISTANT (assistant)); /* clear the internal dsn_info */ if (assistant->priv->dsn_info) { data_source_info_free (assistant->priv->dsn_info); assistant->priv->dsn_info = NULL; } /* New database creation first */ if (gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (assistant->priv->choose_toggle))) { if (!gda_server_operation_is_valid (assistant->priv->create_db_op, NULL, NULL)) { _gdaui_utility_show_error (NULL, _("Missing mandatory information, to create database")); gtk_assistant_set_current_page (assist, PAGE_CREATE_DB_INFO); return; } else { GdaProviderInfo *prov_info; GSList *dsn_params; GError *error = NULL; allok = gda_server_operation_perform_create_database (assistant->priv->create_db_op, NULL, &error); if (!allok) { gchar *str; str = g_strdup_printf (_("Error creating database: %s"), error && error->message ? error->message : _("Unknown error")); _gdaui_utility_show_error (NULL, str); g_free (str); gtk_assistant_set_current_page (assist, PAGE_CREATE_DB_INFO); return; } /* make the connection string for the data source */ prov_info = gda_config_get_provider_info (gdaui_provider_selector_get_provider (GDAUI_PROVIDER_SELECTOR (assistant->priv->general_provider))); g_return_if_fail (prov_info); for (dsn_params = prov_info->dsn_params->holders; dsn_params; dsn_params = dsn_params->next) { GdaHolder *param = GDA_HOLDER (dsn_params->data); const GValue *value; value = gda_server_operation_get_value_at (assistant->priv->create_db_op, "/DB_DEF_P/%s", gda_holder_get_id (param)); if (!value) value = gda_server_operation_get_value_at (assistant->priv->create_db_op, "/SERVER_CNX_P/%s", gda_holder_get_id (param)); if (value && !gda_value_is_null ((GValue *) value)) { gchar *str; if (dsn_params == prov_info->dsn_params->holders) cnc_string = g_string_new (""); else g_string_append (cnc_string, ";"); str = gda_value_stringify ((GValue *) value); g_string_append_printf (cnc_string, "%s=%s", gda_holder_get_id (param), str); g_free (str); } } } } /* Data source declaration */ if (allok) { assistant->priv->dsn_info = g_new0 (GdaDsnInfo, 1); assistant->priv->dsn_info->name = g_strdup (gtk_entry_get_text (GTK_ENTRY (assistant->priv->general_name))); assistant->priv->dsn_info->provider = g_strdup ( gdaui_provider_selector_get_provider ( GDAUI_PROVIDER_SELECTOR (assistant->priv->general_provider))); if (cnc_string) { assistant->priv->dsn_info->cnc_string = cnc_string->str; g_string_free (cnc_string, FALSE); } else assistant->priv->dsn_info->cnc_string = _gdaui_provider_spec_editor_get_specs (GDAUI_PROVIDER_SPEC_EDITOR (assistant->priv->provider_detail)); assistant->priv->dsn_info->description = g_strdup (gtk_entry_get_text (GTK_ENTRY (assistant->priv->general_description))); assistant->priv->dsn_info->auth_string = NULL; if (assistant->priv->auth_detail) assistant->priv->dsn_info->auth_string = _gdaui_provider_auth_editor_get_auth (GDAUI_PROVIDER_AUTH_EDITOR (assistant->priv->auth_detail)); if (gda_config_can_modify_system_config ()) assistant->priv->dsn_info->is_system = gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (assistant->priv->general_is_system)); else assistant->priv->dsn_info->is_system = FALSE; } /* notify listeners */ g_signal_emit (G_OBJECT (assistant), config_assistant_signals[FINISHED], 0, !allok); }
GdaConnection * test_cnc_open_connection (const gchar *provider, const gchar *dbname, GError **error) { GdaConnection *cnc = NULL; gchar *str, *upname; const gchar *cnc_params; GdaProviderInfo *prov_info; GdaQuarkList *db_quark_list = NULL, *cnc_quark_list = NULL; gboolean db_created = FALSE; g_return_val_if_fail (dbname && *dbname, NULL); prov_info = gda_config_get_provider_info (provider); if (!prov_info) { g_set_error (error, TEST_ERROR, TEST_ERROR_GENERIC, "Provider '%s' not found", provider); return NULL; } /* open connection to database */ upname = prov_name_upcase (prov_info->id); str = g_strdup_printf ("%s_CNC_PARAMS", upname); cnc_params = getenv (str); g_free (str); if (cnc_params) cnc_quark_list = gda_quark_list_new_from_string (cnc_params); if (db_quark_list || cnc_quark_list) { Data1 data; data.string = g_string_new (""); data.ql = NULL; data.requested_db_name = NULL; if (db_quark_list) gda_quark_list_foreach (db_quark_list, (GHFunc) cnc_quark_foreach_func, &data); data.ql = db_quark_list; if (cnc_quark_list) gda_quark_list_foreach (cnc_quark_list, (GHFunc) cnc_quark_foreach_func, &data); if (*(data.string->str) != 0) g_string_append_c (data.string, ';'); g_string_append_printf (data.string, "DB_NAME=%s", data.requested_db_name ? data.requested_db_name : dbname); g_print ("Open connection string: %s\n", data.string->str); gchar *auth_string = NULL; GSList *current = prov_info->auth_params->holders; while (current) { GdaHolder *holder = (GdaHolder *) current->data; const gchar *id = gda_holder_get_id (holder); const gchar *env = NULL; if (g_strrstr (id, "USER") != NULL) { str = g_strdup_printf ("%s_USER", upname); env = getenv (str); g_free (str); } else if (g_strrstr (id, "PASS") != NULL) { str = g_strdup_printf ("%s_PASS", upname); env = getenv (str); g_free (str); } if (env) { str = g_strdup_printf ("%s=%s;", id, env); gchar *tmp = auth_string; auth_string = g_strconcat (auth_string, str, NULL); g_free (str); g_free (tmp); } current = g_slist_next (current); } cnc = gda_connection_open_from_string (prov_info->id, data.string->str, auth_string, GDA_CONNECTION_OPTIONS_NONE, error); g_free (auth_string); g_string_free (data.string, TRUE); } if (db_quark_list) gda_quark_list_free (db_quark_list); if (cnc_quark_list) gda_quark_list_free (cnc_quark_list); if (!cnc_params) g_set_error (error, TEST_ERROR, TEST_ERROR_GENERIC, "Connection parameters not specified, test not executed (define %s_CNC_PARAMS or %s_DBCREATE_PARAMS to create a test DB)\n", upname, upname); g_free (upname); return cnc; }