r16037 - gnucash/trunk - More a large number of the QofInstance properties from the public data

David Hampton hampton at cvs.gnucash.org
Tue May 1 21:57:50 EDT 2007


Author: hampton
Date: 2007-05-01 21:57:49 -0400 (Tue, 01 May 2007)
New Revision: 16037
Trac: http://svn.gnucash.org/trac/changeset/16037

Modified:
   gnucash/trunk/lib/libqof/qof/qofbook.c
   gnucash/trunk/lib/libqof/qof/qofid.c
   gnucash/trunk/lib/libqof/qof/qofinstance-p.h
   gnucash/trunk/lib/libqof/qof/qofinstance.c
   gnucash/trunk/lib/libqof/qof/qofinstance.h
   gnucash/trunk/lib/libqof/qof/qofutil.c
   gnucash/trunk/src/engine/test/test-guid.c
Log:
More a large number of the QofInstance properties from the public data
structure to a private data structure, with access to them as properties
of the object.


Modified: gnucash/trunk/lib/libqof/qof/qofbook.c
===================================================================
--- gnucash/trunk/lib/libqof/qof/qofbook.c	2007-05-01 22:05:42 UTC (rev 16036)
+++ gnucash/trunk/lib/libqof/qof/qofbook.c	2007-05-02 01:57:49 UTC (rev 16037)
@@ -30,6 +30,7 @@
  * Created by Linas Vepstas December 1998
  * Copyright (c) 1998-2001,2003 Linas Vepstas <linas at linas.org>
  * Copyright (c) 2000 Dave Peticolas
+ * Copyright (c) 2007 David Hampton <hampton at employees.org>
  */
 
 #include "config.h"
@@ -168,7 +169,7 @@
 {
   if (!book) return FALSE;
 
-  return(book->inst.dirty || qof_object_is_dirty (book));
+  return(qof_instance_get_dirty_flag(book) || qof_object_is_dirty(book));
 }
 
 void
@@ -178,8 +179,8 @@
 
   if (!book) return;
 
