Revision b0bf458e
Von Christian Ehringfeld vor mehr als 10 Jahren hinzugefügt
| EntityManager.pro | ||
|---|---|---|
|
src/tableschema.h \
|
||
|
src/schema/pgsqlschema.h \
|
||
|
src/schema/mysqlschema.h \
|
||
|
src/databasemigration.h \
|
||
|
src/querybuilder.h \
|
||
|
src/databasemigration.h
|
||
|
src/schema/sqlitequerybuilder.h
|
||
|
|
||
|
SOURCES += \
|
||
|
src/entity.cpp \
|
||
| ... | ... | |
|
src/tableschema.cpp \
|
||
|
src/schema/pgsqlschema.cpp \
|
||
|
src/schema/mysqlschema.cpp \
|
||
|
src/databasemigration.cpp \
|
||
|
src/querybuilder.cpp \
|
||
|
src/databasemigration.cpp
|
||
|
src/schema/sqlitequerybuilder.cpp
|
||
|
|
||
|
unix {
|
||
|
target.path = /usr/lib
|
||
| src/entitymanager.cpp | ||
|---|---|---|
|
|
||
|
#include "entitymanager.h"
|
||
|
#include "enums/databasetype.h"
|
||
|
#include <QMetaObject>
|
||
|
#include <QMetaProperty>
|
||
|
using namespace CuteEntityManager;
|
||
|
/**
|
||
|
* Relationen fehlen noch
|
||
| ... | ... | |
|
auto schema = CuteEntityManager::getSchema(CuteEntityManager::getDatabaseType(
|
||
|
this->db.data()->getDatabase().driverName()), this->db);
|
||
|
this->schema = QSharedPointer<Schema>(schema);
|
||
|
this->schema.data()->setTables(this->schema.data()->getTableSchemas());
|
||
|
}
|
||
|
|
||
|
EntityManager::EntityManager(QSqlDatabase database) {
|
||
| ... | ... | |
|
this->init();
|
||
|
}
|
||
|
|
||
|
//inline bool EntityManager::checkTable(Entity *entity) {
|
||
|
// bool rc = true;
|
||
|
// if (!this->db->containsTable(entity->getTablename())) {
|
||
|
// qDebug() << "Tabelle" << entity->getTablename() << "existiert noch nicht.";
|
||
|
// if (this->createTable(entity)) {
|
||
|
// this->db->refreshTableList();
|
||
|
// rc = this->db->containsTable(entity->getTablename());
|
||
|
// }
|
||
|
// }
|
||
|
// return rc;
|
||
|
//}
|
||
|
bool EntityManager::checkTable(const QSharedPointer<Entity> &entity) {
|
||
|
bool rc = true;
|
||
|
if (!this->schema.data()->containsTable(entity.data()->getTablename())) {
|
||
|
if (this->schema.data()->getQueryBuilder().data()->createTable(entity)) {
|
||
|
this->schema.data()->getTableSchema(entity.data()->getTablename(), true);
|
||
|
rc = this->schema.data()->getTables().contains(entity.data()->getTablename());
|
||
|
}
|
||
|
}
|
||
|
return rc;
|
||
|
}
|
||
|
|
||
|
QSharedPointer<Database> EntityManager::getDb() const {
|
||
|
return db;
|
||
| ... | ... | |
|
schema = value;
|
||
|
}
|
||
|
|
||
|
QHash<QString, QVariant> EntityManager::getEntityAttributes(const QSharedPointer<Entity> &entity) {
|
||
|
Entity *e = entity.data();
|
||
|
auto map = QHash<QString, QVariant>();
|
||
|
auto metaObject = e->metaObject();
|
||
|
auto transientAttrs = e->getTransientAttributes();
|
||
|
for (int var = 0; var < metaObject->propertyCount(); ++var) {
|
||
|
auto p = metaObject->property(var);
|
||
|
QString name = QString(p.name());
|
||
|
if (p.isValid() && !transientAttrs.contains(name)) {
|
||
|
QVariant v = p.read(e);
|
||
|
//Relation
|
||
|
if (v.canConvert<Entity *>()) {
|
||
|
this->insertRelationId(qvariant_cast<Entity *>(v),map,name);
|
||
|
} else if (v.canConvert<QSharedPointer<Entity>>()) {
|
||
|
this->insertRelationId(qvariant_cast<QSharedPointer<Entity>>(v).data(),map,name);
|
||
|
} else if (QString(p.typeName()).contains("QList")) {
|
||
|
/**
|
||
|
@TODO
|
||
|
//List and/or ManyToManyRelation
|
||
|
*/
|
||
|
auto n = static_cast<QList<CuteEntityManager::Entity *>*>(v.data());
|
||
|
for (int var = 0; var < n->size(); ++var) {
|
||
|
CuteEntityManager::Entity *entity = n->at(var);
|
||
|
qDebug() << entity->toString();
|
||
|
}
|
||
|
} else {
|
||
|
map.insert(name, v);
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
return map;
|
||
|
}
|
||
|
|
||
|
void EntityManager::insertRelationId(const Entity *e, QHash<QString, QVariant> &map, QString relName) {
|
||
|
if (e && e->getId() > -1) {
|
||
|
map.insert(relName + "_id", e->getId());
|
||
|
}
|
||
|
}
|
||
|
|
||
|
|
||
|
QString EntityManager::createConnection() {
|
||
|
QStringList l = EntityManager::getConnectionNames();
|
||
|
QString conName = "";
|
||
| ... | ... | |
|
return rc;
|
||
|
}
|
||
|
|
||
|
//QString EntityManager::createTableQuery(QSharedPointer<Entity> entity) {
|
||
|
// QChar c = this->db->escapeChar();
|
||
|
// QHash<QString, QString> m = entity->getProperties(this->db->getDatabaseType());
|
||
|
// bool first = true;
|
||
|
// QString s = "CREATE TABLE IF NOT EXISTS ";
|
||
|
// s.append(c).append(entity->getTablename()).append(c).append("(");
|
||
|
// QHash<QString, QString>::const_iterator i = m.constBegin();
|
||
|
// while (i != m.constEnd()) {
|
||
|
// if (first) {
|
||
|
// first = false;
|
||
|
// } else {
|
||
|
// s.append(',');
|
||
|
// }
|
||
|
// s.append(c).append(i.key()).append(c).append(" " + i.value());
|
||
|
// ++i;
|
||
|
// }
|
||
|
// s.append(");");
|
||
|
// return s;
|
||
|
//}
|
||
|
|
||
|
//bool EntityManager::createTable(Entity *entity) {
|
||
|
// bool rc = false;
|
||
|
// this->db->containsTable(entity->getTablename()) ? rc = true : rc = false;
|
||
|
// if (!rc) {
|
||
|
// QSqlQuery q = this->db->getQuery(this->createTableQuery(entity));
|
||
|
// if (this->db->transaction(q)) {
|
||
|
// this->db->refreshTableList();
|
||
|
// rc = true;
|
||
|
// }
|
||
|
// }
|
||
|
// return rc;
|
||
|
|
||
|
//}
|
||
|
|
||
|
void EntityManager::setConnectionNames(QStringList list) {
|
||
|
EntityManager::connectionNames = list;
|
||
|
}
|
||
| src/entitymanager.h | ||
|---|---|---|
|
void init();
|
||
|
QString where(const QSharedPointer<Entity> &entity, QString conjunction = ",", bool ignoreID = false);
|
||
|
QString where(const QHash<QString, QVariant> &m, const QString &conjunction = ",", bool ignoreID = false);
|
||
|
void insertRelationId(const Entity *e, QHash<QString, QVariant> &map, QString relName);
|
||
|
|
||
|
public:
|
||
|
EntityManager(QSqlDatabase database);
|
||
| ... | ... | |
|
void setDb(const QSharedPointer<Database> &value);
|
||
|
QSharedPointer<Schema> getSchema() const;
|
||
|
void setSchema(const QSharedPointer<Schema> &value);
|
||
|
QHash<QString, QVariant> getEntityAttributes(const QSharedPointer<Entity> &entity);
|
||
|
|
||
|
};
|
||
|
}
|
||
| src/querybuilder.cpp | ||
|---|---|---|
|
#include "querybuilder.h"
|
||
|
#include "database.h"
|
||
|
#include <QMetaObject>
|
||
|
#include <QMetaProperty>
|
||
|
#include "entity.h"
|
||
|
using namespace CuteEntityManager;
|
||
|
|
||
|
QueryBuilder::QueryBuilder() {
|
||
|
//bool QueryBuilder::createTable(QString tablename, QHash<QString, QString> tableDefinition) {
|
||
|
//// QHash<QString, QString> Artikel::getProperties(DatabaseType type) {
|
||
|
//// QHash<QString, QString> h = QHash<QString, QString>();
|
||
|
//// h.insert("id",this->idColumnSQL());
|
||
|
//// h.insert("preis","DOUBLE");
|
||
|
//// h.insert("name","TEXT");
|
||
|
//// return h;
|
||
|
//// }
|
||
|
//}
|
||
|
|
||
|
QueryBuilder::QueryBuilder(QSharedPointer<Schema> schema, QSharedPointer<Database> database) {
|
||
|
this->schema = schema;
|
||
|
this->database = database;
|
||
|
}
|
||
|
|
||
|
QueryBuilder::~QueryBuilder() {
|
||
|
bool QueryBuilder::createTable(const QSharedPointer<Entity> &entity) const {
|
||
|
return this->createTable(entity.data()->getTablename(), this->generateTableDefinition(entity));
|
||
|
}
|
||
|
|
||
|
bool QueryBuilder::createTable(const QString &tableName, const QHash<QString, QString> &tableDefinition) const {
|
||
|
bool rc = false;
|
||
|
this->schema.data()->containsTable(tableName) ? rc = true : rc = false;
|
||
|
if (!rc) {
|
||
|
QSqlQuery q = this->database.data()->getQuery(this->createTableQuery(tableName, tableDefinition));
|
||
|
if (this->database.data()->transaction(q)) {
|
||
|
this->schema.data()->getTableSchema(tableName);
|
||
|
rc = true;
|
||
|
}
|
||
|
}
|
||
|
return rc;
|
||
|
}
|
||
|
|
||
|
QString QueryBuilder::createTableQuery(const QString &tableName, const QHash<QString, QString> &tableDefinition) const {
|
||
|
bool first = true;
|
||
|
QString s = "CREATE TABLE ";
|
||
|
s.append(this->schema.data()->quoteTableName(tableName).append(" (\n"));
|
||
|
QHash<QString, QString>::const_iterator i = tableDefinition.constBegin();
|
||
|
while (i != tableDefinition.constEnd()) {
|
||
|
if (first) {
|
||
|
first = false;
|
||
|
} else {
|
||
|
s.append(',');
|
||
|
}
|
||
|
s.append(this->schema.data()->quoteColumnName(i.key())).append(" " + i.value());
|
||
|
++i;
|
||
|
}
|
||
|
s.append("\n);");
|
||
|
return s;
|
||
|
}
|
||
|
|
||
|
QSharedPointer<Database> QueryBuilder::getDatabase() const {
|
||
|
return database;
|
||
|
}
|
||
|
|
||
|
void QueryBuilder::setDatabase(const QSharedPointer<Database> &value) {
|
||
|
database = value;
|
||
|
}
|
||
|
|
||
|
bool QueryBuilder::createTable(QString tablename, QHash<QString, QString> tableDefinition) {
|
||
|
// QHash<QString, QString> Artikel::getProperties(DatabaseType type) {
|
||
|
// QHash<QString, QString> h = QHash<QString, QString>();
|
||
|
// h.insert("id",this->idColumnSQL());
|
||
|
// h.insert("preis","DOUBLE");
|
||
|
// h.insert("name","TEXT");
|
||
|
// return h;
|
||
|
// }
|
||
|
QHash<QString, QString> QueryBuilder::generateTableDefinition(const QSharedPointer<Entity> &entity) const {
|
||
|
auto map = QHash<QString, QString>();
|
||
|
auto o = entity.data()->metaObject();
|
||
|
for (int var = 0; var < o->propertyCount(); ++var) {
|
||
|
auto m = o->property(var);
|
||
|
if (m.isReadable() && !entity.data()->getTransientAttributes().contains(m.name())) {
|
||
|
m.typeName();
|
||
|
/**
|
||
|
@TODO
|
||
|
*/
|
||
|
}
|
||
|
}
|
||
|
return map;
|
||
|
}
|
||
|
|
||
|
QHash<QString, QVariant> QueryBuilder::getEntityAttributes(const QSharedPointer<Entity> &entity) {
|
||
|
Entity *e = entity.data();
|
||
|
auto map = QHash<QString, QVariant>();
|
||
|
auto metaObject = e->metaObject();
|
||
|
auto transientAttrs = e->getTransientAttributes();
|
||
|
for (int var = 0; var < metaObject->propertyCount(); ++var) {
|
||
|
auto p = metaObject->property(var);
|
||
|
QString name = QString(p.name());
|
||
|
if (p.isValid() && !transientAttrs.contains(name)) {
|
||
|
QVariant v = p.read(e);
|
||
|
//Relation
|
||
|
if (v.canConvert<Entity *>()) {
|
||
|
this->insertRelationId(qvariant_cast<Entity *>(v), map, name);
|
||
|
} else if (v.canConvert<QSharedPointer<Entity>>()) {
|
||
|
this->insertRelationId(qvariant_cast<QSharedPointer<Entity>>(v).data(), map, name);
|
||
|
} else if (QString(p.typeName()).contains("QList")) {
|
||
|
/**
|
||
|
@TODO
|
||
|
//List and/or ManyToManyRelation
|
||
|
*/
|
||
|
auto n = static_cast<QList<CuteEntityManager::Entity *>*>(v.data());
|
||
|
for (int var = 0; var < n->size(); ++var) {
|
||
|
CuteEntityManager::Entity *entity = n->at(var);
|
||
|
qDebug() << entity->toString();
|
||
|
}
|
||
|
} else {
|
||
|
map.insert(name, v);
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
return map;
|
||
|
}
|
||
|
|
||
|
void QueryBuilder::insertRelationId(const Entity *e, QHash<QString, QVariant> &map, QString relName) {
|
||
|
if (e && e->getId() > -1) {
|
||
|
map.insert(relName + "_id", e->getId());
|
||
|
}
|
||
|
}
|
||
|
|
||
|
QSharedPointer<Schema> QueryBuilder::getSchema() const {
|
||
|
return schema;
|
||
|
}
|
||
|
|
||
|
void QueryBuilder::setSchema(const QSharedPointer<Schema> &value) {
|
||
|
schema = value;
|
||
|
}
|
||
|
|
||
| src/querybuilder.h | ||
|---|---|---|
|
#ifndef QUERYBUILDER_H
|
||
|
#define QUERYBUILDER_H
|
||
|
#include "schema.h"
|
||
|
#include <QString>
|
||
|
#include <QHash>
|
||
|
#include <QSharedPointer>
|
||
|
namespace CuteEntityManager {
|
||
|
class Schema;
|
||
|
class Entity;
|
||
|
class Database;
|
||
|
class QueryBuilder {
|
||
|
public:
|
||
|
QueryBuilder(QSharedPointer<Schema> schema, QSharedPointer<Database> database);
|
||
|
virtual ~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 dropColumn(QString tableName, QString columName)const;
|
||
|
virtual QString renameColumn(QString tableName, QString oldName, QString newName);
|
||
|
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);
|
||
|
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;
|
||
|
QHash<QString, QVariant> getEntityAttributes(const QSharedPointer<Entity> &entity);
|
||
|
QSharedPointer<Schema> getSchema() const;
|
||
|
void setSchema(const QSharedPointer<Schema> &value);
|
||
|
|
||
|
class QueryBuilder
|
||
|
{
|
||
|
public:
|
||
|
QueryBuilder();
|
||
|
~QueryBuilder();
|
||
|
bool createTable(QString tablename, QHash<QString, QString> tableDefinition);
|
||
|
QSharedPointer<Database> getDatabase() const;
|
||
|
void setDatabase(const QSharedPointer<Database> &value);
|
||
|
|
||
|
QHash<QString, QString> generateTableDefinition(const QSharedPointer<Entity> &entity) const;
|
||
|
|
||
|
|
||
|
protected:
|
||
|
void insertRelationId(const Entity *e, QHash<QString, QVariant> &map, QString relName);
|
||
|
|
||
|
|
||
|
QSharedPointer<Schema> schema;
|
||
|
QSharedPointer<Database> database;
|
||
|
};
|
||
|
}
|
||
|
|
||
|
#endif // QUERYBUILDER_H
|
||
| src/schema.cpp | ||
|---|---|---|
|
Schema::Schema(QSharedPointer<Database> database) {
|
||
|
this->database = database;
|
||
|
this->typeMap = QSharedPointer<QHash<QString, QString>>(new QHash<QString, QString>());
|
||
|
this->queryBuilder = QSharedPointer<QueryBuilder>();
|
||
|
}
|
||
|
|
||
|
Schema::~Schema() {
|
||
|
|
||
|
}
|
||
|
|
||
|
QHash<QString, QString> Schema::getAbstractDatabaseTypes() {
|
||
|
auto typeMap = QHash<QString, QString>();
|
||
|
typeMap.insert("bool", TYPE_SMALLINT);
|
||
|
typeMap.insert("short", TYPE_SMALLINT);
|
||
|
typeMap.insert("int", TYPE_INTEGER);
|
||
|
typeMap.insert("long", TYPE_INTEGER);
|
||
|
typeMap.insert("long long", TYPE_INTEGER);
|
||
|
typeMap.insert("float", TYPE_FLOAT);
|
||
|
typeMap.insert("double", TYPE_FLOAT);
|
||
|
typeMap.insert("long double", TYPE_FLOAT);
|
||
|
typeMap.insert("qint", TYPE_INTEGER);
|
||
|
typeMap.insert("quint", TYPE_INTEGER);
|
||
|
typeMap.insert("quuid", TYPE_INTEGER);
|
||
|
typeMap.insert("qfloat", TYPE_FLOAT);
|
||
|
typeMap.insert("unsigned short", TYPE_SMALLINT);
|
||
|
typeMap.insert("unsigned int", TYPE_INTEGER);
|
||
|
typeMap.insert("unsigned long", TYPE_INTEGER);
|
||
|
typeMap.insert("unsigned long long", TYPE_INTEGER);
|
||
|
typeMap.insert("char",TYPE_CHAR);
|
||
|
typeMap.insert("std::string", TYPE_TEXT);
|
||
|
typeMap.insert("QString", TYPE_TEXT);
|
||
|
typeMap.insert("QVariant", TYPE_TEXT);
|
||
|
typeMap.insert("QUuid", TYPE_TEXT);
|
||
|
typeMap.insert("QDate", TYPE_DATE);
|
||
|
typeMap.insert("QTime", TYPE_TIME);
|
||
|
typeMap.insert("QDateTime", TYPE_DATETIME);
|
||
|
typeMap.insert("QByteArray", TYPE_BINARY);
|
||
|
typeMap.insert("QBitArray", TYPE_BINARY);
|
||
|
return typeMap;
|
||
|
}
|
||
|
|
||
|
QString Schema::quoteSimpleTableName(QString name) {
|
||
|
return name.indexOf("`") ? name : "`" + name + "`";
|
||
|
}
|
||
| ... | ... | |
|
if (schema != "") {
|
||
|
name = schema + "." + names.at(i);
|
||
|
}
|
||
|
TableSchema *t = this->getTableSchema(name, refresh);
|
||
|
if (t) {
|
||
|
this->tables.insert(name, QSharedPointer<TableSchema>(t));
|
||
|
}
|
||
|
this->getTableSchema(name, refresh);
|
||
|
}
|
||
|
return this->tables;
|
||
|
}
|
||
| ... | ... | |
|
return this->tables.contains(tblname);
|
||
|
}
|
||
|
|
||
|
QString Schema::quoteValue(QString str) {
|
||
|
|
||
|
}
|
||
|
|
||
|
TableSchema *Schema::getTableSchema(QString name, bool refresh) {
|
||
|
QSharedPointer<TableSchema> Schema::getTableSchema(QString name, bool refresh) {
|
||
|
if (refresh) {
|
||
|
this->refresh();
|
||
|
}
|
||
|
if (this->tables.contains(name)) {
|
||
|
return this->tables.value(name).data();
|
||
|
return this->tables.value(name);
|
||
|
}
|
||
|
QString realName = this->getRawTable(name);
|
||
|
auto ts = this->loadTableSchema(realName);
|
||
|
if (ts.data()) {
|
||
|
this->tables.insert(name, ts);
|
||
|
}
|
||
|
return ts.data();
|
||
|
return ts;
|
||
|
}
|
||
|
|
||
|
QSharedPointer<Database> Schema::getDatabase() const {
|
||
| ... | ... | |
|
void Schema::setDatabase(const QSharedPointer<Database> &value) {
|
||
|
database = value;
|
||
|
}
|
||
|
QSharedPointer<QueryBuilder> Schema::getQueryBuilder() const {
|
||
|
return queryBuilder;
|
||
|
}
|
||
|
|
||
|
QHash<QString, QSharedPointer<TableSchema> > Schema::getTables() const {
|
||
|
return this->tables;
|
||
| src/schema.h | ||
|---|---|---|
|
#include <QHash>
|
||
|
#include <QSharedPointer>
|
||
|
#include <QSqlField>
|
||
|
#include "querybuilder.h"
|
||
|
namespace CuteEntityManager {
|
||
|
class Database;
|
||
|
class Schema {
|
||
| ... | ... | |
|
|
||
|
|
||
|
virtual QHash<QString, QString> *getTypeMap() = 0;
|
||
|
QHash<QString, QString> getAbstractDatabaseTypes();
|
||
|
virtual QString quoteSimpleTableName(QString name);
|
||
|
virtual QString quoteTableName(QString name);
|
||
|
virtual QString quoteColumnName(QString name);
|
||
|
virtual QString quoteSimpleColumnName(QString name);
|
||
|
virtual QHash<QString, QSharedPointer<TableSchema>> getTableSchemas(QString schema = "", bool refresh = false);
|
||
|
virtual QSharedPointer<TableSchema> getTableSchema(QString name, bool refresh = false);
|
||
|
virtual QStringList getTableNames(QString schema = "");
|
||
|
//virtual QueryBuilder getQueryBuilder();
|
||
|
//virtual QueryBuilder createQueryBuilder();
|
||
|
virtual QVariant getLastInsertID();
|
||
|
virtual void refresh();
|
||
|
virtual QString getRawTable(QString name);
|
||
|
virtual bool containsTable(QString tblname);
|
||
|
virtual QString quoteValue(QString str);
|
||
|
virtual void initQueryBuilder();
|
||
|
|
||
|
QHash<QString, QSharedPointer<TableSchema> > getTables() const;
|
||
|
void setTables(const QHash<QString, QSharedPointer<TableSchema> > &value);
|
||
| ... | ... | |
|
QSharedPointer<Database> getDatabase() const;
|
||
|
void setDatabase(const QSharedPointer<Database> &value);
|
||
|
|
||
|
QSharedPointer<QueryBuilder> getQueryBuilder() const;
|
||
|
|
||
|
protected:
|
||
|
virtual QStringList findTableNames(QString schema = "") = 0;
|
||
|
virtual QHash<QString, QStringList> findUniqueIndexes(const QSharedPointer<TableSchema> &table) = 0;
|
||
|
virtual void findConstraints(const QSharedPointer<TableSchema> &ts) = 0;
|
||
|
virtual bool findColumns(const QSharedPointer<TableSchema> &ts) = 0;
|
||
|
virtual QSharedPointer<TableSchema> loadTableSchema(QString name) = 0;
|
||
|
virtual TableSchema *getTableSchema(QString name, bool refresh = false);
|
||
|
QSharedPointer<Database> database;
|
||
|
QSharedPointer<QHash<QString, QString>> typeMap;
|
||
|
QHash<QString, QSharedPointer<TableSchema>> tables;
|
||
|
QSharedPointer<QueryBuilder> queryBuilder;
|
||
|
|
||
|
|
||
|
};
|
||
| src/schema/sqlitequerybuilder.cpp | ||
|---|---|---|
|
#include "sqlitequerybuilder.h"
|
||
|
|
||
|
|
||
|
CuteEntityManager::SqliteQueryBuilder::SqliteQueryBuilder(QSharedPointer<CuteEntityManager::Schema> schema,
|
||
|
QSharedPointer<CuteEntityManager::Database> database) : QueryBuilder(schema, database) {
|
||
|
|
||
|
}
|
||
|
|
||
|
CuteEntityManager::SqliteQueryBuilder::~SqliteQueryBuilder() {
|
||
|
|
||
|
}
|
||
| src/schema/sqlitequerybuilder.h | ||
|---|---|---|
|
#ifndef SQLITEQUERYBUILDER_H
|
||
|
#define SQLITEQUERYBUILDER_H
|
||
|
#include "../querybuilder.h"
|
||
|
namespace CuteEntityManager {
|
||
|
class SqliteQueryBuilder : public QueryBuilder
|
||
|
{
|
||
|
public:
|
||
|
SqliteQueryBuilder(QSharedPointer<Schema> schema, QSharedPointer<Database> database);
|
||
|
~SqliteQueryBuilder();
|
||
|
};
|
||
|
|
||
|
}
|
||
|
#endif // SQLITEQUERYBUILDER_H
|
||
| src/schema/sqliteschema.cpp | ||
|---|---|---|
|
#include "../database.h"
|
||
|
#include <QSqlRecord>
|
||
|
#include <QSqlResult>
|
||
|
#include "sqlitequerybuilder.h"
|
||
|
using namespace CuteEntityManager;
|
||
|
|
||
|
SqliteSchema::SqliteSchema(QSharedPointer<Database> database) : Schema(database) {
|
||
|
|
||
|
this->queryBuilder = QSharedPointer<QueryBuilder>(new SqliteQueryBuilder(QSharedPointer<Schema>(this), database));
|
||
|
}
|
||
|
|
||
|
SqliteSchema::~SqliteSchema() {
|
||
| ... | ... | |
|
}
|
||
|
|
||
|
QHash<QString, QString> *SqliteSchema::getTypeMap() {
|
||
|
/**
|
||
|
this->typeMap.data()->insert("bool", "SMALLINT");
|
||
|
this->typeMap.data()->insert("short", "SMALLINT");
|
||
|
this->typeMap.data()->insert("int", "INTEGER");
|
||
|
this->typeMap.data()->insert("long", "INTEGER");
|
||
|
this->typeMap.data()->insert("long long", "INTEGER");
|
||
|
this->typeMap.data()->insert("float", "FLOAT");
|
||
|
this->typeMap.data()->insert("double", "FLOAT");
|
||
|
this->typeMap.data()->insert("long double", "FLOAT");
|
||
|
this->typeMap.data()->insert("unsigned short", "SMALLINT");
|
||
|
this->typeMap.data()->insert("unsigned int", "INTEGER");
|
||
|
this->typeMap.data()->insert("unsigned long", "INTEGER");
|
||
|
this->typeMap.data()->insert("unsigned long long", "INTEGER");
|
||
|
this->typeMap.data()->insert("std::string", "TEXT");
|
||
|
this->typeMap.data()->insert("std::wstring", "TEXT");
|
||
|
this->typeMap.data()->insert("QString", "TEXT");
|
||
|
this->typeMap.data()->insert("QVariant", "TEXT");
|
||
|
this->typeMap.data()->insert("QUuid", "TEXT");
|
||
|
this->typeMap.data()->insert("QDate", "DATE");
|
||
|
this->typeMap.data()->insert("QTime", "TIME");
|
||
|
this->typeMap.data()->insert("QDateTime", "TIMESTAMP");
|
||
|
this->typeMap.data()->insert("QByteArray", "BLOB");
|
||
|
*/
|
||
|
if (this->typeMap.data()->empty()) {
|
||
|
this->typeMap.data()->insert(TYPE_SMALLINT, "tinyint");
|
||
|
this->typeMap.data()->insert(TYPE_BOOLEAN, "boolean");
|
||
| ... | ... | |
|
QSqlQuery q2 = this->database.data()->getQuery();
|
||
|
q2.setForwardOnly(true);
|
||
|
if (q.value("unique").toBool()) {
|
||
|
q2.exec("PRAGMA index_info(" + this->quoteValue(indexName) + ")");
|
||
|
q2.exec("PRAGMA index_info(" + this->quoteSimpleTableName(indexName) + ")");
|
||
|
QStringList indexInfo = QStringList();
|
||
|
while (q2.next()) {
|
||
|
indexInfo.append(q2.value("name").toString());
|
||
Auch abrufbar als: Unified diff
wip