Revision ed9ffe4a
Von Christian Ehringfeld vor mehr als 9 Jahren hinzugefügt
src/database.cpp | ||
---|---|---|
|
||
bool Database::select(QSqlQuery &query) {
|
||
query.setForwardOnly(true);
|
||
bool ok = query.exec();
|
||
bool ok = query.exec();
|
||
this->debugQuery(query);
|
||
return ok;
|
||
}
|
src/schema/mysqlquerybuilder.cpp | ||
---|---|---|
#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;
|
||
}
|
src/schema/mysqlquerybuilder.h | ||
---|---|---|
#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
|
src/schema/mysqlschema.cpp | ||
---|---|---|
#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,
|
||
... | ... | |
|
||
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);
|
||
}
|
src/schema/sqliteschema.cpp | ||
---|---|---|
database, QSharedPointer<QueryBuilder>(new SqliteQueryBuilder(
|
||
QSharedPointer<Schema>
|
||
(this), database))) {
|
||
|
||
}
|
||
|
||
SqliteSchema::~SqliteSchema() {
|
||
|
||
}
|
||
|
||
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");
|
Auch abrufbar als: Unified diff
mysql stuff