-  was_dirty = book->inst.dirty;
-  book->inst.dirty = FALSE;
+  was_dirty = qof_instance_get_dirty_flag(book);
+  qof_instance_set_dirty_flag(book, FALSE);
   book->dirty_time = 0;
   qof_object_mark_clean (book);
   if (was_dirty) {
@@ -194,8 +195,8 @@
 
   if (!book) return;
 
-  was_dirty = book->inst.dirty;
-  book->inst.dirty = TRUE;
+  was_dirty = qof_instance_get_dirty_flag(book);
+  qof_instance_set_dirty_flag(book, TRUE);
   if (!was_dirty) {
     book->dirty_time = time(NULL);
     if (book->dirty_cb)
@@ -206,7 +207,7 @@
 void
 qof_book_print_dirty (const QofBook *book)
 {
-  if (book->inst.dirty)
+  if (qof_instance_get_dirty_flag(book))
     printf("book is dirty.\n");
   qof_book_foreach_collection
     (book, (QofCollectionForeachCB)qof_collection_print_dirty, NULL);

Modified: gnucash/trunk/lib/libqof/qof/qofid.c
===================================================================
--- gnucash/trunk/lib/libqof/qof/qofid.c	2007-05-01 22:05:42 UTC (rev 16036)
+++ gnucash/trunk/lib/libqof/qof/qofid.c	2007-05-02 01:57:49 UTC (rev 16037)
@@ -131,12 +131,12 @@
 {
   QofCollection *col;
   if (!ent) return;
-  col = ent->collection;
+  col = qof_instance_get_collection(ent);
   if (!col) return;
   g_hash_table_remove (col->hash_of_entities, &ent->guid);
   if (!qof_alt_dirty_mode)
     qof_collection_mark_dirty(col);
-  ent->collection = NULL;
+  qof_instance_set_collection(ent, NULL);
 }
 
 void
@@ -149,7 +149,7 @@
   g_hash_table_insert (col->hash_of_entities, &ent->guid, ent);
   if (!qof_alt_dirty_mode)
     qof_collection_mark_dirty(col);
-  ent->collection = col;
+  qof_instance_set_collection(ent, col);
 }
 
 gboolean

Modified: gnucash/trunk/lib/libqof/qof/qofinstance-p.h
===================================================================
--- gnucash/trunk/lib/libqof/qof/qofinstance-p.h	2007-05-01 22:05:42 UTC (rev 16036)
+++ gnucash/trunk/lib/libqof/qof/qofinstance-p.h	2007-05-02 01:57:49 UTC (rev 16037)
@@ -24,6 +24,7 @@
  * gnucash objects use.
  * 
  * Copyright (C) 2003 Linas Vepstas <linas at linas.org>
+ * Copyright (c) 2007 David Hampton <hampton at employees.org>
  */
 
 #ifndef QOF_INSTANCE_P_H
@@ -31,6 +32,11 @@
 
 #include "qofinstance.h"
 
+/** Set the collection this instance belongs to.  This function should never
+ *  be called by user code. Instead call the qof_collection_insert_entity()
+ *  function. */
+void qof_instance_set_collection (gconstpointer ptr, QofCollection *col);
+
 void qof_instance_set_slots (QofInstance *, KvpFrame *);
 
 /*  Set the last_update time. Reserved for use by the SQL backend;
@@ -39,4 +45,8 @@
  */
 void qof_instance_set_last_update (QofInstance *inst, Timespec ts);
 
+/** Set the dirty flag of just the instance. Don't modify the
+ *  collection flag at all. */
+void qof_instance_set_dirty_flag (gconstpointer inst, gboolean flag);
+
 #endif /* QOF_INSTANCE_P_H */

Modified: gnucash/trunk/lib/libqof/qof/qofinstance.c
===================================================================
--- gnucash/trunk/lib/libqof/qof/qofinstance.c	2007-05-01 22:05:42 UTC (rev 16036)
+++ gnucash/trunk/lib/libqof/qof/qofinstance.c	2007-05-02 01:57:49 UTC (rev 16037)
@@ -25,6 +25,7 @@
  * gnucash objects use.
  *
  * Copyright (C) 2003 Linas Vepstas <linas at linas.org>
+ * Copyright (c) 2007 David Hampton <hampton at employees.org>
  */
 
 #include "config.h"
@@ -39,37 +40,195 @@
 
 /* ========================================================== */
 
+enum {
+    LAST_SIGNAL
+};
+
+enum {
+    PROP_0,
+    PROP_TYPE,
+    PROP_GUID,
+    PROP_COLLECTION,
+    PROP_BOOK,
+    PROP_KVP_DATA,
+    PROP_LAST_UPDATE,
+    PROP_EDITLEVEL,
+    PROP_DESTROYING,
+    PROP_DIRTY,
+    PROP_INFANT,
+};
+
+typedef struct QofInstancePrivate
+{
+//    QofIdType        e_type;    /**<	Entity type */
+//    GUID             guid;      /**< GUID for the entity */
+    QofCollection  *collection; /**< Entity collection */
+
+    /* The entity_table in which this instance is stored */
+//    QofBook * book;
+
+    /* kvp_data is a key-value pair database for storing arbirtary
+     * information associated with this instance.  
+     * See src/engine/kvp_doc.txt for a list and description of the 
+     * important keys. */
+//    KvpFrame *kvp_data;
+
+    /*  Timestamp used to track the last modification to this 
+     *  instance.  Typically used to compare two versions of the
+     *  same object, to see which is newer.  When used with the 
+     *  SQL backend, this field is reserved for SQL use, to compare
+     *  the version in local memory to the remote, server version.
+     */
+    Timespec last_update;
+
+    /*  Keep track of nesting level of begin/end edit calls */
+    int editlevel;
+
+    /*  In process of being destroyed */
+    gboolean do_free;
+
+    /*  dirty/clean flag. If dirty, then this instance has been modified,
+     *  but has not yet been written out to storage (file/database)
+     */
+    gboolean dirty;
+
+    /* True iff this instance has never been committed. */
+    gboolean infant;
+}  QofInstancePrivate;
+
+#define GET_PRIVATE(o)  \
+   (G_TYPE_INSTANCE_GET_PRIVATE ((o), QOF_TYPE_INSTANCE,  QofInstancePrivate))
+
 QOF_GOBJECT_GET_TYPE(QofInstance, qof_instance, G_TYPE_OBJECT, {});
 QOF_GOBJECT_FINALIZE(qof_instance);
 
+static void qof_instance_get_property (GObject         *object,
+                                       guint            prop_id,
+                                       GValue          *value,
+                                       GParamSpec      *pspec);
+static void qof_instance_set_property (GObject         *object,
+                                       guint            prop_id,
+                                       const GValue    *value,
+                                       GParamSpec      *pspec);
 static void qof_instance_dispose(GObject*);
 static void qof_instance_class_init(QofInstanceClass *klass)
 {
     GObjectClass *object_class = G_OBJECT_CLASS(klass);
     object_class->finalize = qof_instance_finalize;
     object_class->dispose = qof_instance_dispose;
+    object_class->set_property = qof_instance_set_property;
+    object_class->get_property = qof_instance_get_property;
+
+    g_type_class_add_private(klass, sizeof(QofInstancePrivate));
+
+    g_object_class_install_property
+        (object_class,
+         PROP_COLLECTION,
+         g_param_spec_pointer ("collection",
+                               "Object Collection",
+                               "A collection of like objects of which this "
+                               "particular object is amember.  E.g.. A "
+                               "collection of accounts, or a collection of "
+                               "splits.",
+                               G_PARAM_READWRITE));
+
+    g_object_class_install_property
+        (object_class,
+         PROP_BOOK,
+         g_param_spec_object ("book",
+                              "Object Book",
+                              "The book that contains this object.",
+                               QOF_TYPE_BOOK,
+                               G_PARAM_READWRITE));
+    
+    g_object_class_install_property
+        (object_class,
+         PROP_KVP_DATA,
+         g_param_spec_pointer ("kvp-data",
+                               "Object KVP Data",
+                               "A pointer to the key-value data associated "
+                               "with this object.",
+                               G_PARAM_READWRITE));
+
+    g_object_class_install_property
+        (object_class,
+         PROP_LAST_UPDATE,
+         g_param_spec_pointer ("last-update",
+                               "Object Last Update",
+                               "A pointer to the last time this object was "
+                               "updated.  This value is present for use by "
+                               "backends and shouldnot be written by other "
+                               "code.",
+                               G_PARAM_READWRITE));
+
+    g_object_class_install_property
+        (object_class,
+         PROP_EDITLEVEL,
+         g_param_spec_int ("editlevel",
+                           "Object Edit Level",
+                           "The object edit level.",
+                           0, G_MAXINT, 0,
+                           G_PARAM_READABLE));
+
+    g_object_class_install_property
+        (object_class,
+         PROP_DESTROYING,
+         g_param_spec_boolean ("destroying",
+                               "Object Destroying",
+                               "This flag is set to TRUE if the object is "
+                               "about to be destroyed.",
+                               FALSE,
+                               G_PARAM_READWRITE));
+
+    g_object_class_install_property
+        (object_class,
+         PROP_DIRTY,
+         g_param_spec_boolean ("dirty",
+                               "Object Dirty",
+                               "This flag is set to TRUE if the object has "
+                               "unsaved changes.",
+                               FALSE,
+                               G_PARAM_READWRITE));
+
+    g_object_class_install_property
+        (object_class,
+         PROP_INFANT,
+         g_param_spec_boolean ("infant",
+                               "Object Infant",
+                               "This flag is set to TRUE if the object has "
+                               "never been added to a book.  This implies "
+                               "that its destruction does not affect the "
+                               "state of the book, and therefore the saved "
+                               "state of the data file.",
+                               FALSE,
+                               G_PARAM_READABLE));
 }
 
 static void
 qof_instance_init (QofInstance *inst)
 {
+        QofInstancePrivate *priv;
+
+        priv = GET_PRIVATE(inst);
 	inst->book = NULL;
 	inst->kvp_data = kvp_frame_new();
-	inst->last_update.tv_sec = 0;
-	inst->last_update.tv_nsec = -1;
-	inst->editlevel = 0;
-	inst->do_free = FALSE;
-	inst->dirty = FALSE;
-	inst->infant = TRUE;
+	priv->last_update.tv_sec = 0;
+	priv->last_update.tv_nsec = -1;
+	priv->editlevel = 0;
+	priv->do_free = FALSE;
+	priv->dirty = FALSE;
+	priv->infant = TRUE;
 }
 
 void
 qof_instance_init_data (QofInstance *inst, QofIdType type, QofBook *book)
 {
+        QofInstancePrivate *priv;
 	QofCollection *col;
         QofIdType col_type;
 
 	g_return_if_fail(QOF_IS_INSTANCE(inst));
+        priv = GET_PRIVATE(inst);
 	g_return_if_fail(!inst->book);
 
 	inst->book = book;
@@ -95,7 +254,7 @@
           PWARN("duplicate id created, trying again");
         } while(1);
  
-        inst->collection = col;
+        priv->collection = col;
 
         qof_collection_insert_entity (col, inst);
 }
@@ -103,54 +262,169 @@
 static void
 qof_instance_dispose (GObject *instp)
 {
+        QofInstancePrivate *priv;
 	QofInstance* inst = QOF_INSTANCE(instp);
 
-        if (!inst->collection)
+        priv = GET_PRIVATE(instp);
+        if (!priv->collection)
           return;
         qof_collection_remove_entity(inst);
+
         CACHE_REMOVE(inst->e_type);
         inst->e_type = NULL;
+
 	G_OBJECT_CLASS(qof_instance_parent_class)->dispose(instp);
 }
 
 static void
 qof_instance_finalize_real (GObject *instp)
 {
+        QofInstancePrivate *priv;
 	QofInstance* inst = QOF_INSTANCE(instp);
 
 	kvp_frame_delete (inst->kvp_data);
 	inst->kvp_data = NULL;
-	inst->editlevel = 0;
-	inst->do_free = FALSE;
-	inst->dirty = FALSE;
+
+        priv = GET_PRIVATE(inst);
+        priv->editlevel = 0;
+        priv->do_free = FALSE;
+        priv->dirty = FALSE;
 }
 
+static void
+qof_instance_get_property (GObject         *object,
+                           guint            prop_id,
+                           GValue          *value,
+                           GParamSpec      *pspec)
+{
+    QofInstance *inst;
+    QofInstancePrivate *priv;
+
+    g_return_if_fail(QOF_IS_INSTANCE(object));
+
+    inst = QOF_INSTANCE(object);
+    priv = GET_PRIVATE(inst);
+
+    switch (prop_id) {
+        case PROP_GUID:
+            g_value_set_boxed(value, &inst->guid);
+            break;
+        case PROP_COLLECTION:
+            g_value_set_pointer(value, priv->collection);
+            break;
+        case PROP_BOOK:
+            g_value_set_object(value, inst->book);
+            break;
+        case PROP_KVP_DATA:
+            g_value_set_pointer(value, inst->kvp_data);
+            break;
+        case PROP_LAST_UPDATE:
+            g_value_set_pointer(value, &priv->last_update);
+            break;
+        case PROP_EDITLEVEL:
+            g_value_set_int(value, priv->editlevel);
+            break;
+        case PROP_DESTROYING:
+            g_value_set_boolean(value, priv->do_free);
+            break;
+        case PROP_DIRTY:
+            g_value_set_boolean(value, qof_instance_get_dirty(inst));
+            break;
+        case PROP_INFANT:
+            g_value_set_boolean(value, priv->infant);
+            break;
+        default:
+            G_OBJECT_WARN_INVALID_PROPERTY_ID(object, prop_id, pspec);
+            break;
+    }
+}
+
+static void
+qof_instance_set_property (GObject         *object,
+                           guint            prop_id,
+                           const GValue    *value,
+                           GParamSpec      *pspec)
+{
+    QofInstance *inst;
+    QofInstancePrivate *priv;
+    Timespec *ts;
+
+    g_return_if_fail(QOF_IS_INSTANCE(object));
+
+    inst = QOF_INSTANCE(object);
+    priv = GET_PRIVATE(inst);
+
+    switch (prop_id) {
+        case PROP_GUID:
+            qof_instance_set_guid(inst, g_value_get_boxed(value));
+            break;
+        case PROP_COLLECTION:
+            qof_instance_set_collection(inst, g_value_get_pointer(value));
+            break;
+        case PROP_BOOK:
+            qof_instance_set_book(inst, g_value_get_object(value));
+            break;
+        case PROP_KVP_DATA:
+            qof_instance_set_slots(inst, g_value_get_pointer(value));
+            break;
+        case PROP_LAST_UPDATE:
+            ts = g_value_get_pointer(value);
+            qof_instance_set_last_update(inst, *ts);
+            break;
+        case PROP_DESTROYING:
+            qof_instance_set_destroying(inst, g_value_get_boolean(value));
+            break;
+        case PROP_DIRTY:
+            qof_instance_set_dirty(inst);
+            break;
+        default:
+            G_OBJECT_WARN_INVALID_PROPERTY_ID(object, prop_id, pspec);
+            break;
+    }
+}
+
 const GUID *
 qof_instance_get_guid (const QofInstance *inst)
 {
+    QofInstancePrivate *priv;
+
     if (!inst) return guid_null();
-	return &(inst->guid);
+    g_return_val_if_fail(QOF_IS_INSTANCE(inst), guid_null());
+    priv = GET_PRIVATE(inst);
+    return &(inst->guid);
 }
 
 void
 qof_instance_set_guid (QofInstance *ent, const GUID *guid)
 {
-  QofCollection *col;
-  if (guid_equal (guid, &ent->guid)) return;
+    QofInstancePrivate *priv;
+    QofCollection *col;
 
-  col = ent->collection;
-  qof_collection_remove_entity(ent);
-  ent->guid = *guid;
-  qof_collection_insert_entity(col, ent);
+    priv = GET_PRIVATE(ent);
+    if (guid_equal (guid, &ent->guid))
+        return;
+
+    col = priv->collection;
+    qof_collection_remove_entity (ent);
+    ent->guid = *guid;
+    qof_collection_insert_entity (col, ent);
 }
 
-const QofCollection *
+QofCollection *
 qof_instance_get_collection (gconstpointer ptr)
 {
+    
     g_return_val_if_fail(QOF_IS_INSTANCE(ptr), NULL);
-    return QOF_INSTANCE(ptr)->collection;
+    return GET_PRIVATE(ptr)->collection;
 }
 
+void
+qof_instance_set_collection (gconstpointer ptr, QofCollection *col)
+{
+    g_return_if_fail(QOF_IS_INSTANCE(ptr));
+    GET_PRIVATE(ptr)->collection = col;
+}
+
 QofBook *
 qof_instance_get_book (const QofInstance *inst)
 {
@@ -158,66 +432,100 @@
     return inst->book;
 }
 
+void
+qof_instance_set_book (gconstpointer inst, QofBook *book)
+{
+    g_return_if_fail(QOF_IS_INSTANCE(inst));
+    QOF_INSTANCE(inst)->book = book;
+}
+
 KvpFrame*
 qof_instance_get_slots (const QofInstance *inst)
 {
-  if (!inst) return NULL;
-  return inst->kvp_data;
+    if (!inst) return NULL;
+    return inst->kvp_data;
 }
 
+void
+qof_instance_set_slots (QofInstance *inst, KvpFrame *frm)
+{
+    QofInstancePrivate *priv;
+
+    if (!inst) return;
+
+    priv = GET_PRIVATE(inst);
+    if (inst->kvp_data && (inst->kvp_data != frm)) {
+        kvp_frame_delete(inst->kvp_data);
+    }
+
+    priv->dirty = TRUE;
+    inst->kvp_data = frm;
+}
+
 Timespec
 qof_instance_get_last_update (const QofInstance *inst)
 {
-	if (!inst)
-	{
-		Timespec ts = {0,-1};
-		return ts;
-	}
-	return inst->last_update;
+    if (!inst) {
+        Timespec ts = {0,-1};
+        return ts;
+    }
+    return GET_PRIVATE(inst)->last_update;
 }
 
+void
+qof_instance_set_last_update (QofInstance *inst, Timespec ts)
+{
+    if (!inst) return;
+    GET_PRIVATE(inst)->last_update = ts;
+}
+
 gint
 qof_instance_get_editlevel (gconstpointer ptr)
 {
     g_return_val_if_fail(QOF_IS_INSTANCE(ptr), 0);
-    return QOF_INSTANCE(ptr)->editlevel;
+    return GET_PRIVATE(ptr)->editlevel;
 }
 
 void qof_instance_increase_editlevel (gpointer ptr)
 {
     g_return_if_fail(QOF_IS_INSTANCE(ptr));
-    QOF_INSTANCE(ptr)->editlevel++;
+    GET_PRIVATE(ptr)->editlevel++;
 }
 
 void qof_instance_decrease_editlevel (gpointer ptr)
 {
     g_return_if_fail(QOF_IS_INSTANCE(ptr));
-    QOF_INSTANCE(ptr)->editlevel--;
+    GET_PRIVATE(ptr)->editlevel--;
 }
 
 void qof_instance_reset_editlevel (gpointer ptr)
 {
     g_return_if_fail(QOF_IS_INSTANCE(ptr));
-    QOF_INSTANCE(ptr)->editlevel = 0;
+    GET_PRIVATE(ptr)->editlevel = 0;
 }
 
 gboolean
 qof_instance_check_edit(const  QofInstance *inst)
 {
     g_return_val_if_fail(QOF_IS_INSTANCE(inst), FALSE);
-    return (inst->editlevel > 0);
+    return (GET_PRIVATE(inst)->editlevel > 0);
 }
 
 int
 qof_instance_version_cmp (const QofInstance *left, const QofInstance *right)
 {
+        QofInstancePrivate *lpriv, *rpriv;
+
 	if (!left && !right) return 0;
 	if (!left) return -1;
 	if (!right) return +1;
-	if (left->last_update.tv_sec < right->last_update.tv_sec) return -1;
-	if (left->last_update.tv_sec > right->last_update.tv_sec) return +1;
-	if (left->last_update.tv_nsec < right->last_update.tv_nsec) return -1;
-	if (left->last_update.tv_nsec > right->last_update.tv_nsec) return +1;
+
+        lpriv = GET_PRIVATE(left);
+        rpriv = GET_PRIVATE(right);
+        if (lpriv->last_update.tv_sec  < rpriv->last_update.tv_sec) return -1;
+        if (lpriv->last_update.tv_sec  > rpriv->last_update.tv_sec) return +1;
+        if (lpriv->last_update.tv_nsec < rpriv->last_update.tv_nsec) return -1;
+        if (lpriv->last_update.tv_nsec > rpriv->last_update.tv_nsec) return +1;
 	return 0;
 }
 
@@ -225,110 +533,106 @@
 qof_instance_get_destroying (gconstpointer ptr)
 {
     g_return_val_if_fail(QOF_IS_INSTANCE(ptr), FALSE);
-    return QOF_INSTANCE(ptr)->do_free;
+    return GET_PRIVATE(ptr)->do_free;
 }
 
 void
 qof_instance_set_destroying (gpointer ptr, gboolean value)
 {
     g_return_if_fail(QOF_IS_INSTANCE(ptr));
-    QOF_INSTANCE(ptr)->do_free = value;
+    GET_PRIVATE(ptr)->do_free = value;
 }
 
 gboolean
 qof_instance_get_dirty_flag (gconstpointer ptr)
 {
     g_return_val_if_fail(QOF_IS_INSTANCE(ptr), FALSE);
-    return QOF_INSTANCE(ptr)->dirty;
+    return GET_PRIVATE(ptr)->dirty;
 }
 
 void
-qof_instance_print_dirty (const QofInstance *entity, gpointer dummy)
+qof_instance_set_dirty_flag (gconstpointer inst, gboolean flag)
 {
-  QofInstance *inst = QOF_INSTANCE(entity);
+    g_return_if_fail(QOF_IS_INSTANCE(inst));
+    GET_PRIVATE(inst)->dirty = flag;
+}
 
-  if (inst->dirty)
-    printf("%s instance %s is dirty.\n", inst->e_type,
-	   guid_to_string(&inst->guid));
+void
+qof_instance_mark_clean (QofInstance *inst)
+{
+  if(!inst) return;
+  GET_PRIVATE(inst)->dirty = FALSE;
 }
 
+void
+qof_instance_print_dirty (const QofInstance *inst, gpointer dummy)
+{
+    QofInstancePrivate *priv;
+
+    priv = GET_PRIVATE(inst);
+    if (priv->dirty) {
+        printf("%s instance %s is dirty.\n", inst->e_type,
+               guid_to_string(&inst->guid));
+    }
+}
+
 gboolean
-qof_instance_is_dirty (QofInstance *inst)
+qof_instance_get_dirty (QofInstance *inst)
 {
+        QofInstancePrivate *priv;
 	QofCollection *coll;
 
 	if (!inst) { return FALSE; }
+
+        priv = GET_PRIVATE(inst);
 	if (qof_get_alt_dirty_mode())
-	  return inst->dirty;
-	coll = inst->collection;
-	if(qof_collection_is_dirty(coll)) { return inst->dirty; }
-	inst->dirty = FALSE;
+	  return priv->dirty;
+	coll = priv->collection;
+	if(qof_collection_is_dirty(coll)) { return priv->dirty; }
+	priv->dirty = FALSE;
 	return FALSE;
 }
 
 void
 qof_instance_set_dirty(QofInstance* inst)
 {
+        QofInstancePrivate *priv;
 	QofCollection *coll;
 
-	inst->dirty = TRUE;
+        priv = GET_PRIVATE(inst);
+        priv->dirty = TRUE;
 	if (!qof_get_alt_dirty_mode()) {
-	  coll = inst->collection;
+	  coll = priv->collection;
 	  qof_collection_mark_dirty(coll);
 	}
 }
 
 gboolean
-qof_instance_do_free(const QofInstance *inst)
+qof_instance_get_infant(const QofInstance *inst)
 {
-	return inst->do_free;
+    g_return_val_if_fail(QOF_IS_INSTANCE(inst), FALSE);
+    return GET_PRIVATE(inst)->infant;
 }
 
-void
-qof_instance_mark_free(QofInstance *inst)
-{
-	inst->do_free = TRUE;
-}
-
 /* ========================================================== */
-/* setters */
 
 void
-qof_instance_mark_clean (QofInstance *inst)
+qof_instance_gemini (QofInstance *to, const QofInstance *from)
 {
-  if(!inst) return;
-  inst->dirty = FALSE;
-}
+  QofInstancePrivate *from_priv, *to_priv, *fb_priv, *tb_priv;
+  time_t now;
 
-void
-qof_instance_set_slots (QofInstance *inst, KvpFrame *frm)
-{
-  if (!inst) return;
-  if (inst->kvp_data && (inst->kvp_data != frm))
-  {
-    kvp_frame_delete(inst->kvp_data);
-  }
+  g_return_if_fail(QOF_IS_INSTANCE(to));
+  g_return_if_fail(QOF_IS_INSTANCE(from));
 
-  inst->dirty = TRUE;
-  inst->kvp_data = frm;
-}
+  from_priv = GET_PRIVATE(from);
+  to_priv = GET_PRIVATE(to);
+  fb_priv = GET_PRIVATE(QOF_INSTANCE(from)->book);
+  tb_priv = GET_PRIVATE(QOF_INSTANCE(to)->book);
 
-void
-qof_instance_set_last_update (QofInstance *inst, Timespec ts)
-{
-  if (!inst) return;
-  inst->last_update = ts;
-}
-
-/* ========================================================== */
-
-void
-qof_instance_gemini (QofInstance *to, const QofInstance *from)
-{
-  time_t now;
-
   /* Books must differ for a gemini to be meaningful */
-  if (!from || !to || (from->book == to->book)) return;
+  if (from->book == to->book)
+    return;
 
   now = time(0);
 
@@ -342,7 +646,7 @@
                                   "book_guid", &to->book->inst.guid,
                                   NULL);
 
-  to->dirty = TRUE;
+  to_priv->dirty = TRUE;
 }
 
 QofInstance *
