changeset 1585:9a3e03d6a4d5

fix sqlite standalone build
author Sebastien Jodogne <s.jodogne@gmail.com>
date Tue, 25 Aug 2015 19:33:18 +0200
parents 39ecd34fb1c7
children e088bc2c3a1a
files Core/SQLite/Connection.cpp Core/SQLite/OrthancSQLiteException.h Resources/GenerateErrorCodes.py
diffstat 3 files changed, 110 insertions(+), 4 deletions(-) [+]
line wrap: on
line diff
--- a/Core/SQLite/Connection.cpp	Tue Aug 25 17:59:04 2015 +0200
+++ b/Core/SQLite/Connection.cpp	Tue Aug 25 19:33:18 2015 +0200
@@ -162,7 +162,10 @@
       int error = sqlite3_exec(db_, sql, NULL, NULL, NULL);
       if (error == SQLITE_ERROR)
       {
+#if ORTHANC_SQLITE_STANDALONE != 1
         LOG(ERROR) << "SQLite execute error: " << sqlite3_errmsg(db_);
+#endif
+
         throw OrthancSQLiteException(ErrorCode_SQLiteExecute);
       }
       else
--- a/Core/SQLite/OrthancSQLiteException.h	Tue Aug 25 17:59:04 2015 +0200
+++ b/Core/SQLite/OrthancSQLiteException.h	Tue Aug 25 19:33:18 2015 +0200
@@ -45,17 +45,99 @@
 {
   namespace SQLite
   {
+    // Auto-generated by "Resources/GenerateErrorCodes.py"
+    enum ErrorCode
+    {
+      ErrorCode_ParameterOutOfRange,
+      ErrorCode_BadParameterType,
+      ErrorCode_SQLiteNotOpened,
+      ErrorCode_SQLiteAlreadyOpened,
+      ErrorCode_SQLiteCannotOpen,
+      ErrorCode_SQLiteStatementAlreadyUsed,
+      ErrorCode_SQLiteExecute,
+      ErrorCode_SQLiteRollbackWithoutTransaction,
+      ErrorCode_SQLiteCommitWithoutTransaction,
+      ErrorCode_SQLiteRegisterFunction,
+      ErrorCode_SQLiteFlush,
+      ErrorCode_SQLiteCannotRun,
+      ErrorCode_SQLiteCannotStep,
+      ErrorCode_SQLiteBindOutOfRange,
+      ErrorCode_SQLitePrepareStatement,
+      ErrorCode_SQLiteTransactionAlreadyStarted,
+      ErrorCode_SQLiteTransactionCommit,
+      ErrorCode_SQLiteTransactionBegin
+    };
+
     class OrthancSQLiteException : public ::std::runtime_error
     {
     public:
-      OrthancSQLiteException(const std::string& what) :
-        ::std::runtime_error(what)
+      OrthancSQLiteException(ErrorCode error) :
+        ::std::runtime_error(EnumerationToString(error))
       {
       }
 
-      OrthancSQLiteException(const char* what) : 
-        ::std::runtime_error(what)
+      // Auto-generated by "Resources/GenerateErrorCodes.py"
+      static const char* EnumerationToString(ErrorCode code)
       {
+        switch (code)
+        {
+          case ErrorCode_ParameterOutOfRange:
+            return "Parameter out of range";
+
+          case ErrorCode_BadParameterType:
+            return "Bad type for a parameter";
+
+          case ErrorCode_SQLiteNotOpened:
+            return "SQLite: The database is not opened";
+
+          case ErrorCode_SQLiteAlreadyOpened:
+            return "SQLite: Connection is already open";
+
+          case ErrorCode_SQLiteCannotOpen:
+            return "SQLite: Unable to open the database";
+
+          case ErrorCode_SQLiteStatementAlreadyUsed:
+            return "SQLite: This cached statement is already being referred to";
+
+          case ErrorCode_SQLiteExecute:
+            return "SQLite: Cannot execute a command";
+
+          case ErrorCode_SQLiteRollbackWithoutTransaction:
+            return "SQLite: Rolling back a nonexistent transaction (have you called Begin()?)";
+
+          case ErrorCode_SQLiteCommitWithoutTransaction:
+            return "SQLite: Committing a nonexistent transaction";
+
+          case ErrorCode_SQLiteRegisterFunction:
+            return "SQLite: Unable to register a function";
+
+          case ErrorCode_SQLiteFlush:
+            return "SQLite: Unable to flush the database";
+
+          case ErrorCode_SQLiteCannotRun:
+            return "SQLite: Cannot run a cached statement";
+
+          case ErrorCode_SQLiteCannotStep:
+            return "SQLite: Cannot step over a cached statement";
+
+          case ErrorCode_SQLiteBindOutOfRange:
+            return "SQLite: Bing a value while out of range (serious error)";
+
+          case ErrorCode_SQLitePrepareStatement:
+            return "SQLite: Cannot prepare a cached statement";
+
+          case ErrorCode_SQLiteTransactionAlreadyStarted:
+            return "SQLite: Beginning the same transaction twice";
+
+          case ErrorCode_SQLiteTransactionCommit:
+            return "SQLite: Failure when committing the transaction";
+
+          case ErrorCode_SQLiteTransactionBegin:
+            return "SQLite: Cannot start a transaction";
+
+          default:
+            return "Unknown error code";
+        }
       }
     };
   }
--- a/Resources/GenerateErrorCodes.py	Tue Aug 25 17:59:04 2015 +0200
+++ b/Resources/GenerateErrorCodes.py	Tue Aug 25 19:33:18 2015 +0200
@@ -111,3 +111,24 @@
 
 with open(path, 'w') as f:
     f.write(a)
+
+
+
+##
+## Generate the "ErrorCode" enumeration in "OrthancSQLiteException.h"
+##
+
+path = os.path.join(BASE, 'Core', 'SQLite', 'OrthancSQLiteException.h')
+with open(path, 'r') as f:
+    a = f.read()
+
+e = filter(lambda x: 'SQLite' in x and x['SQLite'], ERRORS)
+s = ',\n'.join(map(lambda x: '      ErrorCode_%s' % x['Name'], e))
+a = re.sub('(enum ErrorCode\s*{)[^}]*?(\s*};)', r'\1\n%s\2' % s, a, re.DOTALL)
+
+s = '\n\n'.join(map(lambda x: '          case ErrorCode_%s:\n            return "%s";' % (x['Name'], x['Description']), e))
+a = re.sub('(EnumerationToString\(ErrorCode.*?\)\s*{\s*switch \([^)]*?\)\s*{)[^}]*?(\s*default:)',
+           r'\1\n%s\2' % s, a, re.DOTALL)
+
+with open(path, 'w') as f:
+    f.write(a)