- DBT dkey, ddata;
- DB_TXN *tid;
- int ret;
-
- memset(&dkey, 0, sizeof(DBT));
- memset(&ddata, 0, sizeof(DBT));
- dkey.size = ckeylen;
- dkey.data = ckey;
- ddata.size = cdatalen;
- ddata.data = cdata;
-
- if (MYTID != NULL)
- {
- ret = dbp[cdb]->put(dbp[cdb], /* db */
- MYTID, /* transaction ID */
- &dkey, /* key */
- &ddata, /* data */
- 0); /* flags */
- if (ret)
- {
- lprintf(1, "cdb_store(%d): %s\n", cdb,
- db_strerror(ret));
- abort();
- }
- return ret;
-
- }
- else
- {
- bailIfCursor(MYCURSORS, "attempt to write during r/o cursor");
-
- retry:
- txbegin(&tid);
-
- if ((ret = dbp[cdb]->put(dbp[cdb], /* db */
- tid, /* transaction ID */
- &dkey, /* key */
- &ddata, /* data */
- 0))) /* flags */
- {
- if (ret == DB_LOCK_DEADLOCK)
- {
- txabort(tid);
- goto retry;
- }
- else
- {
- lprintf(1, "cdb_store(%d): %s\n", cdb,
- db_strerror(ret));
- abort();
- }
- }
- else
- {
- txcommit(tid);
- return ret;
- }
- }
+ DBT dkey, ddata;
+ DB_TXN *tid;
+ int ret = 0;
+
+#ifdef HAVE_ZLIB
+ struct CtdlCompressHeader zheader;
+ char *compressed_data = NULL;
+ int compressing = 0;
+ size_t buffer_len = 0;
+ uLongf destLen = 0;
+#endif
+
+ memset(&dkey, 0, sizeof(DBT));
+ memset(&ddata, 0, sizeof(DBT));
+ dkey.size = ckeylen;
+ dkey.data = ckey;
+ ddata.size = cdatalen;
+ ddata.data = cdata;
+
+#ifdef HAVE_ZLIB
+ /* Only compress Visit records. Everything else is uncompressed. */
+ if (cdb == CDB_VISIT) {
+ compressing = 1;
+ zheader.magic = COMPRESS_MAGIC;
+ zheader.uncompressed_len = cdatalen;
+ buffer_len = ((cdatalen * 101) / 100) + 100
+ + sizeof(struct CtdlCompressHeader);
+ destLen = (uLongf) buffer_len;
+ compressed_data = malloc(buffer_len);
+ if (compress2((Bytef *) (compressed_data +
+ sizeof(struct
+ CtdlCompressHeader)),
+ &destLen, (Bytef *) cdata, (uLongf) cdatalen,
+ 1) != Z_OK) {
+ CtdlLogPrintf(CTDL_EMERG, "compress2() error\n");
+ abort();
+ }
+ zheader.compressed_len = (size_t) destLen;
+ memcpy(compressed_data, &zheader,
+ sizeof(struct CtdlCompressHeader));
+ ddata.size = (size_t) (sizeof(struct CtdlCompressHeader) +
+ zheader.compressed_len);
+ ddata.data = compressed_data;
+ }
+#endif
+
+ if (MYTID != NULL) {
+ ret = dbp[cdb]->put(dbp[cdb], /* db */
+ MYTID, /* transaction ID */
+ &dkey, /* key */
+ &ddata, /* data */
+ 0); /* flags */
+ if (ret) {
+ CtdlLogPrintf(CTDL_EMERG, "cdb_store(%d): %s\n", cdb,
+ db_strerror(ret));
+ abort();
+ }
+#ifdef HAVE_ZLIB
+ if (compressing)
+ free(compressed_data);
+#endif
+ return ret;
+
+ } else {
+ bailIfCursor(MYCURSORS,
+ "attempt to write during r/o cursor");
+
+ retry:
+ txbegin(&tid);
+
+ if ((ret = dbp[cdb]->put(dbp[cdb], /* db */
+ tid, /* transaction ID */
+ &dkey, /* key */
+ &ddata, /* data */
+ 0))) { /* flags */
+ if (ret == DB_LOCK_DEADLOCK) {
+ txabort(tid);
+ goto retry;
+ } else {
+ CtdlLogPrintf(CTDL_EMERG, "cdb_store(%d): %s\n",
+ cdb, db_strerror(ret));
+ abort();
+ }
+ } else {
+ txcommit(tid);
+#ifdef HAVE_ZLIB
+ if (compressing)
+ free(compressed_data);
+#endif
+ return ret;
+ }
+ }