@@ -368,4 +672,118 @@
 	return twin;
 }
 
+/* =================================================================== */
+/* Entity edit and commit utilities */
+/* =================================================================== */
+
+gboolean
+qof_begin_edit (QofInstance *inst)
+{
+    QofInstancePrivate *priv;
+    QofBackend * be;
+
+    if (!inst) return FALSE;
+
+    priv = GET_PRIVATE(inst);
+    priv->editlevel++;
+    if (1 < priv->editlevel) return FALSE;
+    if (0 >= priv->editlevel) 
+        priv->editlevel = 1;
+
+    be = qof_book_get_backend(inst->book);
+    if (be && qof_backend_begin_exists(be))
+        qof_backend_run_begin(be, inst);
+    else
+        priv->dirty = TRUE; 
+  
+    return TRUE;
+}
+
+gboolean qof_commit_edit (QofInstance *inst)
+{
+    QofInstancePrivate *priv;
+    QofBackend * be;
+
+    if (!inst) return FALSE;
+
+    priv = GET_PRIVATE(inst);
+    priv->editlevel--;
+    if (0 < priv->editlevel) return FALSE;
+
+    if ((0 == priv->editlevel) && priv->dirty) {
+        be = qof_book_get_backend(inst->book);
+        if (be && qof_backend_commit_exists(be)) {
+            qof_backend_run_commit(be, inst);
+        }
+    }
+    if (0 > priv->editlevel) { 
+        PERR ("unbalanced call - resetting (was %d)", priv->editlevel);
+        priv->editlevel = 0;
+    }
+    return TRUE;
+}
+
+gboolean
+qof_commit_edit_part2(QofInstance *inst, 
+                      void (*on_error)(QofInstance *, QofBackendError), 
+                      void (*on_done)(QofInstance *), 
+                      void (*on_free)(QofInstance *)) 
+{
+    QofInstancePrivate *priv;
+    QofBackend * be;
+    gboolean dirty;
+
+    priv = GET_PRIVATE(inst);
+    dirty = priv->dirty;
+
+    /* See if there's a backend.  If there is, invoke it. */
+    be = qof_book_get_backend(inst->book);
+    if (be && qof_backend_commit_exists(be)) {
+        QofBackendError errcode;
+        
+        /* clear errors */
+        do {
+            errcode = qof_backend_get_error(be);
+        } while (ERR_BACKEND_NO_ERR != errcode);
+
+        qof_backend_run_commit(be, inst);
+        errcode = qof_backend_get_error(be);
+        if (ERR_BACKEND_NO_ERR != errcode) {
+            /* XXX Should perform a rollback here */
+            priv->do_free = FALSE;
+
+            /* Push error back onto the stack */
+            qof_backend_set_error (be, errcode);
+            if (on_error)
+                on_error(inst, errcode);
+            return FALSE;
+        }   
+        /* XXX the backend commit code should clear dirty!! */
+        priv->dirty = FALSE;
+    }
+    if (dirty && qof_get_alt_dirty_mode() && 
+        !(priv->infant && priv->do_free)) {
+      qof_collection_mark_dirty(priv->collection);
+      qof_book_mark_dirty(inst->book);
+    }
+    priv->infant = FALSE;
+
+    if (priv->do_free) {
+        if (on_free)
+            on_free(inst);
+        return TRUE;
+    }
+    
+    if (on_done)
+        on_done(inst);
+    return TRUE;
+}
+
 /* ========================== END OF FILE ======================= */
