commit d99101aee8b6bfa0d43871e5d1bae63127ea453a
Author: Christian Ehringfeld <c.ehringfeld@t-online.de>
Date:   Mon Apr 13 19:38:29 2015 +0200

    thanks to yii2 ^^

diff --git a/src/querybuilder.cpp b/src/querybuilder.cpp
index 1260c53..d657cdc 100644
--- a/src/querybuilder.cpp
+++ b/src/querybuilder.cpp
@@ -59,57 +59,82 @@ QString QueryBuilder::createTableQuery(const QString &tableName, const QHash<QSt
     return s;
 }
 
-bool QueryBuilder::renameTable(QString tableName, QString newName) const {
-
+QString QueryBuilder::renameTable(QString tableName, QString newName) const {
+    return "RENAME TABLE " + this->schema.data()->quoteTableName(tableName) + " TO " + this->schema.data()->quoteTableName(
+               newName);
 }
 
-bool QueryBuilder::dropTable(QString tableName) const {
-
+QString QueryBuilder::dropTable(QString tableName) const {
+    return "DROP TABLE " + this->schema.data()->quoteTableName(tableName);
 }
 
-bool QueryBuilder::truncateTable(QString tableName) const {
-
+QString QueryBuilder::truncateTable(QString tableName) const {
+    return "TRUNCATE TABLE " + this->schema.data()->quoteTableName(tableName);
 }
 
-bool QueryBuilder::addColumn(QString tableName, QString columnName, QString columnType) const {
-
+QString QueryBuilder::addColumn(QString tableName, QString columnName, QString columnType) const {
+    return "ALTER TABLE " + this->schema.data()->quoteTableName(tableName) + " ADD " + this->schema.data()->quoteColumnName(
+               columnName) + " " + this->getColumnType(columnType);
 }
 
 QString QueryBuilder::dropColumn(QString tableName, QString columName) const {
-
+    return "ALTER TABLE " + this->schema.data()->quoteTableName(tableName) + " DROP COLUMN " +
+           this->schema.data()->quoteColumnName(columName);
 }
 
 QString QueryBuilder::renameColumn(QString tableName, QString oldName, QString newName) const {
-
+    return "ALTER TABLE " + this->schema.data()->quoteTableName(tableName) + " RENAME COLUMN " +
+           this->schema.data()->quoteColumnName(oldName) + " TO " + this->schema.data()->quoteColumnName(newName);
 }
 
 QString QueryBuilder::alterColumn(QString tableName, QString columnName, QString newType) const {
-
+    return "ALTER TABLE " + this->schema.data()->quoteTableName(tableName) + " CHANGE " +
+           this->schema.data()->quoteColumnName(columnName) + " " +
+           this->schema.data()->quoteColumnName(columnName) + this->getColumnType(newType);
 }
 
 QString QueryBuilder::addPrimaryKey(QString name, QString tableName, QStringList columns) const {
-
+    return "ALTER TABLE " + this->schema.data()->quoteTableName(tableName) + " ADD CONSTRAINT " +
+           this->schema.data()->quoteColumnName(name) + "PRIMARY KEY (" + this->buildColumns(columns) + " )";
 }
 
 QString QueryBuilder::dropPrimaryKey(QString name, QString tableName) const {
-
+    return "ALTER TABLE " + this->schema.data()->quoteTableName(tableName) + " DROP CONSTRAINT " +
+           this->schema.data()->quoteColumnName(name);
 }
 
 QString QueryBuilder::addForeignKey(QString name, QString tableName, QStringList columns, QString refTableName,
-                                    QStringList refColumns, QString deleteConstraint, QString updateConstraint) {
-
+                                    QStringList refColumns, QString deleteConstraint, QString updateConstraint) const {
+    QString r = "ALTER TABLE " + this->schema.data()->quoteTableName(tableName) + "ADD CONSTRAINT " +
+                this->schema.data()->quoteColumnName(name)
+                + " FOREIGN KEY (" +  this->buildColumns(columns) + ")" + " REFERENCES " + this->schema.data()->quoteTableName(
+                    refTableName) +
+                " (" + this->buildColumns(refColumns) + ")";
+    if (!deleteConstraint.isEmpty()) {
+        r.append(" ON DELETE " + deleteConstraint);
+    }
+    if (!updateConstraint.isEmpty()) {
+        r.append(" ON UPDATE " + updateConstraint);
+    }
+    return r;
 }
 
 QString QueryBuilder::dropForeignKey(QString name, QString tableName) const {
-
+    return "ALTER TABLE " + this->schema.data()->quoteTableName(tableName) + " DROP CONSTRAINT " +
+           this->schema.data()->quoteColumnName(name);
 }
 
 QString QueryBuilder::createIndex(QString name, QString tableName, QStringList columns, bool unique) const {
-
+    QString s = (unique ? "CREATE UNIQUE INDEX " : "CREATE INDEX ") + this->schema.data()->quoteTableName(
+                    name) + " ON " + this->schema.data()->quoteTableName(tableName) + " (";
+    s.append(this->buildColumns(columns));
+    s.append(");");
+    return s;
 }
 
 QString QueryBuilder::dropIndex(QString name, QString tableName) const {
-
+    return "DROP INDEX " + this->schema.data()->quoteTableName(name) + " ON " + this->schema.data()->quoteTableName(
+               tableName);
 }
 
 QSharedPointer<Database> QueryBuilder::getDatabase() const {
@@ -123,14 +148,19 @@ void QueryBuilder::setDatabase(const QSharedPointer<Database> &value) {
 QHash<QString, QString> QueryBuilder::generateTableDefinition(const QSharedPointer<Entity> &entity) const {
     auto map = QHash<QString, QString>();
     auto o = entity.data()->metaObject();
+    QHash<QString, Relation> relations = entity.data()->getRelations();
     for (int var = 0; var < o->propertyCount(); ++var) {
         o->property(var);
         auto m = o->property(var);
         if (m.isReadable() && !entity.data()->getTransientAttributes().contains(m.name())) {
             if (m.isEnumType()) {
                 map.insert(m.name(), this->schema.data()->getTypeMap().data()->value(this->schema.data()->TYPE_INTEGER));
-            } else if (entity.data()->getRelations().contains(m.name())) {
-                map.insert(QString(m.name()) + "_id", this->schema.data()->TYPE_INTEGER);
+            } else if (relations.contains(m.name())) {
+                Relation r = relations.value(m.name());
+                if (r.getType() == RelationType::BELONGS_TO) {
+                    //@TODO detect if id is BIGINT or only Integer
+                    map.insert(QString(m.name()) + "_id", this->schema.data()->TYPE_INTEGER);
+                }
             } else if (entity.data()->getBLOBColumns().contains(m.name())) {
                 map.insert(m.name(), this->schema.data()->getTypeMap().data()->value(this->schema.data()->TYPE_BINARY));
             } else {
@@ -165,6 +195,13 @@ QString QueryBuilder::transformAbstractTypeToRealDbType(QString typeName) const
     return this->schema.data()->getTypeMap().data()->value(typeName);
 }
 
+QString QueryBuilder::getColumnType(QString type) const {
+    /**
+      * @TODO
+      */
+    return this->transformAbstractTypeToRealDbType(type);
+}
+
 QHash<QString, QVariant> QueryBuilder::getEntityAttributes(const QSharedPointer<Entity> &entity) {
     Entity *e = entity.data();
     auto map = QHash<QString, QVariant>();
@@ -204,6 +241,20 @@ void QueryBuilder::insertRelationId(const Entity *e, QHash<QString, QVariant> &m
     }
 }
 
+QString QueryBuilder::buildColumns(const QStringList &columns) const {
+    QString r = "";
+    bool first = true;
+    for (int var = 0; var < columns.size(); ++var) {
+        if (!first) {
+            r.append(",");
+        } else {
+            first = false;
+        }
+        r.append(columns.at(var));
+    }
+    return r;
+}
+
 QSharedPointer<Schema> QueryBuilder::getSchema() const {
     return schema;
 }
diff --git a/src/querybuilder.h b/src/querybuilder.h
index df9d6e7..062ba11 100644
--- a/src/querybuilder.h
+++ b/src/querybuilder.h
@@ -14,17 +14,17 @@ class QueryBuilder {
     virtual bool createTable(const QSharedPointer<Entity> &entity) const;
     virtual bool createTable(const QString &tableName, const QHash<QString, QString> &tableDefinition) const;
     virtual QString createTableQuery(const QString &tableName, const QHash<QString, QString> &tableDefinition) const;
-    virtual bool renameTable(QString tableName, QString newName) const;
-    virtual bool dropTable(QString tableName) const;
-    virtual bool truncateTable(QString tableName) const;
-    virtual bool addColumn(QString tableName, QString columnName, QString columnType) const;
+    virtual QString renameTable(QString tableName, QString newName) const;
+    virtual QString dropTable(QString tableName) const;
+    virtual QString truncateTable(QString tableName) const;
+    virtual QString addColumn(QString tableName, QString columnName, QString columnType) const;
     virtual QString dropColumn(QString tableName, QString columName)const;
     virtual QString renameColumn(QString tableName, QString oldName, QString newName) const;
     virtual QString alterColumn(QString tableName, QString columnName, QString newType)const;
     virtual QString addPrimaryKey(QString name, QString tableName, QStringList columns)const;
     virtual QString dropPrimaryKey(QString name, QString tableName) const;
     virtual QString addForeignKey(QString name, QString tableName, QStringList columns, QString refTableName,
-                                  QStringList refColumns, QString deleteConstraint, QString updateConstraint);
+                                  QStringList refColumns, QString deleteConstraint, QString updateConstraint) const;
     virtual QString dropForeignKey(QString name, QString tableName) const;
     virtual QString createIndex(QString name, QString tableName, QStringList columns, bool unique)const;
     virtual QString dropIndex(QString name, QString tableName)const;
@@ -39,10 +39,12 @@ class QueryBuilder {
 
     QString transformTypeToAbstractDbType(QString typeName) const;
     QString transformAbstractTypeToRealDbType(QString typeName) const;
+    QString getColumnType(QString type) const;
+
 
   protected:
     void insertRelationId(const Entity *e, QHash<QString, QVariant> &map, QString relName);
-
+    QString buildColumns(const QStringList &columns) const;
 
     QSharedPointer<Schema> schema;
     QSharedPointer<Database> database;
diff --git a/src/relation.h b/src/relation.h
index a7739a7..c598b8b 100644
--- a/src/relation.h
+++ b/src/relation.h
@@ -3,10 +3,10 @@
 #include <QString>
 namespace CuteEntityManager {
 enum RelationType {
-    ONE_TO_ONE,
-    ONE_TO_MANY,
-    MANY_TO_MANY,
-    MANY_TO_ONE
+    BELONGS_TO,
+    HAS_MANY,
+    HAS_ONE,
+    MANY_MANY,
 };
 
 class Relation {
diff --git a/src/schema/sqlitequerybuilder.cpp b/src/schema/sqlitequerybuilder.cpp
index 6f814bb..b8402ee 100644
--- a/src/schema/sqlitequerybuilder.cpp
+++ b/src/schema/sqlitequerybuilder.cpp
@@ -1,5 +1,5 @@
 #include "sqlitequerybuilder.h"
-
+#include "../schema.h"
 
 CuteEntityManager::SqliteQueryBuilder::SqliteQueryBuilder(QSharedPointer<CuteEntityManager::Schema> schema,
         QSharedPointer<CuteEntityManager::Database> database) : QueryBuilder(schema, database) {
@@ -9,3 +9,49 @@ CuteEntityManager::SqliteQueryBuilder::SqliteQueryBuilder(QSharedPointer<CuteEnt
 CuteEntityManager::SqliteQueryBuilder::~SqliteQueryBuilder() {
 
 }
+
+QString CuteEntityManager::SqliteQueryBuilder::truncateTable(QString tableName) const {
+    return "DELETE FROM " + this->schema.data()->quoteTableName(tableName);
+}
+
+QString CuteEntityManager::SqliteQueryBuilder::dropIndex(QString name, QString tableName) const {
+    return "DROP INDEX " + this->schema.data()->quoteTableName(name);
+}
+
+QString CuteEntityManager::SqliteQueryBuilder::dropColumn(QString tableName, QString columName) const {
+    //not supported
+    return "";
+}
+
+QString CuteEntityManager::SqliteQueryBuilder::renameColumn(QString tableName, QString oldName, QString newName) const {
+    //not supported
+    return "";
+}
+
+QString CuteEntityManager::SqliteQueryBuilder::addForeignKey(QString name, QString tableName, QStringList columns,
+        QString refTableName, QStringList refColumns, QString deleteConstraint, QString updateConstraint) const {
+    //not supported
+    return "";
+}
+
+QString CuteEntityManager::SqliteQueryBuilder::dropForeignKey(QString name, QString tableName) const {
+    //not supported
+    return "";
+}
+
+QString CuteEntityManager::SqliteQueryBuilder::alterColumn(QString tableName, QString columnName,
+        QString newType) const {
+    //not supported
+    return "";
+}
+
+QString CuteEntityManager::SqliteQueryBuilder::addPrimaryKey(QString name, QString tableName,
+        QStringList columns) const {
+    //not supported
+    return "";
+}
+
+QString CuteEntityManager::SqliteQueryBuilder::dropPrimaryKey(QString name, QString tableName) const {
+    //not supported
+    return "";
+}
diff --git a/src/schema/sqlitequerybuilder.h b/src/schema/sqlitequerybuilder.h
index ffe6c3b..4a5eb3f 100644
--- a/src/schema/sqlitequerybuilder.h
+++ b/src/schema/sqlitequerybuilder.h
@@ -7,6 +7,18 @@ class SqliteQueryBuilder : public QueryBuilder
 public:
     SqliteQueryBuilder(QSharedPointer<Schema> schema, QSharedPointer<Database> database);
     ~SqliteQueryBuilder();
+
+    virtual QString truncateTable(QString tableName) const;
+    virtual QString dropIndex(QString name, QString tableName) const;
+    virtual QString dropColumn(QString tableName, QString columName)const;
+    virtual QString renameColumn(QString tableName, QString oldName, QString newName) const;
+    virtual QString addForeignKey(QString name, QString tableName, QStringList columns, QString refTableName,
+                                  QStringList refColumns, QString deleteConstraint, QString updateConstraint) const;
+    virtual QString dropForeignKey(QString name, QString tableName) const;
+    virtual QString alterColumn(QString tableName, QString columnName, QString newType) const;
+    virtual QString addPrimaryKey(QString name, QString tableName, QStringList columns) const;
+    virtual QString dropPrimaryKey(QString name, QString tableName) const;
+
 };
 
 }
