Commit 2cbf400b authored by unknown's avatar unknown

Merge mysql.com:/home/jimw/my/mysql-5.1-bdb

into  mysql.com:/home/jimw/my/mysql-5.1-clean

parents 7d01da59 39361ade
...@@ -133,137 +133,107 @@ autom4te.cache/* ...@@ -133,137 +133,107 @@ autom4te.cache/*
autom4te.cache/output.0 autom4te.cache/output.0
autom4te.cache/requests autom4te.cache/requests
autom4te.cache/traces.0 autom4te.cache/traces.0
bdb/*.ds? storage/bdb/*.ds?
bdb/*.vcproj storage/bdb/*.vcproj
bdb/README storage/bdb/README
bdb/btree/btree_auto.c storage/bdb/btree/btree_auto.c
bdb/build_unix/* storage/bdb/build_unix/*
bdb/build_vxworks/db.h storage/bdb/build_vxworks/db.h
bdb/build_vxworks/db_int.h storage/bdb/build_vxworks/db_int.h
bdb/build_win32/db.h storage/bdb/build_win32/db.h
bdb/build_win32/db_archive.dsp storage/bdb/build_win32/db_archive.dsp
bdb/build_win32/db_checkpoint.dsp storage/bdb/build_win32/db_checkpoint.dsp
bdb/build_win32/db_config.h storage/bdb/build_win32/db_config.h
bdb/build_win32/db_cxx.h storage/bdb/build_win32/db_cxx.h
bdb/build_win32/db_deadlock.dsp storage/bdb/build_win32/db_deadlock.dsp
bdb/build_win32/db_dll.dsp storage/bdb/build_win32/db_dll.dsp
bdb/build_win32/db_dump.dsp storage/bdb/build_win32/db_dump.dsp
bdb/build_win32/db_int.h storage/bdb/build_win32/db_int.h
bdb/build_win32/db_java.dsp storage/bdb/build_win32/db_java.dsp
bdb/build_win32/db_load.dsp storage/bdb/build_win32/db_load.dsp
bdb/build_win32/db_perf.dsp storage/bdb/build_win32/db_perf.dsp
bdb/build_win32/db_printlog.dsp storage/bdb/build_win32/db_printlog.dsp
bdb/build_win32/db_recover.dsp storage/bdb/build_win32/db_recover.dsp
bdb/build_win32/db_stat.dsp storage/bdb/build_win32/db_stat.dsp
bdb/build_win32/db_static.dsp storage/bdb/build_win32/db_static.dsp
bdb/build_win32/db_tcl.dsp storage/bdb/build_win32/db_tcl.dsp
bdb/build_win32/db_test.dsp storage/bdb/build_win32/db_test.dsp
bdb/build_win32/db_upgrade.dsp storage/bdb/build_win32/db_upgrade.dsp
bdb/build_win32/db_verify.dsp storage/bdb/build_win32/db_verify.dsp
bdb/build_win32/ex_access.dsp storage/bdb/build_win32/ex_access.dsp
bdb/build_win32/ex_btrec.dsp storage/bdb/build_win32/ex_btrec.dsp
bdb/build_win32/ex_env.dsp storage/bdb/build_win32/ex_env.dsp
bdb/build_win32/ex_lock.dsp storage/bdb/build_win32/ex_lock.dsp
bdb/build_win32/ex_mpool.dsp storage/bdb/build_win32/ex_mpool.dsp
bdb/build_win32/ex_tpcb.dsp storage/bdb/build_win32/ex_tpcb.dsp
bdb/build_win32/excxx_access.dsp storage/bdb/build_win32/excxx_access.dsp
bdb/build_win32/excxx_btrec.dsp storage/bdb/build_win32/excxx_btrec.dsp
bdb/build_win32/excxx_env.dsp storage/bdb/build_win32/excxx_env.dsp
bdb/build_win32/excxx_lock.dsp storage/bdb/build_win32/excxx_lock.dsp
bdb/build_win32/excxx_mpool.dsp storage/bdb/build_win32/excxx_mpool.dsp
bdb/build_win32/excxx_tpcb.dsp storage/bdb/build_win32/excxx_tpcb.dsp
bdb/build_win32/include.tcl storage/bdb/build_win32/include.tcl
bdb/build_win32/libdb.def storage/bdb/build_win32/libdb.def
bdb/build_win32/libdb.rc storage/bdb/build_win32/libdb.rc
bdb/db/crdel_auto.c storage/bdb/db/crdel_auto.c
bdb/db/db_auto.c storage/bdb/db/db_auto.c
bdb/dbinc_auto/*.* storage/bdb/dbinc_auto/*.*
bdb/dbreg/dbreg_auto.c storage/bdb/dbreg/dbreg_auto.c
bdb/dist/autom4te-2.53.cache/* storage/bdb/dist/autom4te-2.53.cache/*
bdb/dist/autom4te-2.53.cache/output.0 storage/bdb/dist/autom4te-2.53.cache/output.0
bdb/dist/autom4te-2.53.cache/requests storage/bdb/dist/autom4te-2.53.cache/requests
bdb/dist/autom4te-2.53.cache/traces.0 storage/bdb/dist/autom4te-2.53.cache/traces.0
bdb/dist/autom4te.cache/* storage/bdb/dist/autom4te.cache/*
bdb/dist/autom4te.cache/output.0 storage/bdb/dist/autom4te.cache/output.0
bdb/dist/autom4te.cache/requests storage/bdb/dist/autom4te.cache/requests
bdb/dist/autom4te.cache/traces.0 storage/bdb/dist/autom4te.cache/traces.0
bdb/dist/config.hin storage/bdb/dist/config.hin
bdb/dist/configure storage/bdb/dist/configure
bdb/dist/tags storage/bdb/dist/tags
bdb/dist/template/db_server_proc storage/bdb/dist/template/db_server_proc
bdb/dist/template/gen_client_ret storage/bdb/dist/template/gen_client_ret
bdb/dist/template/rec_btree storage/bdb/dist/template/rec_btree
bdb/dist/template/rec_crdel storage/bdb/dist/template/rec_crdel
bdb/dist/template/rec_db storage/bdb/dist/template/rec_db
bdb/dist/template/rec_dbreg storage/bdb/dist/template/rec_dbreg
bdb/dist/template/rec_fileops storage/bdb/dist/template/rec_fileops
bdb/dist/template/rec_hash storage/bdb/dist/template/rec_hash
bdb/dist/template/rec_log storage/bdb/dist/template/rec_log
bdb/dist/template/rec_qam storage/bdb/dist/template/rec_qam
bdb/dist/template/rec_txn storage/bdb/dist/template/rec_txn
bdb/examples_c/ex_apprec/ex_apprec_auto.c storage/bdb/fileops/fileops_auto.c
bdb/examples_c/ex_apprec/ex_apprec_auto.h storage/bdb/hash/hash_auto.c
bdb/examples_c/ex_apprec/ex_apprec_template storage/bdb/include/btree_auto.h
bdb/examples_java storage/bdb/include/btree_ext.h
bdb/fileops/fileops_auto.c storage/bdb/include/clib_ext.h
bdb/hash/hash_auto.c storage/bdb/include/common_ext.h
bdb/include/btree_auto.h storage/bdb/include/crdel_auto.h
bdb/include/btree_ext.h storage/bdb/include/db_auto.h
bdb/include/clib_ext.h storage/bdb/include/db_ext.h
bdb/include/common_ext.h storage/bdb/include/db_server.h
bdb/include/crdel_auto.h storage/bdb/include/env_ext.h
bdb/include/db_auto.h storage/bdb/include/gen_client_ext.h
bdb/include/db_ext.h storage/bdb/include/gen_server_ext.h
bdb/include/db_server.h storage/bdb/include/hash_auto.h
bdb/include/env_ext.h storage/bdb/include/hash_ext.h
bdb/include/gen_client_ext.h storage/bdb/include/lock_ext.h
bdb/include/gen_server_ext.h storage/bdb/include/log_auto.h
bdb/include/hash_auto.h storage/bdb/include/log_ext.h
bdb/include/hash_ext.h storage/bdb/include/mp_ext.h
bdb/include/lock_ext.h storage/bdb/include/mutex_ext.h
bdb/include/log_auto.h storage/bdb/include/os_ext.h
bdb/include/log_ext.h storage/bdb/include/qam_auto.h
bdb/include/mp_ext.h storage/bdb/include/qam_ext.h
bdb/include/mutex_ext.h storage/bdb/include/rpc_client_ext.h
bdb/include/os_ext.h storage/bdb/include/rpc_server_ext.h
bdb/include/qam_auto.h storage/bdb/include/tcl_ext.h
bdb/include/qam_ext.h storage/bdb/include/txn_auto.h
bdb/include/rpc_client_ext.h storage/bdb/include/txn_ext.h
bdb/include/rpc_server_ext.h storage/bdb/include/xa_ext.h
bdb/include/tcl_ext.h storage/bdb/log/log_auto.c
bdb/include/txn_auto.h storage/bdb/qam/qam_auto.c
bdb/include/txn_ext.h storage/bdb/txn/txn_auto.c
bdb/include/xa_ext.h storage/bdb/txn/txn_autop.c
bdb/java/src/com/sleepycat/db/Db.java
bdb/java/src/com/sleepycat/db/DbBtreeStat.java
bdb/java/src/com/sleepycat/db/DbConstants.java
bdb/java/src/com/sleepycat/db/DbHashStat.java
bdb/java/src/com/sleepycat/db/DbLockStat.java
bdb/java/src/com/sleepycat/db/DbLogStat.java
bdb/java/src/com/sleepycat/db/DbMpoolFStat.java
bdb/java/src/com/sleepycat/db/DbQueueStat.java
bdb/java/src/com/sleepycat/db/DbRepStat.java
bdb/java/src/com/sleepycat/db/DbTxnStat.java
bdb/libdb_java/java_stat_auto.c
bdb/libdb_java/java_stat_auto.h
bdb/log/log_auto.c
bdb/qam/qam_auto.c
bdb/rpc_client/db_server_clnt.c
bdb/rpc_client/gen_client.c
bdb/rpc_server/c/db_server_proc.c
bdb/rpc_server/c/db_server_proc.sed
bdb/rpc_server/c/db_server_svc.c
bdb/rpc_server/c/db_server_xdr.c
bdb/rpc_server/c/gen_db_server.c
bdb/rpc_server/db_server.x
bdb/rpc_server/db_server_proc.sed
bdb/rpc_server/db_server_svc.c
bdb/rpc_server/db_server_xdr.c
bdb/rpc_server/gen_db_server.c
bdb/test/TESTS
bdb/test/include.tcl
bdb/test/logtrack.list
bdb/txn/txn_auto.c
binary/* binary/*
bkpull.log bkpull.log
bkpull.log* bkpull.log*
......
This diff is collapsed.
/*- /*-
* $Id: LICENSE,v 11.12 2004/03/30 20:49:44 bostic Exp $ * $Id: LICENSE,v 12.1 2005/06/16 20:20:10 bostic Exp $
*/ */
The following is the license that applies to this copy of the Berkeley DB The following is the license that applies to this copy of the Berkeley DB
...@@ -10,7 +10,7 @@ the Web at http://www.sleepycat.com. ...@@ -10,7 +10,7 @@ the Web at http://www.sleepycat.com.
=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
/* /*
* Copyright (c) 1990-2004 * Copyright (c) 1990-2005
* Sleepycat Software. All rights reserved. * Sleepycat Software. All rights reserved.
* *
* Redistribution and use in source and binary forms, with or without * Redistribution and use in source and binary forms, with or without
......
...@@ -24,13 +24,12 @@ top_srcdir = @top_srcdir@ ...@@ -24,13 +24,12 @@ top_srcdir = @top_srcdir@
bdb_build = build_unix bdb_build = build_unix
files = LICENSE Makefile Makefile.in README files = LICENSE Makefile Makefile.in README
subdirs = btree build_vxworks build_win32 clib common cxx db dbinc \ subdirs = btree build_win32 clib common cxx db dbinc \
dbinc_auto db185 db_archive db_checkpoint db_deadlock db_dump \ dbinc_auto db185 db_archive db_checkpoint db_deadlock db_dump \
db_dump185 db_load db_printlog db_recover db_stat db_upgrade \ db_dump185 db_hotbackup db_load db_printlog db_recover db_stat db_upgrade \
db_verify dbm dbreg dist env examples_c examples_cxx fileops hash \ db_verify dbm dbreg dist env fileops hash \
hsearch hmac include java libdb_java lock log mp mutex os os_vxworks \ hsearch hmac include lock log mp mutex os \
os_win32 perl.BerkeleyDB perl.DB_File qam rep rpc_client rpc_server tcl \ os_win32 qam rep txn xa sequence
test txn xa sequence
@SET_MAKE@ @SET_MAKE@
......
This diff is collapsed.
/*- /*-
* See the file LICENSE for redistribution information. * See the file LICENSE for redistribution information.
* *
* Copyright (c) 1996-2004 * Copyright (c) 1996-2005
* Sleepycat Software. All rights reserved. * Sleepycat Software. All rights reserved.
*/ */
/* /*
...@@ -39,7 +39,7 @@ ...@@ -39,7 +39,7 @@
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
* SUCH DAMAGE. * SUCH DAMAGE.
* *
* $Id: bt_compare.c,v 11.20 2004/02/21 15:54:44 bostic Exp $ * $Id: bt_compare.c,v 12.1 2005/06/16 20:20:13 bostic Exp $
*/ */
#include "db_config.h" #include "db_config.h"
......
/*- /*-
* See the file LICENSE for redistribution information. * See the file LICENSE for redistribution information.
* *
* Copyright (c) 1996-2004 * Copyright (c) 1996-2005
* Sleepycat Software. All rights reserved. * Sleepycat Software. All rights reserved.
* *
* $Id: bt_conv.c,v 11.15 2004/01/28 03:35:48 bostic Exp $ * $Id: bt_conv.c,v 12.2 2005/06/16 20:20:13 bostic Exp $
*/ */
#include "db_config.h" #include "db_config.h"
...@@ -88,7 +88,7 @@ __bam_mswap(pg) ...@@ -88,7 +88,7 @@ __bam_mswap(pg)
p = (u_int8_t *)pg + sizeof(DBMETA); p = (u_int8_t *)pg + sizeof(DBMETA);
SWAP32(p); /* maxkey */ p += sizeof(u_int32_t); /* unused */
SWAP32(p); /* minkey */ SWAP32(p); /* minkey */
SWAP32(p); /* re_len */ SWAP32(p); /* re_len */
SWAP32(p); /* re_pad */ SWAP32(p); /* re_pad */
......
This diff is collapsed.
This diff is collapsed.
/*- /*-
* See the file LICENSE for redistribution information. * See the file LICENSE for redistribution information.
* *
* Copyright (c) 1996-2004 * Copyright (c) 1996-2005
* Sleepycat Software. All rights reserved. * Sleepycat Software. All rights reserved.
*/ */
/* /*
...@@ -39,7 +39,7 @@ ...@@ -39,7 +39,7 @@
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
* SUCH DAMAGE. * SUCH DAMAGE.
* *
* $Id: bt_delete.c,v 11.49 2004/02/27 12:38:28 bostic Exp $ * $Id: bt_delete.c,v 12.13 2005/10/20 18:14:59 bostic Exp $
*/ */
#include "db_config.h" #include "db_config.h"
...@@ -220,12 +220,13 @@ __bam_adjindx(dbc, h, indx, indx_copy, is_insert) ...@@ -220,12 +220,13 @@ __bam_adjindx(dbc, h, indx, indx_copy, is_insert)
* __bam_dpages -- * __bam_dpages --
* Delete a set of locked pages. * Delete a set of locked pages.
* *
* PUBLIC: int __bam_dpages __P((DBC *, EPG *)); * PUBLIC: int __bam_dpages __P((DBC *, int, int));
*/ */
int int
__bam_dpages(dbc, stack_epg) __bam_dpages(dbc, use_top, update)
DBC *dbc; DBC *dbc;
EPG *stack_epg; int use_top;
int update;
{ {
BTREE_CURSOR *cp; BTREE_CURSOR *cp;
BINTERNAL *bi; BINTERNAL *bi;
...@@ -233,7 +234,7 @@ __bam_dpages(dbc, stack_epg) ...@@ -233,7 +234,7 @@ __bam_dpages(dbc, stack_epg)
DBT a, b; DBT a, b;
DB_LOCK c_lock, p_lock; DB_LOCK c_lock, p_lock;
DB_MPOOLFILE *mpf; DB_MPOOLFILE *mpf;
EPG *epg; EPG *epg, *save_sp, *stack_epg;
PAGE *child, *parent; PAGE *child, *parent;
db_indx_t nitems; db_indx_t nitems;
db_pgno_t pgno, root_pgno; db_pgno_t pgno, root_pgno;
...@@ -243,30 +244,27 @@ __bam_dpages(dbc, stack_epg) ...@@ -243,30 +244,27 @@ __bam_dpages(dbc, stack_epg)
dbp = dbc->dbp; dbp = dbc->dbp;
mpf = dbp->mpf; mpf = dbp->mpf;
cp = (BTREE_CURSOR *)dbc->internal; cp = (BTREE_CURSOR *)dbc->internal;
nitems = 0;
pgno = PGNO_INVALID;
/* /*
* We have the entire stack of deletable pages locked. * We have the entire stack of deletable pages locked.
* *
* Btree calls us with a pointer to the beginning of a stack, where * Btree calls us with the first page in the stack is to have a
* the first page in the stack is to have a single item deleted, and * single item deleted, and the rest of the pages are to be removed.
* the rest of the pages are to be removed.
*
* Recno calls us with a pointer into the middle of the stack, where
* the referenced page is to have a single item deleted, and pages
* after the stack reference are to be removed.
* *
* First, discard any pages that we don't care about. * Recno always has a stack to the root and __bam_merge operations
* may have unneeded items in the sack. We find the lowest page
* in the stack that has more than one record in it and start there.
*/ */
ret = 0; ret = 0;
for (epg = cp->sp; epg < stack_epg; ++epg) { if (use_top)
if ((t_ret = __memp_fput(mpf, epg->page, 0)) != 0 && ret == 0) stack_epg = cp->sp;
ret = t_ret; else
if ((t_ret = __TLPUT(dbc, epg->lock)) != 0 && ret == 0) for (stack_epg = cp->csp; stack_epg > cp->sp; --stack_epg)
ret = t_ret; if (NUM_ENT(stack_epg->page) > 1)
} break;
if (ret != 0) epg = stack_epg;
goto err;
/* /*
* !!! * !!!
* There is an interesting deadlock situation here. We have to relink * There is an interesting deadlock situation here. We have to relink
...@@ -276,8 +274,9 @@ __bam_dpages(dbc, stack_epg) ...@@ -276,8 +274,9 @@ __bam_dpages(dbc, stack_epg)
* It will deadlock here. Before we unlink the subtree, we relink the * It will deadlock here. Before we unlink the subtree, we relink the
* leaf page chain. * leaf page chain.
*/ */
if ((ret = __bam_relink(dbc, cp->csp->page, NULL)) != 0) if (LEVEL(cp->csp->page) == 1 &&
goto err; (ret = __bam_relink(dbc, cp->csp->page, PGNO_INVALID)) != 0)
goto discard;
/* /*
* Delete the last item that references the underlying pages that are * Delete the last item that references the underlying pages that are
...@@ -288,9 +287,18 @@ __bam_dpages(dbc, stack_epg) ...@@ -288,9 +287,18 @@ __bam_dpages(dbc, stack_epg)
* immediately. * immediately.
*/ */
if ((ret = __bam_ditem(dbc, epg->page, epg->indx)) != 0) if ((ret = __bam_ditem(dbc, epg->page, epg->indx)) != 0)
goto err; goto discard;
if ((ret = __bam_ca_di(dbc, PGNO(epg->page), epg->indx, -1)) != 0) if ((ret = __bam_ca_di(dbc, PGNO(epg->page), epg->indx, -1)) != 0)
goto err; goto discard;
if (update && epg->indx == 0) {
save_sp = cp->csp;
cp->csp = epg;
ret = __bam_pupdate(dbc, epg->page);
cp->csp = save_sp;
if (ret != 0)
goto discard;
}
pgno = PGNO(epg->page); pgno = PGNO(epg->page);
nitems = NUM_ENT(epg->page); nitems = NUM_ENT(epg->page);
...@@ -301,6 +309,17 @@ __bam_dpages(dbc, stack_epg) ...@@ -301,6 +309,17 @@ __bam_dpages(dbc, stack_epg)
if (ret != 0) if (ret != 0)
goto err_inc; goto err_inc;
/* Then, discard any pages that we don't care about. */
discard: for (epg = cp->sp; epg < stack_epg; ++epg) {
if ((t_ret = __memp_fput(mpf, epg->page, 0)) != 0 && ret == 0)
ret = t_ret;
epg->page = NULL;
if ((t_ret = __TLPUT(dbc, epg->lock)) != 0 && ret == 0)
ret = t_ret;
}
if (ret != 0)
goto err;
/* Free the rest of the pages in the stack. */ /* Free the rest of the pages in the stack. */
while (++epg <= cp->csp) { while (++epg <= cp->csp) {
/* /*
...@@ -310,13 +329,24 @@ __bam_dpages(dbc, stack_epg) ...@@ -310,13 +329,24 @@ __bam_dpages(dbc, stack_epg)
* be referenced by a cursor. * be referenced by a cursor.
*/ */
if (NUM_ENT(epg->page) != 0) { if (NUM_ENT(epg->page) != 0) {
DB_ASSERT(NUM_ENT(epg->page) == 1); DB_ASSERT(LEVEL(epg->page) != 1);
if ((ret = __bam_ditem(dbc, epg->page, epg->indx)) != 0) if ((ret = __bam_ditem(dbc, epg->page, epg->indx)) != 0)
goto err; goto err;
/*
* Sheer paranoia: if we find any pages that aren't
* emptied by the delete, someone else added an item
* while we were walking the tree, and we discontinue
* the delete. Shouldn't be possible, but we check
* regardless.
*/
if (NUM_ENT(epg->page) != 0)
goto err;
} }
ret = __db_free(dbc, epg->page); ret = __db_free(dbc, epg->page);
if (cp->page == epg->page)
cp->page = NULL;
epg->page = NULL; epg->page = NULL;
if ((t_ret = __TLPUT(dbc, epg->lock)) != 0 && ret == 0) if ((t_ret = __TLPUT(dbc, epg->lock)) != 0 && ret == 0)
ret = t_ret; ret = t_ret;
...@@ -468,12 +498,13 @@ stop: done = 1; ...@@ -468,12 +498,13 @@ stop: done = 1;
* __bam_relink -- * __bam_relink --
* Relink around a deleted page. * Relink around a deleted page.
* *
* PUBLIC: int __bam_relink __P((DBC *, PAGE *, PAGE **)); * PUBLIC: int __bam_relink __P((DBC *, PAGE *, db_pgno_t));
*/ */
int int
__bam_relink(dbc, pagep, new_next) __bam_relink(dbc, pagep, new_pgno)
DBC *dbc; DBC *dbc;
PAGE *pagep, **new_next; PAGE *pagep;
db_pgno_t new_pgno;
{ {
DB *dbp; DB *dbp;
PAGE *np, *pp; PAGE *np, *pp;
...@@ -519,7 +550,7 @@ __bam_relink(dbc, pagep, new_next) ...@@ -519,7 +550,7 @@ __bam_relink(dbc, pagep, new_next)
/* Log the change. */ /* Log the change. */
if (DBC_LOGGING(dbc)) { if (DBC_LOGGING(dbc)) {
if ((ret = __bam_relink_log(dbp, dbc->txn, &ret_lsn, 0, if ((ret = __bam_relink_log(dbp, dbc->txn, &ret_lsn, 0,
pagep->pgno, &pagep->lsn, pagep->prev_pgno, plsnp, pagep->pgno, new_pgno, pagep->prev_pgno, plsnp,
pagep->next_pgno, nlsnp)) != 0) pagep->next_pgno, nlsnp)) != 0)
goto err; goto err;
} else } else
...@@ -528,33 +559,27 @@ __bam_relink(dbc, pagep, new_next) ...@@ -528,33 +559,27 @@ __bam_relink(dbc, pagep, new_next)
np->lsn = ret_lsn; np->lsn = ret_lsn;
if (pp != NULL) if (pp != NULL)
pp->lsn = ret_lsn; pp->lsn = ret_lsn;
pagep->lsn = ret_lsn;
/* /*
* Modify and release the two pages. * Modify and release the two pages.
*
* !!!
* The parameter new_next gets set to the page following the page we
* are removing. If there is no following page, then new_next gets
* set to NULL.
*/ */
if (np != NULL) { if (np != NULL) {
np->prev_pgno = pagep->prev_pgno; if (new_pgno == PGNO_INVALID)
if (new_next == NULL) np->prev_pgno = pagep->prev_pgno;
ret = __memp_fput(mpf, np, DB_MPOOL_DIRTY); else
else { np->prev_pgno = new_pgno;
*new_next = np; ret = __memp_fput(mpf, np, DB_MPOOL_DIRTY);
ret = __memp_fset(mpf, np, DB_MPOOL_DIRTY);
}
if ((t_ret = __TLPUT(dbc, npl)) != 0 && ret == 0) if ((t_ret = __TLPUT(dbc, npl)) != 0 && ret == 0)
ret = t_ret; ret = t_ret;
if (ret != 0) if (ret != 0)
goto err; goto err;
} else if (new_next != NULL) }
*new_next = NULL;
if (pp != NULL) { if (pp != NULL) {
pp->next_pgno = pagep->next_pgno; if (new_pgno == PGNO_INVALID)
pp->next_pgno = pagep->next_pgno;
else
pp->next_pgno = new_pgno;
ret = __memp_fput(mpf, pp, DB_MPOOL_DIRTY); ret = __memp_fput(mpf, pp, DB_MPOOL_DIRTY);
if ((t_ret = __TLPUT(dbc, ppl)) != 0 && ret == 0) if ((t_ret = __TLPUT(dbc, ppl)) != 0 && ret == 0)
ret = t_ret; ret = t_ret;
...@@ -571,3 +596,48 @@ err: if (np != NULL) ...@@ -571,3 +596,48 @@ err: if (np != NULL)
(void)__TLPUT(dbc, ppl); (void)__TLPUT(dbc, ppl);
return (ret); return (ret);
} }
/*
* __bam_pupdate --
* Update parent key pointers up the tree.
*
* PUBLIC: int __bam_pupdate __P((DBC *, PAGE *));
*/
int
__bam_pupdate(dbc, lpg)
DBC *dbc;
PAGE *lpg;
{
BTREE_CURSOR *cp;
DB_ENV *dbenv;
EPG *epg;
int ret;
dbenv = dbc->dbp->dbenv;
cp = (BTREE_CURSOR *)dbc->internal;
ret = 0;
/*
* Update the parents up the tree. __bam_pinsert only looks at the
* left child if is a leaf page, so we don't need to change it. We
* just do a delete and insert; a replace is possible but reusing
* pinsert is better.
*/
for (epg = &cp->csp[-1]; epg >= cp->sp; epg--) {
if ((ret = __bam_ditem(dbc, epg->page, epg->indx)) != 0)
return (ret);
epg->indx--;
if ((ret = __bam_pinsert(dbc, epg,
lpg, epg[1].page, BPI_NORECNUM)) != 0) {
if (ret == DB_NEEDSPLIT) {
/* This should not happen. */
__db_err(dbenv,
"Not enough room in parent: %s: page %lu",
dbc->dbp->fname, (u_long)PGNO(epg->page));
ret = __db_panic(dbenv, EINVAL);
}
return (ret);
}
}
return (ret);
}
/*- /*-
* See the file LICENSE for redistribution information. * See the file LICENSE for redistribution information.
* *
* Copyright (c) 1999-2004 * Copyright (c) 1999-2005
* Sleepycat Software. All rights reserved. * Sleepycat Software. All rights reserved.
* *
* $Id: bt_method.c,v 11.38 2004/09/22 03:31:26 bostic Exp $ * $Id: bt_method.c,v 12.2 2005/06/16 20:20:16 bostic Exp $
*/ */
#include "db_config.h" #include "db_config.h"
...@@ -18,7 +18,6 @@ ...@@ -18,7 +18,6 @@
#include "dbinc/btree.h" #include "dbinc/btree.h"
#include "dbinc/qam.h" #include "dbinc/qam.h"
static int __bam_set_bt_maxkey __P((DB *, u_int32_t));
static int __bam_set_bt_minkey __P((DB *, u_int32_t)); static int __bam_set_bt_minkey __P((DB *, u_int32_t));
static int __bam_set_bt_prefix static int __bam_set_bt_prefix
__P((DB *, size_t(*)(DB *, const DBT *, const DBT *))); __P((DB *, size_t(*)(DB *, const DBT *, const DBT *)));
...@@ -52,7 +51,6 @@ __bam_db_create(dbp) ...@@ -52,7 +51,6 @@ __bam_db_create(dbp)
t->bt_prefix = __bam_defpfx; t->bt_prefix = __bam_defpfx;
dbp->set_bt_compare = __bam_set_bt_compare; dbp->set_bt_compare = __bam_set_bt_compare;
dbp->set_bt_maxkey = __bam_set_bt_maxkey;
dbp->get_bt_minkey = __bam_get_bt_minkey; dbp->get_bt_minkey = __bam_get_bt_minkey;
dbp->set_bt_minkey = __bam_set_bt_minkey; dbp->set_bt_minkey = __bam_set_bt_minkey;
dbp->set_bt_prefix = __bam_set_bt_prefix; dbp->set_bt_prefix = __bam_set_bt_prefix;
...@@ -208,31 +206,6 @@ __bam_set_bt_compare(dbp, func) ...@@ -208,31 +206,6 @@ __bam_set_bt_compare(dbp, func)
return (0); return (0);
} }
/*
* __bam_set_bt_maxkey --
* Set the maximum keys per page.
*/
static int
__bam_set_bt_maxkey(dbp, bt_maxkey)
DB *dbp;
u_int32_t bt_maxkey;
{
BTREE *t;
DB_ILLEGAL_AFTER_OPEN(dbp, "DB->set_bt_maxkey");
DB_ILLEGAL_METHOD(dbp, DB_OK_BTREE);
t = dbp->bt_internal;
if (bt_maxkey < 1) {
__db_err(dbp->dbenv, "minimum bt_maxkey value is 1");
return (EINVAL);
}
t->bt_maxkey = bt_maxkey;
return (0);
}
/* /*
* __db_get_bt_minkey -- * __db_get_bt_minkey --
* Get the minimum keys per page. * Get the minimum keys per page.
......
/*- /*-
* See the file LICENSE for redistribution information. * See the file LICENSE for redistribution information.
* *
* Copyright (c) 1996-2004 * Copyright (c) 1996-2005
* Sleepycat Software. All rights reserved. * Sleepycat Software. All rights reserved.
*/ */
/* /*
...@@ -39,7 +39,7 @@ ...@@ -39,7 +39,7 @@
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
* SUCH DAMAGE. * SUCH DAMAGE.
* *
* $Id: bt_open.c,v 11.92 2004/04/29 14:39:47 ubell Exp $ * $Id: bt_open.c,v 12.5 2005/09/28 17:44:17 margo Exp $
*/ */
#include "db_config.h" #include "db_config.h"
...@@ -311,7 +311,6 @@ __bam_read_root(dbp, txn, base_pgno, flags) ...@@ -311,7 +311,6 @@ __bam_read_root(dbp, txn, base_pgno, flags)
* metadata page will be created/initialized elsewhere. * metadata page will be created/initialized elsewhere.
*/ */
if (meta->dbmeta.magic == DB_BTREEMAGIC) { if (meta->dbmeta.magic == DB_BTREEMAGIC) {
t->bt_maxkey = meta->maxkey;
t->bt_minkey = meta->minkey; t->bt_minkey = meta->minkey;
t->re_pad = (int)meta->re_pad; t->re_pad = (int)meta->re_pad;
t->re_len = meta->re_len; t->re_len = meta->re_len;
...@@ -395,7 +394,6 @@ __bam_init_meta(dbp, meta, pgno, lsnp) ...@@ -395,7 +394,6 @@ __bam_init_meta(dbp, meta, pgno, lsnp)
memcpy(meta->dbmeta.uid, dbp->fileid, DB_FILE_ID_LEN); memcpy(meta->dbmeta.uid, dbp->fileid, DB_FILE_ID_LEN);
t = dbp->bt_internal; t = dbp->bt_internal;
meta->maxkey = t->bt_maxkey;
meta->minkey = t->bt_minkey; meta->minkey = t->bt_minkey;
meta->re_len = t->re_len; meta->re_len = t->re_len;
meta->re_pad = (u_int32_t)t->re_pad; meta->re_pad = (u_int32_t)t->re_pad;
...@@ -428,7 +426,7 @@ __bam_new_file(dbp, txn, fhp, name) ...@@ -428,7 +426,7 @@ __bam_new_file(dbp, txn, fhp, name)
DBT pdbt; DBT pdbt;
PAGE *root; PAGE *root;
db_pgno_t pgno; db_pgno_t pgno;
int ret; int ret, t_ret;
void *buf; void *buf;
dbenv = dbp->dbenv; dbenv = dbp->dbenv;
...@@ -437,7 +435,7 @@ __bam_new_file(dbp, txn, fhp, name) ...@@ -437,7 +435,7 @@ __bam_new_file(dbp, txn, fhp, name)
meta = NULL; meta = NULL;
buf = NULL; buf = NULL;
if (name == NULL) { if (F_ISSET(dbp, DB_AM_INMEM)) {
/* Build the meta-data page. */ /* Build the meta-data page. */
pgno = PGNO_BASE_MD; pgno = PGNO_BASE_MD;
if ((ret = if ((ret =
...@@ -447,6 +445,9 @@ __bam_new_file(dbp, txn, fhp, name) ...@@ -447,6 +445,9 @@ __bam_new_file(dbp, txn, fhp, name)
__bam_init_meta(dbp, meta, PGNO_BASE_MD, &lsn); __bam_init_meta(dbp, meta, PGNO_BASE_MD, &lsn);
meta->root = 1; meta->root = 1;
meta->dbmeta.last_pgno = 1; meta->dbmeta.last_pgno = 1;
if ((ret =
__db_log_page(dbp, txn, &lsn, pgno, (PAGE *)meta)) != 0)
goto err;
ret = __memp_fput(mpf, meta, DB_MPOOL_DIRTY); ret = __memp_fput(mpf, meta, DB_MPOOL_DIRTY);
meta = NULL; meta = NULL;
if (ret != 0) if (ret != 0)
...@@ -460,6 +461,9 @@ __bam_new_file(dbp, txn, fhp, name) ...@@ -460,6 +461,9 @@ __bam_new_file(dbp, txn, fhp, name)
P_INIT(root, dbp->pgsize, 1, PGNO_INVALID, PGNO_INVALID, P_INIT(root, dbp->pgsize, 1, PGNO_INVALID, PGNO_INVALID,
LEAFLEVEL, dbp->type == DB_RECNO ? P_LRECNO : P_LBTREE); LEAFLEVEL, dbp->type == DB_RECNO ? P_LRECNO : P_LBTREE);
LSN_NOT_LOGGED(root->lsn); LSN_NOT_LOGGED(root->lsn);
if ((ret =
__db_log_page(dbp, txn, &root->lsn, pgno, root)) != 0)
goto err;
ret = __memp_fput(mpf, root, DB_MPOOL_DIRTY); ret = __memp_fput(mpf, root, DB_MPOOL_DIRTY);
root = NULL; root = NULL;
if (ret != 0) if (ret != 0)
...@@ -509,10 +513,12 @@ __bam_new_file(dbp, txn, fhp, name) ...@@ -509,10 +513,12 @@ __bam_new_file(dbp, txn, fhp, name)
err: if (buf != NULL) err: if (buf != NULL)
__os_free(dbenv, buf); __os_free(dbenv, buf);
else { else {
if (meta != NULL) if (meta != NULL &&
(void)__memp_fput(mpf, meta, 0); (t_ret = __memp_fput(mpf, meta, 0)) != 0 && ret == 0)
if (root != NULL) ret = t_ret;
(void)__memp_fput(mpf, root, 0); if (root != NULL &&
(t_ret = __memp_fput(mpf, root, 0)) != 0 && ret == 0)
ret = t_ret;
} }
return (ret); return (ret);
} }
......
/*- /*-
* See the file LICENSE for redistribution information. * See the file LICENSE for redistribution information.
* *
* Copyright (c) 1996-2004 * Copyright (c) 1996-2005
* Sleepycat Software. All rights reserved. * Sleepycat Software. All rights reserved.
*/ */
/* /*
...@@ -39,7 +39,7 @@ ...@@ -39,7 +39,7 @@
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
* SUCH DAMAGE. * SUCH DAMAGE.
* *
* $Id: bt_put.c,v 11.80 2004/10/29 17:33:25 ubell Exp $ * $Id: bt_put.c,v 12.10 2005/10/20 18:57:00 bostic Exp $
*/ */
#include "db_config.h" #include "db_config.h"
...@@ -58,7 +58,9 @@ ...@@ -58,7 +58,9 @@
static int __bam_build static int __bam_build
__P((DBC *, u_int32_t, DBT *, PAGE *, u_int32_t, u_int32_t)); __P((DBC *, u_int32_t, DBT *, PAGE *, u_int32_t, u_int32_t));
static int __bam_dup_convert __P((DBC *, PAGE *, u_int32_t)); static int __bam_dup_check __P((DBC *, u_int32_t,
PAGE *, u_int32_t, u_int32_t, db_indx_t *));
static int __bam_dup_convert __P((DBC *, PAGE *, u_int32_t, u_int32_t));
static int __bam_ovput static int __bam_ovput
__P((DBC *, u_int32_t, db_pgno_t, PAGE *, u_int32_t, DBT *)); __P((DBC *, u_int32_t, db_pgno_t, PAGE *, u_int32_t, DBT *));
static u_int32_t static u_int32_t
...@@ -84,11 +86,12 @@ __bam_iitem(dbc, key, data, op, flags) ...@@ -84,11 +86,12 @@ __bam_iitem(dbc, key, data, op, flags)
DBT bk_hdr, tdbt; DBT bk_hdr, tdbt;
DB_MPOOLFILE *mpf; DB_MPOOLFILE *mpf;
PAGE *h; PAGE *h;
db_indx_t indx; db_indx_t cnt, indx;
u_int32_t data_size, have_bytes, need_bytes, needed; u_int32_t data_size, have_bytes, need_bytes, needed, pages, pagespace;
int cmp, bigkey, bigdata, dupadjust, padrec, replace, ret, was_deleted; int cmp, bigkey, bigdata, dupadjust, padrec, replace, ret, was_deleted;
COMPQUIET(bk, NULL); COMPQUIET(bk, NULL);
COMPQUIET(cnt, 0);
dbp = dbc->dbp; dbp = dbc->dbp;
dbenv = dbp->dbenv; dbenv = dbp->dbenv;
...@@ -217,13 +220,39 @@ __bam_iitem(dbc, key, data, op, flags) ...@@ -217,13 +220,39 @@ __bam_iitem(dbc, key, data, op, flags)
return (__db_unknown_flag(dbenv, "DB->put", op)); return (__db_unknown_flag(dbenv, "DB->put", op));
} }
/* /* Split the page if there's not enough room. */
* If there's not enough room, or the user has put a ceiling on the
* number of keys permitted in the page, split the page.
*/
if (P_FREESPACE(dbp, h) < needed) if (P_FREESPACE(dbp, h) < needed)
return (DB_NEEDSPLIT); return (DB_NEEDSPLIT);
/*
* Check to see if we will convert to off page duplicates -- if
* so, we'll need a page.
*/
if (F_ISSET(dbp, DB_AM_DUP) &&
TYPE(h) == P_LBTREE && op != DB_KEYFIRST &&
P_FREESPACE(dbp, h) - needed <= dbp->pgsize / 2 &&
__bam_dup_check(dbc, op, h, indx, needed, &cnt)) {
pages = 1;
dupadjust = 1;
} else
pages = 0;
/*
* If we are not using transactions and there is a page limit
* set on the file, then figure out if things will fit before
* taking action.
*/
if (dbc->txn == NULL && dbp->mpf->mfp->maxpgno != 0) {
pagespace = P_MAXSPACE(dbp, dbp->pgsize);
if (bigdata)
pages += ((data_size - 1) / pagespace) + 1;
if (bigkey)
pages += ((key->size - 1) / pagespace) + 1;
if (pages > (dbp->mpf->mfp->maxpgno - dbp->mpf->mfp->last_pgno))
return (__db_space_err(dbp));
}
/* /*
* The code breaks it up into five cases: * The code breaks it up into five cases:
* *
...@@ -259,7 +288,6 @@ __bam_iitem(dbc, key, data, op, flags) ...@@ -259,7 +288,6 @@ __bam_iitem(dbc, key, data, op, flags)
return (ret); return (ret);
indx += 3; indx += 3;
dupadjust = 1;
cp->indx += 2; cp->indx += 2;
} else { } else {
...@@ -276,7 +304,6 @@ __bam_iitem(dbc, key, data, op, flags) ...@@ -276,7 +304,6 @@ __bam_iitem(dbc, key, data, op, flags)
return (ret); return (ret);
++indx; ++indx;
dupadjust = 1;
} }
break; break;
case DB_CURRENT: case DB_CURRENT:
...@@ -287,11 +314,11 @@ __bam_iitem(dbc, key, data, op, flags) ...@@ -287,11 +314,11 @@ __bam_iitem(dbc, key, data, op, flags)
* will try and remove the item because the cursor's delete * will try and remove the item because the cursor's delete
* flag is set. * flag is set.
*/ */
(void)__bam_ca_delete(dbp, PGNO(h), indx, 0); if ((ret = __bam_ca_delete(dbp, PGNO(h), indx, 0, NULL)) != 0)
return (ret);
if (TYPE(h) == P_LBTREE) { if (TYPE(h) == P_LBTREE) {
++indx; ++indx;
dupadjust = 1;
} }
/* /*
...@@ -380,10 +407,9 @@ __bam_iitem(dbc, key, data, op, flags) ...@@ -380,10 +407,9 @@ __bam_iitem(dbc, key, data, op, flags)
* up at least 25% of the space on the page. If it does, move it onto * up at least 25% of the space on the page. If it does, move it onto
* its own page. * its own page.
*/ */
if (dupadjust && P_FREESPACE(dbp, h) <= dbp->pgsize / 2) { if (dupadjust &&
if ((ret = __bam_dup_convert(dbc, h, indx - O_INDX)) != 0) (ret = __bam_dup_convert(dbc, h, indx - O_INDX, cnt)) != 0)
return (ret); return (ret);
}
/* If we've modified a recno file, set the flag. */ /* If we've modified a recno file, set the flag. */
if (dbc->dbtype == DB_RECNO) if (dbc->dbtype == DB_RECNO)
...@@ -664,26 +690,22 @@ __bam_ritem(dbc, h, indx, data) ...@@ -664,26 +690,22 @@ __bam_ritem(dbc, h, indx, data)
} }
/* /*
* __bam_dup_convert -- * __bam_dup_check --
* Check to see if the duplicate set at indx should have its own page. * Check to see if the duplicate set at indx should have its own page.
* If it should, create it.
*/ */
static int static int
__bam_dup_convert(dbc, h, indx) __bam_dup_check(dbc, op, h, indx, sz, cntp)
DBC *dbc; DBC *dbc;
u_int32_t op;
PAGE *h; PAGE *h;
u_int32_t indx; u_int32_t indx, sz;
db_indx_t *cntp;
{ {
BKEYDATA *bk; BKEYDATA *bk;
DB *dbp; DB *dbp;
DBT hdr; db_indx_t cnt, first, *inp;
DB_MPOOLFILE *mpf;
PAGE *dp;
db_indx_t cnt, cpindx, dindx, first, *inp, sz;
int ret;
dbp = dbc->dbp; dbp = dbc->dbp;
mpf = dbp->mpf;
inp = P_INP(dbp, h); inp = P_INP(dbp, h);
/* /*
...@@ -695,11 +717,21 @@ __bam_dup_convert(dbc, h, indx) ...@@ -695,11 +717,21 @@ __bam_dup_convert(dbc, h, indx)
/* Count the key once. */ /* Count the key once. */
bk = GET_BKEYDATA(dbp, h, indx); bk = GET_BKEYDATA(dbp, h, indx);
sz = B_TYPE(bk->type) == B_KEYDATA ? sz += B_TYPE(bk->type) == B_KEYDATA ?
BKEYDATA_PSIZE(bk->len) : BOVERFLOW_PSIZE; BKEYDATA_PSIZE(bk->len) : BOVERFLOW_PSIZE;
/* Sum up all the data items. */ /* Sum up all the data items. */
for (cnt = 0, first = indx; first = indx;
/*
* Account for the record being inserted. If we are replacing it,
* don't count it twice.
*
* We execute the loop with first == indx to get the size of the
* first record.
*/
cnt = op == DB_CURRENT ? 0 : 1;
for (first = indx;
indx < NUM_ENT(h) && inp[first] == inp[indx]; indx < NUM_ENT(h) && inp[first] == inp[indx];
++cnt, indx += P_INDX) { ++cnt, indx += P_INDX) {
bk = GET_BKEYDATA(dbp, h, indx + O_INDX); bk = GET_BKEYDATA(dbp, h, indx + O_INDX);
...@@ -726,6 +758,36 @@ __bam_dup_convert(dbc, h, indx) ...@@ -726,6 +758,36 @@ __bam_dup_convert(dbc, h, indx)
if (sz < dbp->pgsize / 4) if (sz < dbp->pgsize / 4)
return (0); return (0);
*cntp = cnt;
return (1);
}
/*
* __bam_dup_convert --
* Move a set of duplicates off-page and into their own tree.
*/
static int
__bam_dup_convert(dbc, h, indx, cnt)
DBC *dbc;
PAGE *h;
u_int32_t indx, cnt;
{
BKEYDATA *bk;
DB *dbp;
DBT hdr;
DB_MPOOLFILE *mpf;
PAGE *dp;
db_indx_t cpindx, dindx, first, *inp;
int ret;
dbp = dbc->dbp;
mpf = dbp->mpf;
inp = P_INP(dbp, h);
/* Move to the beginning of the dup set. */
while (indx > 0 && inp[indx] == inp[indx - P_INDX])
indx -= P_INDX;
/* Get a new page. */ /* Get a new page. */
if ((ret = __db_new(dbc, if ((ret = __db_new(dbc,
dbp->dup_compare == NULL ? P_LRECNO : P_LDUP, &dp)) != 0) dbp->dup_compare == NULL ? P_LRECNO : P_LDUP, &dp)) != 0)
...@@ -739,8 +801,8 @@ __bam_dup_convert(dbc, h, indx) ...@@ -739,8 +801,8 @@ __bam_dup_convert(dbc, h, indx)
* we're dealing with. * we're dealing with.
*/ */
memset(&hdr, 0, sizeof(hdr)); memset(&hdr, 0, sizeof(hdr));
dindx = first; first = indx;
indx = first; dindx = indx;
cpindx = 0; cpindx = 0;
do { do {
/* Move cursors referencing the old entry to the new entry. */ /* Move cursors referencing the old entry to the new entry. */
......
This diff is collapsed.
/*- /*-
* See the file LICENSE for redistribution information. * See the file LICENSE for redistribution information.
* *
* Copyright (c) 1998-2004 * Copyright (c) 1998-2005
* Sleepycat Software. All rights reserved. * Sleepycat Software. All rights reserved.
* *
* $Id: bt_reclaim.c,v 11.15 2004/01/28 03:35:49 bostic Exp $ * $Id: bt_reclaim.c,v 12.2 2005/06/16 20:20:19 bostic Exp $
*/ */
#include "db_config.h" #include "db_config.h"
...@@ -69,7 +69,8 @@ __bam_truncate(dbc, countp) ...@@ -69,7 +69,8 @@ __bam_truncate(dbc, countp)
ret = __bam_traverse(dbc, ret = __bam_traverse(dbc,
DB_LOCK_WRITE, dbc->internal->root, __db_truncate_callback, &trunc); DB_LOCK_WRITE, dbc->internal->root, __db_truncate_callback, &trunc);
*countp = trunc.count; if (countp != NULL)
*countp = trunc.count;
return (ret); return (ret);
} }
/*- /*-
* See the file LICENSE for redistribution information. * See the file LICENSE for redistribution information.
* *
* Copyright (c) 1997-2004 * Copyright (c) 1997-2005
* Sleepycat Software. All rights reserved. * Sleepycat Software. All rights reserved.
* *
* $Id: bt_recno.c,v 11.117 2004/03/28 17:01:01 bostic Exp $ * $Id: bt_recno.c,v 12.6 2005/08/08 14:27:59 bostic Exp $
*/ */
#include "db_config.h" #include "db_config.h"
...@@ -203,7 +203,6 @@ __ram_c_del(dbc) ...@@ -203,7 +203,6 @@ __ram_c_del(dbc)
DB *dbp; DB *dbp;
DB_LSN lsn; DB_LSN lsn;
DBT hdr, data; DBT hdr, data;
EPG *epg;
int exact, ret, stack, t_ret; int exact, ret, stack, t_ret;
dbp = dbc->dbp; dbp = dbc->dbp;
...@@ -280,21 +279,11 @@ __ram_c_del(dbc) ...@@ -280,21 +279,11 @@ __ram_c_del(dbc)
* are closed, and then clean it up. * are closed, and then clean it up.
*/ */
if (NUM_ENT(cp->page) == 0 && PGNO(cp->page) != cp->root) { if (NUM_ENT(cp->page) == 0 && PGNO(cp->page) != cp->root) {
/*
* We already have a locked stack of pages. However,
* there are likely entries in the stack that aren't
* going to be emptied by removing the single reference
* to the emptied page (or one of its parents).
*/
for (epg = cp->csp; epg >= cp->sp; --epg)
if (NUM_ENT(epg->page) > 1)
break;
/* /*
* We want to delete a single item out of the last page * We want to delete a single item out of the last page
* that we're not deleting. * that we're not deleting.
*/ */
ret = __bam_dpages(dbc, epg); ret = __bam_dpages(dbc, 0, 0);
/* /*
* Regardless of the return from __bam_dpages, it will * Regardless of the return from __bam_dpages, it will
...@@ -764,7 +753,7 @@ __ram_ca(dbc_arg, op) ...@@ -764,7 +753,7 @@ __ram_ca(dbc_arg, op)
*/ */
DB_ASSERT(F_ISSET(cp_arg, C_RENUMBER)); DB_ASSERT(F_ISSET(cp_arg, C_RENUMBER));
MUTEX_THREAD_LOCK(dbenv, dbenv->dblist_mutexp); MUTEX_LOCK(dbenv, dbenv->mtx_dblist);
/* /*
* Adjust the cursors. See the comment in __bam_ca_delete(). * Adjust the cursors. See the comment in __bam_ca_delete().
*/ */
...@@ -780,7 +769,7 @@ __ram_ca(dbc_arg, op) ...@@ -780,7 +769,7 @@ __ram_ca(dbc_arg, op)
for (ldbp = __dblist_get(dbenv, dbp->adj_fileid); for (ldbp = __dblist_get(dbenv, dbp->adj_fileid);
ldbp != NULL && ldbp->adj_fileid == dbp->adj_fileid; ldbp != NULL && ldbp->adj_fileid == dbp->adj_fileid;
ldbp = LIST_NEXT(ldbp, dblistlinks)) { ldbp = LIST_NEXT(ldbp, dblistlinks)) {
MUTEX_THREAD_LOCK(dbenv, dbp->mutexp); MUTEX_LOCK(dbenv, dbp->mutex);
for (dbc = TAILQ_FIRST(&ldbp->active_queue); for (dbc = TAILQ_FIRST(&ldbp->active_queue);
dbc != NULL; dbc = TAILQ_NEXT(dbc, links)) { dbc != NULL; dbc = TAILQ_NEXT(dbc, links)) {
cp = (BTREE_CURSOR *)dbc->internal; cp = (BTREE_CURSOR *)dbc->internal;
...@@ -789,7 +778,7 @@ __ram_ca(dbc_arg, op) ...@@ -789,7 +778,7 @@ __ram_ca(dbc_arg, op)
order <= cp->order) order <= cp->order)
order = cp->order + 1; order = cp->order + 1;
} }
MUTEX_THREAD_UNLOCK(dbenv, dbp->mutexp); MUTEX_UNLOCK(dbenv, dbp->mutex);
} }
} else } else
order = INVALID_ORDER; order = INVALID_ORDER;
...@@ -798,7 +787,7 @@ __ram_ca(dbc_arg, op) ...@@ -798,7 +787,7 @@ __ram_ca(dbc_arg, op)
for (ldbp = __dblist_get(dbenv, dbp->adj_fileid); for (ldbp = __dblist_get(dbenv, dbp->adj_fileid);
ldbp != NULL && ldbp->adj_fileid == dbp->adj_fileid; ldbp != NULL && ldbp->adj_fileid == dbp->adj_fileid;
ldbp = LIST_NEXT(ldbp, dblistlinks)) { ldbp = LIST_NEXT(ldbp, dblistlinks)) {
MUTEX_THREAD_LOCK(dbenv, dbp->mutexp); MUTEX_LOCK(dbenv, dbp->mutex);
for (dbc = TAILQ_FIRST(&ldbp->active_queue); for (dbc = TAILQ_FIRST(&ldbp->active_queue);
dbc != NULL; dbc = TAILQ_NEXT(dbc, links)) { dbc != NULL; dbc = TAILQ_NEXT(dbc, links)) {
cp = (BTREE_CURSOR *)dbc->internal; cp = (BTREE_CURSOR *)dbc->internal;
...@@ -868,9 +857,9 @@ iafter: if (!adjusted && C_LESSTHAN(cp_arg, cp)) { ...@@ -868,9 +857,9 @@ iafter: if (!adjusted && C_LESSTHAN(cp_arg, cp)) {
break; break;
} }
} }
MUTEX_THREAD_UNLOCK(dbp->dbenv, dbp->mutexp); MUTEX_UNLOCK(dbp->dbenv, dbp->mutex);
} }
MUTEX_THREAD_UNLOCK(dbenv, dbenv->dblist_mutexp); MUTEX_UNLOCK(dbenv, dbenv->mtx_dblist);
return (found); return (found);
} }
...@@ -1037,6 +1026,18 @@ __ram_writeback(dbp) ...@@ -1037,6 +1026,18 @@ __ram_writeback(dbp)
return (0); return (0);
} }
/*
* We step through the records, writing each one out. Use the record
* number and the dbp->get() function, instead of a cursor, so we find
* and write out "deleted" or non-existent records. The DB handle may
* be threaded, so allocate memory as we go.
*/
memset(&key, 0, sizeof(key));
key.size = sizeof(db_recno_t);
key.data = &keyno;
memset(&data, 0, sizeof(data));
F_SET(&data, DB_DBT_REALLOC);
/* Allocate a cursor. */ /* Allocate a cursor. */
if ((ret = __db_cursor(dbp, NULL, &dbc, 0)) != 0) if ((ret = __db_cursor(dbp, NULL, &dbc, 0)) != 0)
return (ret); return (ret);
...@@ -1064,7 +1065,7 @@ __ram_writeback(dbp) ...@@ -1064,7 +1065,7 @@ __ram_writeback(dbp)
*/ */
if ((ret = if ((ret =
__ram_update(dbc, DB_MAX_RECORDS, 0)) != 0 && ret != DB_NOTFOUND) __ram_update(dbc, DB_MAX_RECORDS, 0)) != 0 && ret != DB_NOTFOUND)
return (ret); goto err;
/* /*
* Close any existing file handle and re-open the file, truncating it. * Close any existing file handle and re-open the file, truncating it.
...@@ -1082,18 +1083,6 @@ __ram_writeback(dbp) ...@@ -1082,18 +1083,6 @@ __ram_writeback(dbp)
goto err; goto err;
} }
/*
* We step through the records, writing each one out. Use the record
* number and the dbp->get() function, instead of a cursor, so we find
* and write out "deleted" or non-existent records. The DB handle may
* be threaded, so allocate memory as we go.
*/
memset(&key, 0, sizeof(key));
key.size = sizeof(db_recno_t);
key.data = &keyno;
memset(&data, 0, sizeof(data));
F_SET(&data, DB_DBT_REALLOC);
/* /*
* We'll need the delimiter if we're doing variable-length records, * We'll need the delimiter if we're doing variable-length records,
* and the pad character if we're doing fixed-length records. * and the pad character if we're doing fixed-length records.
......
/*- /*-
* See the file LICENSE for redistribution information. * See the file LICENSE for redistribution information.
* *
* Copyright (c) 1996-2004 * Copyright (c) 1996-2005
* Sleepycat Software. All rights reserved. * Sleepycat Software. All rights reserved.
*/ */
/* /*
...@@ -36,7 +36,7 @@ ...@@ -36,7 +36,7 @@
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
* SUCH DAMAGE. * SUCH DAMAGE.
* *
* $Id: bt_rsearch.c,v 11.40 2004/07/23 17:21:09 bostic Exp $ * $Id: bt_rsearch.c,v 12.5 2005/08/08 03:37:05 ubell Exp $
*/ */
#include "db_config.h" #include "db_config.h"
...@@ -100,44 +100,14 @@ __bam_rsearch(dbc, recnop, flags, stop, exactp) ...@@ -100,44 +100,14 @@ __bam_rsearch(dbc, recnop, flags, stop, exactp)
* *
* Retrieve the root page. * Retrieve the root page.
*/ */
pg = cp->root;
stack = LF_ISSET(S_STACK) ? 1 : 0;
lock_mode = stack ? DB_LOCK_WRITE : DB_LOCK_READ;
if ((ret = __db_lget(dbc, 0, pg, lock_mode, 0, &lock)) != 0)
return (ret);
if ((ret = __memp_fget(mpf, &pg, 0, &h)) != 0) {
/* Did not read it, so we can release the lock */
(void)__LPUT(dbc, lock);
return (ret);
}
/* if ((ret = __bam_get_root(dbc, cp->root, stop, flags, &stack)) != 0)
* Decide if we need to save this page; if we do, write lock it. return (ret);
* We deliberately don't lock-couple on this call. If the tree lock_mode = cp->csp->lock_mode;
* is tiny, i.e., one page, and two threads are busily updating lock = cp->csp->lock;
* the root page, we're almost guaranteed deadlocks galore, as h = cp->csp->page;
* each one gets a read lock and then blocks the other's attempt
* for a write lock.
*/
if (!stack &&
((LF_ISSET(S_PARENT) && (u_int8_t)(stop + 1) >= h->level) ||
(LF_ISSET(S_WRITE) && h->level == LEAFLEVEL))) {
ret = __memp_fput(mpf, h, 0);
if ((t_ret = __LPUT(dbc, lock)) != 0 && ret == 0)
ret = t_ret;
if (ret != 0)
return (ret);
lock_mode = DB_LOCK_WRITE;
if ((ret = __db_lget(dbc, 0, pg, lock_mode, 0, &lock)) != 0)
return (ret);
if ((ret = __memp_fget(mpf, &pg, 0, &h)) != 0) {
/* Did not read it, so we can release the lock */
(void)__LPUT(dbc, lock);
return (ret);
}
stack = 1;
}
BT_STK_CLR(cp);
/* /*
* If appending to the tree, set the record number now -- we have the * If appending to the tree, set the record number now -- we have the
* root page locked. * root page locked.
...@@ -260,15 +230,15 @@ __bam_rsearch(dbc, recnop, flags, stop, exactp) ...@@ -260,15 +230,15 @@ __bam_rsearch(dbc, recnop, flags, stop, exactp)
} }
--indx; --indx;
/* Return if this is the lowest page wanted. */
if (stop == LEVEL(h)) {
BT_STK_ENTER(dbp->dbenv,
cp, h, indx, lock, lock_mode, ret);
if (ret != 0)
goto err;
return (0);
}
if (stack) { if (stack) {
/* Return if this is the lowest page wanted. */
if (LF_ISSET(S_PARENT) && stop == h->level) {
BT_STK_ENTER(dbp->dbenv,
cp, h, indx, lock, lock_mode, ret);
if (ret != 0)
goto err;
return (0);
}
BT_STK_PUSH(dbp->dbenv, BT_STK_PUSH(dbp->dbenv,
cp, h, indx, lock, lock_mode, ret); cp, h, indx, lock, lock_mode, ret);
if (ret != 0) if (ret != 0)
...@@ -286,8 +256,8 @@ __bam_rsearch(dbc, recnop, flags, stop, exactp) ...@@ -286,8 +256,8 @@ __bam_rsearch(dbc, recnop, flags, stop, exactp)
* never unlock it. * never unlock it.
*/ */
if ((LF_ISSET(S_PARENT) && if ((LF_ISSET(S_PARENT) &&
(u_int8_t)(stop + 1) >= (u_int8_t)(h->level - 1)) || (u_int8_t)(stop + 1) >= (u_int8_t)(LEVEL(h) - 1)) ||
(h->level - 1) == LEAFLEVEL) (LEVEL(h) - 1) == LEAFLEVEL)
stack = 1; stack = 1;
if ((ret = __memp_fput(mpf, h, 0)) != 0) if ((ret = __memp_fput(mpf, h, 0)) != 0)
......
This diff is collapsed.
/*- /*-
* See the file LICENSE for redistribution information. * See the file LICENSE for redistribution information.
* *
* Copyright (c) 1996-2004 * Copyright (c) 1996-2005
* Sleepycat Software. All rights reserved. * Sleepycat Software. All rights reserved.
*/ */
/* /*
...@@ -36,7 +36,7 @@ ...@@ -36,7 +36,7 @@
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
* SUCH DAMAGE. * SUCH DAMAGE.
* *
* $Id: bt_split.c,v 11.66 2004/10/01 13:00:21 bostic Exp $ * $Id: bt_split.c,v 12.4 2005/06/16 20:20:22 bostic Exp $
*/ */
#include "db_config.h" #include "db_config.h"
...@@ -56,7 +56,6 @@ ...@@ -56,7 +56,6 @@
static int __bam_broot __P((DBC *, PAGE *, PAGE *, PAGE *)); static int __bam_broot __P((DBC *, PAGE *, PAGE *, PAGE *));
static int __bam_page __P((DBC *, EPG *, EPG *)); static int __bam_page __P((DBC *, EPG *, EPG *));
static int __bam_pinsert __P((DBC *, EPG *, PAGE *, PAGE *, int));
static int __bam_psplit __P((DBC *, EPG *, PAGE *, PAGE *, db_indx_t *)); static int __bam_psplit __P((DBC *, EPG *, PAGE *, PAGE *, db_indx_t *));
static int __bam_root __P((DBC *, EPG *)); static int __bam_root __P((DBC *, EPG *));
static int __ram_root __P((DBC *, PAGE *, PAGE *, PAGE *)); static int __ram_root __P((DBC *, PAGE *, PAGE *, PAGE *));
...@@ -338,7 +337,7 @@ __bam_page(dbc, pp, cp) ...@@ -338,7 +337,7 @@ __bam_page(dbc, pp, cp)
* page can't hold the new keys, and has to be split in turn, in which * page can't hold the new keys, and has to be split in turn, in which
* case we want to release all the locks we can. * case we want to release all the locks we can.
*/ */
if ((ret = __bam_pinsert(dbc, pp, lp, rp, 1)) != 0) if ((ret = __bam_pinsert(dbc, pp, lp, rp, BPI_SPACEONLY)) != 0)
goto err; goto err;
/* /*
...@@ -349,7 +348,7 @@ __bam_page(dbc, pp, cp) ...@@ -349,7 +348,7 @@ __bam_page(dbc, pp, cp)
* a page that's not in our direct ancestry. Consider a cursor walking * a page that's not in our direct ancestry. Consider a cursor walking
* backward through the leaf pages, that has our following page locked, * backward through the leaf pages, that has our following page locked,
* and is waiting on a lock for the page we're splitting. In that case * and is waiting on a lock for the page we're splitting. In that case
* we're going to deadlock here . It's probably OK, stepping backward * we're going to deadlock here. It's probably OK, stepping backward
* through the tree isn't a common operation. * through the tree isn't a common operation.
*/ */
if (ISLEAF(cp->page) && NEXT_PGNO(cp->page) != PGNO_INVALID) { if (ISLEAF(cp->page) && NEXT_PGNO(cp->page) != PGNO_INVALID) {
...@@ -685,13 +684,15 @@ __ram_root(dbc, rootp, lp, rp) ...@@ -685,13 +684,15 @@ __ram_root(dbc, rootp, lp, rp)
/* /*
* __bam_pinsert -- * __bam_pinsert --
* Insert a new key into a parent page, completing the split. * Insert a new key into a parent page, completing the split.
*
* PUBLIC: int __bam_pinsert __P((DBC *, EPG *, PAGE *, PAGE *, int));
*/ */
static int int
__bam_pinsert(dbc, parent, lchild, rchild, space_check) __bam_pinsert(dbc, parent, lchild, rchild, flags)
DBC *dbc; DBC *dbc;
EPG *parent; EPG *parent;
PAGE *lchild, *rchild; PAGE *lchild, *rchild;
int space_check; int flags;
{ {
BINTERNAL bi, *child_bi; BINTERNAL bi, *child_bi;
BKEYDATA *child_bk, *tmp_bk; BKEYDATA *child_bk, *tmp_bk;
...@@ -714,7 +715,7 @@ __bam_pinsert(dbc, parent, lchild, rchild, space_check) ...@@ -714,7 +715,7 @@ __bam_pinsert(dbc, parent, lchild, rchild, space_check)
/* If handling record numbers, count records split to the right page. */ /* If handling record numbers, count records split to the right page. */
nrecs = F_ISSET(cp, C_RECNUM) && nrecs = F_ISSET(cp, C_RECNUM) &&
!space_check ? __bam_total(dbp, rchild) : 0; !LF_ISSET(BPI_SPACEONLY) ? __bam_total(dbp, rchild) : 0;
/* /*
* Now we insert the new page's first key into the parent page, which * Now we insert the new page's first key into the parent page, which
...@@ -750,7 +751,7 @@ __bam_pinsert(dbc, parent, lchild, rchild, space_check) ...@@ -750,7 +751,7 @@ __bam_pinsert(dbc, parent, lchild, rchild, space_check)
if (P_FREESPACE(dbp, ppage) < nbytes) if (P_FREESPACE(dbp, ppage) < nbytes)
return (DB_NEEDSPLIT); return (DB_NEEDSPLIT);
if (space_check) if (LF_ISSET(BPI_SPACEONLY))
return (0); return (0);
/* Add a new record for the right page. */ /* Add a new record for the right page. */
...@@ -780,7 +781,11 @@ __bam_pinsert(dbc, parent, lchild, rchild, space_check) ...@@ -780,7 +781,11 @@ __bam_pinsert(dbc, parent, lchild, rchild, space_check)
child_bk = GET_BKEYDATA(dbp, rchild, 0); child_bk = GET_BKEYDATA(dbp, rchild, 0);
switch (B_TYPE(child_bk->type)) { switch (B_TYPE(child_bk->type)) {
case B_KEYDATA: case B_KEYDATA:
nbytes = BINTERNAL_PSIZE(child_bk->len);
nksize = child_bk->len;
/* /*
* Prefix compression:
* We set t->bt_prefix to NULL if we have a comparison * We set t->bt_prefix to NULL if we have a comparison
* callback but no prefix compression callback. But, * callback but no prefix compression callback. But,
* if we're splitting in an off-page duplicates tree, * if we're splitting in an off-page duplicates tree,
...@@ -792,6 +797,14 @@ __bam_pinsert(dbc, parent, lchild, rchild, space_check) ...@@ -792,6 +797,14 @@ __bam_pinsert(dbc, parent, lchild, rchild, space_check)
* as there's no way for an application to specify a * as there's no way for an application to specify a
* prefix compression callback that corresponds to its * prefix compression callback that corresponds to its
* comparison callback. * comparison callback.
*
* No prefix compression if we don't have a compression
* function, or the key we'd compress isn't a normal
* key (for example, it references an overflow page).
*
* Generate a parent page key for the right child page
* from a comparison of the last key on the left child
* page and the first key on the right child page.
*/ */
if (F_ISSET(dbc, DBC_OPD)) { if (F_ISSET(dbc, DBC_OPD)) {
if (dbp->dup_compare == __bam_defcmp) if (dbp->dup_compare == __bam_defcmp)
...@@ -800,13 +813,8 @@ __bam_pinsert(dbc, parent, lchild, rchild, space_check) ...@@ -800,13 +813,8 @@ __bam_pinsert(dbc, parent, lchild, rchild, space_check)
func = NULL; func = NULL;
} else } else
func = t->bt_prefix; func = t->bt_prefix;
nbytes = BINTERNAL_PSIZE(child_bk->len);
nksize = child_bk->len;
if (func == NULL) if (func == NULL)
goto noprefix; goto noprefix;
if (ppage->prev_pgno == PGNO_INVALID && off <= 1)
goto noprefix;
tmp_bk = GET_BKEYDATA(dbp, lchild, NUM_ENT(lchild) - tmp_bk = GET_BKEYDATA(dbp, lchild, NUM_ENT(lchild) -
(TYPE(lchild) == P_LDUP ? O_INDX : P_INDX)); (TYPE(lchild) == P_LDUP ? O_INDX : P_INDX));
if (B_TYPE(tmp_bk->type) != B_KEYDATA) if (B_TYPE(tmp_bk->type) != B_KEYDATA)
...@@ -821,11 +829,11 @@ __bam_pinsert(dbc, parent, lchild, rchild, space_check) ...@@ -821,11 +829,11 @@ __bam_pinsert(dbc, parent, lchild, rchild, space_check)
if ((n = BINTERNAL_PSIZE(nksize)) < nbytes) if ((n = BINTERNAL_PSIZE(nksize)) < nbytes)
nbytes = n; nbytes = n;
else else
noprefix: nksize = child_bk->len; nksize = child_bk->len;
if (P_FREESPACE(dbp, ppage) < nbytes) noprefix: if (P_FREESPACE(dbp, ppage) < nbytes)
return (DB_NEEDSPLIT); return (DB_NEEDSPLIT);
if (space_check) if (LF_ISSET(BPI_SPACEONLY))
return (0); return (0);
memset(&bi, 0, sizeof(bi)); memset(&bi, 0, sizeof(bi));
...@@ -849,7 +857,7 @@ noprefix: nksize = child_bk->len; ...@@ -849,7 +857,7 @@ noprefix: nksize = child_bk->len;
if (P_FREESPACE(dbp, ppage) < nbytes) if (P_FREESPACE(dbp, ppage) < nbytes)
return (DB_NEEDSPLIT); return (DB_NEEDSPLIT);
if (space_check) if (LF_ISSET(BPI_SPACEONLY))
return (0); return (0);
memset(&bi, 0, sizeof(bi)); memset(&bi, 0, sizeof(bi));
...@@ -883,7 +891,7 @@ noprefix: nksize = child_bk->len; ...@@ -883,7 +891,7 @@ noprefix: nksize = child_bk->len;
if (P_FREESPACE(dbp, ppage) < nbytes) if (P_FREESPACE(dbp, ppage) < nbytes)
return (DB_NEEDSPLIT); return (DB_NEEDSPLIT);
if (space_check) if (LF_ISSET(BPI_SPACEONLY))
return (0); return (0);
/* Add a new record for the right page. */ /* Add a new record for the right page. */
...@@ -904,13 +912,13 @@ noprefix: nksize = child_bk->len; ...@@ -904,13 +912,13 @@ noprefix: nksize = child_bk->len;
* If a Recno or Btree with record numbers AM page, or an off-page * If a Recno or Btree with record numbers AM page, or an off-page
* duplicates tree, adjust the parent page's left page record count. * duplicates tree, adjust the parent page's left page record count.
*/ */
if (F_ISSET(cp, C_RECNUM)) { if (F_ISSET(cp, C_RECNUM) && !LF_ISSET(BPI_NORECNUM)) {
/* Log the change. */ /* Log the change. */
if (DBC_LOGGING(dbc)) { if (DBC_LOGGING(dbc)) {
if ((ret = __bam_cadjust_log(dbp, dbc->txn, if ((ret = __bam_cadjust_log(dbp, dbc->txn,
&LSN(ppage), 0, PGNO(ppage), &LSN(ppage), 0, PGNO(ppage), &LSN(ppage),
&LSN(ppage), parent->indx, -(int32_t)nrecs, 0)) != 0) parent->indx, -(int32_t)nrecs, 0)) != 0)
return (ret); return (ret);
} else } else
LSN_NOT_LOGGED(LSN(ppage)); LSN_NOT_LOGGED(LSN(ppage));
......
/*- /*-
* See the file LICENSE for redistribution information. * See the file LICENSE for redistribution information.
* *
* Copyright (c) 1996-2004 * Copyright (c) 1996-2005
* Sleepycat Software. All rights reserved. * Sleepycat Software. All rights reserved.
* *
* $Id: bt_stat.c,v 11.78 2004/09/22 03:31:26 bostic Exp $ * $Id: bt_stat.c,v 12.3 2005/06/16 20:20:23 bostic Exp $
*/ */
#include "db_config.h" #include "db_config.h"
...@@ -155,7 +155,6 @@ meta_only: ...@@ -155,7 +155,6 @@ meta_only:
/* Get metadata page statistics. */ /* Get metadata page statistics. */
sp->bt_metaflags = meta->dbmeta.flags; sp->bt_metaflags = meta->dbmeta.flags;
sp->bt_maxkey = meta->maxkey;
sp->bt_minkey = meta->minkey; sp->bt_minkey = meta->minkey;
sp->bt_re_len = meta->re_len; sp->bt_re_len = meta->re_len;
sp->bt_re_pad = meta->re_pad; sp->bt_re_pad = meta->re_pad;
...@@ -246,16 +245,12 @@ __bam_stat_print(dbc, flags) ...@@ -246,16 +245,12 @@ __bam_stat_print(dbc, flags)
} }
__db_msg(dbenv, "%s\tByte order", s); __db_msg(dbenv, "%s\tByte order", s);
__db_prflags(dbenv, NULL, sp->bt_metaflags, fn, NULL, "\tFlags"); __db_prflags(dbenv, NULL, sp->bt_metaflags, fn, NULL, "\tFlags");
if (dbp->type == DB_BTREE) { if (dbp->type == DB_BTREE)
#ifdef NOT_IMPLEMENTED
__db_dl(dbenv, "Maximum keys per-page", (u_long)sp->bt_maxkey);
#endif
__db_dl(dbenv, "Minimum keys per-page", (u_long)sp->bt_minkey); __db_dl(dbenv, "Minimum keys per-page", (u_long)sp->bt_minkey);
}
if (dbp->type == DB_RECNO) { if (dbp->type == DB_RECNO) {
__db_dl(dbenv, __db_dl(dbenv,
"Fixed-length record size", (u_long)sp->bt_re_len); "Fixed-length record size", (u_long)sp->bt_re_len);
__db_dl(dbenv, __db_msg(dbenv,
"%#x\tFixed-length record pad", (u_int)sp->bt_re_pad); "%#x\tFixed-length record pad", (u_int)sp->bt_re_pad);
} }
__db_dl(dbenv, __db_dl(dbenv,
......
/*- /*-
* See the file LICENSE for redistribution information. * See the file LICENSE for redistribution information.
* *
* Copyright (c) 1996-2004 * Copyright (c) 1996-2005
* Sleepycat Software. All rights reserved. * Sleepycat Software. All rights reserved.
* *
* $Id: bt_upgrade.c,v 11.30 2004/01/28 03:35:49 bostic Exp $ * $Id: bt_upgrade.c,v 12.1 2005/06/16 20:20:23 bostic Exp $
*/ */
#include "db_config.h" #include "db_config.h"
......
This diff is collapsed.
/*- /*-
* See the file LICENSE for redistribution information. * See the file LICENSE for redistribution information.
* *
* Copyright (c) 1996-2004 * Copyright (c) 1996-2005
* Sleepycat Software. All rights reserved. * Sleepycat Software. All rights reserved.
* *
* $Id: btree.src,v 10.42 2004/06/17 17:35:12 bostic Exp $ * $Id: btree.src,v 12.3 2005/08/08 03:37:05 ubell Exp $
*/ */
PREFIX __bam PREFIX __bam
...@@ -210,10 +210,10 @@ END ...@@ -210,10 +210,10 @@ END
BEGIN relink 147 BEGIN relink 147
/* Fileid of db affected. */ /* Fileid of db affected. */
DB fileid int32_t ld DB fileid int32_t ld
/* The page being changed. */ /* The page being removed. */
ARG pgno db_pgno_t lu ARG pgno db_pgno_t lu
/* The page's original lsn. */ /* The new page number, if any. */
POINTER lsn DB_LSN * lu ARG new_pgno db_pgno_t lu
/* The previous page. */ /* The previous page. */
ARG prev db_pgno_t lu ARG prev db_pgno_t lu
/* The previous page's original lsn. */ /* The previous page's original lsn. */
...@@ -223,3 +223,30 @@ ARG next db_pgno_t lu ...@@ -223,3 +223,30 @@ ARG next db_pgno_t lu
/* The previous page's original lsn. */ /* The previous page's original lsn. */
POINTER lsn_next DB_LSN * lu POINTER lsn_next DB_LSN * lu
END END
/*
* BTREE-merge -- Handles merging of pages during a compaction.
*/
BEGIN merge 148
DB fileid int32_t ld
ARG pgno db_pgno_t lu
POINTER lsn DB_LSN * lu
ARG npgno db_pgno_t lu
POINTER nlsn DB_LSN * lu
DBT hdr DBT s
DBT data DBT s
DBT ind DBT s
END
/*
* BTREE-pgno -- Handles replacing a page number in the record
* refernece on pgno by indx.
*/
BEGIN pgno 149
DB fileid int32_t ld
ARG pgno db_pgno_t lu
POINTER lsn DB_LSN * lu
ARG indx u_int32_t lu
ARG opgno db_pgno_t lu
ARG npgno db_pgno_t lu
END
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
/*- /*-
* See the file LICENSE for redistribution information. * See the file LICENSE for redistribution information.
* *
* Copyright (c) 1999-2004 * Copyright (c) 1999-2005
* Sleepycat Software. All rights reserved. * Sleepycat Software. All rights reserved.
* *
* $Id: dbkill.cpp,v 11.9 2004/01/28 03:35:52 bostic Exp $ * $Id: dbkill.cpp,v 12.1 2005/06/16 20:20:43 bostic Exp $
*/ */
/* /*
* Kill - * Kill -
......
This diff is collapsed.
; $Id: libdb_tcl.def,v 11.7 2002/10/14 23:44:20 mjc Exp $ ; $Id: libdb_tcl.def,v 12.0 2004/11/17 03:48:15 bostic Exp $
DESCRIPTION 'Berkeley DB TCL interface Library' DESCRIPTION 'Berkeley DB TCL interface Library'
EXPORTS EXPORTS
......
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment