summaryrefslogtreecommitdiff
path: root/src/SessionSerializer.cc
diff options
context:
space:
mode:
authorNils Maier <maierman@web.de>2013-03-01 16:07:16 +0100
committerNils Maier <maierman@web.de>2013-03-02 15:48:26 +0100
commitf2f8b14047c5b0f3a41338440c63ca3f9a591427 (patch)
tree06aeb2584b0d6e1db79b15acadb6612a9af2b590 /src/SessionSerializer.cc
parentb0556a7519af611f665ee5a6ccc1b514a0585bef (diff)
Support for gzipped -i and --save-session
Saved sessions may very large, as in hundreds and even thousands of megabyte when dealing with large queues. Add support to save and reload sessions to gzipped files, when libz is available. The session serializer will output gzipped contents when the file ends with .gz, while the input file reader (UriListParser) will accept whatever is thrown at it.
Diffstat (limited to 'src/SessionSerializer.cc')
-rw-r--r--src/SessionSerializer.cc62
1 files changed, 51 insertions, 11 deletions
diff --git a/src/SessionSerializer.cc b/src/SessionSerializer.cc
index 519cf338..6c4832f5 100644
--- a/src/SessionSerializer.cc
+++ b/src/SessionSerializer.cc
@@ -52,6 +52,10 @@
#include "OptionParser.h"
#include "OptionHandler.h"
+#if HAVE_ZLIB
+#include "GZipFile.h"
+#endif
+
namespace aria2 {
SessionSerializer::SessionSerializer
@@ -66,11 +70,20 @@ bool SessionSerializer::save(const std::string& filename) const
std::string tempFilename = filename;
tempFilename += "__temp";
{
- BufferedFile fp(tempFilename.c_str(), BufferedFile::WRITE);
- if(!fp) {
+ SharedHandle<BufferedFile> fp;
+#if HAVE_ZLIB
+ if (filename.compare(filename.length() - 3, 3, ".gz") == 0) {
+ fp.reset(new GZipFile(tempFilename.c_str(), BufferedFile::WRITE));
+ }
+ else
+#endif
+ {
+ fp.reset(new BufferedFile(tempFilename.c_str(), BufferedFile::WRITE));
+ }
+ if(!fp || !*fp) {
return false;
}
- if(!save(fp) || fp.close() == EOF) {
+ if(!save(*fp) || fp->close() == EOF) {
return false;
}
}
@@ -92,12 +105,36 @@ bool writeOption(BufferedFile& fp, const SharedHandle<Option>& op)
false, false);
for(std::vector<std::string>::const_iterator j = v.begin(),
eoj = v.end(); j != eoj; ++j) {
- if(fp.printf(" %s=%s\n", pref->k, (*j).c_str()) < 0) {
+ if (fp.write(" ", 1) != 1) {
+ return false;
+ }
+ if (fp.write(pref->k) == 0) {
+ return false;
+ }
+ if (fp.write("=", 1) != 1) {
+ return false;
+ }
+ if (!j->empty() && fp.write(j->c_str()) == 0) {
+ return false;
+ }
+ if (fp.write("\n", 1) != 1) {
return false;
}
}
} else {
- if(fp.printf(" %s=%s\n", pref->k, op->get(pref).c_str()) < 0) {
+ if (fp.write(" ", 1) != 1) {
+ return false;
+ }
+ if (fp.write(pref->k) == 0) {
+ return false;
+ }
+ if (fp.write("=", 1) != 1) {
+ return false;
+ }
+ if (fp.write(op->get(pref).c_str()) == 0) {
+ return false;
+ }
+ if (fp.write("\n", 1) != 1) {
return false;
}
}
@@ -152,14 +189,17 @@ bool writeDownloadResult
}
for(std::vector<std::string>::const_iterator i = uris.begin(),
eoi = uris.end(); i != eoi; ++i) {
- if(fp.printf("%s\t", (*i).c_str()) < 0) {
+ if (fp.write(i->c_str()) == 0 || fp.write("\t", 1) != 1) {
return false;
}
}
- if(fp.write("\n", 1) != 1) {
+ if(fp.write("\n gid=", 6) != 6) {
return false;
}
- if(fp.printf(" gid=%s\n", dr->gid->toHex().c_str()) < 0) {
+ if(fp.write(dr->gid->toHex().c_str()) == 0) {
+ return false;
+ }
+ if(fp.write("\n", 1) != 1) {
return false;
}
} else {
@@ -167,12 +207,12 @@ bool writeDownloadResult
return true;
} else {
metainfoCache.insert(mi->getGID());
- if(fp.printf("%s\n", mi->getUri().c_str()) < 0) {
+ if (fp.write(mi->getUri().c_str()) == 0 || fp.write("\n", 1) != 1) {
return false;
}
// For downloads generated by metadata (e.g., BitTorrent,
// Metalink), save gid of Metadata download.
- if(fp.printf(" gid=%s\n", GroupId::toHex(mi->getGID()).c_str()) < 0) {
+ if (fp.write(" gid=", 5) != 5 || fp.write(GroupId::toHex(mi->getGID()).c_str()) == 0 || fp.write("\n", 1) != 1) {
return false;
}
}
@@ -241,7 +281,7 @@ bool SessionSerializer::save(BufferedFile& fp) const
// PREF_PAUSE was removed from option, so save it here looking
// property separately.
if(rg->isPauseRequested()) {
- if(fp.printf(" %s=true\n", PREF_PAUSE->k) < 0) {
+ if (fp.write(" ", 1) != 1 || fp.write(PREF_PAUSE->k) == 0 || fp.write("\n", 1) != 1) {
return false;
}
}