diff --git a/configure.ac b/configure.ac
index b5c247434..46036113b 100644
--- a/configure.ac
+++ b/configure.ac
@@ -193,31 +193,6 @@ AC_ARG_WITH(store-dir, AC_HELP_STRING([--with-store-dir=PATH],
storedir=$withval, storedir='/nix/store')
AC_SUBST(storedir)
-AC_ARG_ENABLE(old-db-compat, AC_HELP_STRING([--disable-old-db-compat],
- [disable support for converting from old Berkeley DB-based Nix stores]),
- old_db_compat=$enableval, old_db_compat=yes)
-AM_CONDITIONAL(OLD_DB_COMPAT, test "$old_db_compat" = "yes")
-
-AC_ARG_WITH(bdb, AC_HELP_STRING([--with-bdb=PATH],
- [prefix of Berkeley DB (for Nix <= 0.11 compatibility)]),
- bdb=$withval, bdb=)
-AM_CONDITIONAL(HAVE_BDB, test -n "$bdb")
-if test -z "$bdb"; then
- bdb_lib='-L${top_builddir}/externals/inst-bdb/lib -ldb_cxx'
- bdb_include='-I${top_builddir}/externals/inst-bdb/include'
-else
- bdb_lib="-L$bdb/lib -ldb_cxx"
- bdb_include="-I$bdb/include"
-fi
-if test "$old_db_compat" = "no"; then
- bdb_lib=
- bdb_include=
-else
- AC_DEFINE(OLD_DB_COMPAT, 1, [Whether to support converting from old Berkeley DB-based Nix stores.])
-fi
-AC_SUBST(bdb_lib)
-AC_SUBST(bdb_include)
-
AC_ARG_WITH(aterm, AC_HELP_STRING([--with-aterm=PATH],
[prefix of CWI ATerm library]),
aterm=$withval, aterm=)
@@ -289,7 +264,7 @@ AC_CHECK_FUNCS([strsignal])
AC_CHECK_FUNCS([posix_fallocate])
-# This is needed if ATerm, Berkeley DB or bzip2 are static libraries,
+# This is needed if ATerm or bzip2 are static libraries,
# and the Nix libraries are dynamic.
if test "$(uname)" = "Darwin"; then
LDFLAGS="-all_load $LDFLAGS"
diff --git a/doc/manual/installation.xml b/doc/manual/installation.xml
index 0e66b8f0e..4f4d7acd7 100644
--- a/doc/manual/installation.xml
+++ b/doc/manual/installation.xml
@@ -107,13 +107,6 @@ you can use configure's
and
options to point to their respective locations.
-If you want to be able to upgrade Nix stores from before version
-0.12pre12020, you need Sleepycat's Berkeley DB version version 4.5.
-(Other versions may not have compatible database formats.). Berkeley
-DB 4.5 is included in the Nix source distribution. If you do not need
-this ability, you can build Nix with the
- configure option.
-
diff --git a/externals/Makefile.am b/externals/Makefile.am
index 29d0db052..7f68eee6c 100644
--- a/externals/Makefile.am
+++ b/externals/Makefile.am
@@ -1,46 +1,3 @@
-# Berkeley DB
-
-DB = db-4.5.20
-
-if OLD_DB_COMPAT
-
-$(DB).tar.gz:
- @echo "Nix requires Berkeley DB to build."
- @echo "Please download version 4.5.20 from"
- @echo " http://download-east.oracle.com/berkeley-db/db-4.5.20.tar.gz"
- @echo "and place it in the externals/ directory."
- false
-
-$(DB): $(DB).tar.gz
- gunzip < $(srcdir)/$(DB).tar.gz | tar xvf -
- (cd $(DB) && $(patch) -p1) < $(srcdir)/bdb-cygwin.patch
-
-have-db:
- $(MAKE) $(DB)
- touch have-db
-
-if HAVE_BDB
-build-db:
-else
-build-db: have-db
- (pfx=`pwd` && \
- cd $(DB)/build_unix && \
- CC="$(CC)" CXX="$(CXX)" CFLAGS="$(CFLAGS)" CXXFLAGS="$(CXXFLAGS)" \
- ../dist/configure --prefix=$$pfx/inst-bdb \
- --enable-cxx --disable-shared --disable-cryptography \
- --disable-replication --disable-verify && \
- $(MAKE) && \
- $(MAKE) install_include install_lib)
- touch build-db
-endif
-
-else
-
-build-db:
-
-endif
-
-
# CWI ATerm
ATERM = aterm-2.4.2-fixes-r2
@@ -107,11 +64,10 @@ install:
endif
-all: build-db build-aterm build-bzip2
+all: build-aterm build-bzip2
-EXTRA_DIST = $(DB).tar.gz $(ATERM).tar.bz2 $(BZIP2).tar.gz \
- bdb-cygwin.patch
+EXTRA_DIST = $(ATERM).tar.bz2 $(BZIP2).tar.gz
ext-clean:
- $(RM) -f have-db build-db have-aterm build-aterm have-bzip2 build-bzip2
- $(RM) -rf $(DB) $(ATERM) $(BZIP2)
+ $(RM) -f have-aterm build-aterm have-bzip2 build-bzip2
+ $(RM) -rf $(ATERM) $(BZIP2)
diff --git a/externals/bdb-cygwin.patch b/externals/bdb-cygwin.patch
deleted file mode 100644
index 3f0ee78a7..000000000
--- a/externals/bdb-cygwin.patch
+++ /dev/null
@@ -1,22 +0,0 @@
-diff -rc db-4.5.20-orig/os/os_flock.c db-4.5.20/os/os_flock.c
-*** db-4.5.20-orig/os/os_flock.c 2006-10-13 12:36:12.000000000 +0200
---- db-4.5.20/os/os_flock.c 2006-10-13 12:40:11.000000000 +0200
-***************
-*** 30,35 ****
---- 30,44 ----
-
- DB_ASSERT(dbenv, F_ISSET(fhp, DB_FH_OPENED) && fhp->fd != -1);
-
-+ #ifdef __CYGWIN__
-+ /*
-+ * Windows file locking interferes with read/write operations, so we
-+ * map the ranges to an area past the end of the file.
-+ */
-+ DB_ASSERT(dbenv, offset < (off_t) 1 << 62);
-+ offset += (off_t) 1 << 62;
-+ #endif
-+
- fl.l_start = offset;
- fl.l_len = 1;
- fl.l_type = acquire ? F_WRLCK : F_UNLCK;
-Only in db-4.5.20/os: os_flock.c~
diff --git a/release.nix b/release.nix
index 089035b0c..4d0e2b8c8 100644
--- a/release.nix
+++ b/release.nix
@@ -29,22 +29,8 @@ let
--with-xml-flags=--nonet
'';
- # Include the BDB, ATerm and Bzip2 tarballs in the distribution.
+ # Include the ATerm and Bzip2 tarballs in the distribution.
preConfigure = ''
- stripHash ${db45.src}
- # Remove unnecessary stuff from the Berkeley DB tarball.
- ( mkdir bdb-temp
- cd bdb-temp
- tar xfz ${db45.src}
- cd *
- rm -rf docs test tcl perl libdb_java java rpc_server build_vxworks \
- examples_java examples_c examples_cxx dist/tags
- mkdir test
- touch test/include.tcl
- cd ..
- tar cvfz ../externals/$strippedName *
- )
-
stripHash ${aterm242fixes.src}
cp -pv ${aterm242fixes.src} externals/$strippedName
@@ -91,7 +77,6 @@ let
configureFlags = ''
--disable-init-state
- ${if system == "i686-cygwin" then "--disable-old-db-compat" else "--with-bdb=${db45}"}
--with-aterm=${aterm242fixes} --with-bzip2=${bzip2}
'';
};
@@ -113,7 +98,7 @@ let
configureFlags = ''
--disable-init-state
- --disable-old-db-compat --with-aterm=${aterm242fixes} --with-bzip2=${bzip2}
+ --with-aterm=${aterm242fixes} --with-bzip2=${bzip2}
--enable-static-nix
'';
};
@@ -138,7 +123,7 @@ let
configureFlags = ''
--disable-init-state --disable-shared
- --with-bdb=${db45} --with-aterm=${aterm242fixes} --with-bzip2=${bzip2}
+ --with-aterm=${aterm242fixes} --with-bzip2=${bzip2}
'';
lcovFilter = ["*/boost/*" "*-tab.*"];
diff --git a/src/libexpr/Makefile.am b/src/libexpr/Makefile.am
index 09be6f327..e16600fbf 100644
--- a/src/libexpr/Makefile.am
+++ b/src/libexpr/Makefile.am
@@ -19,7 +19,7 @@ BUILT_SOURCES = nixexpr-ast.cc nixexpr-ast.hh \
EXTRA_DIST = lexer.l parser.y nixexpr-ast.def nixexpr-ast.cc
AM_CXXFLAGS = \
- -I$(srcdir)/.. ${bdb_include} ${aterm_include} \
+ -I$(srcdir)/.. ${aterm_include} \
-I$(srcdir)/../libutil -I$(srcdir)/../libstore
AM_CFLAGS = \
${aterm_include}
diff --git a/src/libstore/Makefile.am b/src/libstore/Makefile.am
index 185bb298d..863871519 100644
--- a/src/libstore/Makefile.am
+++ b/src/libstore/Makefile.am
@@ -2,12 +2,12 @@ pkglib_LTLIBRARIES = libstore.la
libstore_la_SOURCES = \
store-api.cc local-store.cc remote-store.cc derivations.cc build.cc misc.cc \
- globals.cc db.cc references.cc pathlocks.cc gc.cc upgrade-schema.cc \
+ globals.cc references.cc pathlocks.cc gc.cc \
optimise-store.cc
pkginclude_HEADERS = \
store-api.hh local-store.hh remote-store.hh derivations.hh misc.hh \
- globals.hh db.hh references.hh pathlocks.hh \
+ globals.hh references.hh pathlocks.hh \
worker-protocol.hh
libstore_la_LIBADD = ../libutil/libutil.la ../boost/format/libformat.la @ADDITIONAL_NETWORK_LIBS@
@@ -17,7 +17,7 @@ BUILT_SOURCES = derivations-ast.cc derivations-ast.hh
EXTRA_DIST = derivations-ast.def derivations-ast.cc
AM_CXXFLAGS = -Wall \
- -I$(srcdir)/.. ${bdb_include} ${aterm_include} -I$(srcdir)/../libutil
+ -I$(srcdir)/.. ${aterm_include} -I$(srcdir)/../libutil
derivations-ast.cc derivations-ast.hh: ../aterm-helper.pl derivations-ast.def
$(perl) $(srcdir)/../aterm-helper.pl derivations-ast.hh derivations-ast.cc < $(srcdir)/derivations-ast.def
diff --git a/src/libstore/db.cc b/src/libstore/db.cc
deleted file mode 100644
index 26e82d695..000000000
--- a/src/libstore/db.cc
+++ /dev/null
@@ -1,474 +0,0 @@
-#include "config.h"
-
-#ifdef OLD_DB_COMPAT
-
-#include "db.hh"
-#include "util.hh"
-#include "pathlocks.hh"
-
-#include
-#include
-#include
-#include
-
-#include
-
-#include
-
-
-namespace nix {
-
-
-/* Wrapper class to ensure proper destruction. */
-class DestroyDbc
-{
- Dbc * dbc;
-public:
- DestroyDbc(Dbc * _dbc) : dbc(_dbc) { }
- ~DestroyDbc() { dbc->close(); /* close() frees dbc */ }
-};
-
-
-class DestroyDbEnv
-{
- DbEnv * dbenv;
-public:
- DestroyDbEnv(DbEnv * _dbenv) : dbenv(_dbenv) { }
- ~DestroyDbEnv() {
- if (dbenv) {
- if (dbenv->get_DB_ENV()) dbenv->close(0);
- delete dbenv;
- }
- }
- void release() { dbenv = 0; };
-};
-
-
-static void rethrow(DbException & e)
-{
- throw Error(e.what());
-}
-
-
-Transaction::Transaction()
- : txn(0)
-{
-}
-
-
-Transaction::Transaction(Database & db)
- : txn(0)
-{
- begin(db);
-}
-
-
-Transaction::~Transaction()
-{
- if (txn) abort();
-}
-
-
-void Transaction::begin(Database & db)
-{
- assert(txn == 0);
- db.requireEnv();
- try {
- db.env->txn_begin(0, &txn, 0);
- } catch (DbException e) { rethrow(e); }
-}
-
-
-void Transaction::commit()
-{
- if (!txn) throw Error("commit called on null transaction");
- debug(format("committing transaction %1%") % (void *) txn);
- DbTxn * txn2 = txn;
- txn = 0;
- try {
- txn2->commit(0);
- } catch (DbException e) { rethrow(e); }
-}
-
-
-void Transaction::abort()
-{
- if (!txn) throw Error("abort called on null transaction");
- debug(format("aborting transaction %1%") % (void *) txn);
- DbTxn * txn2 = txn;
- txn = 0;
- try {
- txn2->abort();
- } catch (DbException e) { rethrow(e); }
-}
-
-
-void Transaction::moveTo(Transaction & t)
-{
- if (t.txn) throw Error("target txn already exists");
- t.txn = txn;
- txn = 0;
-}
-
-
-void Database::requireEnv()
-{
- checkInterrupt();
- if (!env) throw Error("database environment is not open "
- "(maybe you don't have sufficient permission?)");
-}
-
-
-Db * Database::getDb(TableId table)
-{
- if (table == 0)
- throw Error("database table is not open "
- "(maybe you don't have sufficient permission?)");
- std::map::iterator i = tables.find(table);
- if (i == tables.end())
- throw Error("unknown table id");
- return i->second;
-}
-
-
-Database::Database()
- : env(0)
- , nextId(1)
-{
-}
-
-
-Database::~Database()
-{
- close();
-}
-
-
-void openEnv(DbEnv * & env, const string & path, u_int32_t flags)
-{
- try {
- createDirs(path);
- } catch (SysError & e) {
- if (e.errNo == EPERM || e.errNo == EACCES)
- throw DbNoPermission(format("cannot create the Nix database in `%1%'") % path);
- else
- throw;
- }
-
- try {
- env->open(path.c_str(),
- DB_INIT_LOCK | DB_INIT_LOG | DB_INIT_MPOOL | DB_INIT_TXN |
- DB_CREATE | flags,
- 0666);
- } catch (DbException & e) {
- printMsg(lvlError, format("environment open failed: %1%") % e.what());
- throw;
- }
-}
-
-
-static int my_fsync(int fd)
-{
- return 0;
-}
-
-
-static void errorPrinter(const DbEnv * env, const char * errpfx, const char * msg)
-{
- printMsg(lvlError, format("Berkeley DB error: %1%") % msg);
-}
-
-
-static void messagePrinter(const DbEnv * env, const char * msg)
-{
- printMsg(lvlError, format("Berkeley DB message: %1%") % msg);
-}
-
-
-void Database::open2(const string & path, bool removeOldEnv)
-{
- if (env) throw Error(format("environment already open"));
-
- debug(format("opening database environment"));
-
-
- /* Create the database environment object. */
- DbEnv * env = new DbEnv(0);
- DestroyDbEnv deleteEnv(env);
-
- env->set_errcall(errorPrinter);
- env->set_msgcall(messagePrinter);
- if (getEnv("NIX_DEBUG_DB_REGISTER") == "1")
- env->set_verbose(DB_VERB_REGISTER, 1);
- env->set_verbose(DB_VERB_RECOVERY, 1);
-
- /* Smaller log files. */
- env->set_lg_bsize(32 * 1024); /* default */
- env->set_lg_max(256 * 1024); /* must be > 4 * lg_bsize */
-
- /* Write the log, but don't sync. This protects transactions
- against application crashes, but if the system crashes, some
- transactions may be undone. An acceptable risk, I think. */
- env->set_flags(DB_TXN_WRITE_NOSYNC | DB_LOG_AUTOREMOVE, 1);
-
- /* Increase the locking limits. If you ever get `Dbc::get: Cannot
- allocate memory' or similar, especially while running
- `nix-store --verify', just increase the following number, then
- run db_recover on the database to remove the existing DB
- environment (since changes only take effect on new
- environments). */
- env->set_lk_max_locks(10000);
- env->set_lk_max_lockers(10000);
- env->set_lk_max_objects(10000);
- env->set_lk_detect(DB_LOCK_DEFAULT);
-
- /* Dangerous, probably, but from the docs it *seems* that BDB
- shouldn't sync when DB_TXN_WRITE_NOSYNC is used, but it still
- fsync()s sometimes. */
- db_env_set_func_fsync(my_fsync);
-
-
- if (removeOldEnv) {
- printMsg(lvlError, "removing old Berkeley DB database environment...");
- env->remove(path.c_str(), DB_FORCE);
- return;
- }
-
- openEnv(env, path, DB_REGISTER | DB_RECOVER);
-
- deleteEnv.release();
- this->env = env;
-}
-
-
-void Database::open(const string & path)
-{
- try {
-
- open2(path, false);
-
- } catch (DbException e) {
-
- if (e.get_errno() == DB_VERSION_MISMATCH) {
- /* Remove the environment while we are holding the global
- lock. If things go wrong there, we bail out.
- !!! argh, we abolished the global lock :-( */
- open2(path, true);
-
- /* Try again. */
- open2(path, false);
-
- /* Force a checkpoint, as per the BDB docs. */
- env->txn_checkpoint(DB_FORCE, 0, 0);
-
- printMsg(lvlError, "database succesfully upgraded to new version");
- }
-
-#if 0
- else if (e.get_errno() == DB_RUNRECOVERY) {
- /* If recovery is needed, do it. */
- printMsg(lvlError, "running recovery...");
- open2(path, false, true);
- }
-#endif
-
- else
- rethrow(e);
- }
-}
-
-
-void Database::close()
-{
- if (!env) return;
-
- /* Close the database environment. */
- debug(format("closing database environment"));
-
- try {
-
- for (std::map::iterator i = tables.begin();
- i != tables.end(); )
- {
- std::map::iterator j = i;
- ++j;
- closeTable(i->first);
- i = j;
- }
-
- /* Do a checkpoint every 128 kilobytes, or every 5 minutes. */
- env->txn_checkpoint(128, 5, 0);
-
- env->close(0);
-
- } catch (DbException e) { rethrow(e); }
-
- delete env;
-
- env = 0;
-}
-
-
-TableId Database::openTable(const string & tableName, bool sorted)
-{
- requireEnv();
- TableId table = nextId++;
-
- try {
-
- Db * db = new Db(env, 0);
-
- try {
- db->open(0, tableName.c_str(), 0,
- sorted ? DB_BTREE : DB_HASH,
- DB_CREATE | DB_AUTO_COMMIT, 0666);
- } catch (...) {
- delete db;
- throw;
- }
-
- tables[table] = db;
-
- } catch (DbException e) { rethrow(e); }
-
- return table;
-}
-
-
-void Database::closeTable(TableId table)
-{
- try {
- Db * db = getDb(table);
- db->close(DB_NOSYNC);
- delete db;
- tables.erase(table);
- } catch (DbException e) { rethrow(e); }
-}
-
-
-void Database::deleteTable(const string & table)
-{
- try {
- env->dbremove(0, table.c_str(), 0, DB_AUTO_COMMIT);
- } catch (DbException e) { rethrow(e); }
-}
-
-
-bool Database::queryString(const Transaction & txn, TableId table,
- const string & key, string & data)
-{
- checkInterrupt();
-
- try {
- Db * db = getDb(table);
-
- Dbt kt((void *) key.c_str(), key.length());
- Dbt dt;
-
- int err = db->get(txn.txn, &kt, &dt, 0);
- if (err) return false;
-
- if (!dt.get_data())
- data = "";
- else
- data = string((char *) dt.get_data(), dt.get_size());
-
- } catch (DbException e) { rethrow(e); }
-
- return true;
-}
-
-
-bool Database::queryStrings(const Transaction & txn, TableId table,
- const string & key, Strings & data)
-{
- string d;
- if (!queryString(txn, table, key, d))
- return false;
- data = unpackStrings(d);
- return true;
-}
-
-
-void Database::setString(const Transaction & txn, TableId table,
- const string & key, const string & data)
-{
- checkInterrupt();
- try {
- Db * db = getDb(table);
- Dbt kt((void *) key.c_str(), key.length());
- Dbt dt((void *) data.c_str(), data.length());
- db->put(txn.txn, &kt, &dt, 0);
- } catch (DbException e) { rethrow(e); }
-}
-
-
-void Database::setStrings(const Transaction & txn, TableId table,
- const string & key, const Strings & data, bool deleteEmpty)
-{
- if (deleteEmpty && data.size() == 0)
- delPair(txn, table, key);
- else
- setString(txn, table, key, packStrings(data));
-}
-
-
-void Database::delPair(const Transaction & txn, TableId table,
- const string & key)
-{
- checkInterrupt();
- try {
- Db * db = getDb(table);
- Dbt kt((void *) key.c_str(), key.length());
- db->del(txn.txn, &kt, 0);
- /* Non-existence of a pair with the given key is not an
- error. */
- } catch (DbException e) { rethrow(e); }
-}
-
-
-void Database::enumTable(const Transaction & txn, TableId table,
- Strings & keys, const string & keyPrefix)
-{
- try {
- Db * db = getDb(table);
-
- Dbc * dbc;
- db->cursor(txn.txn, &dbc, 0);
- DestroyDbc destroyDbc(dbc);
-
- Dbt kt, dt;
- u_int32_t flags = DB_NEXT;
-
- if (!keyPrefix.empty()) {
- flags = DB_SET_RANGE;
- kt = Dbt((void *) keyPrefix.c_str(), keyPrefix.size());
- }
-
- while (dbc->get(&kt, &dt, flags) != DB_NOTFOUND) {
- checkInterrupt();
- string data((char *) kt.get_data(), kt.get_size());
- if (!keyPrefix.empty() &&
- string(data, 0, keyPrefix.size()) != keyPrefix)
- break;
- keys.push_back(data);
- flags = DB_NEXT;
- }
-
- } catch (DbException e) { rethrow(e); }
-}
-
-
-void Database::clearTable(const Transaction & txn, TableId table)
-{
- try {
- Db * db = getDb(table);
- u_int32_t count;
- db->truncate(txn.txn, &count, 0);
- } catch (DbException e) { rethrow(e); }
-}
-
-
-}
-
-#endif
diff --git a/src/libstore/db.hh b/src/libstore/db.hh
deleted file mode 100644
index 8672fbc86..000000000
--- a/src/libstore/db.hh
+++ /dev/null
@@ -1,107 +0,0 @@
-#ifndef __DB_H
-#define __DB_H
-
-#include "types.hh"
-
-#include