[grilo/wip/jfelder/related-keys-add-for-id: 1/2] core: Factor out register or lookup key logic from GrlData



commit bef53152f6140b8c4452eff6093dd41d52ba63aa
Author: Jean Felder <jfelder gnome org>
Date:   Wed May 13 03:45:09 2020 +0200

    core: Factor out register or lookup key logic from GrlData
    
    grl_data_set_for_id() and grl_data_new_for_id() share some code to
    register or lookup a key by its name.
    
    This shared code is put in a new private function named
    grl_registry_register_or_lookup_metadata_key().
    
    grl_registry_register_or_lookup_metadata_key() will be used in the
    commit by the new grl_related_keys_set_for_id() function.

 src/data/grl-data.c     | 78 ++++++-------------------------------------------
 src/grl-registry-priv.h |  4 +++
 src/grl-registry.c      | 56 +++++++++++++++++++++++++++++++++++
 3 files changed, 69 insertions(+), 69 deletions(-)
---
diff --git a/src/data/grl-data.c b/src/data/grl-data.c
index 7a3d995..d2b5d94 100644
--- a/src/data/grl-data.c
+++ b/src/data/grl-data.c
@@ -611,27 +611,6 @@ grl_data_get_int64 (GrlData *data, GrlKeyID key)
   }
 }
 
-/*
- * Returns whether the string is a canonical one.
- */
-static gboolean
-is_canonical (const gchar *key)
-{
-  if (key == NULL) {
-    return FALSE;
-  }
-
-  for (; *key != '\0'; key++) {
-    if (*key != '-' &&
-        (*key < '0' || *key > '9') &&
-        (*key < 'A' || *key > 'Z') &&
-        (*key < 'a' || *key > 'z'))
-      return FALSE;
-  }
-
-  return TRUE;
-}
-
 /**
  * grl_data_set_for_id:
  * @data: data to change
@@ -657,36 +636,15 @@ grl_data_set_for_id (GrlData *data, const gchar *key_name, const GValue *value)
 {
   GrlRegistry *registry;
   GrlKeyID key_id;
-  GType value_type;
-
-  if (value == NULL)
-    return TRUE;
-
-  key_name = g_intern_string (key_name);
-  g_return_val_if_fail (is_canonical (key_name), FALSE);
 
   registry = grl_registry_get_default ();
-  key_id = grl_registry_lookup_metadata_key (registry, key_name);
-  value_type = G_VALUE_TYPE (value);
-
-  if (key_id != GRL_METADATA_KEY_INVALID) {
-    GType key_type = grl_registry_lookup_metadata_key_type (registry, key_id);
-    if (!g_value_type_transformable (value_type, key_type)) {
-      GRL_WARNING ("Value type %s can't be set to existing metadata-key of type %s",
-                   g_type_name (value_type),
-                   g_type_name (key_type));
-      return FALSE;
-    }
-    grl_data_set (data, key_id, value);
-    return TRUE;
+  key_id = grl_registry_register_or_lookup_metadata_key (registry, key_name, value);
+  if (key_id == GRL_METADATA_KEY_INVALID) {
+    return FALSE;
   }
 
-  GRL_DEBUG ("%s is not a registered metadata-key", key_name);
-  key_id = grl_registry_register_metadata_key_for_type(registry, key_name, value_type);
-  if (key_id != GRL_METADATA_KEY_INVALID)
-    grl_data_set (data, key_id, value);
-
-  return (key_id != GRL_METADATA_KEY_INVALID);
+  grl_data_set (data, key_id, value);
+  return TRUE;
 }
 
 
@@ -716,32 +674,14 @@ grl_data_add_for_id (GrlData *data, const gchar *key_name, const GValue *value)
   GrlKeyID key_id;
   GType value_type;
 
-  if (value == NULL)
-    return TRUE;
-
-  key_name = g_intern_string (key_name);
-  g_return_val_if_fail (is_canonical (key_name), FALSE);
-
   registry = grl_registry_get_default ();
-  key_id = grl_registry_lookup_metadata_key (registry, key_name);
-  value_type = G_VALUE_TYPE (value);
-
+  key_id = grl_registry_register_or_lookup_metadata_key (registry, key_name, value);
   if (key_id == GRL_METADATA_KEY_INVALID) {
-    GRL_DEBUG ("%s is not a registered metadata-key", key_name);
-    key_id = grl_registry_register_metadata_key_for_type (registry, key_name, value_type);
-    if (key_id == GRL_METADATA_KEY_INVALID) {
-      return FALSE;
-    }
-  } else {
-    GType key_type = grl_registry_lookup_metadata_key_type (registry, key_id);
-    if (!g_value_type_transformable (value_type, key_type)) {
-      GRL_WARNING ("Value type %s can't be set to existing metadata-key of type %s",
-                   g_type_name (value_type),
-                   g_type_name (key_type));
-      return FALSE;
-    }
+    return FALSE;
   }
 
+  value_type = G_VALUE_TYPE (value);
+
   switch (value_type) {
   case G_TYPE_INT:
     grl_data_add_int (data, key_id, g_value_get_int (value));
diff --git a/src/grl-registry-priv.h b/src/grl-registry-priv.h
index e8eeef2..73ca469 100644
--- a/src/grl-registry-priv.h
+++ b/src/grl-registry-priv.h
@@ -41,4 +41,8 @@ GrlKeyID grl_registry_register_metadata_key_for_type (GrlRegistry *registry,
                                                       const gchar *key_name,
                                                       GType type);
 
+GrlKeyID grl_registry_register_or_lookup_metadata_key (GrlRegistry *registry,
+                                                       const gchar *key_name,
+                                                       const GValue *value);
+
 #endif /* _GRL_REGISTRY_PRIV_H_ */
