From eb7e67623e042b7ac447cf51a5da1851e64c7d24 Mon Sep 17 00:00:00 2001 From: Paul Licameli Date: Wed, 2 Sep 2020 14:59:03 -0400 Subject: [PATCH] Demote error message storage from ProjectFileIO into DBConnection --- src/DBConnection.cpp | 22 ++++++++++++++++ src/DBConnection.h | 18 ++++++++++++++ src/ProjectFileIO.cpp | 58 +++++++++++++++++++------------------------ src/ProjectFileIO.h | 16 ++++++------ 4 files changed, 74 insertions(+), 40 deletions(-) diff --git a/src/DBConnection.cpp b/src/DBConnection.cpp index d0b3b8348..db91bd1f1 100644 --- a/src/DBConnection.cpp +++ b/src/DBConnection.cpp @@ -55,6 +55,28 @@ bool DBConnection::ShouldBypass() return mBypass; } +void DBConnection::SetError( + const TranslatableString &msg, const TranslatableString &libraryError) +{ + mLastError = msg; + mLibraryError = libraryError; +} + +void DBConnection::SetDBError( + const TranslatableString &msg, const TranslatableString &libraryError) +{ + mLastError = msg; + wxLogDebug(wxT("SQLite error: %s"), mLastError.Debug()); + printf(" Lib error: %s", mLastError.Debug().mb_str().data()); + + mLibraryError = libraryError.empty() + ? Verbatim(sqlite3_errmsg(DB())) : libraryError; + wxLogDebug(wxT(" Lib error: %s"), mLibraryError.Debug()); + printf(" Lib error: %s", mLibraryError.Debug().mb_str().data()); + + wxASSERT(false); +} + bool DBConnection::Open(const char *fileName) { wxASSERT(mDB == nullptr); diff --git a/src/DBConnection.h b/src/DBConnection.h index c208639c3..0d0dc0105 100644 --- a/src/DBConnection.h +++ b/src/DBConnection.h @@ -69,6 +69,21 @@ public: void SetBypass( bool bypass ); bool ShouldBypass(); + //! Just set stored errors + void SetError( + const TranslatableString &msg, + const TranslatableString &libraryError = {} ); + + //! Set stored errors and write to log; and default libraryError to what database library reports + void SetDBError( + const TranslatableString &msg, + const TranslatableString &libraryError = {} ); + + const TranslatableString &GetLastError() const + { return mLastError; } + const TranslatableString &GetLibraryError() const + { return mLibraryError; } + private: bool ModeConfig(sqlite3 *db, const char *schema, const char *config); @@ -88,6 +103,9 @@ private: std::map mStatements; + TranslatableString mLastError; + TranslatableString mLibraryError; + // Bypass transactions if database will be deleted after close bool mBypass; }; diff --git a/src/ProjectFileIO.cpp b/src/ProjectFileIO.cpp index 6121d477a..7ebbdd6f2 100644 --- a/src/ProjectFileIO.cpp +++ b/src/ProjectFileIO.cpp @@ -507,9 +507,9 @@ int ProjectFileIO::Exec(const char *query, const ExecCB &callback) if (rc != SQLITE_ABORT && errmsg) { SetDBError( - XO("Failed to execute a project file command:\n\n%s").Format(query) + XO("Failed to execute a project file command:\n\n%s").Format(query), + Verbatim(errmsg) ); - mLibraryError = Verbatim(errmsg); } if (errmsg) { @@ -1769,9 +1769,8 @@ bool ProjectFileIO::ImportProject(const FilePath &fileName) if (!xmlFile.ParseString(this, output.GetString())) { SetError( - XO("Unable to parse project information.") + XO("Unable to parse project information."), xmlFile.GetErrorStr() ); - mLibraryError = xmlFile.GetErrorStr(); return false; } @@ -1846,9 +1845,9 @@ bool ProjectFileIO::LoadProject(const FilePath &fileName) if (!success) { SetError( - XO("Unable to parse project information.") + XO("Unable to parse project information."), + xmlFile.GetErrorStr() ); - mLibraryError = xmlFile.GetErrorStr(); return false; } @@ -2122,37 +2121,30 @@ wxLongLong ProjectFileIO::GetFreeDiskSpace() const return -1; } -const TranslatableString &ProjectFileIO::GetLastError() const -{ - return mLastError; -} - -const TranslatableString &ProjectFileIO::GetLibraryError() const -{ - return mLibraryError; -} - -void ProjectFileIO::SetError(const TranslatableString &msg) -{ - mLastError = msg; - mLibraryError = {}; -} - -void ProjectFileIO::SetDBError(const TranslatableString &msg) +const TranslatableString &ProjectFileIO::GetLastError() { auto &currConn = CurrConn(); - mLastError = msg; - wxLogDebug(wxT("SQLite error: %s"), mLastError.Debug()); - printf(" Lib error: %s", mLastError.Debug().mb_str().data()); + return currConn->GetLastError(); +} - if (currConn) - { - mLibraryError = Verbatim(sqlite3_errmsg(currConn->DB())); - wxLogDebug(wxT(" Lib error: %s"), mLibraryError.Debug()); - printf(" Lib error: %s", mLibraryError.Debug().mb_str().data()); - } +const TranslatableString &ProjectFileIO::GetLibraryError() +{ + auto &currConn = CurrConn(); + return currConn->GetLibraryError(); +} - wxASSERT(false); +void ProjectFileIO::SetError( + const TranslatableString &msg, const TranslatableString &libraryError ) +{ + auto &currConn = CurrConn(); + currConn->SetError(msg, libraryError); +} + +void ProjectFileIO::SetDBError( + const TranslatableString &msg, const TranslatableString &libraryError) +{ + auto &currConn = CurrConn(); + currConn->SetDBError(msg, libraryError); } void ProjectFileIO::SetBypass() diff --git a/src/ProjectFileIO.h b/src/ProjectFileIO.h index b5374e80c..effc28c00 100644 --- a/src/ProjectFileIO.h +++ b/src/ProjectFileIO.h @@ -104,8 +104,8 @@ public: // specific database. This is the workhorse for the above 3 methods. static int64_t GetDiskUsage(DBConnection *conn, SampleBlockID blockid); - const TranslatableString &GetLastError() const; - const TranslatableString &GetLibraryError() const; + const TranslatableString &GetLastError(); + const TranslatableString &GetLibraryError(); // Provides a means to bypass "DELETE"s at shutdown if the database // is just going to be deleted anyway. This prevents a noticable @@ -199,8 +199,13 @@ private: bool prune = false, const std::shared_ptr &tracks = nullptr); - void SetError(const TranslatableString & msg); - void SetDBError(const TranslatableString & msg); + //! Just set stored errors + void SetError(const TranslatableString & msg, + const TranslatableString &libraryError = {}); + + //! Set stored errors and write to log; and default libraryError to what database library reports + void SetDBError(const TranslatableString & msg, + const TranslatableString &libraryError = {}); bool ShouldCompact(const std::shared_ptr &tracks); @@ -236,9 +241,6 @@ private: Connection mPrevConn; FilePath mPrevFileName; bool mPrevTemporary; - - TranslatableString mLastError; - TranslatableString mLibraryError; }; // Make a savepoint (a transaction, possibly nested) with the given name;