summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--c_src/permdb.c28
-rw-r--r--c_src/permdbport.c1
-rw-r--r--c_src/permdbpy.c11
3 files changed, 30 insertions, 10 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);
diff --git a/c_src/permdbport.c b/c_src/permdbport.c
index 39b0b72..f5f151d 100644
--- a/c_src/permdbport.c
+++ b/c_src/permdbport.c
@@ -31,6 +31,7 @@ main(int argc, char *argv[])
permdb_object *state = permdb_alloc(store);
if (state == NULL) {
+ fprintf(stderr, "permdbport failed to start\n");
write_reply(NULL, 0, 4);
return 1;
}
diff --git a/c_src/permdbpy.c b/c_src/permdbpy.c
index beea36a..bfad068 100644
--- a/c_src/permdbpy.c
+++ b/c_src/permdbpy.c
@@ -45,8 +45,17 @@ PyTypeObject permdb_type = {
permdb_object_py *
permdb_alloc_py(const char *dbpath)
{
+ struct permdb_object *permdb;
+
+ permdb = permdb_alloc(dbpath);
+
+ if (permdb == NULL) {
+ PyErr_SetString(PyExc_RuntimeError, "Cannot allocate permdb object");
+ return NULL;
+ }
+
permdb_object_py *state = PyObject_New(permdb_object_py, &permdb_type);
- state->permdb = permdb_alloc(dbpath);
+ state->permdb = permdb;
return state;
}