2006/1/26, Bas Driessen <[EMAIL PROTECTED]>: > On Thu, 2006-01-26 at 10:49 +0100, Vivien Malerba wrote: > 2006/1/26, Bas Driessen <[EMAIL PROTECTED]>: > [...] > > > > I agree with the concept to address this issue, but I don't believe this > > code above will work OK. If I append a row with values to the datamodel, > it > > returns the line number of the new row and it exits. At that point I also > > want to append it to the database. In the code above, you try to add the > row > > to the database if appending to the datamodel fails, but that is the other > > way around if I read it correctly. I will do a some testing. > > Calling the gda_data_model_row_append_values() will > (because the > GdaPostgresRecordset object does not implement the GdaDataModelRow's > append_value() virtual function): > * create a new GdaRow object initialized with the correct values > * call the GdaDataModelRow's append_row() virtual function which is > defined in gda-postgres-recordset.c:208, and will do the job. > * return the row number of the new row. > > Tell me if it works > > > If I change the gda_data_model_row_append_values as below, > it works OK. I just tested it. > > static gint > gda_data_model_row_append_values (GdaDataModel *model, > const GList *values, GError **error) > { > GdaRow *row; > > g_return_val_if_fail (GDA_IS_DATA_MODEL_ROW (model), -1); > g_return_val_if_fail (CLASS (model)->append_values != NULL, -1); > > row = CLASS (model)->append_values (GDA_DATA_MODEL_ROW (model), > values, error); > if (row) > { > CLASS (model)->append_row (GDA_DATA_MODEL_ROW (model), row, > error); > return gda_row_get_number (row); > } > else > return -1; > } > > Right, but this results in the GdaRow being added twice to the data Hash data model (once when calling "row = CLASS (model)->append_values...", and once when calling "CLASS (model)->append_row"). May I suggest that you: 1) modify the above function to static gint gda_data_model_row_append_values (GdaDataModel *model, const GList *values, GError **error) { GdaRow *row; g_return_val_if_fail (GDA_IS_DATA_MODEL_ROW (model), -1); g_return_val_if_fail (CLASS (model)->append_values != NULL, -1); row = CLASS (model)->append_values (GDA_DATA_MODEL_ROW (model), values, error); if (row) return gda_row_get_number (row); else return -1; } 2) and modify line 206 of gda-data-model-hash.c to: if (! GDA_DATA_MODEL_ROW_CLASS (G_OBJECT_GET_CLASS (model))->append_row (model, row, error)) { The idea is to make the gda_data_model_hash_append_values() function call GdaPostgresRecordset's defined append_row() instead of calling directly the GdaDataModelHash's append_row() function (which anyway gets called at the end of the GdaPostgresRecordset's defined append_row() function). Can you try that?
Thanks Vivian, that works OK. 1 record added to the table in the database and 1 row added to the datamodel. Perfect! Just a concern. This will now only work for hash implementations. I believe that the MySQL provider uses something else (have to look into again). Can we make this change more generic?
Bas.
_______________________________________________ gnome-db-list mailing list [email protected] http://mail.gnome.org/mailman/listinfo/gnome-db-list
