}
-// Decompress a database item if it was compressed on disk
-void bdb_decompress_if_necessary(struct cdbdata *cdb) {
+// Decompress a DBT data block if it was compressed on disk.
+void bdb_decompress_if_necessary(DBT *d) {
static int magic = COMPRESS_MAGIC;
- if ((cdb == NULL) || (cdb->ptr == NULL) || (cdb->len < sizeof(magic)) || (memcmp(cdb->ptr, &magic, sizeof(magic)))) {
- cdb->cdbfree_must_free_ptr = 0;
+ if ((d == NULL) || (d->data == NULL) || (d->size < sizeof(magic)) || (memcmp(d->data, &magic, sizeof(magic)))) {
return;
}
memset(&zheader, 0, sizeof(struct CtdlCompressHeader));
cplen = sizeof(struct CtdlCompressHeader);
- if (sizeof(struct CtdlCompressHeader) > cdb->len) {
- cplen = cdb->len;
+ if (sizeof(struct CtdlCompressHeader) > d->size) {
+ cplen = d->size;
}
- memcpy(&zheader, cdb->ptr, cplen);
+ memcpy(&zheader, d->data, cplen);
- compressed_data = cdb->ptr;
+ compressed_data = d->data;
compressed_data += sizeof(struct CtdlCompressHeader);
sourceLen = (uLongf) zheader.compressed_len;
bdb_abort();
}
- //free(cdb->ptr);
- cdb->len = (size_t) destLen;
- cdb->ptr = uncompressed_data;
- cdb->cdbfree_must_free_ptr = 1;
+ free(d->data);
+ d->size = (size_t) destLen;
+ d->data = uncompressed_data;
}
return NULL;
}
+ bdb_decompress_if_necessary(&TSD->dbdata[cdb]);
+
tempcdb = (struct cdbdata *) malloc(sizeof(struct cdbdata));
if (tempcdb == NULL) {
syslog(LOG_ERR, "bdb: bdb_fetch() cannot allocate memory for tempcdb: %m");
else {
tempcdb->len = TSD->dbdata[cdb].size;
tempcdb->ptr = TSD->dbdata[cdb].data;
- bdb_decompress_if_necessary(tempcdb);
return (tempcdb);
}
}
// Free a cdbdata item.
void bdb_free(struct cdbdata *cdb) {
- if (cdb->cdbfree_must_free_ptr) {
- free(cdb->ptr);
- }
free(cdb);
}
return NULL; // presumably, we are at the end
}
+ bdb_decompress_if_necessary(&TSD->dbdata[cdb]);
+
cdbret = (struct cdbdata *) malloc(sizeof(struct cdbdata));
cdbret->len = TSD->dbdata[cdb].size;
cdbret->ptr = TSD->dbdata[cdb].data;
- bdb_decompress_if_necessary(cdbret);
return (cdbret);
}