From a2efb4f3b09a6a3d698e5ff4d5a94541bad1f72b Mon Sep 17 00:00:00 2001 From: sniperbeamer Date: Mon, 16 Mar 2009 13:57:47 +0000 Subject: [PATCH] Call OS functions to really flush the database to disk git-svn-id: https://svn.code.sf.net/p/keepassx/code/trunk@283 b624d157-de02-0410-bad0-e51aec6abb33 --- src/Kdb3Database.cpp | 5 +++-- src/lib/tools.cpp | 14 ++++++++++++++ src/lib/tools.h | 5 ++--- 3 files changed, 19 insertions(+), 5 deletions(-) diff --git a/src/Kdb3Database.cpp b/src/Kdb3Database.cpp index a81ff8b..8b2c743 100644 --- a/src/Kdb3Database.cpp +++ b/src/Kdb3Database.cpp @@ -1456,7 +1456,7 @@ bool Kdb3Database::save(){ if(!File->resize(size)){ delete [] buffer; error=decodeFileError(File->error()); - return false; + return false; } File->seek(0); if(File->write(buffer,size)!=size){ @@ -1464,7 +1464,8 @@ bool Kdb3Database::save(){ error=decodeFileError(File->error()); return false; } - File->flush(); + if (!syncFile(File)) + qWarning("Unable to flush file to disk"); delete [] buffer; //if(SearchGroupID!=-1)Groups.push_back(SearchGroup); diff --git a/src/lib/tools.cpp b/src/lib/tools.cpp index bc24c06..b8b0fa8 100644 --- a/src/lib/tools.cpp +++ b/src/lib/tools.cpp @@ -24,8 +24,10 @@ #if defined(Q_WS_X11) || defined(Q_WS_MAC) #include + #include #elif defined(Q_WS_WIN) #include + #include #endif void createBanner(QPixmap* Pixmap,const QPixmap* IconAlpha,const QString& Text,int Width){ @@ -236,6 +238,18 @@ bool unlockPage(void* addr, int len){ #endif } +bool syncFile(QFile* file) { + if (!file->flush()) + return false; +#if defined(Q_WS_X11) || defined(Q_WS_MAC) + return (fsync(file->handle())==0); +#elif defined(Q_WS_WIN) + return (_commit(file->handle())==0); +#else + return false; +#endif +} + QTranslator* translator = new QTranslator(); QTranslator* qtTranslator = new QTranslator(); bool translatorActive = false; diff --git a/src/lib/tools.h b/src/lib/tools.h index 5af112d..fb511ea 100644 --- a/src/lib/tools.h +++ b/src/lib/tools.h @@ -30,9 +30,7 @@ struct Translation { }; bool operator<(const Translation& t1, const Translation& t2); -inline const char* CSTR(const QString& str) { - return QTextCodec::codecForLocale()->fromUnicode(str).constData(); -} +#define CSTR(x)(QTextCodec::codecForLocale()->fromUnicode(x).constData()) const QIcon& getIcon(const QString& name); const QPixmap* getPixmap(const QString& name); @@ -48,6 +46,7 @@ QString getImageFile(const QString& name); bool createKeyFile(const QString& filename,QString* err, int length=32, bool Hex=true); bool lockPage(void* addr, int len); bool unlockPage(void* addr, int len); +bool syncFile(QFile* file); void installTranslator(); bool isTranslationActive(); QList getAllTranslations();