OK, understood Vivian. Will do some testing with MySQL in the morning. To avoid that we overlap any source roll-ins. I will NOT apply anything to CVS HEAD unless you advise me otherwise. Once you have applied your local copy to CVS HEAD, I will re-test and double check if all works OK.2006/1/26, Bas Driessen <[EMAIL PROTECTED]>: > On Thu, 2006-01-26 at 11:12 +0100, Vivien Malerba wrote: > 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? > Yes, you're right, the Mysql recordset inherits the GdaDataModelArray. Here is what I propose: correct the gda_data_model_array_append_values() to call the add_row() virtual function instead of the lines 137 to 139 which do that. I'll correct it in my local copy.
Thanks for your help today!
Bas.
_______________________________________________ gnome-db-list mailing list [email protected] http://mail.gnome.org/mailman/listinfo/gnome-db-list
