ldb_tdb: Add an index shortcut for a <GUID= DN
authorAndrew Bartlett <abartlet@samba.org>
Mon, 14 Aug 2017 04:13:42 +0000 (16:13 +1200)
committerAndrew Bartlett <abartlet@samba.org>
Fri, 22 Sep 2017 19:20:22 +0000 (21:20 +0200)
Signed-off-by: Andrew Bartlett <abartlet@samba.org>
Reviewed-by: Garming Sam <garming@catalyst.net.nz>
lib/ldb/ldb_tdb/ldb_index.c
lib/ldb/ldb_tdb/ldb_tdb.h

index 6675ad0f05d96879d8088386989b7acd34deee1b..37acd6eb7690964365b8cff13e93e542fc94aa77 100644 (file)
@@ -1089,25 +1089,42 @@ static int ltdb_index_dn_base_dn(struct ldb_module *module,
                                 struct ldb_dn *base_dn,
                                 struct dn_list *dn_list)
 {
-       if (ltdb->cache->GUID_index_attribute != NULL) {
-               return ltdb_index_dn_attr(module, ltdb,
-                                         LTDB_IDXDN, base_dn, dn_list);
+       const struct ldb_val *guid_val = NULL;
+       if (ltdb->cache->GUID_index_attribute == NULL) {
+               dn_list->dn = talloc_array(dn_list, struct ldb_val, 1);
+               if (dn_list->dn == NULL) {
+                       return ldb_module_oom(module);
+               }
+               dn_list->dn[0].data = discard_const_p(unsigned char,
+                                                     ldb_dn_get_linearized(base_dn));
+               if (dn_list->dn[0].data == NULL) {
+                       return ldb_module_oom(module);
+               }
+               dn_list->dn[0].length = strlen((char *)dn_list->dn[0].data);
+               dn_list->count = 1;
+
+               return LDB_SUCCESS;
        }
 
-       dn_list->dn = talloc_array(dn_list, struct ldb_val, 1);
-       if (dn_list->dn == NULL) {
-               talloc_free(dn_list);
-               return ldb_module_oom(module);
+       if (ltdb->cache->GUID_index_dn_component != NULL) {
+               guid_val = ldb_dn_get_extended_component(base_dn,
+                                                        ltdb->cache->GUID_index_dn_component);
        }
-       dn_list->dn[0].data = discard_const_p(unsigned char,
-                                             ldb_dn_get_linearized(base_dn));
-       if (dn_list->dn[0].data == NULL) {
-               talloc_free(dn_list);
-               return ldb_module_oom(module);
+
+       if (guid_val != NULL) {
+               dn_list->dn = talloc_array(dn_list, struct ldb_val, 1);
+               if (dn_list->dn == NULL) {
+                       return ldb_module_oom(module);
+               }
+               dn_list->dn[0].data = guid_val->data;
+               dn_list->dn[0].length = guid_val->length;
+               dn_list->count = 1;
+
+               return LDB_SUCCESS;
        }
-       dn_list->dn[0].length = strlen((char *)dn_list->dn[0].data);
-       dn_list->count = 1;
-       return LDB_SUCCESS;
+
+       return ltdb_index_dn_attr(module, ltdb,
+                                 LTDB_IDXDN, base_dn, dn_list);
 }
 
 /*
index ce62bc010ba6489d4d02d74d0c319cdc0fef384e..8ce823f85297bde0e3aecdb9f9fd410c5d6b12e2 100644 (file)
@@ -21,6 +21,7 @@ struct ltdb_private {
                bool one_level_indexes;
                bool attribute_indexes;
                const char *GUID_index_attribute;
+               const char *GUID_index_dn_component;
        } *cache;
 
        int in_transaction;