Add common c-utils, make flatdb aligned on disk
[tedtools.git] / flatdb.c
index 56d78eb..10b3848 100644 (file)
--- a/flatdb.c
+++ b/flatdb.c
@@ -210,6 +210,7 @@ FDBClose(FDB *db) {
                        FDBVacuumFreeSpace(db);
 
                        header.lenfreespace = sizeof(FDBFreeSpace)*db->listcur;
+
                        ptr = findFreeSpace( db, header.lenfreespace );
                
                        if ( ptr ) {
@@ -265,7 +266,7 @@ FDBDelete(FDB *db, off_t offset, size_t length) {
                if ( readLen(db, offset, &length) != FDB_OK )
                        return FDB_ERROR;
 
-       addFreeSpace(db, offset, length);
+       addFreeSpace(db, offset, PTRALIGN(length));
 
        return FDB_OK;
 }
@@ -311,11 +312,14 @@ FDBGet(FDB *db, off_t offset, size_t length, FDBRecord **record) {
 int 
 FDBPut(FDB *db, FDBRecord *record, off_t *offset ) {
        FDBFreeSpace *ptr;
+       size_t  aligned;
 
        if ( db->readonly )
                return FDB_ERROR;
 
-       ptr = findFreeSpace( db, record->length ); 
+       aligned = PTRALIGN(record->length);
+
+       ptr = findFreeSpace( db, aligned ); 
        if ( ptr ) {
                *offset = ptr->offset;
                ptr->length -= record->length;
@@ -334,9 +338,13 @@ FDBPut(FDB *db, FDBRecord *record, off_t *offset ) {
 
        if ( write(db->fd, record, record->length) != record->length ) 
                tlog(TL_CRIT|TL_EXIT,"FDBPut: write failed: %s", strerror(errno));
+       if ( record->length != aligned ) {
+               char    buf[] = {0, 0, 0, 0, 0, 0, 0, 0};
+               if ( write(db->fd, buf, aligned - record->length) != (aligned - record->length) ) 
+                       tlog(TL_CRIT|TL_EXIT,"FDBPut: write failed: %s", strerror(errno));
+       }
 
        return FDB_OK;
-
 }