[gnome-db] patch: gda-postgres recset
- From: Bas Driessen <bas driessen xobas com>
- To: GNOME-DB List <gnome-db-list gnome org>
- Subject: [gnome-db] patch: gda-postgres recset
- Date: Fri, 07 Jan 2005 15:49:02 +1000
Hello,
Attached a patch for the postgres provider. The append-row recset method
needs to up the total number of rows in a data model. The attached patch
takes care of that.
Further it includes all changes in the same file as send yesterday (not
to complicate roll-ins). It is a diff against the latest version in cvs.
Thanks,
Bas.
--- providers/postgres/gda-postgres-recordset.c.orig 2005-01-06 19:19:12.000000000 +1000
+++ providers/postgres/gda-postgres-recordset.c 2005-01-07 15:43:51.423767492 +1000
@@ -57,6 +57,7 @@
static gint gda_postgres_recordset_get_n_rows (GdaDataModel *model);
static const GdaRow *gda_postgres_recordset_get_row (GdaDataModel *model, gint rownum);
static const GdaRow *gda_postgres_recordset_append_row (GdaDataModel *model, const GList *values);
+static gboolean gda_postgres_recordset_remove_row (GdaDataModel *model, const GdaRow *row);
static gboolean gda_postgres_recordset_update_row (GdaDataModel *model, const GdaRow *row);
static GObjectClass *parent_class = NULL;
@@ -91,6 +92,7 @@
model_class->get_value_at = gda_postgres_recordset_get_value_at;
model_class->get_row = gda_postgres_recordset_get_row;
model_class->append_row = gda_postgres_recordset_append_row;
+ model_class->remove_row = gda_postgres_recordset_remove_row;
model_class->update_row = gda_postgres_recordset_update_row;
}
@@ -313,10 +315,119 @@
gda_postgres_make_error (pg_conn, NULL));
row = GDA_DATA_MODEL_CLASS (parent_class)->append_row (model, values);
+ /* up the total number of rows */
+ recset->priv->nrows++;
+
return row;
}
static gboolean
+gda_postgres_recordset_remove_row (GdaDataModel *model, const GdaRow *row)
+{
+ GdaPostgresRecordset *recset = (GdaPostgresRecordset *) model;
+ GdaPostgresRecordsetPrivate *priv_data;
+ gint colnum, uk, rm_rownum, i;
+ PGresult *pg_res, *pg_rm_res;
+ gchar *query, *query_where, *tmp;
+ GdaPostgresConnectionData *cnc_priv_data;
+ PGconn *pg_conn;
+ gboolean status = FALSE;
+ GdaValue *value;
+
+ g_return_val_if_fail (GDA_IS_POSTGRES_RECORDSET (recset), FALSE);
+ g_return_val_if_fail (recset->priv != NULL, FALSE);
+ g_return_val_if_fail (row != NULL, FALSE);
+
+ priv_data = recset->priv;
+ pg_res = priv_data->pg_res;
+ cnc_priv_data = g_object_get_data (G_OBJECT (priv_data->cnc),
+ OBJECT_DATA_POSTGRES_HANDLE);
+ pg_conn = cnc_priv_data->pconn;
+
+ /* checks if the given row belongs to the given model */
+ if (gda_row_get_model ((GdaRow *) row) != model) {
+ gda_connection_add_error_string (priv_data->cnc,
+ _("Given row doesn't belong to the model."));
+ return FALSE;
+ }
+
+ /* checks if the table name has been guessed */
+ if (priv_data->table_name == NULL) {
+ gda_connection_add_error_string (priv_data->cnc,
+ _("Table name could not be guessed."));
+ return FALSE;
+ }
+
+ query_where = g_strdup ("WHERE TRUE ");
+
+ for (colnum = uk = 0;
+ colnum != gda_data_model_get_n_columns (model);
+ colnum++)
+ {
+ GdaFieldAttributes *attrs = gda_data_model_describe_column (model, colnum);
+ const gchar *column_name = PQfname (pg_res, colnum);
+ gchar *curval = gda_value_stringify (gda_row_get_value ((GdaRow *) row, colnum));
+
+ /* unique column: we will use it as an index */
+ if (gda_field_attributes_get_primary_key (attrs) ||
+ gda_field_attributes_get_unique_key (attrs))
+ {
+ /* fills the 'where' part of the update command */
+ tmp = g_strdup_printf ("AND %s = '%s' ",
+ column_name,
+ curval);
+ query_where = g_strconcat (query_where, tmp, NULL);
+ g_free (tmp);
+ uk++;
+ }
+
+ g_free (curval);
+ gda_field_attributes_free (attrs);
+ }
+
+ if (uk == 0) {
+ gda_connection_add_error_string (priv_data->cnc,
+ _("Model doesn't have at least one unique key."));
+ }
+ else {
+ /* build the delete command */
+ query = g_strdup_printf ("DELETE FROM %s %s",
+ priv_data->table_name,
+ query_where);
+
+ /* remove the row */
+ pg_rm_res = PQexec (pg_conn, query);
+ g_free (query);
+
+ if (pg_rm_res != NULL) {
+ /* removal ok! */
+ if (PQresultStatus (pg_rm_res) == PGRES_COMMAND_OK)
+ status = TRUE;
+ else
+ gda_connection_add_error (priv_data->cnc,
+ gda_postgres_make_error (pg_conn, pg_rm_res));
+ PQclear (pg_rm_res);
+ }
+ else
+ gda_connection_add_error (priv_data->cnc,
+ gda_postgres_make_error (pg_conn, NULL));
+ }
+
+ g_free (query_where);
+
+ /* remove from data model by removing the data from the row and unsetting row id */
+ if (status == TRUE) {
+ for (i=0; i<gda_data_model_get_n_columns (model); i++) {
+ value = (GdaValue *) gda_row_get_value( (GdaRow *) row, i);
+ gda_value_set_string (value, "NULL");
+ }
+ gda_row_set_id ((GdaRow *) row, "R");
+ }
+
+ return status;
+}
+
+static gboolean
gda_postgres_recordset_update_row (GdaDataModel *model, const GdaRow *row)
{
GdaPostgresRecordset *recset = (GdaPostgresRecordset *) model;
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]