diff options
author | Max Kellermann <max@duempel.org> | 2014-08-11 21:30:49 +0200 |
---|---|---|
committer | Max Kellermann <max@duempel.org> | 2014-08-11 21:48:25 +0200 |
commit | 2e122e150928dc7cc52a77a3ebec0427146cd2af (patch) | |
tree | ad31bb1019f0058ba0e4507eabe372659028cced /src/db/plugins/simple | |
parent | 486b5b6bfc61344c945d807b230c12a99c3c8edb (diff) | |
download | mpd-2e122e150928dc7cc52a77a3ebec0427146cd2af.tar.gz mpd-2e122e150928dc7cc52a77a3ebec0427146cd2af.tar.xz mpd-2e122e150928dc7cc52a77a3ebec0427146cd2af.zip |
db/simple: compress the database file using gzip
Diffstat (limited to 'src/db/plugins/simple')
-rw-r--r-- | src/db/plugins/simple/SimpleDatabasePlugin.cxx | 58 | ||||
-rw-r--r-- | src/db/plugins/simple/SimpleDatabasePlugin.hxx | 7 |
2 files changed, 60 insertions, 5 deletions
diff --git a/src/db/plugins/simple/SimpleDatabasePlugin.cxx b/src/db/plugins/simple/SimpleDatabasePlugin.cxx index 9e750996c..3048194cd 100644 --- a/src/db/plugins/simple/SimpleDatabasePlugin.cxx +++ b/src/db/plugins/simple/SimpleDatabasePlugin.cxx @@ -34,6 +34,7 @@ #include "fs/io/TextFile.hxx" #include "fs/io/BufferedOutputStream.hxx" #include "fs/io/FileOutputStream.hxx" +#include "fs/io/GzipOutputStream.hxx" #include "config/ConfigData.hxx" #include "fs/FileSystem.hxx" #include "util/CharUtil.hxx" @@ -48,13 +49,23 @@ static constexpr Domain simple_db_domain("simple_db"); inline SimpleDatabase::SimpleDatabase() :Database(simple_db_plugin), path(AllocatedPath::Null()), +#ifdef HAVE_ZLIB + compress(true), +#endif cache_path(AllocatedPath::Null()), prefixed_light_song(nullptr) {} -inline SimpleDatabase::SimpleDatabase(AllocatedPath &&_path) +inline SimpleDatabase::SimpleDatabase(AllocatedPath &&_path, +#ifndef HAVE_ZLIB + gcc_unused +#endif + bool _compress) :Database(simple_db_plugin), path(std::move(_path)), path_utf8(path.ToUTF8()), +#ifdef HAVE_ZLIB + compress(_compress), +#endif cache_path(AllocatedPath::Null()), prefixed_light_song(nullptr) { } @@ -90,6 +101,10 @@ SimpleDatabase::Configure(const config_param ¶m, Error &error) if (path.IsNull() && error.IsDefined()) return false; +#ifdef HAVE_ZLIB + compress = param.GetBlockValue("compress", compress); +#endif + return true; } @@ -369,11 +384,42 @@ SimpleDatabase::Save(Error &error) if (!fos.IsDefined()) return false; - BufferedOutputStream bos(fos); + OutputStream *os = &fos; + +#ifdef HAVE_ZLIB + GzipOutputStream *gzip = nullptr; + if (compress) { + gzip = new GzipOutputStream(*os, error); + if (!gzip->IsDefined()) { + delete gzip; + return false; + } + + os = gzip; + } +#endif + + BufferedOutputStream bos(*os); db_save_internal(bos, *root); - if (!bos.Flush(error) || !fos.Commit(error)) + if (!bos.Flush(error)) { +#ifdef HAVE_ZLIB + delete gzip; +#endif + return false; + } + +#ifdef HAVE_ZLIB + if (gzip != nullptr) { + bool success = gzip->Flush(error); + delete gzip; + if (!success) + return false; + } +#endif + + if (!fos.Commit(error)) return false; struct stat st; @@ -435,8 +481,12 @@ SimpleDatabase::Mount(const char *local_uri, const char *storage_uri, std::string name(storage_uri); std::replace_if(name.begin(), name.end(), IsUnsafeChar, '_'); +#ifndef HAVE_ZLIB + constexpr bool compress = false; +#endif auto db = new SimpleDatabase(AllocatedPath::Build(cache_path, - name.c_str())); + name.c_str()), + compress); if (!db->Open(error)) { delete db; return false; diff --git a/src/db/plugins/simple/SimpleDatabasePlugin.hxx b/src/db/plugins/simple/SimpleDatabasePlugin.hxx index e27b3d956..7ba71e272 100644 --- a/src/db/plugins/simple/SimpleDatabasePlugin.hxx +++ b/src/db/plugins/simple/SimpleDatabasePlugin.hxx @@ -20,6 +20,7 @@ #ifndef MPD_SIMPLE_DATABASE_PLUGIN_HXX #define MPD_SIMPLE_DATABASE_PLUGIN_HXX +#include "check.h" #include "db/Interface.hxx" #include "fs/AllocatedPath.hxx" #include "db/LightSong.hxx" @@ -38,6 +39,10 @@ class SimpleDatabase : public Database { AllocatedPath path; std::string path_utf8; +#ifdef HAVE_ZLIB + bool compress; +#endif + /** * The path where cache files for Mount() are located. */ @@ -64,7 +69,7 @@ class SimpleDatabase : public Database { SimpleDatabase(); - SimpleDatabase(AllocatedPath &&_path); + SimpleDatabase(AllocatedPath &&_path, bool _compress); public: static Database *Create(EventLoop &loop, DatabaseListener &listener, |