]> git.sur5r.net Git - openldap/blobdiff - servers/slapd/back-mdb/init.c
Large multivalued attr support
[openldap] / servers / slapd / back-mdb / init.c
index d59b207bc652fe64812189b6b80a2d0335f977a7..fe023b22431923acf5bbce6e3d36abd991eade0f 100644 (file)
@@ -2,7 +2,7 @@
 /* $OpenLDAP$ */
 /* This work is part of OpenLDAP Software <http://www.openldap.org/>.
  *
- * Copyright 2000-2014 The OpenLDAP Foundation.
+ * Copyright 2000-2016 The OpenLDAP Foundation.
  * All rights reserved.
  *
  * Redistribution and use in source and binary forms, with or without
@@ -31,6 +31,7 @@ static const struct berval mdmi_databases[] = {
        BER_BVC("ad2i"),
        BER_BVC("dn2i"),
        BER_BVC("id2e"),
+       BER_BVC("id2v"),
        BER_BVNULL
 };
 
@@ -62,6 +63,9 @@ mdb_db_init( BackendDB *be, ConfigReply *cr )
        mdb->mi_search_stack = NULL;
 
        mdb->mi_mapsize = DEFAULT_MAPSIZE;
+       mdb->mi_rtxn_size = DEFAULT_RTXN_SIZE;
+       mdb->mi_multi_hi = UINT_MAX;
+       mdb->mi_multi_lo = UINT_MAX;
 
        be->be_private = mdb;
        be->be_cf_ocs = be->bd_info->bi_cf_ocs;
@@ -176,18 +180,18 @@ mdb_db_open( BackendDB *be, ConfigReply *cr )
 
        if ( rc ) {
                Debug( LDAP_DEBUG_ANY,
-                       LDAP_XSTRING(mdb_db_open) ": database \"%s\" cannot be opened, err %d. "
+                       LDAP_XSTRING(mdb_db_open) ": database \"%s\" cannot be opened: %s (%d). "
                        "Restore from backup!\n",
-                       be->be_suffix[0].bv_val, rc, 0 );
+                       be->be_suffix[0].bv_val, mdb_strerror(rc), rc );
                goto fail;
        }
 
        rc = mdb_txn_begin( mdb->mi_dbenv, NULL, flags & MDB_RDONLY, &txn );
        if ( rc ) {
                Debug( LDAP_DEBUG_ANY,
-                       LDAP_XSTRING(mdb_db_open) ": database \"%s\" cannot be opened, err %d. "
+                       LDAP_XSTRING(mdb_db_open) ": database \"%s\" cannot be opened: %s (%d). "
                        "Restore from backup!\n",
-                       be->be_suffix[0].bv_val, rc, 0 );
+                       be->be_suffix[0].bv_val, mdb_strerror(rc), rc );
                goto fail;
        }
 
@@ -200,6 +204,8 @@ mdb_db_open( BackendDB *be, ConfigReply *cr )
                } else {
                        if ( i == MDB_DN2ID )
                                flags |= MDB_DUPSORT;
+                       if ( i == MDB_ID2VAL )
+                               flags ^= MDB_INTEGERKEY|MDB_DUPSORT;
                        if ( !(slapMode & SLAP_TOOL_READONLY) )
                                flags |= MDB_CREATE;
                }
@@ -223,6 +229,8 @@ mdb_db_open( BackendDB *be, ConfigReply *cr )
 
                if ( i == MDB_ID2ENTRY )
                        mdb_set_compare( txn, mdb->mi_dbis[i], mdb_id_compare );
+               else if ( i == MDB_ID2VAL )
+                       mdb_set_compare( txn, mdb->mi_dbis[i], mdb_id2v_compare );
                else if ( i == MDB_DN2ID ) {
                        MDB_cursor *mc;
                        MDB_val key, data;
@@ -456,6 +464,7 @@ mdb_back_initialize(
        bi->bi_op_search = mdb_search;
 
        bi->bi_op_unbind = 0;
+       bi->bi_op_txn = mdb_txn;
 
        bi->bi_extended = mdb_extended;
 
@@ -480,6 +489,7 @@ mdb_back_initialize(
        bi->bi_tool_sync = 0;
        bi->bi_tool_dn2id_get = mdb_tool_dn2id_get;
        bi->bi_tool_entry_modify = mdb_tool_entry_modify;
+       bi->bi_tool_entry_delete = mdb_tool_entry_delete;
 
        bi->bi_connection_init = 0;
        bi->bi_connection_destroy = 0;