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