commit 95b60eb2832a396773a9c8e5dbe721abf1772cc8
Author: Christian Ehringfeld <c.ehringfeld@t-online.de>
Date:   Thu Jun 25 00:52:44 2015 +0200

    remove inheritance

diff --git a/src/database.cpp b/src/database.cpp
index a02ca2b..2dfd7ea 100644
--- a/src/database.cpp
+++ b/src/database.cpp
@@ -122,11 +122,11 @@ bool Database::transaction(QList<QSqlQuery> &queries) {
 
 
 bool Database::commitTransaction() {
-    if (this->supportTransactions && !this->database.commit()) {
-        this->database.rollback();
-        return false;
-    }
-    return true;
+    this->supportTransactions &&this->database.commit();
+}
+
+bool Database::rollbackTransaction() {
+    return supportTransactions && this->database.rollback();
 }
 
 DatabaseType Database::getDatabaseType(QString s) {
diff --git a/src/database.h b/src/database.h
index f90193f..5b682e7 100644
--- a/src/database.h
+++ b/src/database.h
@@ -62,6 +62,8 @@ class Database {
     QSqlQuery select(const QString &query);
     void startTransaction();
     bool commitTransaction();
+    bool rollbackTransaction();
+
     static DatabaseType getDatabaseType(QString s);
     static QSharedPointer<Schema> getSchema(int db,
                                             QSharedPointer<Database> database);
diff --git a/src/entitymanager.cpp b/src/entitymanager.cpp
index 3e3873a..9827c19 100644
--- a/src/entitymanager.cpp
+++ b/src/entitymanager.cpp
@@ -686,8 +686,18 @@ bool EntityManager::remove(QSharedPointer<Entity> &entity) {
     bool rc = false;
     this->db->startTransaction();
     this->removeRelations(entity);
-    QSqlQuery q = this->schema.data()->getQueryBuilder().data()->remove(entity);
-    if (q.exec() && this->db->commitTransaction()) {
+    auto queries = this->schema.data()->getQueryBuilder().data()->remove(entity);
+    bool ok = true;
+    for (int var = 0; var < queries.size(); ++var) {
+        auto q = queries.at(var);
+        if (!q.exec()) {
+            this->db->rollbackTransaction();
+            qDebug() << "Remove transaction rolled back";
+            ok = false;
+            break;
+        }
+    }
+    if (ok && this->db->commitTransaction()) {
         this->cache.remove(entity);
         entity.clear();
         rc = true;
diff --git a/src/entitymanager.h b/src/entitymanager.h
index 0d7c9b8..04b6f39 100644
--- a/src/entitymanager.h
+++ b/src/entitymanager.h
@@ -147,7 +147,7 @@ class EntityManager : public QObject {
      *@TODO use conditions
      */
     /**
-     * @TODO Inheritance at create,save,merge,remove
+     * @TODO Inheritance at create,save,merge
      */
     template<class T> qint8 count(QHash<QString, QString> condition =
                                       QHash<QString, QString>()) {
diff --git a/src/querybuilder.cpp b/src/querybuilder.cpp
index 1cec2de..29665ea 100644
--- a/src/querybuilder.cpp
+++ b/src/querybuilder.cpp
@@ -520,8 +520,8 @@ QString QueryBuilder::selectBase(const QStringList &tables,
     return r;
 }
 
-QSqlQuery QueryBuilder::find(const qint64 &id, const QSharedPointer<Entity> &entity, qint64 offset) const
-{
+QSqlQuery QueryBuilder::find(const qint64 &id,
+                             const QSharedPointer<Entity> &entity, qint64 offset) const {
     QSqlQuery q = this->database.data()->getQuery(this->selectBase(QStringList(
                       entity.data()->getTablename())) + this->joinSuperClasses(
                       entity) + " WHERE id= :id" + this->limit(1, offset));
@@ -566,15 +566,38 @@ QSqlQuery QueryBuilder::findAll(const QString &tableName) const {
     return this->database->getQuery(this->selectBase(QStringList(tableName)) + ";");
 }
 
-QSqlQuery QueryBuilder::remove(const QSharedPointer<Entity> &entity) const {
+QList<QSqlQuery> QueryBuilder::remove(const QSharedPointer<Entity> &entity)
+const {
+    QList<QSqlQuery> queries = QList<QSqlQuery>();
+    if (entity.data()->getInheritanceStrategy() != PER_CLASS_TABLE) {
+        auto stack = entity.data()->superClasses(true);
+        while (!stack.isEmpty()) {
+            auto item = stack.pop();
+            auto instance = EntityInstanceFactory::createInstance(item->className());
+            if (instance) {
+                queries.append(this->remove(instance->getTablename(), entity.data()->getId()));
+                delete instance;
+                instance = 0;
+            }
+        }
+    }
+    queries.append(this->remove(entity.data()->getTablename(),
+                                entity.data()->getId()));
+    return queries;
+}
+
+
+QSqlQuery QueryBuilder::remove(const QString &tableName,
+                               const qint64 &id) const {
     QSqlQuery q = this->database->getQuery("DELETE FROM " +
                                            this->schema.data()->quoteTableName(
-                                                   entity.data()->getTablename()) + " WHERE " +
+                                                   tableName) + " WHERE " +
                                            this->schema.data()->quoteColumnName("id") + "=:id;");
-    q.bindValue(":id", entity.data()->getId());
+    q.bindValue(":id", id);
     return q;
 }
 
+
 QSqlQuery QueryBuilder::findId(const QSharedPointer<Entity> &entity) const {
     QHash<QString, QVariant> values = this->getEntityAttributes(
                                           entity.data()->getMetaProperties(),
diff --git a/src/querybuilder.h b/src/querybuilder.h
index 3dc859a..72d1f27 100644
--- a/src/querybuilder.h
+++ b/src/querybuilder.h
@@ -113,7 +113,7 @@ class QueryBuilder {
     QSqlQuery findAll(const QString &tableName) const;
     QSqlQuery findAll(const QSharedPointer<Entity> &entity, const qint64 limit = 0,
                       qint64 offset = 0);
-    QSqlQuery remove(const QSharedPointer<Entity> &entity) const;
+    QList<QSqlQuery> remove(const QSharedPointer<Entity> &entity) const;
     QSqlQuery findId(const QSharedPointer<Entity> &entity) const;
     QSqlQuery count(const QSharedPointer<Entity> &entity, bool ignoreID) const;
     QSqlQuery count(const QString &tableName) const;
@@ -137,6 +137,7 @@ class QueryBuilder {
     QSqlQuery getQuery() const;
 
   protected:
+    QSqlQuery remove(const QString &tableName, const qint64 &id) const;
     virtual void createRelationFK(QStringList &queries,
                                   const QSharedPointer<Entity> &entity, const Relation &relation,
                                   const QMetaProperty &metaProperty, const QString &update,
