summaryrefslogtreecommitdiff
path: root/src/db/db.c
diff options
context:
space:
mode:
authorLorry Tar Creator <lorry-tar-importer@baserock.org>2015-02-17 17:25:57 +0000
committer <>2015-03-17 16:26:24 +0000
commit780b92ada9afcf1d58085a83a0b9e6bc982203d1 (patch)
tree598f8b9fa431b228d29897e798de4ac0c1d3d970 /src/db/db.c
parent7a2660ba9cc2dc03a69ddfcfd95369395cc87444 (diff)
downloadberkeleydb-master.tar.gz
Imported from /home/lorry/working-area/delta_berkeleydb/db-6.1.23.tar.gz.HEADdb-6.1.23master
Diffstat (limited to 'src/db/db.c')
-rw-r--r--src/db/db.c46
1 files changed, 43 insertions, 3 deletions
diff --git a/src/db/db.c b/src/db/db.c
index 0d9d1e6e..ffeb6d2b 100644
--- a/src/db/db.c
+++ b/src/db/db.c
@@ -1,7 +1,7 @@
/*-
* See the file LICENSE for redistribution information.
*
- * Copyright (c) 1996, 2012 Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 1996, 2015 Oracle and/or its affiliates. All rights reserved.
*/
/*
* Copyright (c) 1990, 1993, 1994, 1995, 1996
@@ -41,6 +41,7 @@
#include "db_config.h"
#include "db_int.h"
+#include "dbinc_auto/sequence_ext.h"
#include "dbinc/db_page.h"
#include "dbinc/db_swap.h"
#include "dbinc/btree.h"
@@ -92,6 +93,9 @@ __db_master_open(subdbp, ip, txn, name, flags, mode, dbpp)
if ((ret = __db_create_internal(&dbp, subdbp->env, 0)) != 0)
return (ret);
+ /* Set the creation directory. */
+ dbp->dirname = subdbp->dirname;
+
/*
* It's always a btree.
* Run in the transaction we've created.
@@ -105,6 +109,20 @@ __db_master_open(subdbp, ip, txn, name, flags, mode, dbpp)
DB_AM_ENCRYPT | DB_AM_CHKSUM | DB_AM_NOT_DURABLE));
/*
+ * If creating the master database, disable blobs, but assign it a
+ * blob file id if blobs are enabled in the subdatabase. This means
+ * that subdatabses can only support blobs if the first subdatabse
+ * supports blobs. This is a temporary restriction, but is needed at
+ * the moment to prevent an infinite loop.
+ */
+ dbp->blob_threshold = 0;
+ if (LF_ISSET(DB_CREATE) && subdbp->blob_threshold != 0) {
+ if ((ret = __blob_generate_dir_ids(
+ dbp, txn, &dbp->blob_file_id)) != 0)
+ return (ret);
+ }
+
+ /*
* If there was a subdb specified, then we only want to apply
* DB_EXCL to the subdb, not the actual file. We only got here
* because there was a subdb specified.
@@ -819,6 +837,21 @@ __db_refresh(dbp, txn, flags, deferred_closep, reuse)
if (dbp->mpf == NULL)
LF_SET(DB_NOSYNC);
+#ifdef HAVE_64BIT_TYPES
+ /* Close the blob meta data databases. */
+ if (dbp->blob_seq != NULL) {
+ if ((t_ret = __seq_close(dbp->blob_seq, 0)) != 0 && ret == 0)
+ ret = t_ret;
+ dbp->blob_seq = NULL;
+ }
+ if (dbp->blob_meta_db != NULL) {
+ if ((t_ret = __db_close(
+ dbp->blob_meta_db, NULL, 0)) != 0 && ret == 0)
+ ret = t_ret;
+ dbp->blob_meta_db = NULL;
+ }
+#endif
+
/* If never opened, or not currently open, it's easy. */
if (!F_ISSET(dbp, DB_AM_OPEN_CALLED))
goto never_opened;
@@ -1164,6 +1197,10 @@ never_opened:
__os_free(dbp->env, dbp->dname);
dbp->dname = NULL;
}
+ if (dbp->blob_sub_dir != NULL) {
+ __os_free(dbp->env, dbp->blob_sub_dir);
+ dbp->blob_sub_dir = NULL;
+ }
/* Discard any memory used to store returned data. */
if (dbp->my_rskey.data != NULL)
@@ -1235,8 +1272,11 @@ __db_disassociate(sdbp)
sdbp->s_refcnt = 0;
while ((dbc = TAILQ_FIRST(&sdbp->free_queue)) != NULL)
- if ((t_ret = __dbc_destroy(dbc)) != 0 && ret == 0)
- ret = t_ret;
+ if ((t_ret = __dbc_destroy(dbc)) != 0) {
+ if (ret == 0)
+ ret = t_ret;
+ break;
+ }
F_CLR(sdbp, DB_AM_SECONDARY);
return (ret);