[tracker: 6/9] tracker-data-manager: Simplify create_decomposed_metadata_property_value()




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]