]> git.sur5r.net Git - openldap/blobdiff - servers/slapd/back-mdb/init.c
Merge remote-tracking branch 'origin/mdb.master'
[openldap] / servers / slapd / back-mdb / init.c
index 41fc4068bb839ac21ae3619034342c303bc11e85..7ccdd67b8f0cc143f816e3cc495f670d736782f1 100644 (file)
@@ -2,7 +2,7 @@
 /* $OpenLDAP$ */
 /* This work is part of OpenLDAP Software <http://www.openldap.org/>.
  *
- * Copyright 2000-2012 The OpenLDAP Foundation.
+ * Copyright 2000-2013 The OpenLDAP Foundation.
  * All rights reserved.
  *
  * Redistribution and use in source and binary forms, with or without
@@ -166,7 +166,7 @@ mdb_db_open( BackendDB *be, ConfigReply *cr )
        flags = mdb->mi_dbenv_flags;
 
        if ( slapMode & SLAP_TOOL_QUICK )
-               flags |= MDB_NOSYNC;
+               flags |= MDB_NOSYNC|MDB_WRITEMAP;
 
        if ( slapMode & SLAP_TOOL_READONLY)
                flags |= MDB_RDONLY;
@@ -182,7 +182,7 @@ mdb_db_open( BackendDB *be, ConfigReply *cr )
                goto fail;
        }
 
-       rc = mdb_txn_begin( mdb->mi_dbenv, NULL, 0, &txn );
+       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. "
@@ -204,14 +204,14 @@ mdb_db_open( BackendDB *be, ConfigReply *cr )
                                flags |= MDB_CREATE;
                }
 
-               rc = mdb_open( txn,
+               rc = mdb_dbi_open( txn,
                        mdmi_databases[i].bv_val,
                        flags,
                        &mdb->mi_dbis[i] );
 
                if ( rc != 0 ) {
                        snprintf( cr->msg, sizeof(cr->msg), "database \"%s\": "
-                               "mdb_open(%s/%s) failed: %s (%d).", 
+                               "mdb_dbi_open(%s/%s) failed: %s (%d).", 
                                be->be_suffix[0].bv_val, 
                                mdb->mi_dbenv_home, mdmi_databases[i].bv_val,
                                mdb_strerror(rc), rc );
@@ -223,9 +223,40 @@ 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_DN2ID )
+               else if ( i == MDB_DN2ID ) {
+                       MDB_cursor *mc;
+                       MDB_val key, data;
+                       ID id;
                        mdb_set_dupsort( txn, mdb->mi_dbis[i], mdb_dup_compare );
-
+                       /* check for old dn2id format */
+                       rc = mdb_cursor_open( txn, mdb->mi_dbis[i], &mc );
+                       /* first record is always ID 0 */
+                       rc = mdb_cursor_get( mc, &key, &data, MDB_FIRST );
+                       if ( rc == 0 ) {
+                               rc = mdb_cursor_get( mc, &key, &data, MDB_NEXT );
+                               if ( rc == 0 ) {
+                                       int len;
+                                       unsigned char *ptr;
+                                       ptr = data.mv_data;
+                                       len = (ptr[0] & 0x7f) << 8 | ptr[1];
+                                       if (data.mv_size < 2*len + 4 + 2*sizeof(ID)) {
+                                               snprintf( cr->msg, sizeof(cr->msg),
+                                               "database \"%s\": DN index needs upgrade, "
+                                               "run \"slapindex entryDN\".",
+                                               be->be_suffix[0].bv_val );
+                                               Debug( LDAP_DEBUG_ANY,
+                                                       LDAP_XSTRING(mdb_db_open) ": %s\n",
+                                                       cr->msg, 0, 0 );
+                                               if ( !(slapMode & SLAP_TOOL_READMAIN ))
+                                                       rc = LDAP_OTHER;
+                                               mdb->mi_flags |= MDB_NEED_UPGRADE;
+                                       }
+                               }
+                       }
+                       mdb_cursor_close( mc );
+                       if ( rc == LDAP_OTHER )
+                               goto fail;
+               }
        }
 
        rc = mdb_ad_read( mdb, txn );
@@ -242,6 +273,10 @@ mdb_db_open( BackendDB *be, ConfigReply *cr )
 
        rc = mdb_txn_commit(txn);
        if ( rc != 0 ) {
+               Debug( LDAP_DEBUG_ANY,
+                       LDAP_XSTRING(mdb_db_open) ": database %s: "
+                       "txn_commit failed: %s (%d)\n",
+                       be->be_suffix[0].bv_val, mdb_strerror(rc), rc );
                goto fail;
        }
 
@@ -281,7 +316,7 @@ mdb_db_close( BackendDB *be, ConfigReply *cr )
 
                        mdb_attr_dbs_close( mdb );
                        for ( i=0; i<MDB_NDB; i++ )
-                               mdb_close( mdb->mi_dbenv, mdb->mi_dbis[i] );
+                               mdb_dbi_close( mdb->mi_dbenv, mdb->mi_dbis[i] );
 
                        /* force a sync, but not if we were ReadOnly,
                         * and not in Quick mode.