fix start/stop/pause
[Sak.git] / backupper.cpp
blobb6da89bdd47b5ddd3ed5c757018ff7f98e0f2f4d
1 #include <QSettings>
2 #include <QDebug>
4 #include "task.h"
5 #include "backupper.h"
8 Backupper::Backupper() {
9 // search for backup dir
10 QString path = QFileInfo(QSettings(QSettings::IniFormat, QSettings::UserScope, "ZanzaSoft", "SAK").fileName()).path() + QDir::separator() + "sakbcks";
11 m_dir =QDir(path);
12 m_dir.mkpath(path);
13 m_dir.cd(path);
14 QStringList list = m_dir.entryList();
15 foreach(QString s, list) {
16 QString fullSuffix = QFileInfo(s).completeSuffix();
17 QString baseName = QFileInfo(s).baseName();
18 if (fullSuffix.count() >= 19)
19 fullSuffix = fullSuffix.mid(fullSuffix.count()-19);
20 if (fullSuffix.count() == 19 && fullSuffix[14]=='.' && fullSuffix.mid(15) == "cbck") {
21 QDateTime time = QDateTime::fromString(fullSuffix.left(14), BACKUPDATEFORMAT);
22 qDebug() << "SAK: found cyclic backup " << s << " on date " << time;
23 m_cyclicBackups[baseName][time]= s;
28 void Backupper::doCyclicBackup() {
29 // build the list of files to be backupped
30 QStringList backupPaths;
31 QSettings settings(QSettings::IniFormat, QSettings::UserScope, "ZanzaSoft", "SAK");
32 backupPaths << m_dir.filePath(QFileInfo(settings.fileName()).baseName());
34 QDir saveDir(QFileInfo(settings.fileName()).dir());
35 saveDir.mkdir("SakTasks");
36 saveDir.cd("SakTasks");
37 QStringList nameFilters;
38 nameFilters << "*.xml";
39 QStringList files = saveDir.entryList( nameFilters, QDir::Files);
40 foreach(QString file, files) {
41 backupPaths << m_dir.filePath(file);
44 foreach(QString filePath, backupPaths) {
45 QDateTime now = QDateTime::currentDateTime();
46 QString fileName = filePath + "." + now.toString(BACKUPDATEFORMAT) + ".cbck";
47 QString baseName = QFileInfo(fileName).baseName();
48 QMap<QDateTime, QString>& map = m_cyclicBackups[baseName];
49 QList<QDateTime> list = map.keys();
50 if (list.size() >= m_nCyclicBackups) {
51 int toBeRemoved = list.size() - map.count() + 1;
52 for(int i=0; i< toBeRemoved; i++) {
53 const QDateTime& d = list[i];
54 qWarning() << "SAK: remove old circular backup file " << map[d];
55 QFile(m_dir.filePath(map[d])).remove();
56 map.remove(d);
59 QString origFile = saveDir.filePath(QFileInfo(filePath).fileName());
60 if (!QFile(origFile).copy(fileName) ) {
61 qWarning() << "SAK: failed to copy " << origFile << " to cyclic backup file " << fileName;
62 } else {
63 qWarning() << "SAK: backup " << origFile << " to " << fileName;
68 //BEGIN: INCREMENTAL
70 Incremental::Incremental() {
71 // search for backup dir
72 QString path = QFileInfo(QSettings(QSettings::IniFormat, QSettings::UserScope, "ZanzaSoft", "SAK").fileName()).path() + QDir::separator() + "sakincr";
73 m_dir =QDir(path);
74 m_dir.mkpath(path);
75 m_dir.cd(path);
76 QStringList list = m_dir.entryList();
77 foreach(QString s, list) {
78 QString fullSuffix = QFileInfo(s).completeSuffix();
79 QString task, subtask;
80 int divisor = s.lastIndexOf(":");
81 if (divisor>=0) {
82 task = s.mid(0,divisor);
83 subtask = QFileInfo(s.mid(divisor+1)).baseName();
84 } else {
85 task = QFileInfo(s).baseName();
86 subtask = QString();
88 if (fullSuffix.count() == 19 && fullSuffix[14]=='.' && fullSuffix.mid(15) == "incr") {
89 QDateTime time = QDateTime::fromString(fullSuffix.left(14), BACKUPDATEFORMAT);
90 QFile f(m_dir.filePath(s));
91 if (!f.open(QIODevice::ReadOnly)) {
92 qDebug() << "SAK: error opening file " << f.fileName() << ": " << f.errorString();
94 QDataStream stream(&f);
95 stream.setVersion(QDataStream::Qt_4_3);
96 Hit& p = foundPieces[time];
97 p.task = task;
98 p.subtask = subtask;
99 stream >> p.duration;
100 qDebug() << "SAK: found piece from task \"" << task << "\" subtask \"" << subtask << "\" timestamp " << time << " duration " << Task::hours(p.duration) << " hours";
101 foundFiles << m_dir.filePath(s);
104 lastTimeStamp = QDateTime::currentDateTime();
107 void Incremental::writePiece(const QString& task, const QString& subTask, const QDateTime& now, int value) {
108 QString filename= m_dir.filePath(task + ":" + subTask + "." + now.toString(BACKUPDATEFORMAT) + ".incr");
109 addedFiles << filename;
110 QFile f(filename);
111 f.open(QIODevice::ReadWrite);
112 QDataStream stream(&f);
113 stream.setVersion(QDataStream::Qt_4_3);
114 stream << value;
115 qDebug() << "SAK: write piece of task " << task << " of duration " << Task::hours(value) << " in file " << filename;
116 addedPieces[now] = Hit(task, subTask, value);
117 lastTimeStamp = now;
120 void Incremental::addPiece(const QString& task, const QString& subTask, const QDateTime& now, int value) {
121 foundPieces.insertMulti(now, Hit(task, subTask, value));
122 lastTimeStamp = now;
125 void Incremental::clearAddedPieces() {
126 foreach(const QString& file, addedFiles) {
127 QFile::remove(file);
131 void Incremental::clearMergedPieces() {
132 foreach(const QString& file, foundFiles) {
133 if (!QFile::remove(file))
134 qDebug() << "Failed removing file " << file;
136 foundPieces.clear();