commit 3938a37e7d3645d2317c6d51f3060f5e47b3806b
Author: Christian Ehringfeld <c.ehringfeld@t-online.de>
Date:   Sun Sep 27 18:14:54 2015 +0200

    logger

diff --git a/src/database.cpp b/src/database.cpp
index f331c1b..8053ed7 100644
--- a/src/database.cpp
+++ b/src/database.cpp
@@ -20,12 +20,12 @@
 #include "schema/mysqlschema.h"
 using namespace CuteEntityManager;
 
-Database::Database(QSqlDatabase database, bool loggerActivated, bool logQueries,
+Database::Database(QSqlDatabase database, bool logQueries,
                    bool logErrors, MsgType type) {
     this->database = database;
     this->init();
     this->connectionName = this->database.connectionName();
-    this->initLogger(loggerActivated, logQueries, logErrors, type);
+    this->initLogger(logQueries, logErrors, type);
 }
 
 Database::Database(QString databaseType, QString connectionName,
@@ -54,7 +54,11 @@ Database::Database(QString databaseType, QString connectionName,
         this->database.setConnectOptions(databaseOptions);
     }
     this->init();
-    this->initLogger(loggerActivated, logQueries, logErrors, type);
+    this->initLogger(logQueries, logErrors, type);
+}
+
+Logger *Database::getLogger() const {
+    return logger;
 }
 
 void Database::init() {
@@ -63,14 +67,12 @@ void Database::init() {
                                     QSqlDriver::Transactions);
 }
 
-void Database::initLogger(bool activated, bool logQueries, bool logErrors,
+void Database::initLogger(bool logQueries, bool logErrors,
                           MsgType type) {
     this->logQueries = logQueries;
     this->logErrors = logErrors;
-    if (activated) {
-        this->logger = new Logger(QDir::currentPath() + "/db" + this->connectionName +
-                                  ".log", type);
-    }
+    this->logger = new Logger(QDir::currentPath() + "/db" + this->connectionName +
+                              ".log", type);
 }
 
 Database::~Database() {
@@ -131,7 +133,7 @@ bool Database::commitTransaction() {
 }
 
 bool Database::rollbackTransaction() {
-    qWarning() << "Transaction rolled back!" << this->database.lastError().text();
+    this->logger->logMsg("Transaction rolled back!" + this->database.lastError().text(),MsgType::WARNING);
     return supportTransactions && this->database.rollback();
 }
 
diff --git a/src/database.h b/src/database.h
index 2295af7..a1654b9 100644
--- a/src/database.h
+++ b/src/database.h
@@ -40,20 +40,20 @@ class Database {
     bool supportTransactions;
     Logger *logger = nullptr;
     void init();
-    void initLogger(bool activated, bool logQueries, bool logErrors, MsgType type);
+    void initLogger(bool logQueries, bool logErrors, MsgType type);
     bool logQueries;
     bool logErrors;
 
   public:
-    Database(QSqlDatabase database, bool loggerActivated = true,
-             bool logQueries = false, bool logErrors = true,MsgType type= DEFAULTMSGTYPE);
+    Database(QSqlDatabase database, bool logQueries = false, bool logErrors = true, MsgType type = DEFAULTMSGTYPE);
     ~Database();
     Database(QString databaseType, QString connectionName = QString(""),
              QString hostname = QString(""),
              QString databasename = QString("") ,
              QString username = QString(""), QString password = QString(""),
              qint64 port = 0, bool loggerActivated = true, bool logQueries = false,
-             bool logErrors = true, QString databaseOptions = "",MsgType type= DEFAULTMSGTYPE);
+             bool logErrors = true, QString databaseOptions = "",
+             MsgType type = DEFAULTMSGTYPE);
     QSqlDatabase getDatabase();
     QString getConnectionName();
     QSqlQuery getQuery();
@@ -69,10 +69,12 @@ class Database {
     QSqlQuery select(const QString &query);
     void startTransaction();
     bool commitTransaction();
+    void logMsg(const QString &value);
     bool rollbackTransaction();
     static DatabaseType getDatabaseType(QString s);
     static QSharedPointer<Schema> getSchema(DatabaseType db,
                                             QSharedPointer<Database> database);
+    Logger *getLogger() const;
 };
 }
 #endif // DATABASE_H
diff --git a/src/entitymanager.cpp b/src/entitymanager.cpp
index 682e63f..4c32592 100644
--- a/src/entitymanager.cpp
+++ b/src/entitymanager.cpp
@@ -15,6 +15,8 @@
  */
 
 #include <QVariantList>
+#include <QHash>
+#include <QDir>
 #include "entitymanager.h"
 #include "enums/databasetype.h"
 #include "databasemigration.h"
@@ -22,7 +24,6 @@
 #include "validators/validator.h"
 #include "validators/validatorrule.h"
 #include "entityinspector.h"
-#include <QHash>
 
 using namespace CuteEntityManager;
 
@@ -35,6 +36,51 @@ QStringList EntityManager::getConnectionNames() {
     return EntityManager::connectionNames;
 }
 
+EntityManager::EntityManager(QSqlDatabase database, bool logQueries,
+                             const bool inspectEntities,
+                             MsgType logActions) : QObject() {
+    auto db = new Database(database, true, logQueries, logActions);
+    this->db = QSharedPointer<Database>(db);
+    this->init(inspectEntities, logActions);
+}
+
+void EntityManager::init(bool inspect, const MsgType msgType) {
+    auto schema = Database::getSchema(Database::getDatabaseType(
+                                          this->db->getDatabase().driverName()), this->db);
+    this->schema = QSharedPointer<Schema>(schema);
+    this->schema->setTables(this->schema->getTableSchemas());
+    this->queryInterpreter = QSharedPointer<QueryInterpreter>(new QueryInterpreter(
+                                 this->schema->getQueryBuilder()));
+    this->appendToInstanceList();
+    if (inspect) {
+        EntityInspector inspector = EntityInspector(msgType);
+        inspector.checkRegisteredEntities();
+    }
+    QString loggerFile = "em" + this->objectName() + ".log";
+    loggerFile.replace("[", "");
+    loggerFile.replace("]", "");
+    this->logger = QSharedPointer<Logger>(new Logger(QDir::currentPath() + "/" +
+                                          loggerFile, msgType));
+}
+
+EntityManager::EntityManager(const QString &databaseType, QString databasename,
+                             QString hostname, QString username, QString password, QString port,
+                             bool logQueries, QString databaseOptions, const bool inspectEntities,
+                             CuteEntityManager::MsgType logActions) : QObject() {
+    auto db = new Database(databaseType, this->createConnection(), hostname,
+                           databasename, username,
+                           password,
+                           port.toInt(), true, logQueries, true, databaseOptions, logActions);
+    this->db = QSharedPointer<Database>(db);
+    this->init(inspectEntities, logActions);
+}
+
+EntityManager::~EntityManager() {
+    EntityManager::removeConnectionName(this->db->getConnectionName());
+    EntityManager::instances.remove(this->objectName());
+}
+
+
 QSharedPointer<QueryBuilder> EntityManager::getQueryBuilder() const {
     return this->schema->getQueryBuilder();
 }
@@ -111,8 +157,8 @@ bool EntityManager::createObject(QSharedPointer<Entity> &entity,
                 }
                 rc = this->db->exec(query);
                 if (!rc) {
-                    qWarning() << "class is erroneous:" <<  EntityHelper::getClassname(
-                                   entity.data());
+                    this->logger->logMsg("class is erroneous:" +  EntityHelper::getClassName(
+                                             entity.data()), MsgType::WARNING);
                     break;
                 }
                 if (first) {
@@ -147,15 +193,6 @@ bool EntityManager::merge(QSharedPointer<Entity> &entity, bool withRelations,
                              relationsIgnoreHasChanged);
 }
 
-/**
- * @brief EntityManager::create
- * Will persist an entity in the database. Before its persisted it has the id -1(invalid id). If database persisting was succesfull it has a valid id.
- * @param entity
- * @param persistRelations
- * @param checkDuplicate
- * @param validate
- * @return
- */
 bool EntityManager::create(QSharedPointer<Entity> &entity,
                            const bool persistRelations, const bool checkDuplicate, const bool validate,
                            const bool relationsIgnoreHasChanged) {
@@ -163,15 +200,7 @@ bool EntityManager::create(QSharedPointer<Entity> &entity,
     return this->createObject(entity, merged, persistRelations,
                               checkDuplicate, validate, relationsIgnoreHasChanged);
 }
-/**
- * @brief EntityManager::save
- * If the entity has no valid ID, this method will call the create() method. Else it would call the merge method.
- * @param entity
- * @param persistRelations
- * @param ignoreHasChanged
- * @param validate
- * @return bool
- */
+
 bool EntityManager::save(QSharedPointer<Entity> &entity,
                          const bool persistRelations, const bool ignoreHasChanged, const bool validate,
                          const bool relationsIgnoreHasChanged) {
@@ -180,45 +209,6 @@ bool EntityManager::save(QSharedPointer<Entity> &entity,
                             ignoreHasChanged, validate, relationsIgnoreHasChanged);
 }
 
-EntityManager::EntityManager(QSqlDatabase database, bool logQueries,
-                             const bool inspectEntities,
-                             MsgType logActions) : QObject() {
-    auto db = new Database(database, true, logQueries, true, logActions);
-    this->db = QSharedPointer<Database>(db);
-    this->init(inspectEntities,logActions);
-}
-
-void EntityManager::init(bool inspect,const MsgType msgType) {
-    auto schema = Database::getSchema(Database::getDatabaseType(
-                                          this->db->getDatabase().driverName()), this->db);
-    this->schema = QSharedPointer<Schema>(schema);
-    this->schema->setTables(this->schema->getTableSchemas());
-    this->queryInterpreter = QSharedPointer<QueryInterpreter>(new QueryInterpreter(
-                                 this->schema->getQueryBuilder()));
-    this->appendToInstanceList();
-    if (inspect) {
-        EntityInspector inspector = EntityInspector(msgType);
-        inspector.checkRegisteredEntities();
-    }
-}
-
-EntityManager::EntityManager(const QString &databaseType, QString databasename,
-                             QString hostname, QString username, QString password, QString port,
-                             bool logQueries, QString databaseOptions, const bool inspectEntities,
-                             CuteEntityManager::MsgType logActions) : QObject() {
-    auto db = new Database(databaseType, this->createConnection(), hostname,
-                           databasename, username,
-                           password,
-                           port.toInt(), true, logQueries, true, databaseOptions, logActions);
-    this->db = QSharedPointer<Database>(db);
-    this->init(inspectEntities,logActions);
-}
-
-EntityManager::~EntityManager() {
-    EntityManager::removeConnectionName(this->db->getConnectionName());
-    EntityManager::instances.remove(this->objectName());
-}
-
 bool EntityManager::startup(QString version, QStringList toInitialize,
                             bool createIndices) {
     QSharedPointer<Entity> dbm = QSharedPointer<DatabaseMigration>
@@ -239,10 +229,10 @@ bool EntityManager::startup(QString version, QStringList toInitialize,
                 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));
+                this->logger->logMsg("startup of version " + version + " failed",
+                                     MsgType::CRITICAL);
+                this->logger->logMsg( "erroneous entity:" + (var == 0 ?
+                                      "null, this should not happen!" : toInitialize.at(var - 1)), MsgType::CRITICAL);
                 break;
             }
         }
@@ -796,14 +786,12 @@ void EntityManager::persistManyToMany(const QSharedPointer<Entity> &entity,
     }
 }
 
