test_cursor_null.c 4.03 KB
Newer Older
Yoni Fogel's avatar
Yoni Fogel committed
1 2 3 4
/* -*- mode: C; c-basic-offset: 4 -*- */
#ident "Copyright (c) 2007 Tokutek Inc.  All rights reserved."

#include <string.h>
5
#include <toku_portability.h>
Yoni Fogel's avatar
Yoni Fogel committed
6 7 8 9 10 11 12
#include <db.h>
#include <assert.h>
#include <errno.h>
#include <sys/stat.h>

#include "test.h"

13
// ENVDIR is defined in the Makefile
Yoni Fogel's avatar
Yoni Fogel committed
14 15 16 17 18 19

DB *db;
DB_ENV* dbenv;
DBC*    cursors[(int)256];
DB_TXN* null_txn = NULL;

20 21
static void
put (int _key, int _data) {
Yoni Fogel's avatar
Yoni Fogel committed
22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39
    int r;
    DBT key;
    DBT data;
    dbt_init(&key,  &_key,  sizeof(int));
    dbt_init(&data, &_data, sizeof(int));
    if (_key == -1) {
        key.data = NULL;
        key.size = 0;
    }
    if (_data == -1) {
        data.data = NULL;
        data.size = 0;
    }
    
    r = db->put(db, null_txn, &key, &data, DB_YESOVERWRITE);
    CKERR(r);
}

40 41
static void
cget (u_int32_t flag, BOOL find, char txn, int _key, int _data) {
Yoni Fogel's avatar
Yoni Fogel committed
42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88
    assert(cursors[(int)txn]);

    int r;
    DBT key;
    DBT data;
    if (flag == DB_CURRENT) {
        _key++;
        _data++;
        dbt_init(&key,  &_key,  sizeof(int));
        dbt_init(&data, &_data, sizeof(int));
        _key--;
        _data--;
    }
    else if (flag == DB_SET) {
        dbt_init(&key,  &_key,  sizeof(int));
        if (_key == -1) {
            key.data = NULL;
            key.size = 0;
        }
        _data++;
        dbt_init(&data, &_data, sizeof(int));
        _data--;
    }
    else assert(FALSE);
    r = cursors[(int)txn]->c_get(cursors[(int)txn], &key, &data, flag);
    if (find) {
        CKERR(r);
        if (_key == -1) {
            assert(key.data == NULL);
            assert(key.size == 0);
        }
        else {
            assert(key.size == sizeof(int));
            assert(*(int*)key.data == _key);
        }
        if (_data == -1) {
            assert(data.data == NULL);
            assert(data.size == 0);
        }
        else {
            assert(data.size == sizeof(int));
            assert(*(int*)data.data == _data);
        }
    }
    else        CKERR2(r, DB_NOTFOUND);
}

89 90
static void
init_dbc (char name) {
Yoni Fogel's avatar
Yoni Fogel committed
91 92 93 94 95 96 97 98
    int r;

    assert(!cursors[(int)name]);
    r = db->cursor(db, null_txn, &cursors[(int)name], 0);
        CKERR(r);
    assert(cursors[(int)name]);
}

99 100
static void
close_dbc (char name) {
Yoni Fogel's avatar
Yoni Fogel committed
101 102 103 104 105 106 107 108
    int r;

    assert(cursors[(int)name]);
    r = cursors[(int)name]->c_close(cursors[(int)name]);
        CKERR(r);
    cursors[(int)name] = NULL;
}

109 110
static void
setup_dbs (u_int32_t dup_flags) {
Yoni Fogel's avatar
Yoni Fogel committed
111 112
    int r;

113
    system("rm -rf " ENVDIR);
114
    toku_os_mkdir(ENVDIR, S_IRWXU+S_IRWXG+S_IRWXO);
Yoni Fogel's avatar
Yoni Fogel committed
115 116 117 118 119 120 121
    dbenv   = NULL;
    db      = NULL;
    /* Open/create primary */
    r = db_env_create(&dbenv, 0);
        CKERR(r);
    u_int32_t env_txn_flags  = 0;
    u_int32_t env_open_flags = DB_CREATE | DB_PRIVATE | DB_INIT_MPOOL;
122
	r = dbenv->open(dbenv, ENVDIR, env_open_flags | env_txn_flags, 0600);
Yoni Fogel's avatar
Yoni Fogel committed
123 124 125 126 127 128 129 130 131 132 133 134 135 136 137
        CKERR(r);
    
    r = db_create(&db, dbenv, 0);
        CKERR(r);
    if (dup_flags) {
        r = db->set_flags(db, dup_flags);
            CKERR(r);
    }

    char a;
    r = db->open(db, null_txn, "foobar.db", NULL, DB_BTREE, DB_CREATE, 0600);
        CKERR(r);
    for (a = 'a'; a <= 'z'; a++) init_dbc(a);
}

138 139
static void
close_dbs (void) {
Yoni Fogel's avatar
Yoni Fogel committed
140 141 142 143 144 145 146 147 148 149 150 151 152 153
    char a;
    for (a = 'a'; a <= 'z'; a++) {
        if (cursors[(int)a]) close_dbc(a);
    }

    int r;
    r = db->close(db, 0);
        CKERR(r);
    db      = NULL;
    r = dbenv->close(dbenv, 0);
        CKERR(r);
    dbenv   = NULL;
}

154 155
static void
test (u_int32_t dup_flags) {
Yoni Fogel's avatar
Yoni Fogel committed
156 157 158 159 160 161 162 163 164 165
    /* ********************************************************************** */
    int key;
    int data;
    int i;
    for (i = 0; i < 4; i++) {
        if (i & 0x1) key  = -1;
        else         key  = 1;
        if (i & 0x2) data = -1;
        else         data = 1;
        setup_dbs(dup_flags);
166
        put(key, data);
Yoni Fogel's avatar
Yoni Fogel committed
167 168 169 170 171 172 173
        cget(DB_SET,     TRUE, 'a', key, data);
        cget(DB_CURRENT, TRUE, 'a', key, data);
        close_dbs();
    }
    /* ********************************************************************** */
}

Yoni Fogel's avatar
Yoni Fogel committed
174 175 176
int
test_main(int argc, const char *argv[]) {
    parse_args(argc, argv);
Yoni Fogel's avatar
Yoni Fogel committed
177 178 179 180
    test(0);
    test(DB_DUP | DB_DUPSORT);
    return 0;
}