+
+// Local Variables:
+// mode: c
+// indent-tabs-mode: nil
+// c-block-comment-prefix: "* "
+// eval: (c-add-style "gnc" '("k&r" (c-basic-offset . 4) (c-offsets-alist (case-label . +))) t)
+// End:

Modified: gnucash/trunk/lib/libqof/qof/qofinstance.h
===================================================================
--- gnucash/trunk/lib/libqof/qof/qofinstance.h	2007-05-01 22:05:42 UTC (rev 16036)
+++ gnucash/trunk/lib/libqof/qof/qofinstance.h	2007-05-02 01:57:49 UTC (rev 16037)
@@ -31,6 +31,7 @@
  *  @brief Object instance holds common fields that most gnucash objects use.
  * 
  *  @author Copyright (C) 2003,2004 Linas Vepstas <linas at linas.org>
+ *  @author Copyright (c) 2007 David Hampton <hampton at employees.org>
  */
 
 #ifndef QOF_INSTANCE_H
@@ -65,10 +66,8 @@
 {
    GObject object;
 
-   /* Globally unique id identifying this instance */
    QofIdType        e_type;		   /**<	Entity type */
    GUID             guid;		   /**< GUID for the entity */
-   QofCollection  * collection;		   /**< Entity collection */
 
    /* The entity_table in which this instance is stored */
    QofBook * book;
@@ -78,28 +77,6 @@
    * See src/engine/kvp_doc.txt for a list and description of the 
    * important keys. */
    KvpFrame *kvp_data;
-
-   /*  Timestamp used to track the last modification to this 
-    *  instance.  Typically used to compare two versions of the
-    *  same object, to see which is newer.  When used with the 
-    *  SQL backend, this field is reserved for SQL use, to compare
-    *  the version in local memory to the remote, server version.
-    */
-   Timespec last_update;
-
-   /*  Keep track of nesting level of begin/end edit calls */
-   int    editlevel;
-
-   /*  In process of being destroyed */
-   gboolean  do_free;
-
-   /*  dirty/clean flag. If dirty, then this instance has been modified,
-    *  but has not yet been written out to storage (file/database)
-    */
-   gboolean  dirty;
-
-   /* True iff this instance has never been committed. */
-   gboolean infant;
 };
 
 struct _QofInstanceClass
