From 2597b609c3a84e80be1babbb547bac1ccb25f75f Mon Sep 17 00:00:00 2001 From: Ted Gould Date: Wed, 24 Mar 2010 20:26:43 -0500 Subject: Making a basic interface for the seen database. --- src/seen-db.c | 25 +++++++++++++++++++++++++ 1 file changed, 25 insertions(+) create mode 100644 src/seen-db.c (limited to 'src/seen-db.c') diff --git a/src/seen-db.c b/src/seen-db.c new file mode 100644 index 0000000..dd164f8 --- /dev/null +++ b/src/seen-db.c @@ -0,0 +1,25 @@ +#include "seen-db.h" + +SeenDB * +seen_db_init(void) +{ + GHashTable * hash = g_hash_table_new_full(g_str_hash, g_str_equal, g_free, NULL); + + return hash; +} + +void +seen_db_add (SeenDB * seendb, const gchar * desktop) +{ + g_hash_table_insert(seendb, + g_strdup(desktop), + GINT_TO_POINTER(TRUE)); + + return; +} + +gboolean +seen_db_seen (SeenDB * seendb, const gchar * desktop) +{ + return GPOINTER_TO_INT(g_hash_table_lookup(seendb, desktop)); +} -- cgit v1.2.3 From 9d667c37212143addd60bb99b6c53c98943a05ae Mon Sep 17 00:00:00 2001 From: Ted Gould Date: Wed, 24 Mar 2010 20:29:54 -0500 Subject: Changing to be more of a singleton type of thing. Really that makes more sense. --- src/seen-db.c | 15 ++++++++++----- 1 file changed, 10 insertions(+), 5 deletions(-) (limited to 'src/seen-db.c') diff --git a/src/seen-db.c b/src/seen-db.c index dd164f8..cf2293c 100644 --- a/src/seen-db.c +++ b/src/seen-db.c @@ -1,15 +1,20 @@ #include "seen-db.h" -SeenDB * +GHashTable * seendb = NULL; + +void seen_db_init(void) { - GHashTable * hash = g_hash_table_new_full(g_str_hash, g_str_equal, g_free, NULL); + if (seendb != NULL) { + return; + } - return hash; + seendb = g_hash_table_new_full(g_str_hash, g_str_equal, g_free, NULL); + return; } void -seen_db_add (SeenDB * seendb, const gchar * desktop) +seen_db_add (const gchar * desktop) { g_hash_table_insert(seendb, g_strdup(desktop), @@ -19,7 +24,7 @@ seen_db_add (SeenDB * seendb, const gchar * desktop) } gboolean -seen_db_seen (SeenDB * seendb, const gchar * desktop) +seen_db_seen (const gchar * desktop) { return GPOINTER_TO_INT(g_hash_table_lookup(seendb, desktop)); } -- cgit v1.2.3 From b840c918e0a355eabcfff49efc2f4c61803b5c52 Mon Sep 17 00:00:00 2001 From: Ted Gould Date: Wed, 24 Mar 2010 20:51:43 -0500 Subject: Building a file name and checking if it exists. --- src/seen-db.c | 13 +++++++++++++ 1 file changed, 13 insertions(+) (limited to 'src/seen-db.c') diff --git a/src/seen-db.c b/src/seen-db.c index cf2293c..027100d 100644 --- a/src/seen-db.c +++ b/src/seen-db.c @@ -1,6 +1,7 @@ #include "seen-db.h" GHashTable * seendb = NULL; +gchar * filename = NULL; void seen_db_init(void) @@ -10,6 +11,18 @@ seen_db_init(void) } seendb = g_hash_table_new_full(g_str_hash, g_str_equal, g_free, NULL); + + /* Build the filename for the seen database. We're putting + it in the cache directory because it could get deleted and + it really wouldn't be a big deal. */ + if (filename == NULL) { + filename = g_build_filename(g_get_user_cache_dir(), "indicators", "messages", "seen-db.keyfile", NULL); + } + + if (g_file_test(filename, G_FILE_TEST_EXISTS)) { + + } + return; } -- cgit v1.2.3 From 288cb93d92574b947ab5addafcbf58fc7d907670 Mon Sep 17 00:00:00 2001 From: Ted Gould Date: Wed, 24 Mar 2010 21:05:07 -0500 Subject: Code to read in the keyfile --- src/seen-db.c | 31 +++++++++++++++++++++++++++++++ 1 file changed, 31 insertions(+) (limited to 'src/seen-db.c') diff --git a/src/seen-db.c b/src/seen-db.c index 027100d..7849781 100644 --- a/src/seen-db.c +++ b/src/seen-db.c @@ -1,5 +1,8 @@ #include "seen-db.h" +#define GROUP_NAME "Seen Database" +#define KEY_NAME "DesktopFiles" + GHashTable * seendb = NULL; gchar * filename = NULL; @@ -20,7 +23,35 @@ seen_db_init(void) } if (g_file_test(filename, G_FILE_TEST_EXISTS)) { + GKeyFile * keyfile = g_key_file_new(); + + if (!g_key_file_load_from_file(keyfile, filename, G_KEY_FILE_NONE, NULL)) { + g_key_file_free(keyfile); + keyfile = NULL; + } + + if (keyfile != NULL && !g_key_file_has_key(keyfile, GROUP_NAME, KEY_NAME, NULL)) { + g_warning("Seen DB '%s' does not have key '%s' in group '%s'", filename, KEY_NAME, GROUP_NAME); + g_key_file_free(keyfile); + keyfile = NULL; + } + + if (keyfile != NULL) { + gchar ** desktops = g_key_file_get_string_list(keyfile, GROUP_NAME, KEY_NAME, NULL, NULL); + gint i = 0; + + while (desktops[i] != NULL) { + g_hash_table_insert(seendb, + g_strdup(desktops[i]), + GINT_TO_POINTER(TRUE)); + } + + g_strfreev(desktops); + } + if (keyfile != NULL) { + g_key_file_free(keyfile); + } } return; -- cgit v1.2.3 From af3e958c5a95d419aacdbf6d332935f02a06c57f Mon Sep 17 00:00:00 2001 From: Ted Gould Date: Wed, 24 Mar 2010 21:22:49 -0500 Subject: Have a background process for writing out the seen DB --- src/seen-db.c | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) (limited to 'src/seen-db.c') diff --git a/src/seen-db.c b/src/seen-db.c index 7849781..6429c13 100644 --- a/src/seen-db.c +++ b/src/seen-db.c @@ -5,6 +5,7 @@ GHashTable * seendb = NULL; gchar * filename = NULL; +guint write_process = 0; void seen_db_init(void) @@ -57,9 +58,25 @@ seen_db_init(void) return; } +static gboolean +write_seen_db (gpointer user_data) +{ + write_process = 0; + return FALSE; +} + void seen_db_add (const gchar * desktop) { + if (!seen_db_seen(desktop)) { + if (write_process != 0) { + g_source_remove(write_process); + write_process = 0; + } + + write_process = g_timeout_add_seconds(300, write_seen_db, NULL); + } + g_hash_table_insert(seendb, g_strdup(desktop), GINT_TO_POINTER(TRUE)); -- cgit v1.2.3 From 10e6733148b0f561fa0825bc9461d73272a5e6a1 Mon Sep 17 00:00:00 2001 From: Ted Gould Date: Wed, 24 Mar 2010 21:24:48 -0500 Subject: Some comments --- src/seen-db.c | 7 +++++++ 1 file changed, 7 insertions(+) (limited to 'src/seen-db.c') diff --git a/src/seen-db.c b/src/seen-db.c index 6429c13..e09901c 100644 --- a/src/seen-db.c +++ b/src/seen-db.c @@ -7,6 +7,8 @@ GHashTable * seendb = NULL; gchar * filename = NULL; guint write_process = 0; +/* Build the hashtable and then see if we have a keyfile that + we can get the history of desktop files we've seen. */ void seen_db_init(void) { @@ -58,6 +60,8 @@ seen_db_init(void) return; } +/* A function to write out the seen database after it's been + modified for a while. */ static gboolean write_seen_db (gpointer user_data) { @@ -65,6 +69,8 @@ write_seen_db (gpointer user_data) return FALSE; } +/* Add a new desktop file to the seen database. Also sets up a timer + to do the write out. */ void seen_db_add (const gchar * desktop) { @@ -84,6 +90,7 @@ seen_db_add (const gchar * desktop) return; } +/* Checks to see if a desktop file has been seen. */ gboolean seen_db_seen (const gchar * desktop) { -- cgit v1.2.3 From 347750ba909a005d9529c6054f33dbe15fe8fa6c Mon Sep 17 00:00:00 2001 From: Ted Gould Date: Wed, 24 Mar 2010 21:26:07 -0500 Subject: Copyright headers. --- src/seen-db.c | 21 +++++++++++++++++++++ 1 file changed, 21 insertions(+) (limited to 'src/seen-db.c') diff --git a/src/seen-db.c b/src/seen-db.c index e09901c..09e67df 100644 --- a/src/seen-db.c +++ b/src/seen-db.c @@ -1,3 +1,24 @@ +/* +A small database of which desktop files we've seen. + +Copyright 2010 Canonical Ltd. + +Authors: + Ted Gould + +This program is free software: you can redistribute it and/or modify it +under the terms of the GNU General Public License version 3, as published +by the Free Software Foundation. + +This program is distributed in the hope that it will be useful, but +WITHOUT ANY WARRANTY; without even the implied warranties of +MERCHANTABILITY, SATISFACTORY QUALITY, or FITNESS FOR A PARTICULAR +PURPOSE. See the GNU General Public License for more details. + +You should have received a copy of the GNU General Public License along +with this program. If not, see . +*/ + #include "seen-db.h" #define GROUP_NAME "Seen Database" -- cgit v1.2.3 From 6e638f602e5765f16b9b7a5f58a5c09f1ffec2ef Mon Sep 17 00:00:00 2001 From: Ted Gould Date: Wed, 24 Mar 2010 21:27:59 -0500 Subject: More comments --- src/seen-db.c | 6 ++++++ 1 file changed, 6 insertions(+) (limited to 'src/seen-db.c') diff --git a/src/seen-db.c b/src/seen-db.c index 09e67df..4c900be 100644 --- a/src/seen-db.c +++ b/src/seen-db.c @@ -49,17 +49,20 @@ seen_db_init(void) if (g_file_test(filename, G_FILE_TEST_EXISTS)) { GKeyFile * keyfile = g_key_file_new(); + /* Load from file */ if (!g_key_file_load_from_file(keyfile, filename, G_KEY_FILE_NONE, NULL)) { g_key_file_free(keyfile); keyfile = NULL; } + /* Check for keys */ if (keyfile != NULL && !g_key_file_has_key(keyfile, GROUP_NAME, KEY_NAME, NULL)) { g_warning("Seen DB '%s' does not have key '%s' in group '%s'", filename, KEY_NAME, GROUP_NAME); g_key_file_free(keyfile); keyfile = NULL; } + /* Grab them and put in DB */ if (keyfile != NULL) { gchar ** desktops = g_key_file_get_string_list(keyfile, GROUP_NAME, KEY_NAME, NULL, NULL); gint i = 0; @@ -73,6 +76,7 @@ seen_db_init(void) g_strfreev(desktops); } + /* Clean up our file */ if (keyfile != NULL) { g_key_file_free(keyfile); } @@ -95,6 +99,8 @@ write_seen_db (gpointer user_data) void seen_db_add (const gchar * desktop) { + /* If this is a new one, let's set up the timer. If + there's already one clear it. */ if (!seen_db_seen(desktop)) { if (write_process != 0) { g_source_remove(write_process); -- cgit v1.2.3 From a357e73e2fd7154183e499790ad531299e15beec Mon Sep 17 00:00:00 2001 From: Ted Gould Date: Wed, 24 Mar 2010 21:57:02 -0500 Subject: Building us a file. --- src/seen-db.c | 55 ++++++++++++++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 54 insertions(+), 1 deletion(-) (limited to 'src/seen-db.c') diff --git a/src/seen-db.c b/src/seen-db.c index 4c900be..0baab5f 100644 --- a/src/seen-db.c +++ b/src/seen-db.c @@ -26,6 +26,7 @@ with this program. If not, see . GHashTable * seendb = NULL; gchar * filename = NULL; +gchar * dirname = NULL; guint write_process = 0; /* Build the hashtable and then see if we have a keyfile that @@ -42,8 +43,11 @@ seen_db_init(void) /* Build the filename for the seen database. We're putting it in the cache directory because it could get deleted and it really wouldn't be a big deal. */ + if (dirname == NULL) { + dirname = g_build_filename(g_get_user_cache_dir(), "indicators", "messages", NULL); + } if (filename == NULL) { - filename = g_build_filename(g_get_user_cache_dir(), "indicators", "messages", "seen-db.keyfile", NULL); + filename = g_build_filename(dirname, "seen-db.keyfile", NULL); } if (g_file_test(filename, G_FILE_TEST_EXISTS)) { @@ -91,6 +95,55 @@ static gboolean write_seen_db (gpointer user_data) { write_process = 0; + + /* Build up the key file */ + GKeyFile * keyfile = g_key_file_new(); + GArray * desktops = g_array_new(FALSE, FALSE, sizeof(gchar *)); + + /* Get the keys from the hashtable and make them + into an array */ + if (keyfile != NULL) { + GList * desktop_keys = g_hash_table_get_keys(seendb); + GList * head = NULL; + + for (head = desktop_keys; head != NULL; head = g_list_next(head)) { + g_array_append_val(desktops, head->data); + } + + g_list_free(desktop_keys); + } + + /* Use the array to dump the strings into the keyfile */ + g_key_file_set_string_list(keyfile, + GROUP_NAME, + KEY_NAME, + (const gchar * const *)desktops->data, + desktops->len); + g_array_free(desktops, TRUE); + + /* Dump the key file to string */ + gchar * keydump = NULL; + gsize keydumplen = 0; + keydump = g_key_file_to_data(keyfile, &keydumplen, NULL); + g_key_file_free(keyfile); + + /* Ensure the directory exists */ + if (g_mkdir_with_parents(dirname, 0700) != 0) { + g_warning("Unable to make directory: %s", dirname); + g_free(keydump); + return FALSE; + } + + /* Dump out the file */ + GError * error = NULL; + if (!g_file_set_contents(filename, keydump, keydumplen, &error)) { + g_warning("Unable to write out file '%s': %s", filename, error->message); + g_error_free(error); + } + + /* Clean up */ + g_free(keydump); + return FALSE; } -- cgit v1.2.3 From 0ba6028b42bd26cf20e7f680b9cc9aca2c3caf19 Mon Sep 17 00:00:00 2001 From: Ted Gould Date: Wed, 24 Mar 2010 22:02:01 -0500 Subject: Make this easier to test --- src/seen-db.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'src/seen-db.c') diff --git a/src/seen-db.c b/src/seen-db.c index 0baab5f..b4df191 100644 --- a/src/seen-db.c +++ b/src/seen-db.c @@ -160,7 +160,7 @@ seen_db_add (const gchar * desktop) write_process = 0; } - write_process = g_timeout_add_seconds(300, write_seen_db, NULL); + write_process = g_timeout_add_seconds(1, write_seen_db, NULL); } g_hash_table_insert(seendb, -- cgit v1.2.3 From 9c0dd994e45546871b39ad007d549b95e1a93d1c Mon Sep 17 00:00:00 2001 From: Ted Gould Date: Wed, 24 Mar 2010 22:02:14 -0500 Subject: Ah, classic failure --- src/seen-db.c | 1 + 1 file changed, 1 insertion(+) (limited to 'src/seen-db.c') diff --git a/src/seen-db.c b/src/seen-db.c index b4df191..7d2fa2f 100644 --- a/src/seen-db.c +++ b/src/seen-db.c @@ -75,6 +75,7 @@ seen_db_init(void) g_hash_table_insert(seendb, g_strdup(desktops[i]), GINT_TO_POINTER(TRUE)); + i++; } g_strfreev(desktops); -- cgit v1.2.3 From 713c7d537e8b55015bad33175f4dcb90ae4ed08f Mon Sep 17 00:00:00 2001 From: Ted Gould Date: Wed, 24 Mar 2010 22:42:42 -0500 Subject: Give us a minute before we write it out. --- src/seen-db.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'src/seen-db.c') diff --git a/src/seen-db.c b/src/seen-db.c index 7d2fa2f..0d08801 100644 --- a/src/seen-db.c +++ b/src/seen-db.c @@ -161,7 +161,7 @@ seen_db_add (const gchar * desktop) write_process = 0; } - write_process = g_timeout_add_seconds(1, write_seen_db, NULL); + write_process = g_timeout_add_seconds(60, write_seen_db, NULL); } g_hash_table_insert(seendb, -- cgit v1.2.3 From 3fba03247a657a3d088920511e3621572bdae4e8 Mon Sep 17 00:00:00 2001 From: Ted Gould Date: Thu, 25 Mar 2010 10:25:13 -0500 Subject: Fail if we have init called more than once. Merge comment. --- src/seen-db.c | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) (limited to 'src/seen-db.c') diff --git a/src/seen-db.c b/src/seen-db.c index 0d08801..57765cc 100644 --- a/src/seen-db.c +++ b/src/seen-db.c @@ -34,9 +34,7 @@ guint write_process = 0; void seen_db_init(void) { - if (seendb != NULL) { - return; - } + g_return_if_fail(seendb == NULL); seendb = g_hash_table_new_full(g_str_hash, g_str_equal, g_free, NULL); -- cgit v1.2.3