diff --git a/src/grl-registry.c b/src/grl-registry.c
index 2aedfa5..4f4e0af 100644
--- a/src/grl-registry.c
+++ b/src/grl-registry.c
@@ -671,6 +671,62 @@ grl_registry_register_metadata_key_for_type (GrlRegistry *registry,
   return grl_registry_register_metadata_key (registry, spec, GRL_METADATA_KEY_INVALID, NULL);
 }
 
+/*
+ * Returns whether the string is a canonical one.
+ */
+static gboolean
+is_canonical (const gchar *key)
+{
+  if (key == NULL) {
+    return FALSE;
+  }
+
+  for (; *key != '\0'; key++) {
+    if (*key != '-' &&
+        (*key < '0' || *key > '9') &&
+        (*key < 'A' || *key > 'Z') &&
+        (*key < 'a' || *key > 'z'))
+      return FALSE;
+  }
+
+  return TRUE;
+}
+
+G_GNUC_INTERNAL GrlKeyID
+grl_registry_register_or_lookup_metadata_key (GrlRegistry *registry,
+                                              const gchar *key_name,
+                                              const GValue *value)
+{
+  GrlKeyID key;
+  GType value_type;
+
+  g_return_val_if_fail (GRL_IS_REGISTRY (registry), GRL_METADATA_KEY_INVALID);
+
+  if (value == NULL)
+    return GRL_METADATA_KEY_INVALID;
+
+  key_name = g_intern_string (key_name);
+  g_return_val_if_fail (is_canonical (key_name), GRL_METADATA_KEY_INVALID);
+
+  key = grl_registry_lookup_metadata_key (registry, key_name);
+  value_type = G_VALUE_TYPE (value);
+
+  if (key == GRL_METADATA_KEY_INVALID) {
+    GRL_DEBUG ("%s is not a registered metadata-key", key_name);
+    key = grl_registry_register_metadata_key_for_type (registry, key_name, value_type);
+  } else {
+    GType key_type = grl_registry_lookup_metadata_key_type (registry, key);
+    if (!g_value_type_transformable (value_type, key_type)) {
+      GRL_WARNING ("Value type %s can't be set to existing metadata-key of type %s",
+                   g_type_name (value_type),
+                   g_type_name (key_type));
+      return GRL_METADATA_KEY_INVALID;
+    }
+  }
+
+  return key;
+}
+
 static void
 key_id_handler_init (struct KeyIDHandler *handler)
 {


[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]