[rhythmbox] rhythmdb: use entry changes in the default sync function



commit 1025f471ac07ea1830f6fd9fbcd9f0bfffe58351
Author: Jonathan Matthew <jonathan d14n org>
Date:   Sat Feb 6 22:31:29 2010 +1000

    rhythmdb: use entry changes in the default sync function
    
    Rather than writing all the entry properties through the metadata
    backend, just write the changes.  This should mean we don't write
    default values for tags that weren't already present in the file.

 rhythmdb/rhythmdb.c |   43 +++++++++++++++++--------------------------
 rhythmdb/rhythmdb.h |    2 +-
 2 files changed, 18 insertions(+), 27 deletions(-)
---
diff --git a/rhythmdb/rhythmdb.c b/rhythmdb/rhythmdb.c
index 6f3fae8..46a1d62 100644
--- a/rhythmdb/rhythmdb.c
+++ b/rhythmdb/rhythmdb.c
@@ -2956,30 +2956,6 @@ rhythmdb_entry_get (RhythmDB *db,
 	}
 }
 
-static void
-entry_to_rb_metadata (RhythmDB *db,
-		      RhythmDBEntry *entry,
-		      RBMetaData *metadata)
-{
-	GValue val = {0, };
-	int i;
-
-	for (i = RHYTHMDB_PROP_TYPE; i != RHYTHMDB_NUM_PROPERTIES; i++) {
-		RBMetaDataField field;
-
-		if (metadata_field_from_prop (i, &field) == FALSE) {
-			continue;
-		}
-
-		g_value_init (&val, rhythmdb_property_type_map[i]);
-		rhythmdb_entry_get (db, entry, i, &val);
-		rb_metadata_set (metadata,
-				 field,
-				 &val);
-		g_value_unset (&val);
-	}
-}
-
 typedef struct
 {
 	RhythmDB *db;
@@ -3058,7 +3034,7 @@ action_thread_main (RhythmDB *db)
 					break;
 
 				entry_type = rhythmdb_entry_get_entry_type (entry);
-				entry_type->sync_metadata (db, entry, &error, entry_type->sync_metadata_data);
+				entry_type->sync_metadata (db, entry, action->data.changes, &error, entry_type->sync_metadata_data);
 
 				if (error != NULL) {
 					RhythmDBSaveErrorData *data;
@@ -4652,16 +4628,31 @@ rhythmdb_compute_status_normal (gint n_songs,
 static void
 default_sync_metadata (RhythmDB *db,
 		       RhythmDBEntry *entry,
+		       GSList *changes,
 		       GError **error,
 		       gpointer data)
 {
 	const char *uri;
 	GError *local_error = NULL;
+	GSList *t;
 
 	uri = rhythmdb_entry_get_string (entry, RHYTHMDB_PROP_LOCATION);
 	rb_metadata_reset (db->priv->metadata);
 
-	entry_to_rb_metadata (db, entry, db->priv->metadata);
+	for (t = changes; t; t = t->next) {
+		RBMetaDataField field;
+		GValue val = {0,};
+		RhythmDBEntryChange *change = (RhythmDBEntryChange *)t->data;
+
+		if (metadata_field_from_prop (change->prop, &field) == FALSE) {
+			continue;
+		}
+
+		g_value_init (&val, rhythmdb_property_type_map[change->prop]);
+		rhythmdb_entry_get (db, entry, change->prop, &val);
+		rb_metadata_set (db->priv->metadata, field, &val);
+		g_value_unset (&val);
+	}
 
 	rb_metadata_save (db->priv->metadata, uri, &local_error);
 	if (local_error != NULL) {
diff --git a/rhythmdb/rhythmdb.h b/rhythmdb/rhythmdb.h
index 1d61149..9b9ae1f 100644
--- a/rhythmdb/rhythmdb.h
+++ b/rhythmdb/rhythmdb.h
@@ -60,7 +60,7 @@ GType rhythmdb_entry_get_type (void);
 typedef void (*RhythmDBEntryActionFunc) (RhythmDBEntry *entry, gpointer data);
 typedef char* (*RhythmDBEntryStringFunc) (RhythmDBEntry *entry, gpointer data);
 typedef gboolean (*RhythmDBEntryCanSyncFunc) (RhythmDB *db, RhythmDBEntry *entry, gpointer data);
-typedef void (*RhythmDBEntrySyncFunc) (RhythmDB *db, RhythmDBEntry *entry, GError **error, gpointer data);
+typedef void (*RhythmDBEntrySyncFunc) (RhythmDB *db, RhythmDBEntry *entry, GSList *changes, GError **error, gpointer data);
 
 GType rhythmdb_entry_category_get_type (void);
 #define RHYTHMDB_TYPE_ENTRY_CATEGORY (rhythmdb_entry_category_get_type ())



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