[tracker/binary-log-2: 34/63] libtracker-db: Use global structure for journal reader and use s/entry/reader/ for API



commit f74da62a4eeffc83a28882f214386667bb48b47f
Author: Martyn Russell <martyn lanedo com>
Date:   Tue Jan 5 09:58:14 2010 +0000

    libtracker-db: Use global structure for journal reader and use s/entry/reader/ for API

 src/libtracker-db/tracker-db-journal.c   |  254 +++++++++++++++---------------
 src/libtracker-db/tracker-db-journal.h   |   33 ++---
 tests/libtracker-db/tracker-db-journal.c |   12 +-
 3 files changed, 150 insertions(+), 149 deletions(-)
---
diff --git a/src/libtracker-db/tracker-db-journal.c b/src/libtracker-db/tracker-db-journal.c
index e5428d4..e4ff221 100644
--- a/src/libtracker-db/tracker-db-journal.c
+++ b/src/libtracker-db/tracker-db-journal.c
@@ -40,7 +40,7 @@
 #define JOURNAL_FILENAME  "tracker-store.journal"
 #define MIN_BLOCK_SIZE    1024
 
-struct TrackerDBJournalEntry {
+static struct {
 	gchar *filename;
 	GMappedFile *file;
 	const gchar *current;
@@ -54,7 +54,7 @@ struct TrackerDBJournalEntry {
 	guint32 p_code;
 	guint32 o_code;
 	const gchar *object;
-};
+} reader;
 
 static gchar *journal_filename = NULL;
 static FILE *journal = NULL;
@@ -437,13 +437,14 @@ tracker_db_journal_fsync (void)
 /*
  * Reader API
  */
-TrackerDBJournalEntry *
-tracker_db_journal_entry_new (const gchar *filename)
+gboolean
+tracker_db_journal_reader_init (const gchar *filename)
 {
-	TrackerDBJournalEntry *entry;
 	GError *error = NULL;
 	gchar *filename_used;
 
+	g_return_val_if_fail (reader.file == NULL, FALSE);
+
 	/* Used mostly for testing */
 	if (G_UNLIKELY (filename)) {
 		filename_used = g_strdup (filename);
@@ -455,110 +456,118 @@ tracker_db_journal_entry_new (const gchar *filename)
 		                                  NULL);
 	}
 
-	entry = g_new0 (TrackerDBJournalEntry, 1);
+	reader.type = TRACKER_DB_JOURNAL_START;
+	reader.filename = filename_used;
 
-	entry->type = TRACKER_DB_JOURNAL_START;
-	entry->filename = filename_used;
-
-	entry->file = g_mapped_file_new (entry->filename, FALSE, &error);
+	reader.file = g_mapped_file_new (reader.filename, FALSE, &error);
 
 	if (error) {
 		g_warning ("Could not create TrackerDBJournalEntry for file '%s', %s", 
-		           entry->filename,
+		           reader.filename,
 		           error->message ? error->message : "no error given");
 		g_error_free (error);
-		tracker_db_journal_entry_free (entry);
+		tracker_db_journal_reader_shutdown ();
 
-		return NULL;
+		return FALSE;
 	}
 
-	entry->current = g_mapped_file_get_contents (entry->file);
-	entry->end = entry->current + g_mapped_file_get_length (entry->file);
+	reader.current = g_mapped_file_get_contents (reader.file);
+	reader.end = reader.current + g_mapped_file_get_length (reader.file);
 
 	/* verify journal file header */
-	g_assert (entry->end - entry->current >= 8);
+	g_assert (reader.end - reader.current >= 8);
 
-	g_assert_cmpint (entry->current[0], ==, 't');
-	g_assert_cmpint (entry->current[1], ==, 'r');
-	g_assert_cmpint (entry->current[2], ==, 'l');
-	g_assert_cmpint (entry->current[3], ==, 'o');
-	g_assert_cmpint (entry->current[4], ==, 'g');
-	g_assert_cmpint (entry->current[5], ==, '\0');
-	g_assert_cmpint (entry->current[6], ==, '0');
-	g_assert_cmpint (entry->current[7], ==, '1');
+	g_assert_cmpint (reader.current[0], ==, 't');
+	g_assert_cmpint (reader.current[1], ==, 'r');
+	g_assert_cmpint (reader.current[2], ==, 'l');
+	g_assert_cmpint (reader.current[3], ==, 'o');
+	g_assert_cmpint (reader.current[4], ==, 'g');
+	g_assert_cmpint (reader.current[5], ==, '\0');
+	g_assert_cmpint (reader.current[6], ==, '0');
+	g_assert_cmpint (reader.current[7], ==, '1');
 
-	entry->current += 8;
+	reader.current += 8;
 
-	return entry;
+	return TRUE;
 }
 
 gboolean
