Switch on the TDB_VERSION1 flag.
 
 /* tdb1_tdb.c: */
 int tdb1_store(struct tdb_context *tdb, TDB_DATA key, TDB_DATA dbuf, int flag);
+enum TDB_ERROR tdb1_fetch(struct tdb_context *tdb, TDB_DATA key,
+                         TDB_DATA *data);
 
 /* tdb.c: */
 enum TDB_ERROR COLD tdb_logerr(struct tdb_context *tdb,
 
        struct hash_info h;
        enum TDB_ERROR ecode;
 
+       if (tdb->flags & TDB_VERSION1)
+               return tdb1_fetch(tdb, key, data);
+
        off = find_and_lock(tdb, key, F_RDLCK, &h, &rec, NULL);
        if (TDB_OFF_IS_ERR(off)) {
                return tdb->last_error = off;
 
 
 void tdb1_set_max_dead(struct tdb_context *tdb, int max_dead);
 
-TDB_DATA tdb1_fetch(struct tdb_context *tdb, TDB_DATA key);
-
 int tdb1_parse_record(struct tdb_context *tdb, TDB_DATA key,
                              int (*parser)(TDB_DATA key, TDB_DATA data,
                                            void *private_data),
 
        return ret;
 }
 
-TDB_DATA tdb1_fetch(struct tdb_context *tdb, TDB_DATA key)
+enum TDB_ERROR tdb1_fetch(struct tdb_context *tdb, TDB_DATA key, TDB_DATA *data)
 {
-       TDB_DATA ret = _tdb1_fetch(tdb, key);
-
-       return ret;
+       *data = _tdb1_fetch(tdb, key);
+       if (data->dptr == NULL)
+               return tdb->last_error;
+       return TDB_SUCCESS;
 }
 
 /*
 
        hsize.base.next = &tap_log_attr;
        hsize.tdb1_hashsize.hsize = 1024;
 
-       plan_tests(24);
+       plan_tests(26);
        tdb = tdb_open("run-36-file.tdb1", TDB_VERSION1,
                       O_CREAT|O_TRUNC|O_RDWR, 0600, &hsize);
 
 
        ok1(tdb_store(tdb, key, orig_data, TDB_INSERT) == TDB_SUCCESS);
 
-       data = tdb1_fetch(tdb, key);
+       ok1(tdb_fetch(tdb, key, &data) == TDB_SUCCESS);
        ok1(data.dsize == strlen("world"));
        ok1(memcmp(data.dptr, "world", strlen("world")) == 0);
        free(data.dptr);
        ok1(tdb1_transaction_start(tdb) == 0);
        ok1(tdb_store(tdb, key, orig_data, TDB_INSERT) == TDB_SUCCESS);
 
-       data = tdb1_fetch(tdb, key);
+       ok1(tdb_fetch(tdb, key, &data) == TDB_SUCCESS);
        ok1(data.dsize == strlen("world"));
        ok1(memcmp(data.dptr, "world", strlen("world")) == 0);
        free(data.dptr);
 
        hsize.base.next = &tap_log_attr;
        hsize.tdb1_hashsize.hsize = 1024;
 
-       plan_tests(11);
+       plan_tests(14);
        tdb = tdb_open("run-endian.tdb1",
                       TDB_VERSION1|TDB_CONVERT,
                       O_CREAT|O_TRUNC|O_RDWR, 0600, &hsize);
        ok1(tdb_store(tdb, key, data, TDB_INSERT) == TDB_ERR_EXISTS);
        ok1(tdb_store(tdb, key, data, TDB_MODIFY) == TDB_SUCCESS);
 
-       data = tdb1_fetch(tdb, key);
+       ok1(tdb_fetch(tdb, key, &data) == TDB_SUCCESS);
        ok1(data.dsize == strlen("world"));
        ok1(memcmp(data.dptr, "world", strlen("world")) == 0);
        free(data.dptr);
 
        key.dsize++;
-       data = tdb1_fetch(tdb, key);
+       ok1(tdb_fetch(tdb, key, &data) == TDB_ERR_NOEXIST);
        ok1(data.dptr == NULL);
        tdb_close(tdb);
 
 
        key.dsize = strlen("hi");
        key.dptr = (void *)"hi";
-       data = tdb1_fetch(tdb, key);
+       ok1(tdb_fetch(tdb, key, &data) == TDB_SUCCESS);
        ok1(data.dsize == strlen("world"));
        ok1(memcmp(data.dptr, "world", strlen("world")) == 0);
        free(data.dptr);
 
        dumbhash_attr.base.next = &log_attr;
        dumbhash_attr.hash.fn = tdb1_dumb_hash;
 
-       plan_tests(38 * 2);
+       plan_tests(42 * 2);
 
        for (flags = 0; flags <= TDB_CONVERT; flags += TDB_CONVERT) {
                unsigned int rwmagic = TDB1_HASH_RWLOCK_MAGIC;
                               O_RDWR, 0600, &incompat_hash_attr);
                ok1(tdb);
                ok1(log_count == 0);
-               d = tdb1_fetch(tdb, d);
+               ok1(tdb_fetch(tdb, d, &d) == TDB_SUCCESS);
                ok1(d.dsize == 5);
                free(d.dptr);
                ok1(tdb1_check(tdb, NULL, NULL) == 0);
                               O_RDWR, 0600, &jhash_attr);
                ok1(tdb);
                ok1(log_count == 0);
-               d = tdb1_fetch(tdb, d);
+               ok1(tdb1_fetch(tdb, d, &d) == TDB_SUCCESS);
                ok1(d.dsize == 5);
                free(d.dptr);
                ok1(tdb1_check(tdb, NULL, NULL) == 0);
                ok1(log_count == 0);
                d.dptr = (void *)"Hello";
                d.dsize = 5;
-               d = tdb1_fetch(tdb, d);
+               ok1(tdb_fetch(tdb, d, &d) == TDB_SUCCESS);
                ok1(d.dsize == 5);
                free(d.dptr);
                ok1(tdb1_check(tdb, NULL, NULL) == 0);
                               &dumbhash_attr);
                ok1(tdb);
                ok1(log_count == 0);
-               d = tdb1_fetch(tdb, d);
+               ok1(tdb1_fetch(tdb, d, &d) == TDB_SUCCESS);
                ok1(d.dsize == 5);
                free(d.dptr);
                ok1(tdb1_check(tdb, NULL, NULL) == 0);
 
        hsize.base.next = &tap_log_attr;
        hsize.tdb1_hashsize.hsize = 1024;
 
-       plan_tests(27);
+       plan_tests(30);
        key.dsize = strlen("hi");
        key.dptr = (void *)"hi";
 
        data.dptr = (void *)"world";
        data.dsize = strlen("world");
        ok1(tdb_store(tdb, key, data, TDB_INSERT) == TDB_SUCCESS);
-       data = tdb1_fetch(tdb, key);
+       ok1(tdb_fetch(tdb, key, &data) == TDB_SUCCESS);
        ok1(data.dsize == strlen("world"));
        ok1(memcmp(data.dptr, "world", strlen("world")) == 0);
        free(data.dptr);
        ok1(tdb1_transaction_start(tdb) != 0);
        ok1(tdb_error(tdb) == TDB_ERR_EINVAL);
 
-       data = tdb1_fetch(tdb, key);
+       ok1(tdb_fetch(tdb, key, &data) == TDB_SUCCESS);
        ok1(data.dsize == strlen("world"));
        ok1(memcmp(data.dptr, "world", strlen("world")) == 0);
        free(data.dptr);
        ok1(tdb1_transaction_commit(tdb) == 0);
-       data = tdb1_fetch(tdb, key);
+       ok1(tdb_fetch(tdb, key, &data) == TDB_SUCCESS);
        ok1(data.dsize == strlen("world"));
        ok1(memcmp(data.dptr, "world", strlen("world")) == 0);
        free(data.dptr);
 
        hsize.base.next = &tap_log_attr;
        hsize.tdb1_hashsize.hsize = 1024;
 
-       plan_tests(4);
+       plan_tests(5);
        tdb = tdb_open(NULL, TDB_INTERNAL|TDB_VERSION1, O_CREAT|O_TRUNC|O_RDWR,
                       0600, &hsize);
        ok1(tdb);
 
        ok1(tdb1_append(tdb, key, data) == 0);
        ok1(tdb1_append(tdb, key, data) == 0);
-       data = tdb1_fetch(tdb, key);
+       ok1(tdb_fetch(tdb, key, &data) == TDB_SUCCESS);
        ok1(data.dsize == 0);
        free(data.dptr);
        tdb_close(tdb);
 
        hsize.base.next = &tap_log_attr;
        hsize.tdb1_hashsize.hsize = 1024;
 
-       plan_tests(8);
+       plan_tests(9);
        tdb = tdb_open("run.tdb1", TDB_VERSION1,
                       O_CREAT|O_TRUNC|O_RDWR, 0600, &hsize);
 
        ok1(tdb_store(tdb, key, data, TDB_INSERT) == TDB_ERR_EXISTS);
        ok1(tdb_store(tdb, key, data, TDB_MODIFY) == TDB_SUCCESS);
 
-       data = tdb1_fetch(tdb, key);
+       ok1(tdb_fetch(tdb, key, &data) == TDB_SUCCESS);
        ok1(data.dsize == strlen("world"));
        ok1(memcmp(data.dptr, "world", strlen("world")) == 0);
        free(data.dptr);
 
        key.dsize++;
-       data = tdb1_fetch(tdb, key);
-       ok1(data.dptr == NULL);
+       ok1(tdb_fetch(tdb, key, &data) == TDB_ERR_NOEXIST);
        tdb_close(tdb);
 
        return exit_status();
 
                ret = tdb1_transaction_start(tdb) == 0 ? SUCCESS : OTHER_FAILURE;
                break;
        case FETCH:
-               data = tdb1_fetch(tdb, k);
-               if (data.dptr == NULL) {
+               if (tdb_fetch(tdb, k, &data) != TDB_SUCCESS) {
                        if (tdb->last_error == TDB_ERR_NOEXIST)
                                ret = FAILED;
                        else