[prev in list] [next in list] [prev in thread] [next in thread] 

List:       kde-commits
Subject:    playground/utils/charm/trunk
From:       Mirko Boehm <mirko () kde ! org>
Date:       2010-03-25 21:30:29
Message-ID: 20100325213029.35C33AC881 () svn ! kde ! org
[Download RAW message or body]

SVN commit 1107518 by mirko:

- add a not fully complete test to verify database transaction support
- add more error handling to the transactor

 M  +1 -1      CMakeLists.txt  
 M  +25 -2     Core/SqlRaiiTransactor.h  
 M  +12 -0     Tests/CMakeLists.txt  
 A             Tests/SqlTransactionTests.cpp   [License: UNKNOWN]
 A             Tests/SqlTransactionTests.h   [License: UNKNOWN]
 M  +1 -1      Tools/TimesheetProcessor/CommandLine.cpp  
 M  +6 -0      Tools/TimesheetProcessor/Database.cpp  


--- trunk/playground/utils/charm/trunk/CMakeLists.txt #1107517:1107518
@@ -1,7 +1,7 @@
 # this is the CMake Project File for Charm
 PROJECT( Charm )
 SET( Charm_VERSION_MAJOR "1" )
-SET( Charm_VERSION_MINOR "3" )
+SET( Charm_VERSION_MINOR "4" )
 SET( Charm_VERSION_PATCH "0" )
 SET( Charm_VERSION_COUNT 3 )
 SET( Charm_VERSION "${Charm_VERSION_MAJOR}.${Charm_VERSION_MINOR}.${Charm_VERSION_PATCH}" \
                )
--- trunk/playground/utils/charm/trunk/Core/SqlRaiiTransactor.h #1107517:1107518
@@ -1,25 +1,48 @@
 #ifndef SQLRAIITRANSACTOR_H
 #define SQLRAIITRANSACTOR_H
 
+#include <exception>
+
 #include <QSqlDatabase>
+#include <QSqlDriver>
 #include <QSqlError>
 
 class SqlRaiiTransactor {
 public:
+    class TransactionException : public std::exception {
+    public:
+        explicit TransactionException( const QString& text = QString() )
+            : mWhat( text )
+        {}
+
+        ~TransactionException() throw()
+        {}
+
+        const char* what() const throw() {
+            return qPrintable( mWhat );
+        }
+    private:
+        QString mWhat;
+    };
+
     SqlRaiiTransactor( QSqlDatabase& database )
         : m_database ( database )
     {
+        if ( ! database.driver()->hasFeature( QSqlDriver::Transactions ) ) {
+            throw TransactionException( QObject::tr( "Database driver does not \
support transactions." ) ); +        }
         m_active = m_database.transaction();
         if ( ! m_active ) {
             qWarning() << "Failed to begin transaction: " << \
m_database.lastError().text(); +            throw TransactionException( QObject::tr( \
"Starting a transaction failed." ) );  }
     }
 
     ~SqlRaiiTransactor() {
         if ( m_active ) {
             if ( ! m_database.rollback() ) {
+                throw TransactionException( QObject::tr( "Database error, \
                transaction rollback failed." ) );
                 qWarning() << "Failed to rollback transaction: " << \
                m_database.lastError().text();
-                // throw database_failure_exception
             }
         }
     }
@@ -34,7 +57,7 @@
                 m_active = false;
                 return true;
             }
-            qWarning() << "Failed to commit transaction: " << \
m_database.lastError().text(); +            throw TransactionException( QObject::tr( \
"Failed to commit transaction: " ) + m_database.lastError().text() );  }
         return false;
     }
--- trunk/playground/utils/charm/trunk/Tests/CMakeLists.txt #1107517:1107518
@@ -93,6 +93,17 @@
    TARGET_LINK_LIBRARIES( ImportExportTests ${QT_QTXML_LIBRARY} )
    TARGET_LINK_LIBRARIES( ImportExportTests ${QT_LIBRARIES} )
 
+   # Sql Transaction Tests:
+   SET( SqlTransactionTests_SRCS SqlTransactionTests.cpp )
+
+   QT4_AUTOMOC( ${SqlTransactionTests_SRCS} )
+
+   ADD_EXECUTABLE( SqlTransactionTests ${SqlTransactionTests_SRCS} )
+
+   TARGET_LINK_LIBRARIES( SqlTransactionTests ${QT_QTTEST_LIBRARY} )
+   TARGET_LINK_LIBRARIES( SqlTransactionTests ${QT_QTXML_LIBRARY} )
+   TARGET_LINK_LIBRARIES( SqlTransactionTests ${QT_LIBRARIES} )
+
    # now add the tests:
    ADD_TEST( SqLiteStorageTests ${EXECUTABLE_OUTPUT_PATH}/SqLiteStorageTests )
    ADD_TEST( ControllerTests ${EXECUTABLE_OUTPUT_PATH}/ControllerTests )
@@ -101,6 +112,7 @@
    ADD_TEST( XmlSerializationTests ${EXECUTABLE_OUTPUT_PATH}/XmlSerializationTests )
    ADD_TEST( TaskStructureTests ${EXECUTABLE_OUTPUT_PATH}/TaskStructureTests )
    ADD_TEST( ImportExportTests ${EXECUTABLE_OUTPUT_PATH}/ImportExportTests )
+   ADD_TEST( SqlTransactionTests ${EXECUTABLE_OUTPUT_PATH}/SqlTransactionTests )
 
 ENDIF ( QT4_FOUND )
 
--- trunk/playground/utils/charm/trunk/Tools/TimesheetProcessor/CommandLine.cpp \
#1107517:1107518 @@ -258,7 +258,7 @@
 			<< endl
 			<< "   * TimesheetProzessor -v                                         <-- print \
version"  << endl
-			<< "   * TimesheetProzessor -a filename -i index -u userid -m comment  <-- add \
timesheet from file with index" +                        << "   * TimesheetProzessor \
-a filename -u userid -m comment  <-- add timesheet from file"  << endl
 			<< "   * TimesheetProzessor -r -i index -u userid                      <-- remove \
timesheet at index"  << endl
--- trunk/playground/utils/charm/trunk/Tools/TimesheetProcessor/Database.cpp \
#1107517:1107518 @@ -1,4 +1,5 @@
 #include <QSqlDatabase>
+#include <QSqlDriver>
 #include <QSqlError>
 #include <QSqlQuery>
 #include <QSqlRecord>
@@ -116,6 +117,11 @@
 			"\"%3\", driver said \"%4\"" ) .arg( database ) .arg( host ) .arg( \
error.driverText() ) .arg( error.databaseText() );  throw \
TimesheetProcessorException( msg );  }
+        // check if the driver has transaction support
+        if( ! m_storage.database().driver()->hasFeature( QSqlDriver::Transactions ) \
) { +            QString msg = QObject::tr( "The database driver in use does not \
support transactions. Transactions are required." ); +            throw \
TimesheetProcessorException( msg ); +        }
 }
 
 void Database::initializeDatabase() throw (TimesheetProcessorException )


[prev in list] [next in list] [prev in thread] [next in thread] 

Configure | About | News | Add a list | Sponsored by KoreLogic