summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--source4/lib/ldb/common/attrib_handlers.c31
-rw-r--r--source4/lib/ldb/common/ldb_attributes.c19
-rw-r--r--source4/lib/ldb/include/ldb.h8
-rw-r--r--source4/lib/ldb/include/ldb_private.h4
-rw-r--r--source4/lib/ldb/ldb_tdb/ldb_cache.c20
5 files changed, 46 insertions, 36 deletions
diff --git a/source4/lib/ldb/common/attrib_handlers.c b/source4/lib/ldb/common/attrib_handlers.c
index 7a9fd1f9da..223f2b5c16 100644
--- a/source4/lib/ldb/common/attrib_handlers.c
+++ b/source4/lib/ldb/common/attrib_handlers.c
@@ -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;
}
-
diff --git a/source4/lib/ldb/common/ldb_attributes.c b/source4/lib/ldb/common/ldb_attributes.c
index d52264b90f..a0118d2452 100644
--- a/source4/lib/ldb/common/ldb_attributes.c
+++ b/source4/lib/ldb/common/ldb_attributes.c
@@ -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);
}
/*
diff --git a/source4/lib/ldb/include/ldb.h b/source4/lib/ldb/include/ldb.h
index eb1f505099..3db334d341 100644
--- a/source4/lib/ldb/include/ldb.h
+++ b/source4/lib/ldb/include/ldb.h
@@ -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
*/
diff --git a/source4/lib/ldb/include/ldb_private.h b/source4/lib/ldb/include/ldb_private.h
index d597f30232..02fb370e16 100644
--- a/source4/lib/ldb/include/ldb_private.h
+++ b/source4/lib/ldb/include/ldb_private.h
@@ -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);
diff --git a/source4/lib/ldb/ldb_tdb/ldb_cache.c b/source4/lib/ldb/ldb_tdb/ldb_cache.c
index 756c198106..d64340b5d0 100644
--- a/source4/lib/ldb/ldb_tdb/ldb_cache.c
+++ b/source4/lib/ldb/ldb_tdb/ldb_cache.c
@@ -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;
}
}