working-on fix
[Sak.git] / backupper.cpp
bloba2cdcece9a552ad3e56ac9751dedbe226de9a769
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 qDebug() << "CICLIC //////////////////////////////////////////////////////////////////////////////////////////////";
30 // build the list of files to be backupped
31 QStringList backupPaths;
32 QSettings settings(QSettings::IniFormat, QSettings::UserScope, "ZanzaSoft", "SAK");
33 backupPaths << m_dir.filePath(QFileInfo(settings.fileName()).baseName());
35 QDir saveDir(QFileInfo(settings.fileName()).dir());
36 saveDir.mkdir("SakTasks");
37 saveDir.cd("SakTasks");
38 QStringList nameFilters;
39 nameFilters << "*.xml";
40 QStringList files = saveDir.entryList( nameFilters, QDir::Files);
41 foreach(QString file, files) {
42 backupPaths << m_dir.filePath(file);
45 foreach(QString filePath, backupPaths) {
46 QDateTime now = QDateTime::currentDateTime();
47 QString fileName = filePath + "." + now.toString(BACKUPDATEFORMAT) + ".cbck";
48 QString baseName = QFileInfo(fileName).baseName();
49 QMap<QDateTime, QString>& map = m_cyclicBackups[baseName];
50 QList<QDateTime> list = map.keys();
51 if (list.size() >= m_nCyclicBackups) {
52 int toBeRemoved = list.size() - m_nCyclicBackups + 1;
53 for(int i=0; i< toBeRemoved; i++) {
54 const QDateTime& d = list[i];
55 qWarning() << "SAK: remove old circular backup file " << map[d];
56 QFile(m_dir.filePath(map[d])).remove();
57 map.remove(d);
60 QString origFile = saveDir.filePath(QFileInfo(filePath).fileName());
61 if (!QFile(origFile).copy(fileName) ) {
62 qWarning() << "SAK: failed to copy " << origFile << " to cyclic backup file " << fileName;
63 } else {
64 qWarning() << "SAK: backup " << origFile << " to " << fileName;
69 //BEGIN: INCREMENTAL
71 Incremental::Incremental() {
72 // search for backup dir
73 QString path = QFileInfo(QSettings(QSettings::IniFormat, QSettings::UserScope, "ZanzaSoft", "SAK").fileName()).path() + QDir::separator() + "sakincr";
74 m_dir =QDir(path);
75 m_dir.mkpath(path);
76 m_dir.cd(path);
77 QStringList list = m_dir.entryList();
78 foreach(QString s, list) {
79 QString fullSuffix = QFileInfo(s).completeSuffix();
80 QString task, subtask;
81 int divisor = s.lastIndexOf(":");
82 if (divisor>=0) {
83 task = s.mid(0,divisor);
84 subtask = QFileInfo(s.mid(divisor+1)).baseName();
85 } else {
86 task = QFileInfo(s).baseName();
87 subtask = QString();
89 if (fullSuffix.count() == 19 && fullSuffix[14]=='.' && fullSuffix.mid(15) == "incr") {
90 QDateTime time = QDateTime::fromString(fullSuffix.left(14), BACKUPDATEFORMAT);
91 QFile f(m_dir.filePath(s));
92 if (!f.open(QIODevice::ReadOnly)) {
93 qDebug() << "SAK: error opening file " << f.fileName() << ": " << f.errorString();
95 QDataStream stream(&f);
96 stream.setVersion(QDataStream::Qt_4_3);
97 Hit& p = foundPieces[time];
98 p.task = task;
99 p.subtask = subtask;
100 stream >> p.duration;
101 qDebug() << "SAK: found piece from task \"" << task << "\" subtask \"" << subtask << "\" timestamp " << time << " duration " << Task::hours(p.duration) << " hours";
102 foundFiles << m_dir.filePath(s);
105 lastTimeStamp = QDateTime::currentDateTime();
108 void Incremental::writePiece(const QString& task, const QString& subTask, const QDateTime& now, int value) {
109 QString filename= m_dir.filePath(task + ":" + subTask + "." + now.toString(BACKUPDATEFORMAT) + ".incr");
110 addedFiles << filename;
111 QFile f(filename);
112 f.open(QIODevice::ReadWrite);
113 QDataStream stream(&f);
114 stream.setVersion(QDataStream::Qt_4_3);
115 stream << value;
116 qDebug() << "SAK: write piece of task " << task << " of duration " << Task::hours(value) << " in file " << filename;
117 addedPieces[now] = Hit(task, subTask, value);
118 lastTimeStamp = now;
121 void Incremental::addPiece(const QString& task, const QString& subTask, const QDateTime& now, int value) {
122 foundPieces.insertMulti(now, Hit(task, subTask, value));
123 lastTimeStamp = now;
126 void Incremental::clearAddedPieces() {
127 foreach(const QString& file, addedFiles) {
128 QFile::remove(file);
132 void Incremental::clearMergedPieces() {
133 foreach(const QString& file, foundFiles) {
134 if (!QFile::remove(file))
135 qDebug() << "Failed removing file " << file;
137 foundPieces.clear();