-tracker_db_journal_entry_free (TrackerDBJournalEntry *entry)
+tracker_db_journal_reader_shutdown (void)
 {
-	g_return_val_if_fail (entry != NULL, FALSE);
+	g_return_val_if_fail (reader.file != NULL, FALSE);
 
-	if (entry->file) {
 #if GLIB_CHECK_VERSION(2,22,0)
-		g_mapped_file_unref (entry->file);
+	g_mapped_file_unref (reader.file);
 #else
-		g_mapped_file_free (entry->file);
+	g_mapped_file_free (reader.file);
 #endif
-	}
 
-	g_free (entry->filename);
+	reader.file = NULL;
+
+	g_free (reader.filename);
+	reader.filename = NULL;
 
-	g_free (entry);
+	reader.current = NULL;
+	reader.end = NULL;
+	reader.entry_begin = NULL;
+	reader.entry_end = NULL;
+	reader.amount_of_triples = 0;
+	reader.type = TRACKER_DB_JOURNAL_START;
+	reader.uri = NULL;
+	reader.s_code = 0;
+	reader.p_code = 0;
+	reader.o_code = 0;
+	reader.object = NULL;
 
 	return TRUE;
 }
 
 TrackerDBJournalEntryType
-tracker_db_journal_entry_get_type (TrackerDBJournalEntry *entry)
+tracker_db_journal_reader_get_type (void)
 {
-	g_return_val_if_fail (entry != NULL, FALSE);
+	g_return_val_if_fail (reader.file != NULL, FALSE);
 
-	return entry->type;
+	return reader.type;
 }
 
 gboolean
