summaryrefslogtreecommitdiff
path: root/c_src/permdb.c
diff options
context:
space:
mode:
Diffstat (limited to 'c_src/permdb.c')
-rw-r--r--c_src/permdb.c28
1 files changed, 19 insertions, 9 deletions
diff --git a/c_src/permdb.c b/c_src/permdb.c
index ef25be5..218b8c8 100644
--- a/c_src/permdb.c
+++ b/c_src/permdb.c
@@ -276,11 +276,12 @@ indexfile_verify_file(buffered_file *file)
struct commit_info *
read_data_commit_backward(buffered_file *file, node_offset *offset);
-int
+static int
datafile_verify_file(buffered_file *file)
{
unsigned char *header = bf_read(file, 0, sizeof(data_file_cookie), NULL);
if (header == NULL || data_file_cookie != read_be64(header)) {
+ fprintf(stderr, "not a data file\n");
free(header);
return -1;
}
@@ -294,8 +295,8 @@ datafile_verify_file(buffered_file *file)
read_data_commit_backward(file, &offset);
if (data_commit == NULL || validate_checksum(data_commit, file) < 0) {
- dprintf(READ, (stderr, "commit broken: %llu\n",
- (long long unsigned) offset));
+ fprintf(stderr, "commit broken: %llu\n",
+ (long long unsigned) offset);
free(data_commit);
return -1;
}
@@ -437,6 +438,9 @@ permdb_alloc(const char *dbpath)
state->dirtynodes = NULL;
state->error = NULL;
+ state->datafile = NULL;
+ state->indexfile = NULL;
+
state->datafile = bf_open(dbpath, O_RDWR|O_CREAT, "datafile", 1);
if (state->datafile == NULL) {
permdb_free(state);
@@ -462,21 +466,21 @@ permdb_alloc(const char *dbpath)
} else if (bf_total_length(state->datafile) > 0
&& bf_total_length(state->indexfile) == 0) {
if (rebuild_index_file(state) < 0) {
- warnx("index file rebuilding failed");
+ warnx("index file rebuilding failed: %s", dbpath);
permdb_free(state);
return NULL;
}
}
if (datafile_verify_file(state->datafile) < 0) {
- warnx("data file verification failed");
+ warnx("data file verification failed: %s", dbpath);
permdb_free(state);
return NULL;
}
if (indexfile_verify_file(state->indexfile) < 0) {
- warnx("index file verification failed, rebuilding");
+ warnx("index file verification failed, rebuilding: %s", dbpath);
if (rebuild_index_file(state) < 0) {
- warnx("index file rebuilding failed");
+ warnx("index file rebuilding failed: %s", dbpath);
permdb_free(state);
return NULL;
}
@@ -487,8 +491,14 @@ permdb_alloc(const char *dbpath)
void
permdb_free(permdb_object *state)
{
- bf_close(state->datafile);
- bf_close(state->indexfile);
+ if (state->datafile != NULL) {
+ bf_close(state->datafile);
+ }
+
+ if (state->indexfile != NULL) {
+ bf_close(state->indexfile);
+ }
+
delete_all_nodes_in_cache(state);
delete_all_dirty_nodes(state);
free(state);