[tracker: 6/9] tracker-data-manager: Simplify create_decomposed_metadata_property_value()
- From: Carlos Garnacho <carlosg src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [tracker: 6/9] tracker-data-manager: Simplify create_decomposed_metadata_property_value()
- Date: Sun, 9 May 2021 11:33:36 +0000 (UTC)
commit d53d574cd66dc366ab223214b0d41c25d9bc8781
Author: Daniele Nicolodi <daniele grinta net>
Date: Tue May 4 10:37:23 2021 +0200
tracker-data-manager: Simplify create_decomposed_metadata_property_value()
This function is used both to create detached property tables for
multi-valued properties and to retrieve the SQL representation of a
property.
Splitting these two functions allows some simplification.
The newly introduced property_get_sql_representation() function will
be expanded in successive commits to return more than the SQL type.
src/libtracker-data/tracker-data-manager.c | 292 ++++++++++++++---------------
1 file changed, 146 insertions(+), 146 deletions(-)
---
diff --git a/src/libtracker-data/tracker-data-manager.c b/src/libtracker-data/tracker-data-manager.c
index 6ebde3f49..498f9855a 100644
--- a/src/libtracker-data/tracker-data-manager.c
+++ b/src/libtracker-data/tracker-data-manager.c
@@ -2497,176 +2497,176 @@ range_change_for (TrackerProperty *property,
}
}
-static void
-create_decomposed_metadata_property_table (TrackerDBInterface *iface,
- TrackerProperty *property,
- const gchar *database,
- const gchar *service_name,
- TrackerClass *service,
- const gchar **sql_type_for_single_value,
- gboolean in_update,
- gboolean in_change,
- GError **error)
+static void property_get_sql_representation (TrackerProperty *property,
+ const gchar **type)
{
- GError *internal_error = NULL;
- const char *field_name;
- const char *sql_type;
-
- field_name = tracker_property_get_name (property);
-
- switch (tracker_property_get_data_type (property)) {
+ switch (tracker_property_get_data_type (property)) {
case TRACKER_PROPERTY_TYPE_STRING:
case TRACKER_PROPERTY_TYPE_LANGSTRING:
- sql_type = "TEXT";
+ *type = "TEXT";
break;
case TRACKER_PROPERTY_TYPE_INTEGER:
case TRACKER_PROPERTY_TYPE_BOOLEAN:
case TRACKER_PROPERTY_TYPE_DATE:
case TRACKER_PROPERTY_TYPE_DATETIME:
case TRACKER_PROPERTY_TYPE_RESOURCE:
- sql_type = "INTEGER";
+ *type = "INTEGER";
break;
case TRACKER_PROPERTY_TYPE_DOUBLE:
- sql_type = "REAL";
+ *type = "REAL";
break;
case TRACKER_PROPERTY_TYPE_UNKNOWN:
- sql_type = "";
+ g_assert_not_reached();
break;
}
+}
+
+static void
+create_decomposed_metadata_property_table (TrackerDBInterface *iface,
+ TrackerProperty *property,
+ const gchar *database,
+ const gchar *service_name,
+ TrackerClass *service,
+ gboolean in_update,
+ gboolean in_change,
+ GError **error)
+{
+ GError *internal_error = NULL;
+ const char *field_name;
+ const char *sql_type;
+
+ property_get_sql_representation (property, &sql_type);
+
+ field_name = tracker_property_get_name (property);
if (!in_update || (in_update && (tracker_property_get_is_new (property) ||
tracker_property_get_is_new_domain_index (property, service) ||
tracker_property_get_cardinality_changed (property) ||
tracker_property_get_db_schema_changed (property)))) {
- if (tracker_property_get_multiple_values (property)) {
- GString *sql = NULL;
- GString *in_col_sql = NULL;
- GString *sel_col_sql = NULL;
-
- /* multiple values */
-
- if (in_update) {
- TRACKER_NOTE (ONTOLOGY_CHANGES,
- g_message ("Altering database for class '%s' property '%s':
multi value",
- service_name, field_name));
- }
-
- if (in_change && !tracker_property_get_is_new (property) &&
!tracker_property_get_cardinality_changed (property)) {
- TRACKER_NOTE (ONTOLOGY_CHANGES,
- g_message ("Drop index: DROP INDEX IF EXISTS
\"%s_%s_ID\"\nRename: ALTER TABLE \"%s_%s\" RENAME TO \"%s_%s_TEMP\"",
- service_name, field_name, service_name, field_name,
service_name, field_name));
-
- tracker_db_interface_execute_query (iface, &internal_error,
- "DROP INDEX IF EXISTS
\"%s\".\"%s_%s_ID\"",
- database,
- service_name,
- field_name);
-
- if (internal_error) {
- g_propagate_error (error, internal_error);
- goto error_out;
- }
- tracker_db_interface_execute_query (iface, &internal_error,
- "ALTER TABLE \"%s\".\"%s_%s\" RENAME TO
\"%s_%s_TEMP\"",
- database, service_name, field_name,
- service_name, field_name);
+ GString *sql = NULL;
+ GString *in_col_sql = NULL;
+ GString *sel_col_sql = NULL;
- if (internal_error) {
- g_propagate_error (error, internal_error);
- goto error_out;
- }
- } else if (in_change && tracker_property_get_cardinality_changed (property)) {
- /* We should be dropping all indices colliding with the new table name */
- tracker_db_interface_execute_query (iface, &internal_error,
- "DROP INDEX IF EXISTS \"%s\".\"%s_%s\"",
- database,
- service_name,
- field_name);
- }
+ if (in_update) {
+ TRACKER_NOTE (ONTOLOGY_CHANGES,
+ g_message ("Altering database for class '%s' property '%s': multi
value",
+ service_name, field_name));
+ }
- sql = g_string_new ("");
- g_string_append_printf (sql,
- "CREATE TABLE \"%s\".\"%s_%s\" ("
- "ID INTEGER NOT NULL, "
- "\"%s\" %s NOT NULL",
- database,
- service_name,
- field_name,
- field_name,
- sql_type);
+ if (in_change && !tracker_property_get_is_new (property) &&
!tracker_property_get_cardinality_changed (property)) {
+ TRACKER_NOTE (ONTOLOGY_CHANGES,
+ g_message ("Drop index: DROP INDEX IF EXISTS \"%s_%s_ID\"\nRename:
ALTER TABLE \"%s_%s\" RENAME TO \"%s_%s_TEMP\"",
+ service_name, field_name, service_name, field_name,
service_name, field_name));
- if (in_change && !tracker_property_get_is_new (property)) {
- in_col_sql = g_string_new ("ID");
- sel_col_sql = g_string_new ("ID");
+ tracker_db_interface_execute_query (iface, &internal_error,
+ "DROP INDEX IF EXISTS \"%s\".\"%s_%s_ID\"",
+ database,
+ service_name,
+ field_name);
- range_change_for (property, in_col_sql, sel_col_sql, field_name);
+ if (internal_error) {
+ g_propagate_error (error, internal_error);
+ goto error_out;
}
tracker_db_interface_execute_query (iface, &internal_error,
- "%s)", sql->str);
+ "ALTER TABLE \"%s\".\"%s_%s\" RENAME TO
\"%s_%s_TEMP\"",
+ database, service_name, field_name,
+ service_name, field_name);
if (internal_error) {
g_propagate_error (error, internal_error);
goto error_out;
}
+ } else if (in_change && tracker_property_get_cardinality_changed (property)) {
+ /* We should be dropping all indices colliding with the new table name */
+ tracker_db_interface_execute_query (iface, &internal_error,
+ "DROP INDEX IF EXISTS \"%s\".\"%s_%s\"",
+ database,
+ service_name,
+ field_name);
+ }
+
+ sql = g_string_new ("");
+ g_string_append_printf (sql,
+ "CREATE TABLE \"%s\".\"%s_%s\" ("
+ "ID INTEGER NOT NULL, "
+ "\"%s\" %s NOT NULL",
+ database,
+ service_name,
+ field_name,
+ field_name,
+ sql_type);
+
+ if (in_change && !tracker_property_get_is_new (property)) {
+ in_col_sql = g_string_new ("ID");
+ sel_col_sql = g_string_new ("ID");
- /* multiple values */
- set_index_for_multi_value_property (iface, database, service, property,
&internal_error);
- if (internal_error) {
- g_propagate_error (error, internal_error);
- goto error_out;
- }
+ range_change_for (property, in_col_sql, sel_col_sql, field_name);
+ }
- if (in_change && !tracker_property_get_is_new (property) &&
- !tracker_property_get_cardinality_changed (property) && in_col_sql &&
sel_col_sql) {
- gchar *query;
+ tracker_db_interface_execute_query (iface, &internal_error,
+ "%s)", sql->str);
- query = g_strdup_printf ("INSERT INTO \"%s\".\"%s_%s\"(%s) "
- "SELECT %s FROM \"%s\".\"%s_%s_TEMP\"",
- database, service_name, field_name, in_col_sql->str,
- sel_col_sql->str, database, service_name,
field_name);
+ if (internal_error) {
+ g_propagate_error (error, internal_error);
+ goto error_out;
+ }
- tracker_db_interface_execute_query (iface, &internal_error, "%s", query);
+ /* multiple values */
+ set_index_for_multi_value_property (iface, database, service, property, &internal_error);
+ if (internal_error) {
+ g_propagate_error (error, internal_error);
+ goto error_out;
+ }
- if (internal_error) {
- g_free (query);
- g_propagate_error (error, internal_error);
- goto error_out;
- }
+ if (in_change && !tracker_property_get_is_new (property) &&
+ !tracker_property_get_cardinality_changed (property) && in_col_sql && sel_col_sql) {
+ gchar *query;
+
+ query = g_strdup_printf ("INSERT INTO \"%s\".\"%s_%s\"(%s) "
+ "SELECT %s FROM \"%s\".\"%s_%s_TEMP\"",
+ database, service_name, field_name, in_col_sql->str,
+ sel_col_sql->str, database, service_name, field_name);
+
+ tracker_db_interface_execute_query (iface, &internal_error, "%s", query);
+ if (internal_error) {
g_free (query);
- tracker_db_interface_execute_query (iface, &internal_error, "DROP TABLE
\"%s\".\"%s_%s_TEMP\"",
- database, service_name, field_name);
+ g_propagate_error (error, internal_error);
+ goto error_out;
+ }
- if (internal_error) {
- g_propagate_error (error, internal_error);
- goto error_out;
- }
+ g_free (query);
+ tracker_db_interface_execute_query (iface, &internal_error, "DROP TABLE
\"%s\".\"%s_%s_TEMP\"",
+ database, service_name, field_name);
+
+ if (internal_error) {
+ g_propagate_error (error, internal_error);
+ goto error_out;
}
+ }
- /* multiple values */
- set_index_for_multi_value_property (iface, database, service, property,
&internal_error);
- if (internal_error) {
- g_propagate_error (error, internal_error);
- goto error_out;
- }
+ /* multiple values */
+ set_index_for_multi_value_property (iface, database, service, property, &internal_error);
+ if (internal_error) {
+ g_propagate_error (error, internal_error);
+ goto error_out;
+ }
- error_out:
+ error_out:
- if (sql) {
- g_string_free (sql, TRUE);
- }
+ if (sql) {
+ g_string_free (sql, TRUE);
+ }
- if (sel_col_sql) {
- g_string_free (sel_col_sql, TRUE);
- }
+ if (sel_col_sql) {
+ g_string_free (sel_col_sql, TRUE);
+ }
- if (in_col_sql) {
- g_string_free (in_col_sql, TRUE);
- }
- } else if (sql_type_for_single_value) {
- *sql_type_for_single_value = sql_type;
+ if (in_col_sql) {
+ g_string_free (in_col_sql, TRUE);
}
}
}
@@ -2807,7 +2807,7 @@ create_decomposed_metadata_tables (TrackerDataManager *manager,
domain_indexes = tracker_class_get_domain_indexes (service);
for (i = 0; i < n_props; i++) {
- const gchar *sql_type_for_single_value = NULL;
+ const gchar *sql_type;
gboolean put_change;
const gchar *field_name;
gboolean is_domain_index;
@@ -2819,27 +2819,27 @@ create_decomposed_metadata_tables (TrackerDataManager *manager,
continue;
}
- create_decomposed_metadata_property_table (iface, property,
- database,
- service_name,
- service,
- &sql_type_for_single_value,
- in_alter,
- in_change,
- &internal_error);
-
- if (internal_error) {
- g_propagate_error (error, internal_error);
- goto error_out;
- }
-
+ if (tracker_property_get_multiple_values (property)) {
+ /* Multi-valued property. */
- if (!sql_type_for_single_value)
+ create_decomposed_metadata_property_table (iface, property,
+ database,
+ service_name,
+ service,
+ in_alter,
+ in_change,
+ &internal_error);
+ if (internal_error) {
+ g_propagate_error (error, internal_error);
+ goto error_out;
+ }
continue;
+ }
- /* single value */
+ /* Single-valued property. */
field_name = tracker_property_get_name (property);
+ property_get_sql_representation (property, &sql_type);
if (in_update) {
TRACKER_NOTE (ONTOLOGY_CHANGES,
@@ -2856,7 +2856,7 @@ create_decomposed_metadata_tables (TrackerDataManager *manager,
g_string_append_printf (create_sql, ", \"%s\" %s",
field_name,
- sql_type_for_single_value);
+ sql_type);
if (!copy_schedule) {
copy_schedule = g_ptr_array_new_with_free_func (g_free);
@@ -2866,8 +2866,8 @@ create_decomposed_metadata_tables (TrackerDataManager *manager,
schedule_copy (copy_schedule, property, field_name, NULL);
}
- if (g_ascii_strcasecmp (sql_type_for_single_value, "TEXT") == 0 ||
- g_ascii_strcasecmp (sql_type_for_single_value, "BLOB") == 0) {
+ if (g_ascii_strcasecmp (sql_type, "TEXT") == 0 ||
+ g_ascii_strcasecmp (sql_type, "BLOB") == 0) {
g_string_append (create_sql, " COLLATE " TRACKER_COLLATION_NAME);
}
@@ -2886,10 +2886,10 @@ create_decomposed_metadata_tables (TrackerDataManager *manager,
database,
service_name,
field_name,
- sql_type_for_single_value);
+ sql_type);
- if (g_ascii_strcasecmp (sql_type_for_single_value, "TEXT") == 0 ||
- g_ascii_strcasecmp (sql_type_for_single_value, "BLOB") == 0) {
+ if (g_ascii_strcasecmp (sql_type, "TEXT") == 0 ||
+ g_ascii_strcasecmp (sql_type, "BLOB") == 0) {
g_string_append (alter_sql, " COLLATE " TRACKER_COLLATION_NAME);
}
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]