-tracker_db_journal_entry_next (TrackerDBJournalEntry  *entry,
-                               GError                **error)
+tracker_db_journal_reader_next (GError **error)
 {
-	g_return_val_if_fail (entry != NULL, FALSE);
+	g_return_val_if_fail (reader.file != NULL, FALSE);
 
-	if (entry->type == TRACKER_DB_JOURNAL_START ||
-	    entry->type == TRACKER_DB_JOURNAL_END_TRANSACTION) {
+	if (reader.type == TRACKER_DB_JOURNAL_START ||
+	    reader.type == TRACKER_DB_JOURNAL_END_TRANSACTION) {
 		/* expect new transaction or end of file */
 		guint32 entry_size;
 		guint32 crc32;
 		guint32 read_size;
 
-		if (entry->current >= entry->end) {
+		if (reader.current >= reader.end) {
 			g_set_error (error, TRACKER_DB_JOURNAL_ERROR, 0, 
 			             "End of journal reached");
 			return FALSE;
 		}
 
-		if (entry->end - entry->current < sizeof (guint32)) {
+		if (reader.end - reader.current < sizeof (guint32)) {
 			g_set_error (error, TRACKER_DB_JOURNAL_ERROR, 0, 
 			             "Damaged journal entry, < sizeof(guint32) at start/end of journal");
 			return FALSE;
 		}
 
-		entry->entry_begin = entry->current;
-		entry_size = read_uint32 (entry->current);
-		entry->entry_end = entry->entry_begin + entry_size;
+		reader.entry_begin = reader.current;
+		entry_size = read_uint32 (reader.current);
+		reader.entry_end = reader.entry_begin + entry_size;
 
-		if (entry->end < entry->entry_end) {
+		if (reader.end < reader.entry_end) {
 			g_set_error (error, TRACKER_DB_JOURNAL_ERROR, 0, 
 			             "Damaged journal entry, end < entry end");
 			return FALSE;
 		}
 
-		entry->current += 4;
+		reader.current += 4;
 
 		/* compare with entry_size at end */
-		read_size = read_uint32 (entry->entry_end - 4);
+		read_size = read_uint32 (reader.entry_end - 4);
 
 		if (entry_size != read_size) {
 			/* damaged journal entry */
@@ -569,67 +578,67 @@ tracker_db_journal_entry_next (TrackerDBJournalEntry  *entry,
 			return FALSE;
 		}
 
-		entry->amount_of_triples = read_uint32 (entry->current);
-		entry->current += 4;
+		reader.amount_of_triples = read_uint32 (reader.current);
+		reader.current += 4;
 
-		crc32 = read_uint32 (entry->current);
-		entry->current += 4;
+		crc32 = read_uint32 (reader.current);
+		reader.current += 4;
 
 		/* verify checksum */
-		if (crc32 != tracker_crc32 (entry->entry_begin, entry_size)) {
+		if (crc32 != tracker_crc32 (reader.entry_begin, entry_size)) {
 			/* damaged journal entry */
 			g_set_error (error, TRACKER_DB_JOURNAL_ERROR, 0, 
 			             "Damaged journal entry, crc32 failed");
 			return FALSE;
 		}
 
-		entry->type = TRACKER_DB_JOURNAL_START_TRANSACTION;
+		reader.type = TRACKER_DB_JOURNAL_START_TRANSACTION;
 		return TRUE;
-	} else if (entry->amount_of_triples == 0) {
+	} else if (reader.amount_of_triples == 0) {
 		/* end of transaction */
 
-		if (entry->current + 4 != entry->entry_end) {
+		if (reader.current + 4 != reader.entry_end) {
 			/* damaged journal entry */
 			g_set_error (error, TRACKER_DB_JOURNAL_ERROR, 0, 
 			             "Damaged journal entry, %p != %p (end of transaction with 0 triples)",
-			             entry->current + 4,
-			             entry->entry_end);
+			             reader.current + 4,
+			             reader.entry_end);
 			return FALSE;
 		}
 
-		entry->type = TRACKER_DB_JOURNAL_END_TRANSACTION;
+		reader.type = TRACKER_DB_JOURNAL_END_TRANSACTION;
 		return TRUE;
 	} else {
 		guint32 data_format;
 		gsize str_length;
 
-		if (entry->end - entry->current < sizeof (guint32)) {
+		if (reader.end - reader.current < sizeof (guint32)) {
 			/* damaged journal entry */
 			g_set_error (error, TRACKER_DB_JOURNAL_ERROR, 0, 
 			             "Damaged journal entry, %d < sizeof(guint32)",
-			             (gint) (entry->end - entry->current));
+			             (gint) (reader.end - reader.current));
 			return FALSE;
 		}
 
-		data_format = read_uint32 (entry->current);
-		entry->current += 4;
+		data_format = read_uint32 (reader.current);
+		reader.current += 4;
 
 		if (data_format == 1) {
-			entry->type = TRACKER_DB_JOURNAL_RESOURCE;
+			reader.type = TRACKER_DB_JOURNAL_RESOURCE;
 
-			if (entry->end - entry->current < sizeof (guint32) + 1) {
+			if (reader.end - reader.current < sizeof (guint32) + 1) {
 				/* damaged journal entry */
 				g_set_error (error, TRACKER_DB_JOURNAL_ERROR, 0, 
 				             "Damaged journal entry, %d < sizeof(guint32) + 1 for resource",
-				             (gint) (entry->end - entry->current));
+				             (gint) (reader.end - reader.current));
 				return FALSE;
 			}
 
-			entry->s_code = read_uint32 (entry->current);
-			entry->current += 4;
+			reader.s_code = read_uint32 (reader.current);
+			reader.current += 4;
 
-			str_length = strnlen (entry->current, entry->end - entry->current);
-			if (str_length == entry->end - entry->current) {
+			str_length = strnlen (reader.current, reader.end - reader.current);
+			if (str_length == reader.end - reader.current) {
 				/* damaged journal entry (no terminating '\0' character) */
 				g_set_error (error, TRACKER_DB_JOURNAL_ERROR, 0, 
 				             "Damaged journal entry, no terminating zero found for resource");
@@ -637,85 +646,85 @@ tracker_db_journal_entry_next (TrackerDBJournalEntry  *entry,
 
 			}
 
-			if (!g_utf8_validate (entry->current, -1, NULL)) {
+			if (!g_utf8_validate (reader.current, -1, NULL)) {
 				/* damaged journal entry (invalid UTF-8) */
 				g_set_error (error, TRACKER_DB_JOURNAL_ERROR, 0, 
 				             "Damaged journal entry, invalid UTF-8 for resource");
 				return FALSE;
 			}
 
-			entry->uri = entry->current;
-			entry->current += str_length + 1;
+			reader.uri = reader.current;
+			reader.current += str_length + 1;
 		} else {
 			if (data_format & 4) {
 				if (data_format & 2) {
-					entry->type = TRACKER_DB_JOURNAL_DELETE_STATEMENT_CODE;
+					reader.type = TRACKER_DB_JOURNAL_DELETE_STATEMENT_CODE;
 				} else {
-					entry->type = TRACKER_DB_JOURNAL_DELETE_STATEMENT;
+					reader.type = TRACKER_DB_JOURNAL_DELETE_STATEMENT;
 				}
 			} else {
 				if (data_format & 2) {
-					entry->type = TRACKER_DB_JOURNAL_INSERT_STATEMENT_CODE;
+					reader.type = TRACKER_DB_JOURNAL_INSERT_STATEMENT_CODE;
 				} else {
-					entry->type = TRACKER_DB_JOURNAL_INSERT_STATEMENT;
+					reader.type = TRACKER_DB_JOURNAL_INSERT_STATEMENT;
 				}
 			}
 
-			if (entry->end - entry->current < 2 * sizeof (guint32)) {
+			if (reader.end - reader.current < 2 * sizeof (guint32)) {
 				/* damaged journal entry */
 				g_set_error (error, TRACKER_DB_JOURNAL_ERROR, 0, 
 				             "Damaged journal entry, %d < 2 * sizeof(guint32)",
-				             (gint) (entry->end - entry->current));
+				             (gint) (reader.end - reader.current));
 				return FALSE;
 			}
 
-			entry->s_code = read_uint32 (entry->current);
-			entry->current += 4;
+			reader.s_code = read_uint32 (reader.current);
+			reader.current += 4;
 
-			entry->p_code = read_uint32 (entry->current);
-			entry->current += 4;
+			reader.p_code = read_uint32 (reader.current);
+			reader.current += 4;
 
 			if (data_format & 2) {
-				if (entry->end - entry->current < sizeof (guint32)) {
+				if (reader.end - reader.current < sizeof (guint32)) {
 					/* damaged journal entry */
 					g_set_error (error, TRACKER_DB_JOURNAL_ERROR, 0, 
 					             "Damaged journal entry, %d < sizeof(guint32) for data format 2",
-					             (gint) (entry->end - entry->current));
+					             (gint) (reader.end - reader.current));
 					return FALSE;
 				}
 
-				entry->o_code = read_uint32 (entry->current);
-				entry->current += 4;
+				reader.o_code = read_uint32 (reader.current);
+				reader.current += 4;
 			} else {
-				if (entry->end - entry->current < 1) {
+				if (reader.end - reader.current < 1) {
 					/* damaged journal entry */
 					g_set_error (error, TRACKER_DB_JOURNAL_ERROR, 0, 
 					             "Damaged journal entry, %d < 1",
-					             (gint) (entry->end - entry->current));
+					             (gint) (reader.end - reader.current));
 					return FALSE;
 				}
 
-				str_length = strnlen (entry->current, entry->end - entry->current);
-				if (str_length == entry->end - entry->current) {
+				str_length = strnlen (reader.current, reader.end - reader.current);
+				if (str_length == reader.end - reader.current) {
 					/* damaged journal entry (no terminating '\0' character) */
 					g_set_error (error, TRACKER_DB_JOURNAL_ERROR, 0, 
 					             "Damaged journal entry, no terminating zero found");
 					return FALSE;
 				}
 
-				if (!g_utf8_validate (entry->current, -1, NULL)) {
+				if (!g_utf8_validate (reader.current, -1, NULL)) {
 					/* damaged journal entry (invalid UTF-8) */
 					g_set_error (error, TRACKER_DB_JOURNAL_ERROR, 0, 
 					             "Damaged journal entry, invalid UTF-8");
 					return FALSE;
 				}
 
-				entry->object = entry->current;
-				entry->current += str_length + 1;
+				reader.object = reader.current;
+				reader.current += str_length + 1;
 			}
 		}
 
-		entry->amount_of_triples--;
+		reader.amount_of_triples--;
 		return TRUE;
 	}
 
@@ -725,51 +734,48 @@ tracker_db_journal_entry_next (TrackerDBJournalEntry  *entry,
 }
 
 gboolean
-tracker_db_journal_entry_get_resource (TrackerDBJournalEntry  *entry,
-                                       guint32                *code,
-                                       const gchar           **uri)
+tracker_db_journal_reader_get_resource (guint32      *code,
+                                        const gchar **uri)
 {
-	g_return_val_if_fail (entry != NULL, FALSE);
-	g_return_val_if_fail (entry->type == TRACKER_DB_JOURNAL_RESOURCE, FALSE);
+	g_return_val_if_fail (reader.file != NULL, FALSE);
+	g_return_val_if_fail (reader.type == TRACKER_DB_JOURNAL_RESOURCE, FALSE);
 
-	*code = entry->s_code;
-	*uri = entry->uri;
+	*code = reader.s_code;
+	*uri = reader.uri;
 
 	return TRUE;
 }
 
 gboolean
-tracker_db_journal_entry_get_statement (TrackerDBJournalEntry  *entry,
-                                        guint32                *s_code,
-                                        guint32                *p_code,
-                                        const gchar           **object)
+tracker_db_journal_reader_get_statement (guint32      *s_code,
+                                         guint32      *p_code,
+                                         const gchar **object)
 {
-	g_return_val_if_fail (entry != NULL, FALSE);
-	g_return_val_if_fail (entry->type == TRACKER_DB_JOURNAL_INSERT_STATEMENT ||
-	                      entry->type == TRACKER_DB_JOURNAL_DELETE_STATEMENT,
+	g_return_val_if_fail (reader.file != NULL, FALSE);
+	g_return_val_if_fail (reader.type == TRACKER_DB_JOURNAL_INSERT_STATEMENT ||
+	                      reader.type == TRACKER_DB_JOURNAL_DELETE_STATEMENT,
 	                      FALSE);
 
-	*s_code = entry->s_code;
-	*p_code = entry->p_code;
-	*object = entry->object;
+	*s_code = reader.s_code;
+	*p_code = reader.p_code;
+	*object = reader.object;
 
 	return TRUE;
 }
 
 gboolean
-tracker_db_journal_entry_get_statement_code (TrackerDBJournalEntry *entry,
-                                             guint32               *s_code,
-                                             guint32               *p_code,
-                                             guint32               *o_code)
+tracker_db_journal_reader_get_statement_code (guint32 *s_code,
+                                              guint32 *p_code,
+                                              guint32 *o_code)
 {
-	g_return_val_if_fail (entry != NULL, FALSE);
-	g_return_val_if_fail (entry->type == TRACKER_DB_JOURNAL_INSERT_STATEMENT_CODE ||
-	                      entry->type == TRACKER_DB_JOURNAL_DELETE_STATEMENT_CODE,
+	g_return_val_if_fail (reader.file != NULL, FALSE);
+	g_return_val_if_fail (reader.type == TRACKER_DB_JOURNAL_INSERT_STATEMENT_CODE ||
+	                      reader.type == TRACKER_DB_JOURNAL_DELETE_STATEMENT_CODE,
 	                      FALSE);
 
-	*s_code = entry->s_code;
-	*p_code = entry->p_code;
-	*o_code = entry->o_code;
+	*s_code = reader.s_code;
+	*p_code = reader.p_code;
+	*o_code = reader.o_code;
 
 	return TRUE;
 }
diff --git a/src/libtracker-db/tracker-db-journal.h b/src/libtracker-db/tracker-db-journal.h
index 4ba2a43..8894ebe 100644
--- a/src/libtracker-db/tracker-db-journal.h
+++ b/src/libtracker-db/tracker-db-journal.h
@@ -30,8 +30,6 @@ G_BEGIN_DECLS
 #define TRACKER_DB_JOURNAL_ERROR_DOMAIN "TrackerDBJournal"
 #define TRACKER_DB_JOURNAL_ERROR        tracker_db_journal_error_quark()
 
-typedef struct TrackerDBJournalEntry TrackerDBJournalEntry;
-
 typedef enum {
 	TRACKER_DB_JOURNAL_START,
 	TRACKER_DB_JOURNAL_START_TRANSACTION,
@@ -78,25 +76,20 @@ gboolean     tracker_db_journal_fsync                        (void);
 /*
  * Reader API
  */
-TrackerDBJournalEntry *
-             tracker_db_journal_entry_new                    (const gchar            *filename);
-gboolean     tracker_db_journal_entry_free                   (TrackerDBJournalEntry  *entry);
+gboolean     tracker_db_journal_reader_init                  (const gchar  *filename);
+gboolean     tracker_db_journal_reader_shutdown              (void);
 TrackerDBJournalEntryType
-             tracker_db_journal_entry_get_type               (TrackerDBJournalEntry  *entry);
-
-gboolean     tracker_db_journal_entry_next                   (TrackerDBJournalEntry  *entry, 
-                                                              GError                **error);
-gboolean     tracker_db_journal_entry_get_resource           (TrackerDBJournalEntry  *entry,
-                                                              guint32                *code,
-                                                              const gchar           **uri);
-gboolean     tracker_db_journal_entry_get_statement          (TrackerDBJournalEntry  *entry,
-                                                              guint32                *s_code,
-                                                              guint32                *p_code,
-                                                              const gchar           **object);
-gboolean     tracker_db_journal_entry_get_statement_code     (TrackerDBJournalEntry  *entry,
-                                                              guint32                *s_code,
-                                                              guint32                *p_code,
-                                                              guint32                *o_code);
+             tracker_db_journal_reader_get_type              (void);
+
+gboolean     tracker_db_journal_reader_next                  (GError      **error);
+gboolean     tracker_db_journal_reader_get_resource          (guint32      *code,
+                                                              const gchar **uri);
+gboolean     tracker_db_journal_reader_get_statement         (guint32      *s_code,
+                                                              guint32      *p_code,
+                                                              const gchar **object);
+gboolean     tracker_db_journal_reader_get_statement_code    (guint32      *s_code,
+                                                              guint32      *p_code,
+                                                              guint32      *o_code);
 
 G_END_DECLS
 
diff --git a/tests/libtracker-db/tracker-db-journal.c b/tests/libtracker-db/tracker-db-journal.c
index 1f8bc2d..4db0916 100644
--- a/tests/libtracker-db/tracker-db-journal.c
+++ b/tests/libtracker-db/tracker-db-journal.c
@@ -136,7 +136,6 @@ test_read_functions (void)
 	gchar *path;
 	gsize initial_size, actual_size;
 	gboolean result;
-	TrackerDBJournalEntry *entry;
 	TrackerDBJournalEntryType type;
 
 	path = g_build_filename (TOP_SRCDIR, "tests", "libtracker-db", "tracker-store.journal", NULL);
@@ -144,18 +143,21 @@ test_read_functions (void)
 	/* NOTE: we don't unlink here so we can use the data from the write tests */
 
 	/* Create an iterator */
-	entry = tracker_db_journal_entry_new (path);
-	g_assert (entry != NULL);
+	result = tracker_db_journal_reader_init (path);
+	g_assert_cmpint (result, ==, TRUE);
 
-	type = tracker_db_journal_entry_get_type (entry);
+	type = tracker_db_journal_reader_get_type ();
 	g_assert_cmpint (type, ==, TRACKER_DB_JOURNAL_START);
 
-	result = tracker_db_journal_entry_next (entry, &error);
+	result = tracker_db_journal_reader_next (&error);
 	g_assert_no_error (error);
 	g_assert_cmpint (result, ==, TRUE);
 
 	/* FIXME: unfinished */
 
+	result = tracker_db_journal_reader_shutdown ();
+	g_assert_cmpint (result, ==, TRUE);
+
 	g_free (path);
 }
 



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