[tracker/binary-log-2: 34/63] libtracker-db: Use global structure for journal reader and use s/entry/reader/ for API
- From: Jürg Billeter <juergbi src gnome org>
- To: svn-commits-list gnome org
- Cc:
- Subject: [tracker/binary-log-2: 34/63] libtracker-db: Use global structure for journal reader and use s/entry/reader/ for API
- Date: Fri, 8 Jan 2010 09:45:18 +0000 (UTC)
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]