@@ -116,11 +93,14 @@
 /** Return the book pointer */
 QofBook * qof_instance_get_book (const QofInstance *);
 
+/** Set the book pointer */
+void qof_instance_set_book (gconstpointer inst, QofBook *book);
+
 /** Return the GUID of this instance */
 const GUID * qof_instance_get_guid (const QofInstance *);
 
 /** Return the collection this instance belongs to */
-const QofCollection* qof_instance_get_collection (gconstpointer inst);
+QofCollection* qof_instance_get_collection (gconstpointer inst);
 
 /** Set the GUID of this instance */
 void qof_instance_set_guid (QofInstance *ent, const GUID *guid);
@@ -183,7 +163,8 @@
 void qof_instance_print_dirty (const QofInstance *entity, gpointer dummy);
 
 /** Return value of is_dirty flag */
-gboolean qof_instance_is_dirty (QofInstance *);
+#define qof_instance_is_dirty qof_instance_get_dirty
+gboolean qof_instance_get_dirty (QofInstance *);
 
 /** \brief Set the dirty flag
 
@@ -194,12 +175,14 @@
 /* reset the dirty flag */
 void qof_instance_mark_clean (QofInstance *);
 
+gint qof_instance_get_editlevel(gconstpointer inst);
+void qof_instance_set_editlevel(gpointer inst, gint level);
+void qof_instance_increase_editlevel(gpointer inst);
+void qof_instance_decrease_editlevel(gpointer inst);
 gboolean qof_instance_check_edit(const QofInstance *inst);
 
