fixed a speellling erra
[gd/samba/.git] / source4 / lib / ldb / ldb_tdb / ldb_index.c
index 19385f5504881faa2c67a1ea11ed13519c486c22..269305a4680c90c94ad4dc625486ad3b5bcaffcc 100644 (file)
@@ -10,7 +10,7 @@
    This library is free software; you can redistribute it and/or
    modify it under the terms of the GNU Lesser General Public
    License as published by the Free Software Foundation; either
-   version 2 of the License, or (at your option) any later version.
+   version 3 of the License, or (at your option) any later version.
 
    This library is distributed in the hope that it will be useful,
    but WITHOUT ANY WARRANTY; without even the implied warranty of
@@ -18,8 +18,7 @@
    Lesser General Public License for more details.
 
    You should have received a copy of the GNU Lesser General Public
-   License along with this library; if not, write to the Free Software
-   Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+   License along with this library; if not, see <http://www.gnu.org/licenses/>.
 */
 
 /*
  *  Author: Andrew Tridgell
  */
 
-#include "includes.h"
-#include "ldb/include/includes.h"
+#include "ldb_includes.h"
 
-#include "ldb/ldb_tdb/ldb_tdb.h"
+#include "ldb_tdb.h"
 
 /*
   find an element in a list, using the given comparison function and
@@ -47,7 +45,7 @@ static int ldb_list_find(const void *needle,
                         const void *base, size_t nmemb, size_t size, 
                         comparison_fn_t comp_fn)
 {
-       const char *base_p = base;
+       const char *base_p = (const char *)base;
        size_t min_i, max_i, test_i;
 
        if (nmemb == 0) {
@@ -108,7 +106,7 @@ static struct ldb_dn *ltdb_index_key(struct ldb_context *ldb,
 {
        struct ldb_dn *ret;
        struct ldb_val v;
-       const struct ldb_attrib_handler *h;
+       const struct ldb_schema_attribute *a;
        char *attr_folded;
        int r;
 
@@ -117,8 +115,8 @@ static struct ldb_dn *ltdb_index_key(struct ldb_context *ldb,
                return NULL;
        }
 
-       h = ldb_attrib_handler(ldb, attr);
-       r = h->canonicalise_fn(ldb, ldb, value, &v);
+       a = ldb_schema_attribute_by_name(ldb, attr);
+       r = a->syntax->canonicalise_fn(ldb, ldb, value, &v);
        if (r != LDB_SUCCESS) {
                const char *errstr = ldb_errstring(ldb);
                /* canonicalisation can be refused. For example, 
@@ -202,22 +200,22 @@ static int ltdb_index_dn_simple(struct ldb_module *module,
        /* if the attribute isn't in the list of indexed attributes then
           this node needs a full search */
        if (ldb_msg_find_idx(index_list, tree->u.equality.attr, NULL, LTDB_IDXATTR) == -1) {
-               return -1;
+               return LDB_ERR_OPERATIONS_ERROR;
        }
 
        /* the attribute is indexed. Pull the list of DNs that match the 
           search criterion */
        dn = ltdb_index_key(ldb, tree->u.equality.attr, &tree->u.equality.value);
-       if (!dn) return -1;
+       if (!dn) return LDB_ERR_OPERATIONS_ERROR;
 
        msg = talloc(list, struct ldb_message);
        if (msg == NULL) {
-               return -1;
+               return LDB_ERR_OPERATIONS_ERROR;
        }
 
        ret = ltdb_search_dn1(module, dn, msg);
        talloc_free(dn);
