commit ed9ffe4a8114a2f91de4d257d1ef5a9ab9b28cb0
Author: Christian Ehringfeld <c.ehringfeld@t-online.de>
Date:   Sun Sep 13 21:55:35 2015 +0200

    mysql stuff

diff --git a/src/database.cpp b/src/database.cpp
index 9443046..cdf1c18 100644
--- a/src/database.cpp
+++ b/src/database.cpp
@@ -211,7 +211,7 @@ void Database::debugQuery(const QSqlQuery &query) const {
 
 bool Database::select(QSqlQuery &query) {
     query.setForwardOnly(true);
-    bool ok  = query.exec();
+    bool ok = query.exec();
     this->debugQuery(query);
     return ok;
 }
diff --git a/src/schema/mysqlquerybuilder.cpp b/src/schema/mysqlquerybuilder.cpp
new file mode 100644
index 0000000..3ae4816
--- /dev/null
+++ b/src/schema/mysqlquerybuilder.cpp
@@ -0,0 +1,56 @@
+#include "mysqlquerybuilder.h"
+#include "../schema.h"
+
+CuteEntityManager::MysqlQueryBuilder::MysqlQueryBuilder(
+    QSharedPointer<CuteEntityManager::Schema> schema,
+    QSharedPointer<CuteEntityManager::Database> database) : QueryBuilder(schema,
+                database) {
+
+}
+
+QString CuteEntityManager::MysqlQueryBuilder::renameColumn(QString tableName,
+        QString oldName, QString newName) const {
+    return "ALTER TABLE " + this->schema->quoteTableName(
+               tableName) + " CHANGE " +
+           this->schema->quoteColumnName(oldName) + " " +
+           this->schema->quoteColumnName(
+               newName);
+    /**
+      * @todo must append datatype
+      */
+}
+
+QString CuteEntityManager::MysqlQueryBuilder::createIndex(QString name,
+        QString tableName, QStringList columns, bool unique) const {
+    QString s = "ALTER TABLE ";
+    s += this->schema->quoteTableName(tableName);
+    s += (unique ? "ADD UNIQUE INDEX " : "ADD INDEX ") +
+         this->schema->quoteTableName(
+             name) + " (";
+    s.append(this->buildColumns(columns));
+    s.append(");");
+    return s;
+}
+
+QString CuteEntityManager::MysqlQueryBuilder::dropForeignKey(QString name,
+        QString tableName) const {
+    return "ALTER TABLE " + this->schema->quoteTableName(
+               tableName) + " DROP FOREIGN KEY " +
+           this->schema->quoteColumnName(name);
+}
+
+QString CuteEntityManager::MysqlQueryBuilder::limit(const quint64 &limit,
+        const quint64 &offset, bool withSpace) const {
+    QString s = "";
+    if (limit > 0) {
+        s.append((withSpace ? " " : "") + this->limitKeyword() + " " +
+                 QString::number(limit));
+        if (offset > 0) {
+            s.append(" " + this->offsetKeyword() + QString::number(offset));
+        }
+    } else if (offset > 0) {
+        s.append((withSpace ? " " : "") + this->limitKeyword() + " " +
+                 QString::number(offset) + ", 18446744073709551615"); //2^64-1
+    }
+    return s;
+}
diff --git a/src/schema/mysqlquerybuilder.h b/src/schema/mysqlquerybuilder.h
new file mode 100644
index 0000000..16b1c46
--- /dev/null
+++ b/src/schema/mysqlquerybuilder.h
@@ -0,0 +1,26 @@
+#ifndef MYSQLQUERYBUILDER_H
+#define MYSQLQUERYBUILDER_H
+#include "../querybuilder.h"
+namespace CuteEntityManager {
+class MysqlQueryBuilder : public QueryBuilder
+{
+public:
+    MysqlQueryBuilder(QSharedPointer<Schema> schema,
+                       QSharedPointer<Database> database);
+
+
+    QString renameColumn(QString tableName, QString oldName,
+                                 QString newName) const override;
+    QString createIndex(QString name, QString tableName,
+                                QStringList columns,
+                                bool unique)const override;
+        QString dropForeignKey(QString name, QString tableName) const override;
+
+
+protected:
+    QString limit(const quint64 &limit, const quint64 &offset,
+                          bool withSpace = true) const override;
+};
+
+}
+#endif // MYSQLQUERYBUILDER_H
diff --git a/src/schema/mysqlschema.cpp b/src/schema/mysqlschema.cpp
index e395b6f..534a282 100644
--- a/src/schema/mysqlschema.cpp
+++ b/src/schema/mysqlschema.cpp
@@ -2,9 +2,16 @@
 #include "../database.h"
 #include <QSqlRecord>
 #include <QSqlResult>
-#include "sqlitequerybuilder.h"
+#include "mysqlquerybuilder.h"
 using namespace CuteEntityManager;
 
+MysqlSchema::MysqlSchema(QSharedPointer<Database> database) : Schema(
+        database, QSharedPointer<QueryBuilder>(new MysqlQueryBuilder(
+                    QSharedPointer<Schema>
+                    (this), database))) {
+
+}
+
 QSharedPointer<QHash<QString, QString> > MysqlSchema::getTypeMap() {
     if (this->typeMap->empty()) {
         this->typeMap->insert(TYPE_PK,
@@ -67,29 +74,29 @@ QHash<QString, QStringList> MysqlSchema::findUniqueIndexes(
 
 void MysqlSchema::findConstraints(const QSharedPointer<TableSchema> &ts) {
     QString sql =
-        "SELECT table_name, column_name,referenced_table_name,referenced_column_name";
+        "SELECT " + this->quoteColumnName("table_name") + ", " +
+        this->quoteColumnName("column_name") + ", " +
+        this->quoteColumnName("referenced_table_name") + ", " +
+        this->quoteColumnName("referenced_column_name");
     sql +=  " FROM " + this->quoteTableName("information_schema.key_column_usage");
     sql += "WHERE " + this->quoteColumnName("referenced_table_name") +
            " is not null";
-    sql += " AND " + this->quoteColumnName("table_schema") + " = \"" +
-           this->getDatabase()->getDatabase().databaseName() + "\"";
-    sql += " AND " + this->quoteColumnName("table_name") + " = \"" + ts->getName() +
-           "\"";
+    sql += " AND " + this->quoteColumnName("table_schema") + " = ?";
+    sql += " AND " + this->quoteColumnName("table_name") + " = ?";
     QSqlQuery q = this->database->getQuery();
-    q.setForwardOnly(true);
-    q.exec(sql);
+    q.prepare(sql);
+    q.bindValue(0, this->getDatabase()->getDatabase().databaseName());
+    q.bindValue(1, ts->getName());
+    this->database->select(q);
     auto foreignKeys = ts->getRelations();
     int id = 0;
     while (q.next()) {
-        bool ok;
-        if (ok) {
-            auto rel = new QSqlRelation(q.value("referenced_table_name").toString(),
-                                        q.value("column_name").toString(),
-                                        q.value("referenced_column_name").toString());
-            auto ptr = QSharedPointer<QSqlRelation>(rel);
-            foreignKeys.insert(QString::number(id), ptr);
-        }
-        id++;
+        auto rel = new QSqlRelation(q.value("referenced_table_name").toString(),
+                                    q.value("column_name").toString(),
+                                    q.value("referenced_column_name").toString());
+        auto ptr = QSharedPointer<QSqlRelation>(rel);
+        foreignKeys.insert(QString::number(id), ptr);
+        ++id;
     }
     ts->setRelations(foreignKeys);
 }
diff --git a/src/schema/sqliteschema.cpp b/src/schema/sqliteschema.cpp
index 7bc48a4..19e5714 100644
--- a/src/schema/sqliteschema.cpp
+++ b/src/schema/sqliteschema.cpp
@@ -24,11 +24,9 @@ SqliteSchema::SqliteSchema(QSharedPointer<Database> database) : Schema(
         database, QSharedPointer<QueryBuilder>(new SqliteQueryBuilder(
                     QSharedPointer<Schema>
                     (this), database))) {
-
 }
 
 SqliteSchema::~SqliteSchema() {
-
 }
 
 QSharedPointer<QHash<QString, QString>> SqliteSchema::getTypeMap() {
@@ -36,7 +34,7 @@ QSharedPointer<QHash<QString, QString>> SqliteSchema::getTypeMap() {
         this->typeMap->insert(TYPE_PK,
                               "integer PRIMARY KEY AUTOINCREMENT NOT NULL");
         this->typeMap->insert(TYPE_BIGPK,
-                              "bigint PRIMARY KEY AUTOINCREMENT NOT NULL");
+                              "integer PRIMARY KEY AUTOINCREMENT NOT NULL");
         this->typeMap->insert(TYPE_BOOLEAN, "boolean");
         this->typeMap->insert(TYPE_SMALLINT, "smallint");
         this->typeMap->insert(TYPE_INTEGER, "integer");
