commit f4e3904b4ac79d50a697c7e246911c6d1e61b2e6
Author: Christian Ehringfeld <c.ehringfeld@t-online.de>
Date:   Mon Apr 27 18:17:48 2015 +0200

    could(!) work, relation loading still not implemented

diff --git a/EntityManager.pro b/EntityManager.pro
index e42a6a5..a801134 100644
--- a/EntityManager.pro
+++ b/EntityManager.pro
@@ -26,7 +26,8 @@ src/entity.h \
     src/databasemigration.h \
     src/querybuilder.h \
     src/schema/sqlitequerybuilder.h \
-    src/relation.h
+    src/relation.h \
+    src/entityinstancefactory.h
 
 SOURCES += \
 src/entity.cpp \
@@ -40,7 +41,8 @@ src/entity.cpp \
     src/databasemigration.cpp \
     src/querybuilder.cpp \
     src/schema/sqlitequerybuilder.cpp \
-    src/relation.cpp
+    src/relation.cpp \
+    src/entityinstancefactory.cpp
 
 unix {
     target.path = /usr/lib
diff --git a/src/entity.cpp b/src/entity.cpp
index 847487e..aeb05c8 100644
--- a/src/entity.cpp
+++ b/src/entity.cpp
@@ -50,6 +50,21 @@ QString Entity::getPrimaryKey() {
     return "id";
 }
 
+QHash<QString, QMetaProperty> Entity::getMetaProperties() const {
+    QHash<QString, QMetaProperty> h = QHash<QString, QMetaProperty>();
+    for (int var = 0; var < this->metaObject()->propertyCount(); ++var) {
+        QMetaProperty m = this->metaObject()->property(var);
+        if (m.name() != QString("objectName") && m.isValid()) {
+            h.insert(m.name(), m);
+        }
+    }
+    return h;
+}
+
+const char *Entity::getClassname() const {
+    return this->metaObject()->className();
+}
+
 qint64 Entity::getId() const {
     return id;
 }
diff --git a/src/entity.h b/src/entity.h
index bc8c46b..a1e9a09 100644
--- a/src/entity.h
+++ b/src/entity.h
@@ -51,6 +51,8 @@ class Entity : public QObject {
     virtual QStringList getBLOBColumns();
     //return value must be the exact name defined in Q_PROPERTY
     virtual QString getPrimaryKey();
+    QHash<QString, QMetaProperty> getMetaProperties() const;
+    const char* getClassname() const;
 
     qint64 getId() const;
     void setId(const qint64 &value);
diff --git a/src/entityinstancefactory.cpp b/src/entityinstancefactory.cpp
new file mode 100644
index 0000000..48dc6fd
--- /dev/null
+++ b/src/entityinstancefactory.cpp
@@ -0,0 +1,47 @@
+#include "entityinstancefactory.h"
+#include "entity.h"
+#include <QMetaType>
+using namespace CuteEntityManager;
+EntityInstanceFactory::EntityInstanceFactory() {
+
+}
+
+Entity *EntityInstanceFactory::createInstance(const char *className) {
+    return EntityInstanceFactory::createInstance(QMetaType::type(className));
+}
+
+Entity *EntityInstanceFactory::createInstance(int id) {
+    Entity *e = 0;
+    if (id != -1) {
+        e = static_cast<Entity *>(QMetaType::create(id));
+    }
+    return e;
+}
+
+Entity *EntityInstanceFactory::createInstance(const char *className, const QHash<QString, QVariant> &attributes) {
+    Entity *e = EntityInstanceFactory::createInstance(className);
+    EntityInstanceFactory::setAttributes(e, attributes);
+    return e;
+}
+
+Entity *EntityInstanceFactory::setAttributes(Entity *e, const QHash<QString, QVariant> &attributes,
+        QHash<QString, QMetaProperty> metaprops) {
+    if (e) {
+        auto iterator = attributes.constBegin();
+        while (iterator != attributes.constEnd()) {
+            if (metaprops.contains(iterator.key())) {
+                QMetaProperty prop = metaprops.value(iterator.key());
+                if (!prop.isWritable() && !prop.write(e, iterator.value())) {
+                    qDebug() << prop.name() << "on Entity" << e->getClassname() << "not writeable!";
+                }
+            }
+            ++iterator;
+        }
+    }
+    return e;
+}
+
+Entity *EntityInstanceFactory::setAttributes(Entity *e, const QHash<QString, QVariant> &attributes) {
+    auto metaprops = e->getMetaProperties();
+    return EntityInstanceFactory::setAttributes(e, attributes, metaprops);
+}
diff --git a/src/entityinstancefactory.h b/src/entityinstancefactory.h
new file mode 100644
index 0000000..cc0deee
--- /dev/null
+++ b/src/entityinstancefactory.h
@@ -0,0 +1,20 @@
+#ifndef ENTITYINSTANCEFACTORY_H
+#define ENTITYINSTANCEFACTORY_H
+#include <QString>
+#include <QVariant>
+#include <QHash>
+
+namespace CuteEntityManager {
+class Entity;
+class EntityInstanceFactory {
+  public:
+    static Entity *createInstance(const char *className);
+    static Entity *createInstance(int id);
+    static Entity *createInstance(const char *className, const QHash<QString, QVariant> &attributes);
+    static Entity *setAttributes(Entity *e, const QHash<QString, QVariant> &attributes, QHash<QString, QMetaProperty> metaprops);
+    static Entity *setAttributes(Entity *e, const QHash<QString, QVariant> &attributes);
+  protected:
+    EntityInstanceFactory();
+};
+}
+#endif // ENTITYINSTANCEFACTORY_H
diff --git a/src/entitymanager.cpp b/src/entitymanager.cpp
index d655813..828cdd8 100644
--- a/src/entitymanager.cpp
+++ b/src/entitymanager.cpp
@@ -16,11 +16,8 @@
 
 #include "entitymanager.h"
 #include "enums/databasetype.h"
+#include "entityinstancefactory.h"
 using namespace CuteEntityManager;
-/**
- * Relationen fehlen noch
- * Fehlermeldungen erstellen am besten eine Exception Klasse diesbzgl. erstellen
- */
 
 QStringList EntityManager::connectionNames = QStringList();
 
@@ -94,17 +91,34 @@ void EntityManager::removeConnectionName(const QString &name) {
     EntityManager::connectionNames.removeOne(name);
 }
 
-QList<QSharedPointer<Entity> > EntityManager::findAllEntities(QSharedPointer<Entity> entity) {
+QList<QSharedPointer<Entity>> EntityManager::findAllEntities(QSharedPointer<Entity> entity) {
+    auto maps = this->findAll(entity.data()->getTablename());
+    return this->convert(maps, entity.data()->getClassname());
+}
+
 
+QSharedPointer<Entity> EntityManager::convert(const QHash<QString, QVariant> &map, const char *classname) {
+    return QSharedPointer<Entity>(EntityInstanceFactory::createInstance(classname, map));
+}
+
+QList<QSharedPointer<Entity> > EntityManager::convert(QList<QHash<QString, QVariant> > maps, const char *classname) {
+    auto list = QList<QSharedPointer<Entity> >();
+    for (int var = 0; var < maps.size(); ++var) {
+        list.append(this->convert(maps.at(var), classname));
+    }
+    return list;
 }
 
-QSharedPointer<Entity> EntityManager::findEntity(QSharedPointer<Entity> entity) {
 
+QSharedPointer<Entity> EntityManager::findEntity(QSharedPointer<Entity> entity) {
+    auto map  = this->find(entity);
+    return this->convert(map, entity.data()->getClassname());
 }
 
 QList<QSharedPointer<Entity> > EntityManager::findEntityByAttributes(const QSharedPointer<Entity> &entity,
         bool ignoreID) {
-
+    auto maps = this->findByAttributes(entity, ignoreID);
+    return this->convert(maps, entity.data()->getClassname());
 }
 
 /**
@@ -149,6 +163,7 @@ QHash<QString, QVariant> EntityManager::find(qint64 id, QString tblname) {
     return map;
 }
 
+
 QList<QHash<QString, QVariant> > EntityManager::findByAttributes(const QSharedPointer<Entity> &entity, bool ignoreID) {
     QSqlQuery q = this->schema.data()->getQueryBuilder().data()->findByAttributes(entity, ignoreID);
     return this->convertQueryResult(q);
diff --git a/src/entitymanager.h b/src/entitymanager.h
index 779acc9..906141e 100644
--- a/src/entitymanager.h
+++ b/src/entitymanager.h
@@ -49,6 +49,9 @@ class EntityManager {
     QList<QHash<QString, QVariant> > findAll(QString tblname);
     QHash<QString, QVariant> find(QSharedPointer<Entity> entity);
     QHash<QString, QVariant> find(qint64 id, QString tblname);
+    QSharedPointer<Entity> convert(const QHash<QString, QVariant> &map, const char *classname);
+    QList<QSharedPointer<Entity>> convert(QList<QHash<QString, QVariant> > maps,const char *classname);
+
     QList<QHash<QString, QVariant> > findByAttributes(const QSharedPointer<Entity> &entity, bool ignoreID = false);
     QList<QHash<QString, QVariant> > findByAttributes(const QHash<QString, QVariant> &m, const QString &tblname,
             bool ignoreID = false);
diff --git a/src/querybuilder.cpp b/src/querybuilder.cpp
index 7273508..c6e2b21 100644
--- a/src/querybuilder.cpp
+++ b/src/querybuilder.cpp
@@ -37,7 +37,7 @@ QString QueryBuilder::createTableQuery(const QString &tableName, const QHash<QSt
     bool first = true;
     QString s = "CREATE TABLE ";
     s.append(this->schema.data()->quoteTableName(tableName).append(" (\n"));
-    QHash<QString, QString>::const_iterator i = tableDefinition.constBegin();
+    auto i = tableDefinition.constBegin();
     while (i != tableDefinition.constEnd()) {
         if (first) {
             first = false;
@@ -137,18 +137,6 @@ void QueryBuilder::setDatabase(const QSharedPointer<Database> &value) {
     database = value;
 }
 
-
-QHash<QString, QMetaProperty> QueryBuilder::getMetaProperties(const QSharedPointer<Entity> &entity) const {
-    QHash<QString, QMetaProperty> h = QHash<QString, QMetaProperty>();
-    for (int var = 0; var < entity.data()->metaObject()->propertyCount(); ++var) {
-        QMetaProperty m = entity.data()->metaObject()->property(var);
-        if (m.name() != QString("objectName") && m.isValid()) {
-            h.insert(m.name(), m);
-        }
-    }
-    return h;
-}
-
 QString QueryBuilder::buildCreateQuery(QHash<QString, QVariant>::const_iterator i,
                                        QHash<QString, QVariant>::const_iterator end,
                                        QString &p1, QString &p2) const {
@@ -211,7 +199,7 @@ QHash<QString, QHash<QString, QString>> QueryBuilder::generateRelationTables(con
 const {
     auto relations = QHash<QString, QHash<QString, QString>>();
     QHash<QString, Relation> m = entity.data()->getRelations();
-    auto props = this->getMetaProperties(entity);
+    auto props = entity.data()->getMetaProperties();
     for (auto i = m.begin(); i != m.end(); ++i) {
         Relation r = i.value();
         if (r.getType() == MANY_TO_MANY && r.getMappedBy().isEmpty()) {
@@ -314,7 +302,7 @@ QSqlQuery QueryBuilder::findByAttributes(const QHash<QString, QVariant> &m, cons
 }
 
 QSqlQuery QueryBuilder::findByAttributes(const QSharedPointer<Entity> &e, bool ignoreID) {
-    QHash<QString, QVariant> values = this->getEntityAttributes(this->getMetaProperties(e), e);
+    QHash<QString, QVariant> values = this->getEntityAttributes(e.data()->getMetaProperties(), e);
     return this->findByAttributes(values, e.data()->getTablename(), ignoreID);
 }
 
@@ -331,7 +319,7 @@ QSqlQuery QueryBuilder::remove(const QSharedPointer<Entity> &entity) const {
 }
 
 QSqlQuery QueryBuilder::findId(const QSharedPointer<Entity> &entity) const {
-    QHash<QString, QVariant> values = this->getEntityAttributes(this->getMetaProperties(entity), entity);
+    QHash<QString, QVariant> values = this->getEntityAttributes(entity.data()->getMetaProperties(), entity);
     QSqlQuery q = this->database.data()->getQuery("SELECT " + this->schema.data()->quoteColumnName("id") + " FROM " +
                   this->schema.data()->quoteTableName(
                       entity.data()->getTablename()) + this->where(values,
@@ -341,7 +329,7 @@ QSqlQuery QueryBuilder::findId(const QSharedPointer<Entity> &entity) const {
 }
 
 QSqlQuery QueryBuilder::count(const QSharedPointer<Entity> &entity, bool ignoreID) const {
-    QHash<QString, QVariant> values = this->getEntityAttributes(this->getMetaProperties(entity), entity);
+    QHash<QString, QVariant> values = this->getEntityAttributes(entity.data()->getMetaProperties(), entity);
     QSqlQuery q = this->database.data()->getQuery("SELECT COUNT(*) FROM " + this->schema.data()->quoteTableName(
                       entity.data()->getTablename()) + this->where(
                       values, "AND", ignoreID));
@@ -380,7 +368,7 @@ QSqlQuery QueryBuilder::create(const QSharedPointer<Entity> &entity) const {
 }
 
 QHash<QString, QVariant> QueryBuilder::saveAttributes(const QSharedPointer<Entity> &entity) const {
-    auto props = this->getMetaProperties(entity);
+    auto props = entity.data()->getMetaProperties();
     auto values = this->getEntityAttributes(props, entity);
     auto relValues = this->getManyToOneAttributes(props, entity);
     auto iterator = relValues.constBegin();
@@ -391,18 +379,6 @@ QHash<QString, QVariant> QueryBuilder::saveAttributes(const QSharedPointer<Entit
     return values;
 }
 
-Entity *QueryBuilder::createInstance(const char *className) const {
-    return this->createInstance(QMetaType::type(className));
-}
-
-Entity *QueryBuilder::createInstance(int id) const {
-    Entity *e = 0;
-    if (id != -1) {
-        e = static_cast<Entity *>(QMetaType::create(id));
-    }
-    return e;
-}
-
 QHash<QString, QVariant> QueryBuilder::getEntityAttributes(const QHash<QString, QMetaProperty> &props,
         const QSharedPointer<Entity> &entity) const {
     Entity *e = entity.data();
@@ -473,7 +449,7 @@ void QueryBuilder::bindValues(const QHash<QString, QVariant> &h, QSqlQuery &q, b
 }
 
 QString QueryBuilder::where(const QSharedPointer<Entity> &entity, QString conjunction, bool ignoreID) const {
-    return this->where(this->getEntityAttributes(this->getMetaProperties(entity), entity), conjunction, ignoreID);
+    return this->where(this->getEntityAttributes(entity.data()->getMetaProperties(), entity), conjunction, ignoreID);
 }
 
 QString QueryBuilder::where(const QHash<QString, QVariant> &m, const QString &conjunction, bool ignoreID) const {
diff --git a/src/relation.cpp b/src/relation.cpp
index c796213..b2af29c 100644
--- a/src/relation.cpp
+++ b/src/relation.cpp
@@ -19,7 +19,12 @@ Relation::Relation(QString propertyName, RelationType type, QString mappedBy, QS
     this->mappedBy = mappedBy;
     this->optional = true;
     this->tableName = tableName;
-    this->cascadeType = cascadeType;
+    if (this->type == MANY_TO_ONE) {
+        this->cascadeType = ALL;
+    } else {
+        this->cascadeType = cascadeType;
+    }
+
 
 }
 
