diff --git a/buildheader/make_tdb.cc b/buildheader/make_tdb.cc index 32a82150256..930f5906145 100644 --- a/buildheader/make_tdb.cc +++ b/buildheader/make_tdb.cc @@ -365,6 +365,7 @@ static void print_db_env_struct (void) { "int (*txn_xa_recover) (DB_ENV*, TOKU_XA_XID list[/*count*/], long count, /*out*/ long *retp, uint32_t flags)", "int (*get_txn_from_xid) (DB_ENV*, /*in*/ TOKU_XA_XID *, /*out*/ DB_TXN **)", "int (*get_cursor_for_directory) (DB_ENV*, /*in*/ DB_TXN *, /*out*/ DBC **)", + "int (*get_cursor_for_persistent_environment) (DB_ENV*, /*in*/ DB_TXN *, /*out*/ DBC **)", NULL}; sort_and_dump_fields("db_env", true, extra); diff --git a/src/tests/CMakeLists.txt b/src/tests/CMakeLists.txt index f15323b4cbb..25972616994 100644 --- a/src/tests/CMakeLists.txt +++ b/src/tests/CMakeLists.txt @@ -513,6 +513,8 @@ if(BUILD_TESTING OR BUILD_SRC_TESTS) endif () endforeach(src) + configure_file(run_with_env.sh . COPYONLY) + ## for some reason this rule doesn't run with the makefile and it crashes with this rule, so I'm disabling this special case #declare_custom_tests(test_thread_stack.tdb) #add_custom_command(OUTPUT run_test_thread_stack.sh diff --git a/src/tests/dump-env.cc b/src/tests/dump-env.cc new file mode 100644 index 00000000000..fb87e2e2e35 --- /dev/null +++ b/src/tests/dump-env.cc @@ -0,0 +1,103 @@ +/* -*- mode: C++; c-basic-offset: 4; indent-tabs-mode: nil -*- */ +// vim: ft=cpp:expandtab:ts=8:sw=4:softtabstop=4: +#ident "$Id: cursor-more-than-a-leaf-provdel.cc 49851 2012-11-12 00:43:22Z esmet $" +#ident "Copyright (c) 2007 Tokutek Inc. All rights reserved." +#include "test.h" +#include +#include + +static DB_ENV *env; +static DB *db; +DB_TXN *txn; + +const int num_insert = 25000; + +static void +setup (void) { + int r; + r=toku_os_mkdir(ENVDIR, S_IRWXU+S_IRWXG+S_IRWXO); + if (r != 0) { + CKERR2(errno, EEXIST); + } + + r=db_env_create(&env, 0); CKERR(r); +#ifdef TOKUDB + r=env->set_redzone(env, 0); CKERR(r); + r=env->set_default_bt_compare(env, int_dbt_cmp); CKERR(r); +#endif + env->set_errfile(env, stderr); +#ifdef USE_BDB + r=env->set_lk_max_objects(env, 2*num_insert); CKERR(r); +#endif + + r=env->open(env, ENVDIR, DB_INIT_LOCK|DB_INIT_LOG|DB_INIT_MPOOL|DB_INIT_TXN|DB_CREATE|DB_PRIVATE, S_IRWXU+S_IRWXG+S_IRWXO); CKERR(r); + r=db_create(&db, env, 0); CKERR(r); + + r=env->txn_begin(env, 0, &txn, 0); assert(r==0); +#ifdef USE_BDB + r=db->set_bt_compare(db, int_dbt_cmp); CKERR(r); +#endif + r=db->open(db, txn, "foo.db", 0, DB_BTREE, DB_CREATE, S_IRWXU+S_IRWXG+S_IRWXO); CKERR(r); + r=txn->commit(txn, 0); assert(r==0); +} + +static void +test_shutdown (void) { + int r; + r= db->close(db, 0); CKERR(r); + r= env->close(env, 0); CKERR(r); +} + +static void +doit(void) { + int r; + + DBC *dbc; + r=env->txn_begin(env, 0, &txn, 0); CKERR(r); + r = env->get_cursor_for_persistent_environment(env, txn, &dbc); CKERR(r); + DBT key; + DBT val; + dbt_init_realloc(&key); + dbt_init_realloc(&val); + + while ((r = dbc->c_get(dbc, &key, &val, DB_NEXT)) == 0) { + if (verbose) { + printf("ENTRY\n\tKEY [%.*s]", + key.size, + (char*)key.data); + if (val.size == sizeof(uint32_t)) { + //assume integer + printf("\n\tVAL [%" PRIu32"]\n", + toku_dtoh32(*(uint32_t*)val.data)); + } else if (val.size == sizeof(uint64_t)) { + //assume 64 bit integer + printf("\n\tVAL [%" PRIu64"]\n", + toku_dtoh64(*(uint64_t*)val.data)); + } else { + printf("\n\tVAL [%.*s]\n", + val.size, + (char*)val.data); + } + } + } + CKERR2(r, DB_NOTFOUND); + r = dbc->c_close(dbc); + CKERR(r); + r = txn->commit(txn, 0); + CKERR(r); + + toku_free(key.data); + toku_free(val.data); +} + +int +test_main (int argc, char * const argv[]) { + parse_args(argc, argv); + + setup(); + doit(); + test_shutdown(); + + return 0; +} + diff --git a/src/tests/run_with_env.sh b/src/tests/run_with_env.sh new file mode 100755 index 00000000000..a4876ebdc93 --- /dev/null +++ b/src/tests/run_with_env.sh @@ -0,0 +1,11 @@ +#!/usr/bin/env bash + +if [[ $# -lt 3 ]]; then exit 1; fi + +bin=$1; shift +saveddir=$1; shift +envdir=$1; shift + +rm -rf $envdir +cp -r $saveddir $envdir +$bin "$@" diff --git a/src/ydb.cc b/src/ydb.cc index c435a5d09a8..b9b2eceeb74 100644 --- a/src/ydb.cc +++ b/src/ydb.cc @@ -2084,6 +2084,14 @@ env_crash(DB_ENV * UU(db_env), const char* msg, const char * fun, const char* fi return -1; // placate compiler } +static int +env_get_cursor_for_persistent_environment(DB_ENV* env, DB_TXN* txn, DBC** c) { + if (!env_opened(env)) { + return EINVAL; + } + return toku_db_cursor(env->i->persistent_environment, txn, c, 0); +} + static int env_get_cursor_for_directory(DB_ENV* env, DB_TXN* txn, DBC** c) { if (!env_opened(env)) { @@ -2159,6 +2167,7 @@ toku_env_create(DB_ENV ** envp, uint32_t flags) { USENV(log_flush); USENV(log_archive); USENV(create_loader); + USENV(get_cursor_for_persistent_environment); USENV(get_cursor_for_directory); #undef USENV