+bool Kdb3Database::saveFileTransactional(char* buffer, int size) {
+ QString orgFilename = File->fileName();
+ QFile* tmpFile = new QFile(orgFilename + ".tmp");
+ if (!tmpFile->open(QIODevice::WriteOnly|QIODevice::Truncate)) {
+ tmpFile->remove();
+ delete tmpFile;
+ return false;
+ }
+ if (tmpFile->write(buffer,size) != size) {
+ tmpFile->remove();
+ delete tmpFile;
+ return false;
+ }
+ if (!syncFile(tmpFile))
+ qWarning("Unable to flush file to disk");
+ tmpFile->close();
+ if (!File->remove()) {
+ delete tmpFile;
+ return false;
+ }
+ delete File;
+ File = NULL;
+ if (!tmpFile->rename(orgFilename)) {
+ delete tmpFile;
+ File = new QFile(orgFilename);
+ return false;
+ }
+ File = tmpFile;
+ if (!tmpFile->open(QIODevice::ReadWrite)) {
+ delete tmpFile;
+ return false;
+ }
+
+ return true;
+}
+