aboutsummaryrefslogtreecommitdiff
path: root/src/libutil/compression.cc
diff options
context:
space:
mode:
authorEelco Dolstra <eelco.dolstra@logicblox.com>2016-04-29 17:02:57 +0200
committerEelco Dolstra <eelco.dolstra@logicblox.com>2016-04-29 17:02:57 +0200
commit5acb6914020a94be8468d7670b564388c59794ee (patch)
tree0ba3c95263577cab2cd5a69810c755485ef57a4c /src/libutil/compression.cc
parent8e065c6b3e36e4cd113769575c0045b6d42357ef (diff)
BinaryCacheStore: Support "none" compression method
Diffstat (limited to 'src/libutil/compression.cc')
-rw-r--r--src/libutil/compression.cc28
1 files changed, 24 insertions, 4 deletions
diff --git a/src/libutil/compression.cc b/src/libutil/compression.cc
index beede1321..e8a820d30 100644
--- a/src/libutil/compression.cc
+++ b/src/libutil/compression.cc
@@ -15,7 +15,7 @@ struct LzmaStream
lzma_stream & operator()() { return strm; }
};
-std::string compressXZ(const std::string & in)
+static ref<std::string> compressXZ(const std::string & in)
{
LzmaStream strm;
@@ -28,7 +28,7 @@ std::string compressXZ(const std::string & in)
lzma_action action = LZMA_RUN;
uint8_t outbuf[BUFSIZ];
- string res;
+ ref<std::string> res = make_ref<std::string>();
strm().next_in = (uint8_t *) in.c_str();
strm().avail_in = in.size();
strm().next_out = outbuf;
@@ -43,7 +43,7 @@ std::string compressXZ(const std::string & in)
lzma_ret ret = lzma_code(&strm(), action);
if (strm().avail_out == 0 || ret == LZMA_STREAM_END) {
- res.append((char *) outbuf, sizeof(outbuf) - strm().avail_out);
+ res->append((char *) outbuf, sizeof(outbuf) - strm().avail_out);
strm().next_out = outbuf;
strm().avail_out = sizeof(outbuf);
}
@@ -56,7 +56,7 @@ std::string compressXZ(const std::string & in)
}
}
-ref<std::string> decompressXZ(const std::string & in)
+static ref<std::string> decompressXZ(const std::string & in)
{
LzmaStream strm;
@@ -95,4 +95,24 @@ ref<std::string> decompressXZ(const std::string & in)
}
}
+ref<std::string> compress(const std::string & method, ref<std::string> in)
+{
+ if (method == "none")
+ return in;
+ else if (method == "xz")
+ return compressXZ(*in);
+ else
+ throw UnknownCompressionMethod(format("unknown compression method ā€˜%sā€™") % method);
+}
+
+ref<std::string> decompress(const std::string & method, ref<std::string> in)
+{
+ if (method == "none")
+ return in;
+ else if (method == "xz")
+ return decompressXZ(*in);
+ else
+ throw UnknownCompressionMethod(format("unknown compression method ā€˜%sā€™") % method);
+}
+
}