r20168: start separating attributes and syntaxes
authorStefan Metzmacher <metze@samba.org>
Thu, 14 Dec 2006 10:03:21 +0000 (10:03 +0000)
committerGerald (Jerry) Carter <jerry@samba.org>
Wed, 10 Oct 2007 19:29:17 +0000 (14:29 -0500)
metze
(This used to be commit 8dda4342f648aa71878ac9eeb7941710e2813aee)

source4/lib/ldb/common/attrib_handlers.c
source4/lib/ldb/common/ldb_attributes.c
source4/lib/ldb/include/ldb.h
source4/lib/ldb/include/ldb_private.h
source4/lib/ldb/ldb_tdb/ldb_cache.c

index 7a9fd1f9da9bcb4f013fe59cfd3b8e1026a903c5..223f2b5c16ea9f40db5df7aace3e98fdfd111ada 100644 (file)
@@ -336,50 +336,44 @@ int ldb_canonicalise_utctime(struct ldb_context *ldb, void *mem_ctx,
 /*
   table of standard attribute handlers
 */
-static const struct ldb_attrib_handler ldb_standard_attribs[] = {
+static const struct ldb_schema_syntax ldb_standard_syntaxes[] = {
        { 
-               .attr            = LDB_SYNTAX_INTEGER,
-               .flags           = 0,
+               .name            = LDB_SYNTAX_INTEGER,
                .ldif_read_fn    = ldb_handler_copy,
                .ldif_write_fn   = ldb_handler_copy,
                .canonicalise_fn = ldb_canonicalise_Integer,
                .comparison_fn   = ldb_comparison_Integer
        },
        { 
-               .attr            = LDB_SYNTAX_OCTET_STRING,
-               .flags           = 0,
+               .name            = LDB_SYNTAX_OCTET_STRING,
                .ldif_read_fn    = ldb_handler_copy,
                .ldif_write_fn   = ldb_handler_copy,
                .canonicalise_fn = ldb_handler_copy,
                .comparison_fn   = ldb_comparison_binary
        },
        { 
-               .attr            = LDB_SYNTAX_DIRECTORY_STRING,
-               .flags           = 0,
+               .name            = LDB_SYNTAX_DIRECTORY_STRING,
                .ldif_read_fn    = ldb_handler_copy,
                .ldif_write_fn   = ldb_handler_copy,
                .canonicalise_fn = ldb_handler_fold,
                .comparison_fn   = ldb_comparison_fold
        },
        { 
-               .attr            = LDB_SYNTAX_DN,
-               .flags           = 0,
+               .name            = LDB_SYNTAX_DN,
                .ldif_read_fn    = ldb_handler_copy,
                .ldif_write_fn   = ldb_handler_copy,
                .canonicalise_fn = ldb_canonicalise_dn,
                .comparison_fn   = ldb_comparison_dn
        },
        { 
-               .attr            = LDB_SYNTAX_OBJECTCLASS,
-               .flags           = 0,
+               .name            = LDB_SYNTAX_OBJECTCLASS,
                .ldif_read_fn    = ldb_handler_copy,
                .ldif_write_fn   = ldb_handler_copy,
                .canonicalise_fn = ldb_handler_fold,
                .comparison_fn   = ldb_comparison_objectclass
        },
        { 
-               .attr            = LDB_SYNTAX_UTC_TIME,
-               .flags           = 0,
+               .name            = LDB_SYNTAX_UTC_TIME,
                .ldif_read_fn    = ldb_handler_copy,
                .ldif_write_fn   = ldb_handler_copy,
                .canonicalise_fn = ldb_canonicalise_utctime,
@@ -391,17 +385,16 @@ static const struct ldb_attrib_handler ldb_standard_attribs[] = {
 /*
   return the attribute handlers for a given syntax name
 */
-const struct ldb_attrib_handler *ldb_attrib_handler_syntax(struct ldb_context *ldb,
-                                                          const char *syntax)
+const struct ldb_schema_syntax *ldb_standard_syntax_by_name(struct ldb_context *ldb,
+                                                           const char *syntax)
 {
        int i;
-       unsigned num_handlers = sizeof(ldb_standard_attribs)/sizeof(ldb_standard_attribs[0]);
+       unsigned num_handlers = sizeof(ldb_standard_syntaxes)/sizeof(ldb_standard_syntaxes[0]);
        /* TODO: should be replaced with a binary search */
        for (i=0;i<num_handlers;i++) {
-               if (strcmp(ldb_standard_attribs[i].attr, syntax) == 0) {
-                       return &ldb_standard_attribs[i];
+               if (strcmp(ldb_standard_syntaxes[i].name, syntax) == 0) {
+                       return &ldb_standard_syntaxes[i];
                }
        }
        return NULL;
 }
-
index d52264b90fa264a15758b994cc0da0d2e2928534..a0118d24524b6634cfd4e020638846a46391dc1b 100644 (file)
@@ -149,15 +149,20 @@ void ldb_remove_attrib_handler(struct ldb_context *ldb, const char *attrib)
 int ldb_set_attrib_handler_syntax(struct ldb_context *ldb, 
                                  const char *attr, const char *syntax)
 {
-       const struct ldb_attrib_handler *h = ldb_attrib_handler_syntax(ldb, syntax);
-       struct ldb_attrib_handler h2;
-       if (h == NULL) {
-               ldb_debug(ldb, LDB_DEBUG_ERROR, "Unknown syntax '%s'\n", syntax);
+       const struct ldb_schema_syntax *s = ldb_standard_syntax_by_name(ldb, syntax);
+       struct ldb_attrib_handler h;
+       if (s == NULL) {
+                       ldb_debug(ldb, LDB_DEBUG_ERROR, "Unknown syntax '%s'\n", syntax);
                return -1;
        }
-       h2 = *h;
-       h2.attr = attr;
-       return ldb_set_attrib_handlers(ldb, &h2, 1);
+       h.attr = attr;
+       h.flags = 0;
+       h.ldif_read_fn = s->ldif_read_fn;
+       h.ldif_write_fn = s->ldif_write_fn;
+       h.canonicalise_fn = s->canonicalise_fn;
+       h.comparison_fn = s->comparison_fn;
+
+       return ldb_set_attrib_handlers(ldb, &h, 1);
 }
 
 /*
index eb1f5050993b95e54ee21df68c816acc19f36b9e..3db334d341d5fd543161815397778f58ddffb207 100644 (file)
@@ -340,6 +340,14 @@ struct ldb_attrib_handler {
        ldb_attr_comparison_t comparison_fn;
 };
 
+struct ldb_schema_syntax {
+       const char *name;
+       ldb_attr_handler_t ldif_read_fn;
+       ldb_attr_handler_t ldif_write_fn;
+       ldb_attr_handler_t canonicalise_fn;
+       ldb_attr_comparison_t comparison_fn;
+};
+
 /**
    The attribute is not returned by default
 */
index d597f30232c0e5471b89f4b191651b3b55e4dd4f..02fb370e164146319b903eb4f5d6f5243bed7d3b 100644 (file)
@@ -184,8 +184,8 @@ int ldb_match_msg(struct ldb_context *ldb,
                  enum ldb_scope scope);
 
 void ldb_remove_attrib_handler(struct ldb_context *ldb, const char *attrib);
-const struct ldb_attrib_handler *ldb_attrib_handler_syntax(struct ldb_context *ldb,
-                                                          const char *syntax);
+const struct ldb_schema_syntax *ldb_standard_syntax_by_name(struct ldb_context *ldb,
+                                                           const char *syntax);
 int ldb_set_attrib_handlers(struct ldb_context *ldb, 
                            const struct ldb_attrib_handler *handlers, 
                            unsigned num_handlers);
index 756c19810696d5b72ceb85348c086f27fc6e01db..d64340b5d04ea8a05827013a45dc6f9c62007422 100644 (file)
@@ -125,8 +125,8 @@ static int ltdb_attributes_load(struct ldb_module *module)
        for (i=0;i<msg->num_elements;i++) {
                unsigned flags;
                const char *syntax;
-               const struct ldb_attrib_handler *h;
-               struct ldb_attrib_handler h2;
+               const struct ldb_schema_syntax *s;
+               struct ldb_attrib_handler h;
 
                if (ltdb_attributes_flags(&msg->elements[i], &flags) != 0) {
                        ldb_debug(module->ldb, LDB_DEBUG_ERROR, "Invalid @ATTRIBUTES element for '%s'\n", msg->elements[i].name);
@@ -149,17 +149,21 @@ static int ltdb_attributes_load(struct ldb_module *module)
                        goto failed;
                }
 
-               h = ldb_attrib_handler_syntax(module->ldb, syntax);
-               if (h == NULL) {
+               s = ldb_standard_syntax_by_name(module->ldb, syntax);
+               if (s == NULL) {
                        ldb_debug(module->ldb, LDB_DEBUG_ERROR, 
                                  "Invalid attribute syntax '%s' for '%s' in @ATTRIBUTES\n",
                                  syntax, msg->elements[i].name);
                        goto failed;
                }
-               h2 = *h;
-               h2.attr = msg->elements[i].name;
-               h2.flags |= LDB_ATTR_FLAG_ALLOCATED;
-               if (ldb_set_attrib_handlers(module->ldb, &h2, 1) != 0) {
+               h.attr = msg->elements[i].name;
+               h.flags |= LDB_ATTR_FLAG_ALLOCATED;
+               h.ldif_read_fn = s->ldif_read_fn;
+               h.ldif_write_fn = s->ldif_write_fn;
+               h.canonicalise_fn = s->canonicalise_fn;
+               h.comparison_fn = s->comparison_fn;
+
+               if (ldb_set_attrib_handlers(module->ldb, &h, 1) != 0) {
                        goto failed;
                }
        }