-       if (ret == 0 || ret == -1) {
+       if (ret != LDB_SUCCESS) {
                return ret;
        }
 
@@ -233,7 +231,7 @@ static int ltdb_index_dn_simple(struct ldb_module *module,
                list->dn = talloc_array(list, char *, el->num_values);
                if (!list->dn) {
                        talloc_free(msg);
-                       return -1;
+                       return LDB_ERR_OPERATIONS_ERROR;
                }
 
                for (j=0;j<el->num_values;j++) {
@@ -241,7 +239,7 @@ static int ltdb_index_dn_simple(struct ldb_module *module,
                                talloc_strdup(list->dn, (char *)el->values[j].data);
                        if (!list->dn[list->count]) {
                                talloc_free(msg);
-                               return -1;
+                               return LDB_ERR_OPERATIONS_ERROR;
                        }
                        list->count++;
                }
@@ -253,73 +251,12 @@ static int ltdb_index_dn_simple(struct ldb_module *module,
                qsort(list->dn, list->count, sizeof(char *), (comparison_fn_t) list_cmp);
        }
 
-       return 1;
+       return LDB_SUCCESS;
 }
 
 
 static int list_union(struct ldb_context *, struct dn_list *, const struct dn_list *);
 
-/*
-  return a list of dn's that might match a simple indexed search on
-  the special objectclass attribute
- */
-static int ltdb_index_dn_objectclass(struct ldb_module *module, 
-                                    const struct ldb_parse_tree *tree,
-                                    const struct ldb_message *index_list,
-                                    struct dn_list *list)
-{
-       struct ldb_context *ldb = module->ldb;
-       unsigned int i;
-       int ret;
-       const char *target = (const char *)tree->u.equality.value.data;
-       const char **subclasses;
-
-       list->count = 0;
-       list->dn = NULL;
-
-       ret = ltdb_index_dn_simple(module, tree, index_list, list);
-
-       subclasses = ldb_subclass_list(module->ldb, target);
-
-       if (subclasses == NULL) {
-               return ret;
-       }
-
-       for (i=0;subclasses[i];i++) {
-               struct ldb_parse_tree tree2;
-               struct dn_list *list2;
-               tree2.operation = LDB_OP_EQUALITY;
-               tree2.u.equality.attr = LTDB_OBJECTCLASS;
-               if (!tree2.u.equality.attr) {
-                       return -1;
-               }
-               tree2.u.equality.value.data = 
-                       (uint8_t *)talloc_strdup(list, subclasses[i]);
-               if (tree2.u.equality.value.data == NULL) {
-                       return -1;                      
-               }
-               tree2.u.equality.value.length = strlen(subclasses[i]);
-               list2 = talloc(list, struct dn_list);
-               if (list2 == NULL) {
-                       talloc_free(tree2.u.equality.value.data);
-                       return -1;
-               }
-               if (ltdb_index_dn_objectclass(module, &tree2, 
-                                             index_list, list2) == 1) {
-                       if (list->count == 0) {
-                               *list = *list2;
-                               ret = 1;
-                       } else {
-                               list_union(ldb, list, list2);
-                               talloc_free(list2);
-                       }
-               }
-               talloc_free(tree2.u.equality.value.data);
-       }
-
-       return ret;
-}
-
 /*
   return a list of dn's that might match a leaf indexed search
  */
@@ -328,22 +265,19 @@ static int ltdb_index_dn_leaf(struct ldb_module *module,
                              const struct ldb_message *index_list,
                              struct dn_list *list)
 {
-       if (ldb_attr_cmp(tree->u.equality.attr, LTDB_OBJECTCLASS) == 0) {
-               return ltdb_index_dn_objectclass(module, tree, index_list, list);
-       }
        if (ldb_attr_dn(tree->u.equality.attr) == 0) {
                list->dn = talloc_array(list, char *, 1);
                if (list->dn == NULL) {
                        ldb_oom(module->ldb);
-                       return -1;
+                       return LDB_ERR_OPERATIONS_ERROR;
                }
-               list->dn[0] = talloc_strdup(list, (char *)tree->u.equality.value.data);
+               list->dn[0] = talloc_strdup(list->dn, (char *)tree->u.equality.value.data);
                if (list->dn[0] == NULL) {
                        ldb_oom(module->ldb);
-                       return -1;
+                       return LDB_ERR_OPERATIONS_ERROR;
                }
                list->count = 1;
-               return 1;
+               return LDB_SUCCESS;
        }
        return ltdb_index_dn_simple(module, tree, index_list, list);
 }
@@ -362,18 +296,18 @@ static int list_intersect(struct ldb_context *ldb,
 
        if (list->count == 0 || list2->count == 0) {
                /* 0 & X == 0 */
-               return 0;
+               return LDB_ERR_NO_SUCH_OBJECT;
        }
 
        list3 = talloc(ldb, struct dn_list);
        if (list3 == NULL) {
-               return -1;
+               return LDB_ERR_OPERATIONS_ERROR;
        }
 
        list3->dn = talloc_array(list3, char *, list->count);
        if (!list3->dn) {
                talloc_free(list3);
-               return -1;
+               return LDB_ERR_OPERATIONS_ERROR;
        }
        list3->count = 0;
 
@@ -392,7 +326,7 @@ static int list_intersect(struct ldb_context *ldb,
        list->count = list3->count;
        talloc_free(list3);
 
-       return 0;
+       return LDB_ERR_NO_SUCH_OBJECT;
 }
 
 
@@ -410,12 +344,12 @@ static int list_union(struct ldb_context *ldb,
 
        if (list->count == 0 && list2->count == 0) {
                /* 0 | 0 == 0 */
-               return 0;
+               return LDB_ERR_NO_SUCH_OBJECT;
        }
 
        d = talloc_realloc(list, list->dn, char *, list->count + list2->count);
        if (!d) {
-               return -1;
+               return LDB_ERR_OPERATIONS_ERROR;
        }
        list->dn = d;
 
@@ -424,7 +358,7 @@ static int list_union(struct ldb_context *ldb,
                              sizeof(char *), (comparison_fn_t)strcmp) == -1) {
                        list->dn[list->count] = talloc_strdup(list->dn, list2->dn[i]);
                        if (!list->dn[list->count]) {
-                               return -1;
+                               return LDB_ERR_OPERATIONS_ERROR;
                        }
                        list->count++;
                }               
@@ -434,7 +368,7 @@ static int list_union(struct ldb_context *ldb,
                qsort(list->dn, list->count, sizeof(char *), (comparison_fn_t)list_cmp);
        }
 
-       return 0;
+       return LDB_ERR_NO_SUCH_OBJECT;
 }
 
 static int ltdb_index_dn(struct ldb_module *module, 
@@ -455,7 +389,7 @@ static int ltdb_index_dn_or(struct ldb_module *module,
        unsigned int i;
        int ret;
        
-       ret = -1;
+       ret = LDB_ERR_OPERATIONS_ERROR;
        list->dn = NULL;
        list->count = 0;
 
@@ -465,43 +399,43 @@ static int ltdb_index_dn_or(struct ldb_module *module,
 
                list2 = talloc(module, struct dn_list);
                if (list2 == NULL) {
-                       return -1;
+                       return LDB_ERR_OPERATIONS_ERROR;
                }
 
                v = ltdb_index_dn(module, tree->u.list.elements[i], index_list, list2);
 
-               if (v == 0) {
+               if (v == LDB_ERR_NO_SUCH_OBJECT) {
                        /* 0 || X == X */
-                       if (ret == -1) {
-                               ret = 0;
+                       if (ret != LDB_SUCCESS && ret != LDB_ERR_NO_SUCH_OBJECT) {
+                               ret = v;
                        }
                        talloc_free(list2);
                        continue;
                }
 
-               if (v == -1) {
+               if (v != LDB_SUCCESS && v != LDB_ERR_NO_SUCH_OBJECT) {
                        /* 1 || X == 1 */
                        talloc_free(list->dn);
                        talloc_free(list2);
-                       return -1;
+                       return v;
                }
 
-               if (ret == -1) {
-                       ret = 1;
+               if (ret != LDB_SUCCESS && ret != LDB_ERR_NO_SUCH_OBJECT) {
+                       ret = LDB_SUCCESS;
                        list->dn = talloc_move(list, &list2->dn);
                        list->count = list2->count;
                } else {
                        if (list_union(ldb, list, list2) == -1) {
                                talloc_free(list2);
-                               return -1;
+                               return LDB_ERR_OPERATIONS_ERROR;
                        }
-                       ret = 1;
+                       ret = LDB_SUCCESS;
                }
                talloc_free(list2);
        }
 
        if (list->count == 0) {
-               return 0;
+               return LDB_ERR_NO_SUCH_OBJECT;
        }
 
        return ret;
@@ -524,7 +458,7 @@ static int ltdb_index_dn_not(struct ldb_module *module,
           instead, we just give up, and rely on a full index scan
           (unless an outer & manages to reduce the list)
        */
-       return -1;
+       return LDB_ERR_OPERATIONS_ERROR;
 }
 
 /*
@@ -539,7 +473,7 @@ static int ltdb_index_dn_and(struct ldb_module *module,
        unsigned int i;
        int ret;
        
-       ret = -1;
+       ret = LDB_ERR_OPERATIONS_ERROR;
        list->dn = NULL;
        list->count = 0;
 
@@ -549,32 +483,32 @@ static int ltdb_index_dn_and(struct ldb_module *module,
 
                list2 = talloc(module, struct dn_list);
                if (list2 == NULL) {
-                       return -1;
+                       return LDB_ERR_OPERATIONS_ERROR;
                }
 
                v = ltdb_index_dn(module, tree->u.list.elements[i], index_list, list2);
 
-               if (v == 0) {
+               if (v == LDB_ERR_NO_SUCH_OBJECT) {
                        /* 0 && X == 0 */
                        talloc_free(list->dn);
                        talloc_free(list2);
-                       return 0;
+                       return LDB_ERR_NO_SUCH_OBJECT;
                }
 
-               if (v == -1) {
+               if (v != LDB_SUCCESS && v != LDB_ERR_NO_SUCH_OBJECT) {
                        talloc_free(list2);
                        continue;
                }
 
-               if (ret == -1) {
-                       ret = 1;
+               if (ret != LDB_SUCCESS && ret != LDB_ERR_NO_SUCH_OBJECT) {
+                       ret = LDB_SUCCESS;
                        talloc_free(list->dn);
                        list->dn = talloc_move(list, &list2->dn);
                        list->count = list2->count;
                } else {
                        if (list_intersect(ldb, list, list2) == -1) {
                                talloc_free(list2);
-                               return -1;
+                               return LDB_ERR_OPERATIONS_ERROR;
                        }
                }
 
@@ -582,7 +516,7 @@ static int ltdb_index_dn_and(struct ldb_module *module,
 
                if (list->count == 0) {
                        talloc_free(list->dn);
-                       return 0;
+                       return LDB_ERR_NO_SUCH_OBJECT;
                }
        }
 
@@ -606,28 +540,28 @@ static int ltdb_index_dn_one(struct ldb_module *module,
        
        list2 = talloc_zero(module, struct dn_list);
        if (list2 == NULL) {
-               return -1;
+               return LDB_ERR_OPERATIONS_ERROR;
        }
 
        /* the attribute is indexed. Pull the list of DNs that match the 
           search criterion */
-       val.data = (uint8_t *)((intptr_t)ldb_dn_get_casefold(parent_dn));
+       val.data = (uint8_t *)((uintptr_t)ldb_dn_get_casefold(parent_dn));
        val.length = strlen((char *)val.data);
        key = ltdb_index_key(ldb, LTDB_IDXONE, &val);
        if (!key) {
                talloc_free(list2);
-               return -1;
+               return LDB_ERR_OPERATIONS_ERROR;
        }
 
        msg = talloc(list2, struct ldb_message);
        if (msg == NULL) {
                talloc_free(list2);
-               return -1;
+               return LDB_ERR_OPERATIONS_ERROR;
        }
 
        ret = ltdb_search_dn1(module, key, msg);
        talloc_free(key);
-       if (ret == 0 || ret == -1) {
+       if (ret != LDB_SUCCESS) {
                return ret;
        }
 
@@ -643,14 +577,14 @@ static int ltdb_index_dn_one(struct ldb_module *module,
                list2->dn = talloc_array(list2, char *, el->num_values);
                if (!list2->dn) {
                        talloc_free(list2);
-                       return -1;
+                       return LDB_ERR_OPERATIONS_ERROR;
                }
 
                for (j = 0; j < el->num_values; j++) {
                        list2->dn[list2->count] = talloc_strdup(list2->dn, (char *)el->values[j].data);
                        if (!list2->dn[list2->count]) {
                                talloc_free(list2);
-                               return -1;
+                               return LDB_ERR_OPERATIONS_ERROR;
                        }
                        list2->count++;
                }
@@ -658,7 +592,7 @@ static int ltdb_index_dn_one(struct ldb_module *module,
 
        if (list2->count == 0) {
                talloc_free(list2);
-               return 0;
+               return LDB_ERR_NO_SUCH_OBJECT;
        }
 
        if (list2->count > 1) {
@@ -668,13 +602,13 @@ static int ltdb_index_dn_one(struct ldb_module *module,
        if (list->count > 0) {
                if (list_intersect(ldb, list, list2) == -1) {
                        talloc_free(list2);
-                       return -1;
+                       return LDB_ERR_OPERATIONS_ERROR;
                }
 
                if (list->count == 0) {
                        talloc_free(list->dn);
                        talloc_free(list2);
-                       return 0;
+                       return LDB_ERR_NO_SUCH_OBJECT;
                }
        } else {
                list->dn = talloc_move(list, &list2->dn);
@@ -683,19 +617,19 @@ static int ltdb_index_dn_one(struct ldb_module *module,
 
        talloc_free(list2);
 
-       return 1;
+       return LDB_SUCCESS;
 }
 
 /*
   return a list of dn's that might match a indexed search or
-  -1 if an error. return 0 for no matches, or 1 for matches
+  an error. return LDB_ERR_NO_SUCH_OBJECT for no matches, or LDB_SUCCESS for matches
  */
 static int ltdb_index_dn(struct ldb_module *module, 
                         const struct ldb_parse_tree *tree,
                         const struct ldb_message *index_list,
                         struct dn_list *list)
 {
-       int ret = -1;
+       int ret = LDB_ERR_OPERATIONS_ERROR;
 
        switch (tree->operation) {
        case LDB_OP_AND:
@@ -721,7 +655,7 @@ static int ltdb_index_dn(struct ldb_module *module,
        case LDB_OP_APPROX:
        case LDB_OP_EXTENDED:
                /* we can't index with fancy bitops yet */
-               ret = -1;
+               ret = LDB_ERR_OPERATIONS_ERROR;
                break;
        }
 
@@ -767,13 +701,13 @@ static int ltdb_index_filter(const struct dn_list *dn_list,
 
                ret = ltdb_search_dn1(ac->module, dn, ares->message);
                talloc_free(dn);
-               if (ret == 0) {
+               if (ret == LDB_ERR_NO_SUCH_OBJECT) {
                        /* the record has disappeared? yes, this can happen */
                        talloc_free(ares);
                        continue;
                }
 
-               if (ret == -1) {
+               if (ret != LDB_SUCCESS && ret != LDB_ERR_NO_SUCH_OBJECT) {
                        /* an internal error */
                        talloc_free(ares);
                        return LDB_ERR_OPERATIONS_ERROR;
@@ -833,15 +767,15 @@ int ltdb_search_indexed(struct ldb_handle *handle)
 
        if ((ac->scope == LDB_SCOPE_ONELEVEL && (idxattr+idxone == 0)) ||
            (ac->scope == LDB_SCOPE_SUBTREE && idxattr == 0)) {
-               /* no indexs? must do full search */
-               return -1;
+               /* no indexes? must do full search */
+               return LDB_ERR_OPERATIONS_ERROR;
        }
 
-       ret = -1;
+       ret = LDB_ERR_OPERATIONS_ERROR;
 
        dn_list = talloc_zero(handle, struct dn_list);
        if (dn_list == NULL) {
-               return -1;
+               return LDB_ERR_OPERATIONS_ERROR;
        }
 
        if (ac->scope == LDB_SCOPE_BASE) {
@@ -849,21 +783,21 @@ int ltdb_search_indexed(struct ldb_handle *handle)
                dn_list->dn = talloc_array(dn_list, char *, 1);
                if (dn_list->dn == NULL) {
                        ldb_oom(ac->module->ldb);
-                       return -1;
+                       return LDB_ERR_OPERATIONS_ERROR;
                }
                dn_list->dn[0] = ldb_dn_alloc_linearized(dn_list, ac->base);
                if (dn_list->dn[0] == NULL) {
                        ldb_oom(ac->module->ldb);
-                       return -1;
+                       return LDB_ERR_OPERATIONS_ERROR;
                }
                dn_list->count = 1;
-               ret = 1;
+               ret = LDB_SUCCESS;
        }
 
        if (ac->scope != LDB_SCOPE_BASE && idxattr == 1) {
                ret = ltdb_index_dn(ac->module, ac->tree, ltdb->cache->indexlist, dn_list);
 
-               if (ret < 0) {
+               if (ret != LDB_SUCCESS && ret != LDB_ERR_NO_SUCH_OBJECT) {
                        talloc_free(dn_list);
                        return ret;
                }
@@ -873,7 +807,7 @@ int ltdb_search_indexed(struct ldb_handle *handle)
                ret = ltdb_index_dn_one(ac->module, ac->base, dn_list);
        }
 
-       if (ret == 1) {
+       if (ret == LDB_SUCCESS) {
                /* we've got a candidate list - now filter by the full tree
                   and extract the needed attributes */
                ret = ltdb_index_filter(dn_list, handle);
@@ -899,25 +833,25 @@ static int ltdb_index_add1_new(struct ldb_context *ldb,
        el = talloc_realloc(msg, msg->elements, 
                               struct ldb_message_element, msg->num_elements+1);
        if (!el) {
-               return -1;
+               return LDB_ERR_OPERATIONS_ERROR;
        }
 
        msg->elements = el;
        msg->elements[msg->num_elements].name = talloc_strdup(msg->elements, LTDB_IDX);
        if (!msg->elements[msg->num_elements].name) {
-               return -1;
+               return LDB_ERR_OPERATIONS_ERROR;
        }
        msg->elements[msg->num_elements].num_values = 0;
        msg->elements[msg->num_elements].values = talloc(msg->elements, struct ldb_val);
        if (!msg->elements[msg->num_elements].values) {
-               return -1;
+               return LDB_ERR_OPERATIONS_ERROR;
        }
        msg->elements[msg->num_elements].values[0].length = strlen(dn);
        msg->elements[msg->num_elements].values[0].data = discard_const_p(uint8_t, dn);
        msg->elements[msg->num_elements].num_values = 1;
        msg->num_elements++;
 
-       return 0;
+       return LDB_SUCCESS;
 }
 
 
@@ -936,7 +870,7 @@ static int ltdb_index_add1_add(struct ldb_context *ldb,
        /* for multi-valued attributes we can end up with repeats */
        for (i=0;i<msg->elements[idx].num_values;i++) {
                if (strcmp(dn, (char *)msg->elements[idx].values[i].data) == 0) {
-                       return 0;
+                       return LDB_SUCCESS;
                }
        }
 
@@ -944,7 +878,7 @@ static int ltdb_index_add1_add(struct ldb_context *ldb,
                              struct ldb_val, 
                              msg->elements[idx].num_values+1);
        if (!v2) {
-               return -1;
+               return LDB_ERR_OPERATIONS_ERROR;
        }
        msg->elements[idx].values = v2;
 
@@ -952,7 +886,7 @@ static int ltdb_index_add1_add(struct ldb_context *ldb,
        msg->elements[idx].values[msg->elements[idx].num_values].data = discard_const_p(uint8_t, dn);
        msg->elements[idx].num_values++;
 
-       return 0;
+       return LDB_SUCCESS;
 }
 
 /*
@@ -970,23 +904,23 @@ static int ltdb_index_add1(struct ldb_module *module, const char *dn,
        msg = talloc(module, struct ldb_message);
        if (msg == NULL) {
                errno = ENOMEM;
-               return -1;
+               return LDB_ERR_OPERATIONS_ERROR;
        }
 
        dn_key = ltdb_index_key(ldb, el->name, &el->values[v_idx]);
        if (!dn_key) {
                talloc_free(msg);
-               return -1;
+               return LDB_ERR_OPERATIONS_ERROR;
        }
        talloc_steal(msg, dn_key);
 
        ret = ltdb_search_dn1(module, dn_key, msg);
-       if (ret == -1) {
+       if (ret != LDB_SUCCESS && ret != LDB_ERR_NO_SUCH_OBJECT) {
                talloc_free(msg);
-               return -1;
+               return ret;
        }
 
-       if (ret == 0) {
+       if (ret == LDB_ERR_NO_SUCH_OBJECT) {
                msg->dn = dn_key;
                msg->num_elements = 0;
                msg->elements = NULL;
@@ -1004,7 +938,7 @@ static int ltdb_index_add1(struct ldb_module *module, const char *dn,
                ret = ltdb_index_add1_add(ldb, msg, i, dn);
        }
 
-       if (ret == 0) {
+       if (ret == LDB_SUCCESS) {
                ret = ltdb_store(module, msg, TDB_REPLACE);
        }
 
@@ -1016,17 +950,17 @@ static int ltdb_index_add1(struct ldb_module *module, const char *dn,
 static int ltdb_index_add0(struct ldb_module *module, const char *dn,
                           struct ldb_message_element *elements, int num_el)
 {
-       struct ltdb_private *ltdb = module->private_data;
+       struct ltdb_private *ltdb = (struct ltdb_private *)module->private_data;
        int ret;
        unsigned int i, j;
 
        if (dn[0] == '@') {
-               return 0;
+               return LDB_SUCCESS;
        }
 
        if (ltdb->cache->indexlist->num_elements == 0) {
                /* no indexed fields */
-               return 0;
+               return LDB_SUCCESS;
        }
 
        for (i = 0; i < num_el; i++) {
@@ -1037,18 +971,17 @@ static int ltdb_index_add0(struct ldb_module *module, const char *dn,
                }
                for (j = 0; j < elements[i].num_values; j++) {
                        ret = ltdb_index_add1(module, dn, &elements[i], j);
-                       if (ret == -1) {
-                               return -1;
+                       if (ret != LDB_SUCCESS) {
+                               return ret;
                        }
                }
        }
 
-       return 0;
+       return LDB_SUCCESS;
 }
 
 /*
   add the index entries for a new record
-  return -1 on failure
 */
 int ltdb_index_add(struct ldb_module *module, const struct ldb_message *msg)
 {
@@ -1057,7 +990,7 @@ int ltdb_index_add(struct ldb_module *module, const struct ldb_message *msg)
 
        dn = ldb_dn_get_linearized(msg->dn);
        if (dn == NULL) {
-               return -1;
+               return LDB_ERR_OPERATIONS_ERROR;
        }
 
        ret = ltdb_index_add0(module, dn, msg->elements, msg->num_elements);
@@ -1079,31 +1012,31 @@ int ltdb_index_del_value(struct ldb_module *module, const char *dn,
        unsigned int j;
 
        if (dn[0] == '@') {
-               return 0;
+               return LDB_SUCCESS;
        }
 
        dn_key = ltdb_index_key(ldb, el->name, &el->values[v_idx]);
        if (!dn_key) {
-               return -1;
+               return LDB_ERR_OPERATIONS_ERROR;
        }
 
        msg = talloc(dn_key, struct ldb_message);
        if (msg == NULL) {
                talloc_free(dn_key);
-               return -1;
+               return LDB_ERR_OPERATIONS_ERROR;
        }
 
        ret = ltdb_search_dn1(module, dn_key, msg);
-       if (ret == -1) {
+       if (ret != LDB_SUCCESS && ret != LDB_ERR_NO_SUCH_OBJECT) {
                talloc_free(dn_key);
-               return -1;
+               return ret;
        }
 
-       if (ret == 0) {
+       if (ret == LDB_ERR_NO_SUCH_OBJECT) {
                /* it wasn't indexed. Did we have an earlier error? If we did then
                   its gone now */
                talloc_free(dn_key);
-               return 0;
+               return LDB_SUCCESS;
        }
 
        i = ldb_msg_find_idx(msg, dn, &j, LTDB_IDX);
@@ -1113,7 +1046,7 @@ int ltdb_index_del_value(struct ldb_module *module, const char *dn,
                                ldb_dn_get_linearized(dn_key));
                /* it ain't there. hmmm */
                talloc_free(dn_key);
-               return 0;
+               return LDB_SUCCESS;
        }
 
        if (j != msg->elements[i].num_values - 1) {
@@ -1141,7 +1074,7 @@ int ltdb_index_del_value(struct ldb_module *module, const char *dn,
 */
 int ltdb_index_del(struct ldb_module *module, const struct ldb_message *msg)
 {
-       struct ltdb_private *ltdb = module->private_data;
+       struct ltdb_private *ltdb = (struct ltdb_private *)module->private_data;
        int ret;
        const char *dn;
        unsigned int i, j;
@@ -1149,16 +1082,16 @@ int ltdb_index_del(struct ldb_module *module, const struct ldb_message *msg)
        /* find the list of indexed fields */   
        if (ltdb->cache->indexlist->num_elements == 0) {
                /* no indexed fields */
-               return 0;
+               return LDB_SUCCESS;
        }
 
        if (ldb_dn_is_special(msg->dn)) {
-               return 0;
+               return LDB_SUCCESS;
        }
 
        dn = ldb_dn_get_linearized(msg->dn);
        if (dn == NULL) {
-               return -1;
+               return LDB_ERR_OPERATIONS_ERROR;
        }
 
        for (i = 0; i < msg->num_elements; i++) {
@@ -1169,13 +1102,13 @@ int ltdb_index_del(struct ldb_module *module, const struct ldb_message *msg)
                }
                for (j = 0; j < msg->elements[i].num_values; j++) {
                        ret = ltdb_index_del_value(module, dn, &msg->elements[i], j);
-                       if (ret == -1) {
-                               return -1;
+                       if (ret != LDB_SUCCESS) {
+                               return ret;
                        }
                }
        }
 
-       return 0;
+       return LDB_SUCCESS;
 }
 
 /* 
@@ -1183,7 +1116,7 @@ int ltdb_index_del(struct ldb_module *module, const struct ldb_message *msg)
 */
 int ltdb_index_one(struct ldb_module *module, const struct ldb_message *msg, int add)
 {
-       struct ltdb_private *ltdb = module->private_data;
+       struct ltdb_private *ltdb = (struct ltdb_private *)module->private_data;
        struct ldb_message_element el;
        struct ldb_val val;
        struct ldb_dn *pdn;
@@ -1193,24 +1126,24 @@ int ltdb_index_one(struct ldb_module *module, const struct ldb_message *msg, int
        /* We index for ONE Level only if requested */
        ret = ldb_msg_find_idx(ltdb->cache->indexlist, NULL, NULL, LTDB_IDXONE);
        if (ret != 0) {
-               return 0;
+               return LDB_SUCCESS;
        }
 
        pdn = ldb_dn_get_parent(module, msg->dn);
        if (pdn == NULL) {
-               return -1;
+               return LDB_ERR_OPERATIONS_ERROR;
        }
 
        dn = ldb_dn_get_linearized(msg->dn);
        if (dn == NULL) {
                talloc_free(pdn);
-               return -1;
+               return LDB_ERR_OPERATIONS_ERROR;
        }
 
-       val.data = (uint8_t *)((intptr_t)ldb_dn_get_casefold(pdn));
+       val.data = (uint8_t *)((uintptr_t)ldb_dn_get_casefold(pdn));
        if (val.data == NULL) {
                talloc_free(pdn);
-               return -1;
+               return LDB_ERR_OPERATIONS_ERROR;
        }
 
        val.length = strlen((char *)val.data);
@@ -1247,7 +1180,7 @@ static int delete_index(struct tdb_context *tdb, TDB_DATA key, TDB_DATA data, vo
 */
 static int re_index(struct tdb_context *tdb, TDB_DATA key, TDB_DATA data, void *state)
 {
-       struct ldb_module *module = state;
+       struct ldb_module *module = (struct ldb_module *)state;
        struct ldb_message *msg;
        const char *dn = NULL;
        int ret;
@@ -1292,7 +1225,7 @@ static int re_index(struct tdb_context *tdb, TDB_DATA key, TDB_DATA data, void *
        }
 
        ret = ltdb_index_one(module, msg, 1);
-       if (ret == 0) {
+       if (ret == LDB_SUCCESS) {
                ret = ltdb_index_add0(module, dn, msg->elements, msg->num_elements);
        } else {
                ldb_debug(module->ldb, LDB_DEBUG_ERROR,
@@ -1302,7 +1235,9 @@ static int re_index(struct tdb_context *tdb, TDB_DATA key, TDB_DATA data, void *
 
        talloc_free(msg);
 
-       return ret;
+       if (ret != LDB_SUCCESS) return -1;
+
+       return 0;
 }
 
 /*
@@ -1310,24 +1245,29 @@ static int re_index(struct tdb_context *tdb, TDB_DATA key, TDB_DATA data, void *
 */
 int ltdb_reindex(struct ldb_module *module)
 {
-       struct ltdb_private *ltdb = module->private_data;
+       struct ltdb_private *ltdb = (struct ltdb_private *)module->private_data;
        int ret;
 
        if (ltdb_cache_reload(module) != 0) {
-               return -1;
+               return LDB_ERR_OPERATIONS_ERROR;
        }
 
        /* first traverse the database deleting any @INDEX records */
        ret = tdb_traverse(ltdb->tdb, delete_index, NULL);
        if (ret == -1) {
-               return -1;
+               return LDB_ERR_OPERATIONS_ERROR;
+       }
+
+       /* if we don't have indexes we have nothing todo */
+       if (ltdb->cache->indexlist->num_elements == 0) {
+               return LDB_SUCCESS;
        }
 
        /* now traverse adding any indexes for normal LDB records */
        ret = tdb_traverse(ltdb->tdb, re_index, module);
        if (ret == -1) {
-               return -1;
+               return LDB_ERR_OPERATIONS_ERROR;
        }
 
-       return 0;
+       return LDB_SUCCESS;
 }