ldb: Add helper function ldb_schema_attribute_remove_flagged()
authorAndrew Bartlett <abartlet@samba.org>
Thu, 20 Oct 2016 03:04:04 +0000 (16:04 +1300)
committerAndrew Bartlett <abartlet@samba.org>
Thu, 1 Dec 2016 04:54:23 +0000 (05:54 +0100)
This helps us avoid keeping a list of attributes to later remove on @ATTRIBUTES reload

Signed-off-by: Andrew Bartlett <abartlet@samba.org>
Reviewed-by: Garming Sam <garming@catalyst.net.nz>
lib/ldb/common/ldb_attributes.c
lib/ldb/include/ldb.h
lib/ldb/include/ldb_private.h

index 767f69cdbbcd8ed938917da16437145e454c9b93..ca6707edf65af1548bd4cbe803426599e831da67 100644 (file)
@@ -215,6 +215,39 @@ void ldb_schema_attribute_remove(struct ldb_context *ldb, const char *name)
        ldb->schema.num_attributes--;
 }
 
+/*
+  remove attributes with a specified flag (eg LDB_ATTR_FLAG_FROM_DB) for this ldb context
+
+  This is to permit correct reloads
+*/
+void ldb_schema_attribute_remove_flagged(struct ldb_context *ldb, unsigned int flag)
+{
+       ptrdiff_t i;
+
+       for (i = 0; i < ldb->schema.num_attributes;) {
+               const struct ldb_schema_attribute *a
+                       = &ldb->schema.attributes[i];
+               /* FIXED attributes are never removed */
+               if (a->flags & LDB_ATTR_FLAG_FIXED) {
+                       i++;
+                       continue;
+               }
+               if ((a->flags & flag) == 0) {
+                       i++;
+                       continue;
+               }
+               if (a->flags & LDB_ATTR_FLAG_ALLOCATED) {
+                       talloc_free(discard_const_p(char, a->name));
+               }
+               if (i < ldb->schema.num_attributes - 1) {
+                       memmove(&ldb->schema.attributes[i],
+                               a+1, sizeof(*a) * (ldb->schema.num_attributes-(i+1)));
+               }
+
+               ldb->schema.num_attributes--;
+       }
+}
+
 /*
   setup a attribute handler using a standard syntax
 */
index ef292302d3963f9228d60cc0e6d1492189d37ff4..397f994671073e68f79c63f626c4d0d345b8c34c 100644 (file)
@@ -427,6 +427,11 @@ const struct ldb_dn_extended_syntax *ldb_dn_extended_syntax_by_name(struct ldb_c
  */
 #define LDB_ATTR_FLAG_FORCE_BASE64_LDIF        (1<<5)
 
+/*
+ * The attribute was loaded from a DB, rather than via the C API
+ */
+#define LDB_ATTR_FLAG_FROM_DB      (1<<6)
+
 /**
   LDAP attribute syntax for a DN
 
index 26a9d426afb857103c6008e29f0f34b3a1fb14a7..ef0b69715810834b37d90fb365b588584760c4fb 100644 (file)
@@ -163,6 +163,12 @@ extern const struct ldb_backend_ops ldb_ldapi_backend_ops;
 extern const struct ldb_backend_ops ldb_ldaps_backend_ops;
 
 int ldb_setup_wellknown_attributes(struct ldb_context *ldb);
+/*
+  remove attributes with a specified flag (eg LDB_ATTR_FLAG_FROM_DB) for this ldb context
+
+  This is to permit correct reloads
+*/
+void ldb_schema_attribute_remove_flagged(struct ldb_context *ldb, unsigned int flag);
 
 const char **ldb_subclass_list(struct ldb_context *ldb, const char *classname);
 void ldb_subclass_remove(struct ldb_context *ldb, const char *classname);