int main(int argc, char *argv[]) { const gchar* connection_string = "HOST=localhost;USER=murrayc;PASSWORD=yourpasswordhere;DATABASE=template1"; GdaClient *client = 0; GdaConnection *con = 0; gda_init ("glom-gda-test", NULL, argc, argv); /* 3. Create a gda client */ client = gda_client_new (); /* 4. Open the connection */ con = gda_client_open_connection_from_string (client, "PostgreSQL", connection_string, 0); if (!GDA_IS_CONNECTION (con)) { g_print ("** ERROR: could not open connection.\n"); /* This cannot work because it needs a working connection: get_errors (con); */ return 0; } gboolean created = gda_connection_create_database(con, "glomtest"); if(!created) { g_print("** Error: gda_connection_create_database failed.\n"); get_errors(con); } gda_connection_close (con); g_object_unref (G_OBJECT (client)); g_print ("** Connection successfully opened, database created, and connection closed.\n"); return 0; }
/** * Display a list with projects and let the user select one. Returns the project * id of the selected one. */ static gint sql_plugin_retrieve_project_id (PlannerPlugin *plugin, gchar *server, gchar *port, gchar *database, gchar *login, gchar *password) { GdaConnection *conn; GdaDataModel *model; gboolean success; GdaClient *client; GladeXML *gui; GtkWidget *dialog; GtkWidget *treeview; GtkWidget *ok_button; GtkListStore *liststore; GtkCellRenderer *cell; GtkTreeViewColumn *col; gint i; gint response; gint project_id; GtkTreeSelection *selection; GtkTreeIter iter; gchar *db_txt; const gchar *dsn_name = "planner-auto"; const gchar *provider = "PostgreSQL"; gchar *filename; db_txt = g_strdup_printf (CONNECTION_FORMAT_STRING,server,database); gda_config_save_data_source (dsn_name, provider, db_txt, "planner project", login, password, FALSE); g_free (db_txt); client = gda_client_new (); conn = sql_get_tested_connection (dsn_name, server, database, client, plugin); if (conn == NULL) { return -1; } success = sql_execute_command (conn, "BEGIN"); if (!success) { g_warning ("BEGIN command failed."); return -1; } success = sql_execute_command (conn, "DECLARE mycursor CURSOR FOR SELECT proj_id, name," "phase, revision FROM project ORDER by proj_id ASC"); if (!success) { g_warning ("DECLARE CURSOR command failed (project)."); return -1; } model = sql_execute_query (conn, "FETCH ALL in mycursor"); if (model == NULL) { g_warning ("FETCH ALL failed."); return -1; } filename = mrp_paths_get_glade_dir ("sql.glade"); gui = glade_xml_new (filename, "select_dialog", NULL); g_free (filename); dialog = glade_xml_get_widget (gui, "select_dialog"); treeview = glade_xml_get_widget (gui, "project_treeview"); ok_button = glade_xml_get_widget (gui, "ok_button"); g_object_unref (gui); liststore = gtk_list_store_new (4, G_TYPE_INT, G_TYPE_STRING, G_TYPE_STRING, G_TYPE_INT); gtk_tree_view_set_model (GTK_TREE_VIEW (treeview), GTK_TREE_MODEL (liststore)); cell = gtk_cell_renderer_text_new (); col = gtk_tree_view_column_new_with_attributes (_("ID"), cell, "text", COL_ID, NULL); gtk_tree_view_column_set_resizable (col, TRUE); gtk_tree_view_append_column (GTK_TREE_VIEW (treeview), col); cell = gtk_cell_renderer_text_new (); col = gtk_tree_view_column_new_with_attributes (_("Project"), cell, "text", COL_NAME, NULL); gtk_tree_view_column_set_resizable (col, TRUE); gtk_tree_view_append_column (GTK_TREE_VIEW (treeview), col); cell = gtk_cell_renderer_text_new (); col = gtk_tree_view_column_new_with_attributes (_("Phase"), cell, "text", COL_PHASE, NULL); gtk_tree_view_column_set_resizable (col, TRUE); gtk_tree_view_append_column (GTK_TREE_VIEW (treeview), col); cell = gtk_cell_renderer_text_new (); col = gtk_tree_view_column_new_with_attributes (_("Revision"), cell, "text", COL_REVISION, NULL); gtk_tree_view_column_set_resizable (col, TRUE); gtk_tree_view_append_column (GTK_TREE_VIEW (treeview), col); gtk_tree_view_columns_autosize (GTK_TREE_VIEW (treeview)); selection = gtk_tree_view_get_selection (GTK_TREE_VIEW (treeview)); gtk_tree_selection_set_mode (selection, GTK_SELECTION_SINGLE); g_signal_connect (selection, "changed", G_CALLBACK (selection_changed_cb), ok_button); g_signal_connect (treeview, "row_activated", G_CALLBACK (row_activated_cb), ok_button); for (i = 0; i < gda_data_model_get_n_rows (model); i++) { gint id; gchar *name; gchar *phase; gint revision; id = get_int (model, i, 0); name = get_string (model, i, 1); phase = get_string (model, i, 2); revision = get_int (model, i, 3); /* FIXME: needs fixing in the database backend. */ if (strcmp (phase, "NULL") == 0) { g_free (phase); phase = g_strdup (""); } gtk_list_store_append (GTK_LIST_STORE (liststore), &iter); gtk_list_store_set (GTK_LIST_STORE (liststore), &iter, COL_ID, id, COL_NAME, name, COL_PHASE, phase, COL_REVISION, revision, -1); g_free (name); g_free (phase); } if (gda_data_model_get_n_columns (model) == 0) { gtk_widget_set_sensitive (ok_button, FALSE); } g_object_unref (model); sql_execute_command (conn,"CLOSE mycursor"); gtk_widget_show_all (dialog); response = gtk_dialog_run (GTK_DIALOG (dialog)); project_id = -1; switch (response) { case GTK_RESPONSE_CANCEL: case GTK_RESPONSE_DELETE_EVENT: break; case GTK_RESPONSE_OK: if (!gtk_tree_selection_get_selected (selection, NULL, &iter)) { break; } gtk_tree_model_get (GTK_TREE_MODEL (liststore), &iter, COL_ID, &project_id, -1); break; }; gtk_widget_destroy (dialog); return project_id; }
/* Try to create the database */ static gboolean create_database (const gchar *dsn_name, const gchar *host, const gchar *db_name, PlannerPlugin *plugin) { GtkWidget *dialog; GtkWindow *window; guint result; gboolean retval; GdaConnection *conn; GdaClient *client; GdaDataSourceInfo *dsn; gchar *cnc_string_orig; /* FIXME: In postgresql we use template1 as the connection database */ gchar *init_database = "template1"; gchar *query; GError *error; dsn = gda_config_find_data_source (dsn_name); cnc_string_orig = dsn->cnc_string; retval = FALSE; window = GTK_WINDOW (plugin->main_window); /* Use same data but changing the database */ dsn->cnc_string = g_strdup_printf (CONNECTION_FORMAT_STRING, host, init_database); gda_config_save_data_source_info (dsn); client = gda_client_new (); conn = gda_client_open_connection (client, dsn_name, NULL, NULL, 0, &error); if (conn == NULL) { g_warning ("Can't connect to database server in order to check/create the database: %s", cnc_string_orig); } else { dialog = gtk_message_dialog_new (window, GTK_DIALOG_DESTROY_WITH_PARENT, GTK_MESSAGE_QUESTION, GTK_BUTTONS_YES_NO, _("Database %s is not setup for Planner. " "Do you want to do that?"), db_name); result = gtk_dialog_run (GTK_DIALOG (dialog)); gtk_widget_destroy (dialog); if (result == GTK_RESPONSE_YES) { query = g_strdup_printf ("CREATE DATABASE %s WITH ENCODING = 'UTF8'", db_name); sql_execute_command (conn, query); g_free (query); retval = TRUE; } else { retval = FALSE; } gda_connection_close (conn); g_object_unref (client); } g_free (dsn->cnc_string); dsn->cnc_string = cnc_string_orig; gda_config_save_data_source_info (dsn); return retval; }
static void sql_plugin_save (GtkAction *action, gpointer user_data) { GdaClient *client; GdaConnection *conn; PlannerPlugin *plugin = user_data; MrpProject *project; GObject *object; gchar *server = NULL; gchar *port = NULL; gchar *database = NULL; gchar *login = NULL; gchar *password = NULL; gchar *uri = NULL; const gchar *uri_plan = NULL; GError *error = NULL; gchar *db_txt; const gchar *dsn_name = "planner-auto"; const gchar *provider = "PostgreSQL"; project = planner_window_get_project (plugin->main_window); if (!sql_plugin_retrieve_db_values (plugin, _("Save to Database"), &server, &port, &database, &login, &password)) { return; } db_txt = g_strdup_printf (CONNECTION_FORMAT_STRING,server,database); gda_config_save_data_source (dsn_name, provider, db_txt, "planner project", login, password, FALSE); g_free (db_txt); client = gda_client_new (); conn = sql_get_tested_connection (dsn_name, server, database, client, plugin); if (conn == NULL) { g_object_unref (client); return; } gda_connection_close (conn); g_object_unref (client); /* This code is prepared for getting support for selecting a project to * save over. Needs finishing though. Pass project id -1 for now (always * create a new project). */ uri_plan = mrp_project_get_uri (project); /* First time project */ if (uri_plan == NULL) { uri = create_sql_uri (server, port, database, login, password, -1); if (!mrp_project_save_as (project, uri, FALSE, &error)) { show_error_dialog (plugin, error->message); g_clear_error (&error); goto fail; } g_free (uri); } /* Project was in database */ else if (strncmp (uri_plan, "sql://", 6) == 0) { if (!mrp_project_save (project, FALSE, &error)) { show_error_dialog (plugin, error->message); g_clear_error (&error); goto fail; } } /* Project wasn't in database */ else { uri = create_sql_uri (server, port, database, login, password, -1); if (!mrp_project_save_as (project, uri, FALSE, &error)) { show_error_dialog (plugin, error->message); g_clear_error (&error); goto fail; } g_free (uri); } object = G_OBJECT (plugin->main_window); g_object_set_data_full (object, SERVER, server, g_free); g_object_set_data_full (object, DATABASE, database, g_free); g_object_set_data_full (object, LOGIN, login, g_free); g_object_set_data_full (object, PASSWORD, password, g_free); return; fail: g_free (server); g_free (port); g_free (database); g_free (login); g_free (password); g_free (uri); }