Commit 45a0280b authored by Yoni Fogel's avatar Yoni Fogel

Modified tokudb to work with test_db_already_exists

git-svn-id: file:///svn/tokudb@643 c7de825b-a66e-492c-adef-691d508d4ae1
parent 406ade74
...@@ -9,9 +9,9 @@ extern "C" { ...@@ -9,9 +9,9 @@ extern "C" {
#endif #endif
#define DB_VERSION_MAJOR 4 #define DB_VERSION_MAJOR 4
#define DB_VERSION_MINOR 1 #define DB_VERSION_MINOR 1
#define DB_VERSION_PATCH 25 #define DB_VERSION_PATCH 24
#ifndef _TOKUDB_WRAP_H #ifndef _TOKUDB_WRAP_H
#define DB_VERSION_STRING "Tokutek: TokuDB 4.1.25" #define DB_VERSION_STRING "Tokutek: TokuDB 4.1.24"
#else #else
#define DB_VERSION_STRING_ydb "Tokutek: TokuDB (wrapped bdb)" #define DB_VERSION_STRING_ydb "Tokutek: TokuDB (wrapped bdb)"
#endif #endif
...@@ -40,6 +40,7 @@ typedef enum { ...@@ -40,6 +40,7 @@ typedef enum {
#define DB_ARCH_ABS 1 #define DB_ARCH_ABS 1
#define DB_ARCH_LOG 4 #define DB_ARCH_LOG 4
#define DB_CREATE 1 #define DB_CREATE 1
#define DB_EXCL 2048
#define DB_PRIVATE 262144 #define DB_PRIVATE 262144
#define DB_RDONLY 16 #define DB_RDONLY 16
#define DB_RECOVER 32 #define DB_RECOVER 32
......
...@@ -39,6 +39,7 @@ void print_defines (void) { ...@@ -39,6 +39,7 @@ void print_defines (void) {
dodefine(DB_ARCH_LOG); dodefine(DB_ARCH_LOG);
dodefine(DB_CREATE); dodefine(DB_CREATE);
dodefine(DB_EXCL);
dodefine(DB_PRIVATE); dodefine(DB_PRIVATE);
dodefine(DB_RDONLY); dodefine(DB_RDONLY);
dodefine(DB_RECOVER); dodefine(DB_RECOVER);
......
...@@ -9,9 +9,9 @@ extern "C" { ...@@ -9,9 +9,9 @@ extern "C" {
#endif #endif
#define DB_VERSION_MAJOR 4 #define DB_VERSION_MAJOR 4
#define DB_VERSION_MINOR 1 #define DB_VERSION_MINOR 1
#define DB_VERSION_PATCH 25 #define DB_VERSION_PATCH 24
#ifndef _TOKUDB_WRAP_H #ifndef _TOKUDB_WRAP_H
#define DB_VERSION_STRING "Tokutek: TokuDB 4.1.25" #define DB_VERSION_STRING "Tokutek: TokuDB 4.1.24"
#else #else
#define DB_VERSION_STRING_ydb "Tokutek: TokuDB (wrapped bdb)" #define DB_VERSION_STRING_ydb "Tokutek: TokuDB (wrapped bdb)"
#endif #endif
...@@ -40,6 +40,7 @@ typedef enum { ...@@ -40,6 +40,7 @@ typedef enum {
#define DB_ARCH_ABS 1 #define DB_ARCH_ABS 1
#define DB_ARCH_LOG 4 #define DB_ARCH_LOG 4
#define DB_CREATE 1 #define DB_CREATE 1
#define DB_EXCL 2048
#define DB_PRIVATE 262144 #define DB_PRIVATE 262144
#define DB_RDONLY 16 #define DB_RDONLY 16
#define DB_RECOVER 32 #define DB_RECOVER 32
......
...@@ -1497,7 +1497,7 @@ int brt_set_dup_compare(BRT brt, int (*dup_compare)(DB *, const DBT*, const DBT* ...@@ -1497,7 +1497,7 @@ int brt_set_dup_compare(BRT brt, int (*dup_compare)(DB *, const DBT*, const DBT*
return 0; return 0;
} }
int brt_open(BRT t, const char *fname, const char *dbname, int is_create, CACHETABLE cachetable, TOKUTXN txn __attribute__((__unused__))) { int brt_open(BRT t, const char *fname, const char *dbname, int is_create, int only_create, CACHETABLE cachetable, TOKUTXN txn __attribute__((__unused__))) {
/* If dbname is NULL then we setup to hold a single tree. Otherwise we setup an array. */ /* If dbname is NULL then we setup to hold a single tree. Otherwise we setup an array. */
int r; int r;
...@@ -1507,6 +1507,7 @@ int brt_open(BRT t, const char *fname, const char *dbname, int is_create, CACHET ...@@ -1507,6 +1507,7 @@ int brt_open(BRT t, const char *fname, const char *dbname, int is_create, CACHET
__FILE__, __LINE__, fname, dbname, is_create, newbrt, nodesize, cachetable)); __FILE__, __LINE__, fname, dbname, is_create, newbrt, nodesize, cachetable));
if (0) { died0: assert(r); return r; } if (0) { died0: assert(r); return r; }
assert(is_create || !only_create);
if (dbname) { if (dbname) {
malloced_name = toku_strdup(dbname); malloced_name = toku_strdup(dbname);
if (malloced_name==0) { if (malloced_name==0) {
...@@ -1557,12 +1558,16 @@ int brt_open(BRT t, const char *fname, const char *dbname, int is_create, CACHET ...@@ -1557,12 +1558,16 @@ int brt_open(BRT t, const char *fname, const char *dbname, int is_create, CACHET
} else { } else {
int i; int i;
assert(r==0); assert(r==0);
assert(dbname);
assert(t->h->unnamed_root==-1); assert(t->h->unnamed_root==-1);
assert(t->h->n_named_roots>=0); assert(t->h->n_named_roots>=0);
for (i=0; i<t->h->n_named_roots; i++) { for (i=0; i<t->h->n_named_roots; i++) {
if (strcmp(t->h->names[i], dbname)==0) { if (strcmp(t->h->names[i], dbname)==0) {
r = EEXIST; if (only_create) {
goto died1; /* deallocate everything. */ r = EEXIST;
goto died1; /* deallocate everything. */
}
else goto found_it;
} }
} }
if ((t->h->names = toku_realloc(t->h->names, (1+t->h->n_named_roots)*sizeof(*t->h->names))) == 0) { assert(errno==ENOMEM); r=ENOMEM; goto died1; } if ((t->h->names = toku_realloc(t->h->names, (1+t->h->n_named_roots)*sizeof(*t->h->names))) == 0) { assert(errno==ENOMEM); r=ENOMEM; goto died1; }
...@@ -1653,6 +1658,7 @@ int open_brt (const char *fname, const char *dbname, int is_create, BRT *newbrt, ...@@ -1653,6 +1658,7 @@ int open_brt (const char *fname, const char *dbname, int is_create, BRT *newbrt,
int (*compare_fun)(DB*,const DBT*,const DBT*)) { int (*compare_fun)(DB*,const DBT*,const DBT*)) {
BRT brt; BRT brt;
int r; int r;
int only_create = 0;
r = brt_create(&brt); r = brt_create(&brt);
if (r != 0) if (r != 0)
...@@ -1660,7 +1666,7 @@ int open_brt (const char *fname, const char *dbname, int is_create, BRT *newbrt, ...@@ -1660,7 +1666,7 @@ int open_brt (const char *fname, const char *dbname, int is_create, BRT *newbrt,
brt_set_nodesize(brt, nodesize); brt_set_nodesize(brt, nodesize);
brt_set_bt_compare(brt, compare_fun); brt_set_bt_compare(brt, compare_fun);
r = brt_open(brt, fname, dbname, is_create, cachetable, txn); r = brt_open(brt, fname, dbname, is_create, only_create, cachetable, txn);
if (r != 0) { if (r != 0) {
return r; return r;
} }
......
...@@ -18,7 +18,7 @@ int brt_set_nodesize(BRT, int nodesize); ...@@ -18,7 +18,7 @@ int brt_set_nodesize(BRT, int nodesize);
int brt_set_bt_compare(BRT, int (*bt_compare)(DB *, const DBT*, const DBT*)); int brt_set_bt_compare(BRT, int (*bt_compare)(DB *, const DBT*, const DBT*));
int brt_set_dup_compare(BRT, int (*dup_compare)(DB *, const DBT*, const DBT*)); int brt_set_dup_compare(BRT, int (*dup_compare)(DB *, const DBT*, const DBT*));
int brt_set_cachetable(BRT, CACHETABLE); int brt_set_cachetable(BRT, CACHETABLE);
int brt_open(BRT, const char *fname, const char *dbname, int is_create, CACHETABLE ct, TOKUTXN txn); int brt_open(BRT, const char *fname, const char *dbname, int is_create, int only_create, CACHETABLE ct, TOKUTXN txn);
int brt_remove_subdb(BRT brt, const char *dbname, u_int32_t flags); int brt_remove_subdb(BRT brt, const char *dbname, u_int32_t flags);
int brt_insert (BRT, DBT *, DBT *, DB*, TOKUTXN); int brt_insert (BRT, DBT *, DBT *, DB*, TOKUTXN);
......
...@@ -4,6 +4,7 @@ ...@@ -4,6 +4,7 @@
#include <assert.h> #include <assert.h>
#include <unistd.h> #include <unistd.h>
#include <db.h> #include <db.h>
#include <errno.h>
// DIR is defined in the Makefile // DIR is defined in the Makefile
...@@ -23,7 +24,13 @@ int main() { ...@@ -23,7 +24,13 @@ int main() {
r = db_create(&db, null_env, 0); r = db_create(&db, null_env, 0);
assert(r == 0); assert(r == 0);
r = db->set_flags(db, DB_DUP); r = db->open(db, null_txn, fname, "main", DB_BTREE, DB_CREATE, 0666);
assert(r == 0);
r = db->close(db, 0);
assert(r == 0);
r = db_create(&db, null_env, 0);
assert(r == 0); assert(r == 0);
r = db->open(db, null_txn, fname, "main", DB_BTREE, DB_CREATE, 0666); r = db->open(db, null_txn, fname, "main", DB_BTREE, DB_CREATE, 0666);
...@@ -35,8 +42,17 @@ int main() { ...@@ -35,8 +42,17 @@ int main() {
r = db_create(&db, null_env, 0); r = db_create(&db, null_env, 0);
assert(r == 0); assert(r == 0);
r = db->open(db, null_txn, fname, "main", DB_BTREE, DB_CREATE, 0666); r = db->open(db, null_txn, fname, "main", DB_BTREE, DB_EXCL, 0666);
assert(r == EINVAL);
r = db->close(db, 0);
assert(r == 0); assert(r == 0);
r = db_create(&db, null_env, 0);
assert(r == 0);
r = db->open(db, null_txn, fname, "main", DB_BTREE, DB_CREATE | DB_EXCL, 0666);
assert(r == EEXIST);
r = db->close(db, 0); r = db->close(db, 0);
assert(r == 0); assert(r == 0);
......
...@@ -577,6 +577,9 @@ int __toku_db_open(DB * db, DB_TXN * txn, const char *fname, const char *dbname, ...@@ -577,6 +577,9 @@ int __toku_db_open(DB * db, DB_TXN * txn, const char *fname, const char *dbname,
int openflags = 0; int openflags = 0;
int r; int r;
if ((flags & DB_EXCL) && !(flags & DB_CREATE)) return EINVAL;
if (db->i->full_fname) if (db->i->full_fname)
return -1; /* It was already open. */ return -1; /* It was already open. */
db->i->full_fname = construct_full_name(db->dbenv->i->dir, fname); db->i->full_fname = construct_full_name(db->dbenv->i->dir, fname);
...@@ -594,17 +597,17 @@ int __toku_db_open(DB * db, DB_TXN * txn, const char *fname, const char *dbname, ...@@ -594,17 +597,17 @@ int __toku_db_open(DB * db, DB_TXN * txn, const char *fname, const char *dbname,
openflags |= O_RDONLY; openflags |= O_RDONLY;
else else
openflags |= O_RDWR; openflags |= O_RDWR;
if (flags & DB_CREATE)
openflags |= O_CREAT;
{ {
struct stat statbuf; struct stat statbuf;
if (stat(db->i->full_fname, &statbuf) == 0) { if (stat(db->i->full_fname, &statbuf) == 0) {
/* If the database exists at the file level, and we specified no db_name, then complain here. */ /* If the database exists at the file level, and we specified no db_name, then complain here. */
if (dbname == 0 && (flags & DB_CREATE)) { if (dbname == 0 && (flags & DB_CREATE)) {
r = EEXIST; if (flags & DB_EXCL) {
goto error_cleanup; r = EEXIST;
goto error_cleanup;
}
flags &= ~DB_CREATE;
} }
} else { } else {
if (!(flags & DB_CREATE)) { if (!(flags & DB_CREATE)) {
...@@ -613,12 +616,13 @@ int __toku_db_open(DB * db, DB_TXN * txn, const char *fname, const char *dbname, ...@@ -613,12 +616,13 @@ int __toku_db_open(DB * db, DB_TXN * txn, const char *fname, const char *dbname,
} }
} }
} }
if (flags & DB_CREATE) openflags |= O_CREAT;
db->i->open_flags = flags; db->i->open_flags = flags;
db->i->open_mode = mode; db->i->open_mode = mode;
r = brt_open(db->i->brt, db->i->full_fname, dbname, flags & DB_CREATE, r = brt_open(db->i->brt, db->i->full_fname, dbname, flags & DB_CREATE,
db->dbenv->i->cachetable, flags & DB_EXCL, db->dbenv->i->cachetable,
txn ? txn->i->tokutxn : NULL_TXN); txn ? txn->i->tokutxn : NULL_TXN);
if (r != 0) if (r != 0)
goto error_cleanup; goto error_cleanup;
......
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