commit 2fedfe763af5db9dd9aa9b8573eacb58dc0f5aae
Author: Christian Ehringfeld <c.ehringfeld@t-online.de>
Date:   Tue Sep 8 19:49:58 2015 +0200

    ticket #582 and startup method improvement

diff --git a/src/entitymanager.cpp b/src/entitymanager.cpp
index dcb707f..cacd9b2 100644
--- a/src/entitymanager.cpp
+++ b/src/entitymanager.cpp
@@ -202,15 +202,29 @@ bool EntityManager::startup(QString version, QStringList toInitialize,
                 QString c = toInitialize.at(var);
                 auto entity = QSharedPointer<Entity>
                               (EntityInstanceFactory::createInstance(c));
-                ok = this->createTable(entity);
+                ok = this->createTable(entity, false);
                 entities.append(entity);
             } else {
+                qWarning() << "startup of version " << version << " failed";
+                qWarning() << "erroneous entity:" << (var == 0 ? "null, this should not happen!" : toInitialize.at(
+                        var - 1));
                 break;
             }
         }
-        if (createIndices) {
+        if (ok) {
+            for (int i = 0; i < entities.size(); ++i) {
+                ok = this->schema->getQueryBuilder()->createRelationTables(entities.at(i));
+                if (!ok) {
+                    break;
+                }
+            }
+        }
+        if (ok && createIndices) {
             for (int i = 0; i < entities.size(); ++i) {
                 ok = this->schema->getQueryBuilder()->createIndices(entities.at(i));
+                if (!ok) {
+                    break;
+                }
             }
         }
         if (ok) {
diff --git a/src/querybuilder.cpp b/src/querybuilder.cpp
index b43eff9..d0bb069 100644
--- a/src/querybuilder.cpp
+++ b/src/querybuilder.cpp
@@ -43,25 +43,36 @@ bool QueryBuilder::createTable(const QSharedPointer<Entity> &entity,
         if (!rc) {
             QSqlQuery q = this->database->getQuery(this->createTable(tableName,
                                                    tableDefinition));
-            if (this->database->exec(q)) {
-                if (createRelationTables) {
-                    auto relTables = this->generateRelationTables(entity);
-                    auto i = relTables.constBegin();
-                    while (i != relTables.constEnd()) {
-                        auto query = this->database->getQuery(this->createTable(i.key(),
-                                                              i.value()));
-                        this->database->exec(query);
-                        ++i;
-                    }
-                }
-                this->schema->getTableSchema(tableName);
+            if (this->database->exec(q) && (!createRelationTables || (createRelationTables
+                                            && this->createRelationTables(entity)))) {
                 rc = true;
+            } else {
+                qWarning() << "Table " << entity->getTablename() << " could not be created.";
             }
+            this->schema->getTableSchema(tableName);
         }
     }
     return rc;
 }
 
+bool QueryBuilder::createRelationTables(const QSharedPointer<Entity> &entity)
+const {
+    bool ok = true;
+    auto relTables = this->generateRelationTables(entity);
+    auto i = relTables.constBegin();
+    while (i != relTables.constEnd()) {
+        auto query = this->database->getQuery(this->createTable(i.key(), i.value()));
+        if (!this->database->exec(query)) {
+            ok = false;
+            qWarning() << "Relational table for table " << entity->getTablename() <<
+                       " could not be created." << " Tablename:" << i.key();
+            break;
+        }
+        ++i;
+    }
+    return ok;
+}
+
 bool QueryBuilder::createIndices(const QSharedPointer<Entity> &entity) const {
     bool ok = true;
     QStringList queries = QStringList();
diff --git a/src/querybuilder.h b/src/querybuilder.h
index 3850afb..55f81c4 100644
--- a/src/querybuilder.h
+++ b/src/querybuilder.h
@@ -51,6 +51,7 @@ class QueryBuilder {
     virtual bool createIndices(const QSharedPointer<Entity> &entity) const;
     virtual QString createTable(const QString &tableName,
                                 const QHash<QString, QString> &tableDefinition) const;
+    virtual bool createRelationTables(const QSharedPointer<Entity> &entity) const;
     virtual QString createTableQuery(const QString &tableName,
                                      const QHash<QString, QString> &tableDefinition) const;
     virtual QString renameTable(QString tableName, QString newName) const;
