Re: [gnome-db] append row to data model.



2006/1/26, Bas Driessen <bas driessen xobas com>:
>  On Thu, 2006-01-26 at 11:12 +0100, Vivien Malerba wrote:
>  2006/1/26, Bas Driessen <bas driessen xobas com>:
> > On Thu, 2006-01-26 at 10:49 +0100, Vivien Malerba wrote:
> > 2006/1/26, Bas Driessen <bas driessen xobas com>:
> > [...]
> > >
> > > 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,

Vivien



[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]