commit 45135a146dc995359644296ea96b021054316ddf
Author: Christian Ehringfeld <c.ehringfeld@t-online.de>
Date:   Thu Jul 30 19:02:21 2015 +0200

    integration of logger component

diff --git a/src/database.cpp b/src/database.cpp
index f2e14d3..b871be1 100644
--- a/src/database.cpp
+++ b/src/database.cpp
@@ -15,19 +15,21 @@
  */
 
 #include "database.h"
+#include "logger.h"
+#include <QDir>
 using namespace CuteEntityManager;
 
-Database::Database(QSqlDatabase database) {
+Database::Database(QSqlDatabase database, bool loggerActivated, bool logQueries, bool logErrors) {
     this->database = database;
     this->init();
     this->connectionName = this->database.connectionName();
-
+    this->initLogger(loggerActivated,logQueries,logErrors);
 }
 
 Database::Database(QString databaseType, QString connectionName,
                    QString hostname,
                    QString databasename,
-                   QString username, QString password, qint64 port) {
+                   QString username, QString password, qint64 port, bool loggerActivated, bool logQueries, bool logErrors) {
     this->database = QSqlDatabase::addDatabase(databaseType, connectionName);
     this->connectionName = connectionName;
     if (hostname != QString("")) {
@@ -46,15 +48,28 @@ Database::Database(QString databaseType, QString connectionName,
         this->database.setPort(port);
     }
     this->init();
+    this->initLogger(loggerActivated,logQueries,logErrors);
 }
 
 void Database::init() {
     this->database.open();
     this->supportTransactions = this->database.driver()->hasFeature(
-                                    QSqlDriver::Transactions);
+                QSqlDriver::Transactions);
+}
+
+void Database::initLogger(bool activated, bool logQueries, bool logErrors) {
+    this->logQueries = logQueries;
+    this->logErrors = logErrors;
+    if(activated) {
+        this->logger = new Logger(QDir::currentPath() + "/db" + this->connectionName + "db.log");
+    }
 }
 
 Database::~Database() {
+    if(this->logger) {
+    delete this->logger;
+    this->logger = nullptr;
+    }
     if (this->database.isOpen()) {
         this->database.close();
     }
@@ -82,6 +97,7 @@ bool Database::transaction(const QStringList &queries) {
         QSqlQuery sqlquery = QSqlQuery(this->database);
         for (int var = 0; var < queries.size(); ++var) {
             sqlquery.exec(queries.at(var));
+            this->debugQuery(sqlquery);
         }
         ok = this->commitTransaction();
     } else {
@@ -122,17 +138,17 @@ DatabaseType Database::getDatabaseType(QString s) {
 }
 
 QSharedPointer<Schema> Database::getSchema(DatabaseType db,
-        QSharedPointer<Database> database) {
+                                           QSharedPointer<Database> database) {
     switch (db) {
     case DatabaseType::SQLITE:
         return QSharedPointer<Schema>(new SqliteSchema(database));;
         break;
-//    case PGSQL:
-//        return QSharedPointer<Schema>(new PgSqlSchema());
-//        break;
-//    case MYSQL:
-//        return QSharedPointer<Schema>(new MysqlSchema());
-//        break;
+        //    case PGSQL:
+        //        return QSharedPointer<Schema>(new PgSqlSchema());
+        //        break;
+        //    case MYSQL:
+        //        return QSharedPointer<Schema>(new MysqlSchema());
+        //        break;
     default:
         return QSharedPointer<Schema>(new SqliteSchema(database));
         break;
@@ -180,7 +196,13 @@ bool Database::exec(QList<QSqlQuery> queries) {
 }
 
 void Database::debugQuery(const QSqlQuery &query) const {
-    qDebug() << query.executedQuery();
+    if(this->logger) {
+        if(this->logErrors) {
+            this->logger->lastError(query,this->logQueries);
+        }
+    } else {
+        qDebug() << query.executedQuery();
+    }
 }
 
 bool Database::select(QSqlQuery &query) {
diff --git a/src/database.h b/src/database.h
index b923323..393c5d6 100644
--- a/src/database.h
+++ b/src/database.h
@@ -26,23 +26,27 @@
 #include <QString>
 #include <QDebug>
 #include "enums/databasetype.h"
+#include "logger.h"
 namespace CuteEntityManager {
-
 class Database {
   private:
     QSqlDatabase database;
     QString connectionName;
     bool supportTransactions;
+    Logger *logger = nullptr;
     void init();
+    void initLogger(bool activated, bool logQueries, bool logErrors);
+    bool logQueries;
+    bool logErrors;
 
   public:
-    Database(QSqlDatabase database);
+    Database(QSqlDatabase database, bool loggerActivated = true, bool logQueries=false, bool logErrors=true);
     ~Database();
     Database(QString databaseType, QString connectionName = QString(""),
              QString hostname = QString(""),
              QString databasename = QString("") ,
              QString username = QString(""), QString password = QString(""),
-             qint64 port = 0);
+             qint64 port = 0, bool loggerActivated = true, bool logQueries=false, bool logErrors=true);
     QSqlDatabase getDatabase();
     QString getConnectionName();
     QSqlQuery getQuery();
diff --git a/src/entitymanager.cpp b/src/entitymanager.cpp
index 800918a..fb6acdc 100644
--- a/src/entitymanager.cpp
+++ b/src/entitymanager.cpp
@@ -36,10 +36,14 @@ EntityManager::EntityManager(const QString &databaseType, QString databasename ,
                              QString hostname,
                              QString username,
                              QString password, QString port) : QObject() {
+    bool logQueries = false;
+#ifdef QT_DEBUG
+    logQueries = true;
+#endif
     auto db = new Database(databaseType, this->createConnection(), hostname,
                            databasename, username,
                            password,
-                           port.toInt());
+                           port.toInt(),true,logQueries);
     this->db = QSharedPointer<Database>(db);
     this->init();
 }
diff --git a/src/entitymanager.h b/src/entitymanager.h
index deb9517..039f436 100644
--- a/src/entitymanager.h
+++ b/src/entitymanager.h
@@ -34,6 +34,8 @@
 
 namespace CuteEntityManager {
 
+
+class Logger;
 class EntityManager : public QObject {
     Q_OBJECT
   signals:
diff --git a/src/logger.cpp b/src/logger.cpp
index 538ee80..276834a 100644
--- a/src/logger.cpp
+++ b/src/logger.cpp
@@ -15,15 +15,24 @@ QString Logger::defaultPath() const {
     return QDir::currentPath() + "/errors.log";
 }
 
-void Logger::lastError(const QSqlQuery &q) {
+void Logger::lastError(const QSqlQuery &q, bool logQuery) {
     QFile log(this->getPath());
     log.open(QIODevice::WriteOnly | QIODevice::Text | QIODevice::Append);
     log.seek(log.size());
     QTextStream stream(&log);
-    qDebug() << this->generateLogMsg(q.lastError());
-    qDebug() << generateLogMsg(q);
-    stream << this->generateLogMsg(q.lastError());
-    stream << generateLogMsg(q);
+    const QString errorMsg = this->generateLogMsg(q.lastError());
+    if (!errorMsg.isEmpty()) {
+        qDebug() << errorMsg;
+        stream << errorMsg;
+    }
+    if(logQuery) {
+        const QString query = this->generateLogMsg(q);
+        if(!query.isEmpty()) {
+            qDebug() << query;
+            stream << query;
+        }
+    }
+    stream.flush();
     log.close();
 }
 
@@ -40,11 +49,14 @@ void Logger::lastError(const QSqlError &e) {
 }
 
 QString Logger::generateLogMsg(const QSqlQuery &q) const {
-    QString r = "Query:<" + q.executedQuery() + ">";
+    QString r = "<" + q.executedQuery() + ">";
     QMap<QString, QVariant> m = q.boundValues();
     QMap<QString,QVariant>::iterator i;
-    for (i = m.begin(); i != m.end(); ++i) {
-        r += "\n<" + i.key() + "|" + i.value().toString() + ">";
+    if(!m.isEmpty()) {
+        r += "Values: ";
+        for (i = m.begin(); i != m.end(); ++i) {
+            r += "{" + i.key() + ":" + i.value().toString() + "}";
+        }
     }
     return r;
 }
@@ -61,5 +73,9 @@ void Logger::setPath(const QString &value) {
 }
 
 QString Logger::generateLogMsg(const QSqlError &e) const {
-    return "UTC:" + QDateTime::currentDateTime().toString("yyyy-MM-dd|hh:MM:ss") + "|" + e.driverText() + "|" + e.databaseText().toLatin1() + "\n";
+    if(e.isValid()) {
+        return "UTC:" + QDateTime::currentDateTime().toString("yyyy-MM-dd|hh:MM:ss") + "|" + e.driverText() + "|" + e.databaseText().toLatin1() + "\n";
+    } else {
+        return "";
+    }
 }
diff --git a/src/logger.h b/src/logger.h
index 1f33606..ba91743 100644
--- a/src/logger.h
+++ b/src/logger.h
@@ -10,11 +10,11 @@ class Logger
 {
 public:
     Logger(QString path="");
-    virtual ~Logger();
+    ~Logger();
     QString defaultPath() const;
 
     void lastError(const QSqlError &e);
-    void lastError(const QSqlQuery &q);
+    void lastError(const QSqlQuery &q, bool logQuery=false);
     QString getPath();
     void setPath(const QString &value);
 
