8 Backupper::Backupper() {
9 // search for backup dir
10 QString path
= QFileInfo(QSettings(QSettings::IniFormat
, QSettings::UserScope
, "ZanzaSoft", "SAK").fileName()).path() + QDir::separator() + "sakbcks";
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();
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
;
63 qWarning() << "SAK: backup " << origFile
<< " to " << fileName
;
70 Incremental::Incremental() {
71 // search for backup dir
72 QString path
= QFileInfo(QSettings(QSettings::IniFormat
, QSettings::UserScope
, "ZanzaSoft", "SAK").fileName()).path() + QDir::separator() + "sakincr";
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(":");
82 task
= s
.mid(0,divisor
);
83 subtask
= QFileInfo(s
.mid(divisor
+1)).baseName();
85 task
= QFileInfo(s
).baseName();
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
];
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
;
111 f
.open(QIODevice::ReadWrite
);
112 QDataStream
stream(&f
);
113 stream
.setVersion(QDataStream::Qt_4_3
);
115 qDebug() << "SAK: write piece of task " << task
<< " of duration " << Task::hours(value
) << " in file " << filename
;
116 addedPieces
[now
] = Hit(task
, subTask
, value
);
120 void Incremental::addPiece(const QString
& task
, const QString
& subTask
, const QDateTime
& now
, int value
) {
121 foundPieces
.insertMulti(now
, Hit(task
, subTask
, value
));
125 void Incremental::clearAddedPieces() {
126 foreach(const QString
& file
, addedFiles
) {
131 void Incremental::clearMergedPieces() {
132 foreach(const QString
& file
, foundFiles
) {
133 if (!QFile::remove(file
))
134 qDebug() << "Failed removing file " << file
;