-
 void EntityManager::missingManyToManyTable(const QString &tblName,
         const QSharedPointer<Entity> &e, const Relation &r) {
-    qWarning() << "MANY_TO_MANY Table " << tblName << " is missing";
-    qWarning() << "Entity " << EntityHelper::getClassName(e.data()) <<
-               " is affected";
-    qWarning() << "Relation of property: " << r.getPropertyName();
-    //qDebug() << "RelationType:" << r.getType() << " MappedBy:" << r.getMappedBy();
+    this->logger->logMsg("MANY_TO_MANY Table " + tblName + " is missing.\n" +
+                         "Entity " + EntityHelper::getClassName(e.data()) +
+                         " is affected.\n" + "Relation of property: " + r.getPropertyName(),
+                         MsgType::CRITICAL);
 }
 
 void EntityManager::manyToMany(const QSharedPointer<Entity> &entity,
diff --git a/src/entitymanager.h b/src/entitymanager.h
index 3baed58..91abf87 100644
--- a/src/entitymanager.h
+++ b/src/entitymanager.h
@@ -72,9 +72,27 @@ class EntityManager : public QObject {
     bool create(QList<QSharedPointer<Entity>> entities,
                 const bool persistRelations = true, const bool validate = true,
                 const bool relationsIgnoreHasChanged = false);
+    /**
+     * @brief EntityManager::create
+     * Will persist an entity in the database. Before its persisted it has the id -1(invalid id). If database persisting was succesfull it has a valid id.
+     * @param entity
+     * @param persistRelations
+     * @param checkDuplicate
+     * @param validate
+     * @return
+     */
     bool create(QSharedPointer<Entity> &entity, const bool persistRelations = true,
                 const bool checkDuplicate = false, const bool validate = true,
                 const bool relationsIgnoreHasChanged = false) ;
+    /**
+     * @brief EntityManager::save
+     * If the entity has no valid ID, this method will call the create() method. Else it would call the merge method.
+     * @param entity
+     * @param persistRelations
+     * @param ignoreHasChanged
+     * @param validate
+     * @return bool
+     */
     bool save(QSharedPointer<Entity> &entity, const bool persistRelations = true,
               const bool ignoreHasChanged = false, const bool validate = true,
               const bool relationsIgnoreHasChanged = false);
@@ -340,10 +358,6 @@ class EntityManager : public QObject {
     QList<QSharedPointer<Entity>> convert(QList<QHash<QString, QVariant> > maps,
                                           const char *classname, const bool refresh = false,
                                           const bool resolveRelations = true);
-    /**
-      @todo wait for Qt 5.5.1
-      @see https://codereview.qt-project.org/#/c/122232/
-      */
     void missingManyToManyTable(const QString &tblName,
                                 const QSharedPointer<Entity> &e, const Relation &r);
     /**
@@ -357,6 +371,7 @@ class EntityManager : public QObject {
   private:
     static QStringList connectionNames;
     static QHash<QString, EntityManager *> instances;
+    QSharedPointer<Logger> logger;
     QString id;
     QSharedPointer<Schema> schema;
     static void setConnectionNames(QStringList list);
diff --git a/src/logger.cpp b/src/logger.cpp
index 8451801..81be4f6 100644
--- a/src/logger.cpp
+++ b/src/logger.cpp
@@ -54,14 +54,17 @@ void Logger::lastError(const QSqlError &e) {
 
 void Logger::logMsg(const QString &value, const MsgType type) {
     if (!value.isEmpty() && this->shouldBeLogged(type)) {
-        this->outputToConsole(type, value);
+        QString msg = value;
         QFile log(this->getPath());
         log.open(QIODevice::WriteOnly | QIODevice::Text | QIODevice::Append);
         log.seek(log.size());
         QTextStream stream(&log);
         stream.setCodec("UTF-8");
-        stream << value;
-        stream << "\n";
+        if (value.size() - 1 != value.lastIndexOf("\n")) {
+            msg.append("\n");
+        }
+        stream << msg;
+        this->outputToConsole(type, msg.replace("\"", "'"));
         stream.flush();
         log.close();
     }
diff --git a/src/querybuilder.cpp b/src/querybuilder.cpp
index d83b9fb..72c8613 100644
--- a/src/querybuilder.cpp
+++ b/src/querybuilder.cpp
@@ -20,6 +20,7 @@
 #include <QRegularExpression>
 #include "entityinstancefactory.h"
 #include "entityhelper.h"
+#include "logger.h"
 
 using namespace CuteEntityManager;
 
@@ -47,7 +48,8 @@ bool QueryBuilder::createTable(const QSharedPointer<Entity> &entity,
                                             && this->createRelationTables(entity)))) {
                 rc = true;
             } else {
-                qWarning() << "Table " << entity->getTablename() << " could not be created.";
+                this->database->getLogger()->logMsg("Table " + entity->getTablename() +
+                                                    " could not be created.", MsgType::WARNING);
             }
             this->schema->getTableSchema(tableName);
         }
@@ -64,8 +66,9 @@ const {
         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();
+            this->database->getLogger()->logMsg("Relational table for table " +
+                                                entity->getTablename() +
+                                                " could not be created." + " Tablename:" + i.key(), MsgType::WARNING);
             break;
         }
         ++i;
@@ -911,7 +914,7 @@ QString QueryBuilder::generateManyToManyColumnName(const QSharedPointer<Entity>
     if (entity) {
         return this->generateColumnNameID(entity->getTablename());
     }
-    qWarning() << "Entity is empty!";
+    this->database->getLogger()->logMsg("Entity is empty!", MsgType::WARNING);
     return "";
 }
 
@@ -988,7 +991,8 @@ QList<QueryBuilder::ClassAttributes> QueryBuilder::inheritedAttributes(
                             this->saveAttributes(entity, this->processProperties(e, usedProperties),
                                                  this->processRelations(e, usedRelations)), e->getPrimaryKey()));
             } else {
-                qWarning() << "Instance of " << metaObj->className() << " could not be created";
+                this->database->getLogger()->logMsg("Instance of " + QString(metaObj->className()) +
+                                                    " could not be created", MsgType::CRITICAL);
                 break;
             }
         }
diff --git a/src/querybuilder.h b/src/querybuilder.h
index 55f81c4..8103c29 100644
--- a/src/querybuilder.h
+++ b/src/querybuilder.h
@@ -29,6 +29,7 @@ namespace CuteEntityManager {
 class Schema;
 class Entity;
 class Database;
+class Logger;
 enum DbForeignKeyCascade {
     RESTRICT,
     CASCADE,