-gboolean qof_instance_do_free(const QofInstance *inst);
+gboolean qof_instance_get_infant(const QofInstance *inst);
 
-void qof_instance_mark_free(QofInstance *inst);
-
 /** Pair things up.  This routine inserts a kvp value into each instance
  *  containing the guid of the other.  In this way, if one has one of the
  *  pair, one can always find the other by looking up it's guid.  Typically,

Modified: gnucash/trunk/lib/libqof/qof/qofutil.c
===================================================================
--- gnucash/trunk/lib/libqof/qof/qofutil.c	2007-05-01 22:05:42 UTC (rev 16036)
+++ gnucash/trunk/lib/libqof/qof/qofutil.c	2007-05-02 01:57:49 UTC (rev 16037)
@@ -224,105 +224,6 @@
 }
 
 /* =================================================================== */
-/* Entity edit and commit utilities */
-/* =================================================================== */
-
-gboolean
-qof_begin_edit(QofInstance *inst)
-{
-  QofBackend * be;
-
-  if (!inst) return FALSE;
-  inst->editlevel++;
-  if (1 < inst->editlevel) return FALSE;
-  if (0 >= inst->editlevel) 
-      inst->editlevel = 1;
-
-  be = qof_book_get_backend (inst->book);
-  if (be && qof_backend_begin_exists(be))
-      qof_backend_run_begin(be, inst);
-  else
-      inst->dirty = TRUE; 
-  
-  return TRUE;
-}
-
-gboolean qof_commit_edit(QofInstance *inst)
-{
-  QofBackend * be;
-
-  if (!inst) return FALSE;
-  inst->editlevel--;
-  if (0 < inst->editlevel) return FALSE;
-
-  if ((0 == inst->editlevel) && inst->dirty)
-  {
-    be = qof_book_get_backend (inst->book);
-    if (be && qof_backend_commit_exists(be)) {
-        qof_backend_run_commit(be, inst);
-    }
-  }
-  if (0 > inst->editlevel) { 
-      PERR ("unbalanced call - resetting (was %d)", inst->editlevel);
-      inst->editlevel = 0;
-  }
-  return TRUE;
-}
-
-
-gboolean
-qof_commit_edit_part2(QofInstance *inst, 
-                      void (*on_error)(QofInstance *, QofBackendError), 
-                      void (*on_done)(QofInstance *), 
-                      void (*on_free)(QofInstance *)) 
-{
-    QofBackend * be;
-    gboolean dirty = inst->dirty;
-
-    /* See if there's a backend.  If there is, invoke it. */
-    be = qof_book_get_backend(inst->book);
-    if (be && qof_backend_commit_exists(be)) {
-        QofBackendError errcode;
-        
-        /* clear errors */
-        do {
-            errcode = qof_backend_get_error(be);
-        } while (ERR_BACKEND_NO_ERR != errcode);
-
-        qof_backend_run_commit(be, inst);
-        errcode = qof_backend_get_error(be);
-        if (ERR_BACKEND_NO_ERR != errcode) {
-            /* XXX Should perform a rollback here */
-            inst->do_free = FALSE;
-
-            /* Push error back onto the stack */
-            qof_backend_set_error (be, errcode);
-            if (on_error)
-                on_error(inst, errcode);
-            return FALSE;
-        }   
-        /* XXX the backend commit code should clear dirty!! */
-        inst->dirty = FALSE;
-    }
-    if (dirty && qof_get_alt_dirty_mode() && 
-        !(inst->infant && inst->do_free)) {
-      qof_collection_mark_dirty(inst->collection);
-      qof_book_mark_dirty(inst->book);
-    }
-    inst->infant = FALSE;
-
-    if (inst->do_free) {
-        if (on_free)
-            on_free(inst);
-        return TRUE;
-    }
-
-    if (on_done)
-        on_done(inst);
-    return TRUE;
-}
-
-/* =================================================================== */
 /* The QOF string cache */
 /* =================================================================== */
 

