[tracker/ontology-cope: 10/11] libtracker-data: Added comments explaining how ontology-change coping works
- From: Jürg Billeter <juergbi src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [tracker/ontology-cope: 10/11] libtracker-data: Added comments explaining how ontology-change coping works
- Date: Tue, 23 Mar 2010 13:40:12 +0000 (UTC)
commit aba27b312a7b604d4b5114c049504b35f7f7f8cd
Author: Philip Van Hoof <philip codeminded be>
Date: Mon Mar 22 15:20:30 2010 +0100
libtracker-data: Added comments explaining how ontology-change coping works
src/libtracker-data/tracker-data-manager.c | 51 +++++++++++++++++++++++----
src/libtracker-data/tracker-data-update.c | 6 +++
2 files changed, 49 insertions(+), 8 deletions(-)
---
diff --git a/src/libtracker-data/tracker-data-manager.c b/src/libtracker-data/tracker-data-manager.c
index dc12536..73d4235 100644
--- a/src/libtracker-data/tracker-data-manager.c
+++ b/src/libtracker-data/tracker-data-manager.c
@@ -1385,7 +1385,7 @@ tracker_data_ontology_import_into_db (gboolean is_new)
create_decomposed_metadata_tables (iface, classes[i], is_new);
}
- /* insert classes into rdfs:Resource table and set all classes to not new */
+ /* insert classes into rdfs:Resource table */
for (i = 0; i < n_classes; i++) {
if (tracker_class_get_is_new (classes[i]) == is_new) {
insert_uri_in_resource_table (iface, tracker_class_get_uri (classes[i]),
@@ -1393,7 +1393,7 @@ tracker_data_ontology_import_into_db (gboolean is_new)
}
}
- /* insert properties into rdfs:Resource table and set all properties to not new */
+ /* insert properties into rdfs:Resource table */
for (i = 0; i < n_props; i++) {
if (tracker_property_get_is_new (properties[i]) == is_new) {
insert_uri_in_resource_table (iface, tracker_property_get_uri (properties[i]),
@@ -1538,16 +1538,18 @@ tracker_data_manager_init (TrackerDBManagerFlags flags,
in_journal_replay = TRUE;
- /* load ontology from journal into memory */
+ /* Load ontology from journal into memory and cache ID v. uri mappings */
load_ontology_from_journal (&classes, &properties, &id_uri_map);
+ /* Read first ontology and commit it into the DB */
tracker_data_begin_db_transaction_for_replay (tracker_db_journal_reader_get_time ());
tracker_db_interface_sqlite_fts_init (TRACKER_DB_INTERFACE_SQLITE (iface), TRUE);
tracker_data_ontology_import_into_db (FALSE);
tracker_data_commit_db_transaction ();
-
tracker_db_journal_reader_shutdown ();
+ /* Start replay. Ontology changes might happen during replay of the journal. */
+
tracker_data_replay_journal (classes, properties, id_uri_map);
in_journal_replay = FALSE;
@@ -1566,7 +1568,7 @@ tracker_data_manager_init (TrackerDBManagerFlags flags,
sorted = get_ontologies (test_schema != NULL, ontologies_dir);
- /* truncate journal as it does not even contain a single valid transaction
+ /* Truncate journal as it does not even contain a single valid transaction
* or is explicitly ignored (journal_check == FALSE, only for test cases) */
tracker_db_journal_init (NULL, TRUE);
@@ -1586,6 +1588,7 @@ tracker_data_manager_init (TrackerDBManagerFlags flags,
}
tracker_data_begin_db_transaction ();
+
/* Not an ontology transaction: this is the first ontology */
tracker_db_journal_start_transaction (time (NULL));
@@ -1596,6 +1599,7 @@ tracker_data_manager_init (TrackerDBManagerFlags flags,
for (l = sorted; l; l = l->next) {
import_ontology_file (l->data, FALSE, test_schema != NULL);
}
+
if (test_schema) {
load_turtle_file (test_schema_path, FALSE, TRUE);
g_free (test_schema_path);
@@ -1607,11 +1611,13 @@ tracker_data_manager_init (TrackerDBManagerFlags flags,
g_list_foreach (sorted, (GFunc) g_free, NULL);
g_list_free (sorted);
sorted = NULL;
+
+ /* First time, no need to check ontology */
check_ontology = FALSE;
} else {
tracker_db_journal_init (NULL, FALSE);
- /* load ontology from database into memory */
+ /* Load ontology from database into memory */
db_get_static_data (iface);
create_decomposed_transient_metadata_tables (iface);
check_ontology = TRUE;
@@ -1622,13 +1628,23 @@ tracker_data_manager_init (TrackerDBManagerFlags flags,
if (check_ontology && !test_schema) {
GList *to_reload = NULL;
+ /* Get all the ontology files from ontologies_dir */
sorted = get_ontologies (test_schema != NULL, ontologies_dir);
/* check ontology against database */
+
tracker_data_begin_db_transaction ();
- /* This _is_ an ontology transaction, it represents a change to the ontology */
+
+ /* This _is_ an ontology transaction, it represents a change to the
+ * ontology. We mark it up as such in the journal, so that replay_journal
+ * can recognize it and deal with it properly. */
+
tracker_db_journal_start_ontology_transaction (time (NULL));
+ /* Get a map of tracker:Ontology v. nao:lastModified so that we can test
+ * for all the ontology files in ontologies_dir whether the last-modified
+ * has changed since we dealt with the file last time. */
+
stmt = tracker_db_interface_create_statement (iface,
"SELECT Resource.Uri, \"rdfs:Resource\".\"nao:lastModified\" FROM \"tracker:Ontology\""
"INNER JOIN Resource ON Resource.ID = \"tracker:Ontology\".ID "
@@ -1661,9 +1677,13 @@ tracker_data_manager_init (TrackerDBManagerFlags flags,
gboolean found;
gpointer value;
+ /* Parse a TrackerOntology from ontology_file */
ontology = get_ontology_from_file (ontology_file);
if (!ontology) {
+ /* TODO: cope with full custom .ontology files: deal with this
+ * error gracefully. App devs might install wrong ontology files
+ * and we shouldn't critical() due to this. */
g_critical ("Can't get ontology from file: %s", ontology_file);
continue;
}
@@ -1682,6 +1702,9 @@ tracker_data_manager_init (TrackerDBManagerFlags flags,
last_mod = (gint) tracker_ontology_get_last_modified (ontology);
val = GPOINTER_TO_INT (value);
+ /* When the last-modified in our database isn't the same as the last
+ * modified in the latest version of the file, deal with changes. */
+
if (val != last_mod) {
g_debug ("Ontology file '%s' needs update", ontology_file);
@@ -1691,9 +1714,14 @@ tracker_data_manager_init (TrackerDBManagerFlags flags,
max_id = get_new_service_id (iface);
}
+ /* load ontology from files into memory, set all new's
+ * is_new to TRUE */
+
load_ontology_file (ontology_file, &max_id, TRUE);
+
to_reload = g_list_prepend (to_reload, l->data);
+ /* Update the nao:lastModified in the database */
stmt = tracker_db_interface_create_statement (iface,
"UPDATE \"rdfs:Resource\" SET \"nao:lastModified\"= ? "
"WHERE \"rdfs:Resource\".ID = "
@@ -1709,19 +1737,26 @@ tracker_data_manager_init (TrackerDBManagerFlags flags,
}
- }
+ } /* else {
+ * TODO: cope with full new .ontology files, handle this.
+ * } */
+
g_object_unref (ontology);
}
if (to_reload) {
+ /* Perform ALTER-TABLE and CREATE-TABLE calls for all that are is_new */
tracker_data_ontology_import_into_db (TRUE);
+
for (l = to_reload; l; l = l->next) {
const gchar *ontology_file = l->data;
+ /* store ontology in database */
import_ontology_file (ontology_file, TRUE, test_schema != NULL);
}
g_list_free (to_reload);
}
+ /* Reset the is_new flag for all classes and properties */
tracker_data_ontology_import_finished ();
tracker_db_journal_commit_db_transaction ();
diff --git a/src/libtracker-data/tracker-data-update.c b/src/libtracker-data/tracker-data-update.c
index 02de762..dadb88e 100644
--- a/src/libtracker-data/tracker-data-update.c
+++ b/src/libtracker-data/tracker-data-update.c
@@ -2270,6 +2270,7 @@ ontology_transaction_end (GList *ontology_queue)
GList *l;
const gchar *ontology_uri = NULL;
+ /* Perform ALTER-TABLE and CREATE-TABLE calls for all that are is_new */
tracker_data_ontology_import_into_db (TRUE);
for (l = ontology_queue; l; l = l->next) {
@@ -2281,6 +2282,7 @@ ontology_transaction_end (GList *ontology_queue)
}
}
+ /* store ontology in database */
tracker_data_ontology_process_statement (queued->graph,
queued->subject,
queued->predicate,
@@ -2290,6 +2292,7 @@ ontology_transaction_end (GList *ontology_queue)
}
+ /* Update the nao:lastModified in the database */
if (ontology_uri) {
TrackerOntology *ontology;
ontology = tracker_ontologies_get_ontology_by_uri (ontology_uri);
@@ -2317,6 +2320,7 @@ ontology_transaction_end (GList *ontology_queue)
}
}
+ /* Reset the is_new flag for all classes and properties */
tracker_data_ontology_import_finished ();
}
@@ -2342,9 +2346,11 @@ ontology_statement_insert (GList *ontology_queue,
subject = g_hash_table_lookup (id_uri_map, GINT_TO_POINTER (subject_id));
predicate = g_hash_table_lookup (id_uri_map, GINT_TO_POINTER (predicate_id));
+ /* load ontology from journal into memory, set all new's is_new to TRUE */
tracker_data_ontology_load_statement ("journal", subject_id, subject, predicate,
object, NULL, TRUE, classes, properties);
+ /* Queue the statement for processing after ALTER in ontology_transaction_end */
ontology_queue = queue_statement (ontology_queue, graph, subject, predicate, object, is_uri);
return ontology_queue;
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]