~kamstrup/dee/sorted

« back to all changes in this revision

Viewing changes to dee/dee-serializable-model.c

  • Committer: Tarmac
  • Author(s): Mikkel Kamstrup Erlandsen
  • Date: 2011-12-15 12:38:40 UTC
  • mfrom: (309.1.42 transactions)
  • Revision ID: tarmac-20111215123840-c8orvxf3iq88widl
Implement transaction logic for DeeModels in DeeTransaction

This branch implements a new class, DeeTransaction, that implements
transaction isolation on top of any old DeeModel implementation. It
has only one interesting API call so far,namely commit() which does
as labeled.

How/if exactly we want to expose a transactional API on DeeModel itself
is still up in the air; but this work should provide a solid foundation
for that. (and all of the trickier code needed, anything else will be
mostly just gloss).

Since this is a rather complicated afair I recomment that we take a somewhat
functional approach to the review. Validate the testing harness - and possibly
submit a few new test cases to cover the stuff I didn't think of.. Fixes: https://bugs.launchpad.net/bugs/894023. Appoved by Michal Hruby.

Show diffs side-by-side

added added

removed removed

Lines of Context:
427
427
static guint
428
428
dee_serializable_model_get_n_rows (DeeModel *self)
429
429
{
430
 
  DeeModelIter *iter;
 
430
  DeeModelIter *iter, *end;
431
431
  guint         count;
432
432
 
433
433
  count = 0;
 
434
  end = dee_model_get_last_iter (self);
434
435
  iter = dee_model_get_first_iter (self);
435
 
  while (!dee_model_is_last (self, iter))
 
436
  while (iter != end)
436
437
    {
437
438
      iter = dee_model_next (self, iter);
438
439
      count++;
462
463
dee_serializable_model_prepend_row (DeeModel  *self,
463
464
                                 GVariant **row_members)
464
465
{
465
 
  g_critical ("%s not implemented", G_STRFUNC);
466
 
  return NULL;
 
466
  DeeModelIter *iter;
 
467
 
 
468
  g_return_val_if_fail (DEE_IS_SERIALIZABLE_MODEL (self), NULL);
 
469
 
 
470
  iter = dee_model_get_first_iter (self);
 
471
  return dee_model_insert_row_before (self, iter, row_members);
467
472
}
468
473
 
469
474
static DeeModelIter*
470
475
dee_serializable_model_append_row (DeeModel  *self,
471
 
                                GVariant **row_members)
 
476
                                   GVariant **row_members)
472
477
{
473
 
  g_critical ("%s not implemented", G_STRFUNC);
474
 
  return NULL;
 
478
  DeeModelIter *iter;
 
479
 
 
480
  g_return_val_if_fail (DEE_IS_SERIALIZABLE_MODEL (self), NULL);
 
481
 
 
482
  iter = dee_model_get_last_iter (self);
 
483
  return dee_model_insert_row_before (self, iter, row_members);
475
484
}
476
485
 
477
486
static DeeModelIter*
478
487
dee_serializable_model_insert_row (DeeModel  *self,
479
 
                                guint      pos,
480
 
                                GVariant **row_members)
 
488
                                   guint      pos,
 
489
                                   GVariant **row_members)
481
490
{
482
491
  DeeModelIter *iter;
483
492
 
484
 
  g_return_val_if_fail (DEE_IS_SERIALIZABLE_MODEL (self), 0);
 
493
  g_return_val_if_fail (DEE_IS_SERIALIZABLE_MODEL (self), NULL);
485
494
 
486
495
  if (pos > 0)
487
496
    {
782
791
  pos = 0;
783
792
  iter = dee_model_get_first_iter (self);
784
793
  while (!dee_model_is_last (self, iter) && pos < row)
785
 
    iter = dee_model_next (self, iter);
786
 
    pos++;
 
794
    {
 
795
      iter = dee_model_next (self, iter);
 
796
      pos++;
 
797
    }
787
798
 
788
799
  if (dee_model_is_last (self, iter))
789
800
    {