Modified: gnucash/trunk/src/engine/test/test-guid.c
===================================================================
--- gnucash/trunk/src/engine/test/test-guid.c	2007-05-01 22:05:42 UTC (rev 16036)
+++ gnucash/trunk/src/engine/test/test-guid.c	2007-05-02 01:57:49 UTC (rev 16037)
@@ -34,6 +34,8 @@
 #include "test-engine-stuff.h"
 #include "qof.h"
 
+#define NENT 500123
+
 static void test_null_guid(void)
 {
   GUID g;
@@ -53,7 +55,7 @@
   int i;
   QofSession *sess;
   QofBook *book;
-  QofInstance *eblk;
+  QofInstance *ent, *eblk[NENT];
   QofCollection *col;
   QofIdType type;
 
@@ -64,11 +66,10 @@
   col = qof_book_get_collection (book, "asdf");
   type = qof_collection_get_type (col);
   
-#define NENT 500123
-  eblk = g_new0(QofInstance, NENT);
   for (i=0; i<NENT; i++)
   {
-    QofInstance *ent = &eblk[i];
+    ent = g_object_new(QOF_TYPE_INSTANCE, NULL);
+    eblk[i] = ent;
     guid_new(&ent->guid);
     do_test ((NULL == qof_collection_lookup_entity (col, &ent->guid)),
 						  "duplicate guid");



More information about the gnucash-changes mailing list