Projekt

Allgemein

Profil

« Zurück | Weiter » 

Revision ed9ffe4a

Von Christian Ehringfeld vor mehr als 8 Jahren hinzugefügt

  • ID ed9ffe4a8114a2f91de4d257d1ef5a9ab9b28cb0
  • Vorgänger 5b3f11b2
  • Nachfolger 2d59cb88

mysql stuff

Unterschiede anzeigen:

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