/** * gda_server_provider_perform_operation_default: * @provider: a #GdaServerProvider object * @cnc: (allow-none): a #GdaConnection object which will be used to perform an action, or %NULL * @op: a #GdaServerOperation object * @error: a place to store an error, or %NULL * * Performs the operation described by @op, using the SQL from the rendering of the operation * * Returns: %TRUE if no error occurred */ gboolean gda_server_provider_perform_operation_default (GdaServerProvider *provider, GdaConnection *cnc, GdaServerOperation *op, GError **error) { gchar *sql; GdaBatch *batch; const GSList *list; gboolean retval = TRUE; sql = gda_server_provider_render_operation (provider, cnc, op, error); if (!sql) return FALSE; GdaSqlParser *parser; parser = gda_server_provider_internal_get_parser (provider); /* no ref held! */ batch = gda_sql_parser_parse_string_as_batch (parser, sql, NULL, error); g_free (sql); if (!batch) return FALSE; for (list = gda_batch_get_statements (batch); list; list = list->next) { if (gda_connection_statement_execute_non_select (cnc, GDA_STATEMENT (list->data), NULL, NULL, error) == -1) { retval = FALSE; break; } } g_object_unref (batch); return retval; }
static void show_sql (G_GNUC_UNUSED GtkButton *button, DemoData *data) { GdaServerProvider *prov; if (!data->op) return; prov = get_provider_obj (data); if (prov) { gchar *sql, *msg; GtkMessageType msg_type = GTK_MESSAGE_INFO; GtkWidget *dlg; GError *error = NULL; sql = gda_server_provider_render_operation (prov, NULL, data->op, &error); if (!sql) { msg_type = GTK_MESSAGE_ERROR; msg = g_strdup_printf ("<b>Can't render operation as SQL:</b>\n%s\n", error && error->message ? error->message : "No detail (This operation may not be accessible using SQL)"); if (error) g_error_free (error); } else msg = g_strdup_printf ("<b>SQL:</b>\n%s", sql); dlg = gtk_message_dialog_new (GTK_WINDOW (data->top_window), GTK_DIALOG_MODAL, msg_type, GTK_BUTTONS_CLOSE, NULL); gtk_message_dialog_set_markup (GTK_MESSAGE_DIALOG (dlg), msg); g_free (sql); g_free (msg); gtk_dialog_run (GTK_DIALOG (dlg)); gtk_widget_destroy (dlg); } else g_warning ("Could not get provider object"); }
/* * Create a "products" table using a GdaServerOperation object */ void create_table (GdaConnection *cnc) { GError *error = NULL; GdaServerProvider *provider; GdaServerOperation *op; gchar *sql; gint i; /* create a new GdaServerOperation object */ provider = gda_connection_get_provider (cnc); op = gda_server_provider_create_operation (provider, cnc, GDA_SERVER_OPERATION_CREATE_TABLE, NULL, &error); if (!op) { g_print ("CREATE TABLE operation is not supported by the provider: %s\n", error && error->message ? error->message : "No detail"); exit (1); } /* Set parameter's values */ /* table name */ if (!gda_server_operation_set_value_at (op, "products", &error, "/TABLE_DEF_P/TABLE_NAME")) goto on_set_error; /* "id' field */ i = 0; if (!gda_server_operation_set_value_at (op, "id", &error, "/FIELDS_A/@COLUMN_NAME/%d", i)) goto on_set_error; if (!gda_server_operation_set_value_at (op, "integer", &error, "/FIELDS_A/@COLUMN_TYPE/%d", i)) goto on_set_error; if (!gda_server_operation_set_value_at (op, "TRUE", &error, "/FIELDS_A/@COLUMN_AUTOINC/%d", i)) goto on_set_error; if (!gda_server_operation_set_value_at (op, "TRUE", &error, "/FIELDS_A/@COLUMN_PKEY/%d", i)) goto on_set_error; /* 'product_name' field */ i++; if (!gda_server_operation_set_value_at (op, "product_name", &error, "/FIELDS_A/@COLUMN_NAME/%d", i)) goto on_set_error; if (!gda_server_operation_set_value_at (op, "varchar", &error, "/FIELDS_A/@COLUMN_TYPE/%d", i)) goto on_set_error; if (!gda_server_operation_set_value_at (op, "50", &error, "/FIELDS_A/@COLUMN_SIZE/%d", i)) goto on_set_error; if (!gda_server_operation_set_value_at (op, "TRUE", &error, "/FIELDS_A/@COLUMN_NNUL/%d", i)) goto on_set_error; /* Show the SQL to execute * This does not always work since some operations may not be accessible through SQL */ sql = gda_server_provider_render_operation (provider, cnc, op, &error); if (!sql) { g_print ("Error rendering SQL: %s\n", error && error->message ? error->message : "No detail"); exit (1); } g_print ("SQL to execute: %s\n", sql); g_free (sql); /* Actually execute the operation */ if (! gda_server_provider_perform_operation (provider, cnc, op, &error)) { g_print ("Error executing the operation: %s\n", error && error->message ? error->message : "No detail"); exit (1); } g_object_unref (op); return; on_set_error: g_print ("Error setting value in GdaSererOperation: %s\n", error && error->message ? error->message : "No detail"); exit (1); }