Projekt

Allgemein

Profil

« Zurück | Weiter » 

Revision 14f9beed

Von Christian Ehringfeld vor mehr als 9 Jahren hinzugefügt

  • ID 14f9beedc0732435decdf9597baff12738d9f7f4
  • Vorgänger 9cf4747e
  • Nachfolger 9d05e414

update

Unterschiede anzeigen:

EntityManager.pro
src/schema.h \
src/schema/sqliteschema.h \
src/tableschema.h \
src/columnschema.h \
src/schema/pgsqlschema.h \
src/schema/mysqlschema.h
src/schema/mysqlschema.h \
src/querybuilder.h
SOURCES += \
src/entity.cpp \
......
src/schema.cpp \
src/schema/sqliteschema.cpp \
src/tableschema.cpp \
src/columnschema.cpp \
src/schema/pgsqlschema.cpp \
src/schema/mysqlschema.cpp
src/schema/mysqlschema.cpp \
src/querybuilder.cpp
unix {
target.path = /usr/lib
src/columnschema.cpp
#include "columnschema.h"
using namespace CuteEntityManager;
ColumnSchema::ColumnSchema() {
}
ColumnSchema::~ColumnSchema() {
}
QString ColumnSchema::getName() const {
return name;
}
void ColumnSchema::setName(const QString &value) {
name = value;
}
bool ColumnSchema::getAllowNull() const {
return allowNull;
}
void ColumnSchema::setAllowNull(bool value) {
allowNull = value;
}
QString ColumnSchema::getDbType() const {
return dbType;
}
void ColumnSchema::setDbType(const QString &value) {
dbType = value;
}
QString ColumnSchema::getDefaultValue() const {
return defaultValue;
}
void ColumnSchema::setDefaultValue(const QString &value) {
defaultValue = value;
}
QList<QString> ColumnSchema::getEnumValues() const {
return enumValues;
}
void ColumnSchema::setEnumValues(const QList<QString> &value) {
enumValues = value;
}
quint8 ColumnSchema::getSize() const {
return size;
}
void ColumnSchema::setSize(const quint8 &value) {
size = value;
}
quint8 ColumnSchema::getPrecision() const {
return precision;
}
void ColumnSchema::setPrecision(const quint8 &value) {
precision = value;
}
quint8 ColumnSchema::getScale() const {
return scale;
}
void ColumnSchema::setScale(const quint8 &value) {
scale = value;
}
bool ColumnSchema::getPrimaryKey() const {
return primaryKey;
}
void ColumnSchema::setPrimaryKey(bool value) {
primaryKey = value;
}
bool ColumnSchema::getAutoIncrement() const {
return autoIncrement;
}
void ColumnSchema::setAutoIncrement(bool value) {
autoIncrement = value;
}
bool ColumnSchema::getUnsignedColumn() const {
return unsignedColumn;
}
void ColumnSchema::setUnsignedColumn(bool value) {
unsignedColumn = value;
}
QString ColumnSchema::getComment() const {
return comment;
}
void ColumnSchema::setComment(const QString &value) {
comment = value;
}
src/columnschema.h
#ifndef COLUMNSCHEMA_H
#define COLUMNSCHEMA_H
#include <QString>
#include <QList>
namespace CuteEntityManager {
class ColumnSchema {
public:
ColumnSchema();
~ColumnSchema();
QString getName() const;
void setName(const QString &value);
bool getAllowNull() const;
void setAllowNull(bool value);
QString getDbType() const;
void setDbType(const QString &value);
QString getDefaultValue() const;
void setDefaultValue(const QString &value);
QList<QString> getEnumValues() const;
void setEnumValues(const QList<QString> &value);
quint8 getSize() const;
void setSize(const quint8 &value);
quint8 getPrecision() const;
void setPrecision(const quint8 &value);
quint8 getScale() const;
void setScale(const quint8 &value);
bool getPrimaryKey() const;
void setPrimaryKey(bool value);
bool getAutoIncrement() const;
void setAutoIncrement(bool value);
bool getUnsignedColumn() const;
void setUnsignedColumn(bool value);
QString getComment() const;
void setComment(const QString &value);
private:
QString name;
bool allowNull;
QString dbType;
QString defaultValue;
QList<QString> enumValues;
quint8 size;
quint8 precision;
quint8 scale;
bool primaryKey;
bool autoIncrement;
bool unsignedColumn;
QString comment;
};
}
#endif // COLUMNSCHEMA_H
src/database.cpp
void Database::init() {
this->database.open();
this->databasetype = this->getDatabaseType();
this->supportTransactions = this->database.driver()->hasFeature(QSqlDriver::Transactions);
this->tableList = QStringList();
this->getTableListFromDatabase();
}
DatabaseType Database::getDatabaseType() {
return CuteEntityManager::getDatabaseType(this->database.driverName());
}
void Database::getTableListFromDatabase() {
if (this->database.open()) {
QString q = "";
QSqlQuery query = QSqlQuery(this->database);
query.prepare(q);
this->select(query);
this->setTableList(query);
}
}
//QString Database::mysqlTableList() {
// return "SHOW TABLES;";
//}
//QString Database::pgsqlTableList() {
// return "SELECT table_name FROM information_schema.tables WHERE table_catalog = '"+this->database.databaseName()+"';";
//}
Database::~Database() {
if (this->database.isOpen()) {
this->database.close();
}
QSqlDatabase::removeDatabase(this->connectionName);
delete this->tableList;
}
QString Database::getConnectionName() {
return this->connectionName;
}
//QString Database::pgsqlSeqTable() {
// return "CREATE TABLE IF NOT EXISTS sequence (SEQ_NAME varchar(255) NOT NULL UNIQUE , SEQ_COUNT bigint NOT NULL);";
//}
//QString Database::mysqlSeqTable() {
// return "CREATE TABLE IF NOT EXISTS `sequence` (`SEQ_NAME` varchar(255) NOT NULL UNIQUE , `SEQ_COUNT` bigint(20) unsigned NOT NULL) CHARSET = utf8";
//}
//QString Database::sqliteSeqTable() {
// return "CREATE TABLE IF NOT EXISTS \"sequence\" (\"SEQ_NAME\" TEXT PRIMARY KEY NOT NULL , \"SEQ_COUNT\" INTEGER NOT NULL );";
//}
QChar Database::escapeChar() {
QChar c = QChar();
if (this->databasetype == CuteEntityManager::SQLITE) {
c = '\'';
} else if (this->databasetype == CuteEntityManager::MYSQL) {
c = '`';
}
return c;
}
bool Database::transaction(const QString &query) {
bool rc = false;
if (supportTransactions) {
......
return q;
}
QString Database::querySequenceCounter() {
return "INSERT INTO sequence (SEQ_NAME, SEQ_COUNT) VALUES(\'id_count\',\'0\');";
}
void Database::refreshTableList() {
this->tableList->clear();
this->getTableListFromDatabase();
}
bool Database::containsTable(QString tblname) {
return this->tableList->contains(tblname);
}
bool Database::updateSequenceCounter(QSqlQuery &q) {
QList<QSqlQuery> l = QList<QSqlQuery>();
l.append(QSqlQuery("UPDATE sequence SET SEQ_COUNT=(SEQ_COUNT+1);", this->database));
l.append(q);
return this->transaction(l);
}
qint64 Database::getLastId() {
qint64 id = -1;
QSqlQuery q = this->select("SELECT SEQ_COUNT FROM sequence WHERE SEQ_NAME=\'id_count\';");
if (q.next()) {
id = q.value(0).toInt();
}
return id;
}
QSqlDatabase Database::getDatabase() {
return this->database;
}
src/database.h
QSqlDatabase database;
QString connectionName;
bool seqTable;
DatabaseType databasetype;
bool supportTransactions;
void init();
QStringList tableList;
protected:
// inline QString pgsqlSeqTable();
......
bool exec(QList<QSqlQuery> queries);
bool select(QSqlQuery &query);
QSqlQuery select(const QString &query);
bool isSeqTable();
qint64 getLastId();
void getTableListFromDatabase();
void setTableList(QSqlQuery &q);
void refreshTableList();
bool containsTable(QString tblname);
DatabaseType getDatabaseType();
QChar escapeChar();
// bool isSeqTable();
// qint64 getLastId();
// void getTableListFromDatabase();
// void setTableList(QSqlQuery &q);
// void refreshTableList();
// QChar escapeChar();
};
}
#endif // DATABASE_H
src/entitymanager.cpp
}
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 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;
}
QString EntityManager::createConnection() {
src/enums/databasetype.h
#ifndef DATABASETYPE_H
#define DATABASETYPE_H
#include <QString>
#include "../schema.h"
#include <QSharedPointer>
#include "../schema/sqliteschema.h"
#include "../schema/pgsqlschema.h"
#include "../schema/mysqlschema.h"
#include <memory>
namespace CuteEntityManager {
class Schema;
class Database;
enum DatabaseType {
SQLITE = 0,
PGSQL = 1,
......
}
}
static const std::shared_ptr<Schema> getSchema(int db) {
static const QSharedPointer<Schema> getSchema(int db, QSharedPointer<Database> database) {
switch (db) {
case SQLITE:
return std::shared_ptr<Schema>(new SqliteSchema());
break;
case PGSQL:
return std::shared_ptr<Schema>(new PgSqlSchema());
break;
case MYSQL:
return std::shared_ptr<Schema>(new MysqlSchema());
return QSharedPointer<Schema>(new SqliteSchema(database));;
break;
// case PGSQL:
// return QSharedPointer<Schema>(new PgSqlSchema());
// break;
// case MYSQL:
// return QSharedPointer<Schema>(new MysqlSchema());
// break;
default:
return std::shared_ptr<Schema>(new SqliteSchema());
return QSharedPointer<Schema>(new SqliteSchema(database));
break;
}
}
src/querybuilder.cpp
#include "querybuilder.h"
QueryBuilder::QueryBuilder() {
}
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;
// }
}
src/querybuilder.h
#ifndef QUERYBUILDER_H
#define QUERYBUILDER_H
#include "schema.h"
class QueryBuilder
{
public:
QueryBuilder();
~QueryBuilder();
bool createTable(QString tablename, QHash<QString, QString> tableDefinition);
};
#endif // QUERYBUILDER_H
src/schema.cpp
#include <QRegularExpression>
#include <QSqlRecord>
#include <QSqlQuery>
#include "database.h"
using namespace CuteEntityManager;
Schema::Schema(std::shared_ptr<Database> database) {
Schema::Schema(QSharedPointer<Database> database) {
this->database = database;
this->typeMap = QSharedPointer<QHash<QString, QString>>(new QHash<QString, QString>());
}
......
}
QStringList Schema::getTableNames(QString schema) {
return this->database.get()->getDatabase().tables();
return this->database.data()->getDatabase().tables();
}
QVariant Schema::getLastInsertID() {
QSqlQuery q(this->database.get()->getDatabase());
QSqlQuery q(this->database.data()->getDatabase());
return q.lastInsertId();
}
......
QString Schema::getRawTable(QString name) {
if (name.indexOf("{{")) {
QRegularExpression re("/\\{\\{(.*?)\\}\\}/");
QRegularExpression re2("\1");
return name.replace(re, re2);
return name.replace(re, "\\1");
}
return name;
}
bool Schema::containsTable(QString tblname) {
return this->tables.contains(tblname);
}
QString Schema::quoteValue(QString str) {
}
TableSchema *Schema::getTableSchema(QString name, bool refresh) {
if (refresh) {
this->refresh();
}
if (this->tables.contains(name)) {
return this->tables.value(name);
return this->tables.value(name).data();
}
QString realName = this->getRawTable(name);
QSharedPointer<TableSchema> ts = this->loadTableSchema(realName);
auto ts = this->loadTableSchema(realName);
if (ts.data()) {
this->tables.insert(name, ts);
}
return ts.data();
}
QSharedPointer<Database> Schema::getDatabase() const {
return database;
}
void Schema::setDatabase(const QSharedPointer<Database> &value) {
database = value;
}
QHash<QString, QSharedPointer<TableSchema> > Schema::getTables() const {
return this->tables;
}
src/schema.h
#include <QStringList>
#include <QHash>
#include <QSharedPointer>
#include <QSqlDatabase>
#include <memory>
#include "database.h"
#include <QSqlField>
namespace CuteEntityManager {
class Database;
class Schema {
public:
Schema(std::shared_ptr<Database> database);
Schema(QSharedPointer<Database> database);
virtual ~Schema();
const QString TYPE_PK = "pk";
const QString TYPE_BIGPK = "bigpk";
......
const QString TYPE_TIMESTAMP = "timestamp";
const QString TYPE_TIME = "time";
const QString TYPE_DATE = "date";
const QString TYPE_CHAR = "char";
const QString TYPE_BINARY = "binary";
const QString TYPE_BOOLEAN = "boolean";
const QString TYPE_MONEY = "money";
......
virtual QVariant getLastInsertID();
virtual void refresh();
virtual QString getRawTable(QString name);
virtual bool containsTable(QString tblname);
virtual QString quoteValue(QString str);
QHash<QString, QSharedPointer<TableSchema> > getTables() const;
void setTables(const QHash<QString, QSharedPointer<TableSchema> > &value);
protected:
QSharedPointer<Database> getDatabase() const;
void setDatabase(const QSharedPointer<Database> &value);
protected:
virtual QStringList findTableNames(QString schema = "") = 0;
virtual QStringList findUniqueIndexes(QString tableName) = 0;
virtual QSharedPointer<TableSchema> findConstraints(TableSchema ts) = 0;
virtual QString getCreateTableSql(TableSchema ts) = 0;
virtual bool findColumns(TableSchema ts) = 0;
QSharedPointer<QHash<QString, QString>> typeMap;
virtual QSharedPointer<TableSchema> *loadTableSchema(QString name) = 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);
std::shared_ptr<Database> database;
QSharedPointer<Database> database;
QSharedPointer<QHash<QString, QString>> typeMap;
QHash<QString, QSharedPointer<TableSchema>> tables;
src/schema/mysqlschema.cpp
#include "mysqlschema.h"
#include <QSqlQuery>
using namespace CuteEntityManager;
//#include "mysqlschema.h"
//#include <QSqlQuery>
//using namespace CuteEntityManager;
MysqlSchema::MysqlSchema(std::shared_ptr<Database> database) : Schema(database) {
//MysqlSchema::MysqlSchema(std::shared_ptr<Database> database) : Schema(database) {
}
//}
MysqlSchema::~MysqlSchema() {
//MysqlSchema::~MysqlSchema() {
}
//}
QHash<QString, QString> *MysqlSchema::getTypeMap() {
if (this->typeMap.data()->empty()) {
// this->typeMap->data()->insert(TYPE_SMALLINT, 'tinyint');
// this->typeMap->data()->insert(TYPE_SMALLINT, 'bit');
// this->typeMap->data()->insert(TYPE_BOOLEAN, 'boolean');
// this->typeMap->data()->insert(TYPE_BOOLEAN, 'bool');
// this->typeMap->data()->insert(TYPE_SMALLINT, 'smallint');
// this->typeMap->data()->insert(TYPE_INTEGER, 'mediumint');
// this->typeMap->data()->insert(TYPE_INTEGER, 'int');
// this->typeMap->data()->insert(TYPE_INTEGER, 'integer');
// this->typeMap->data()->insert(TYPE_BIGINT, 'bigint');
// this->typeMap->data()->insert(TYPE_FLOAT, 'float');
// this->typeMap->data()->insert(TYPE_DOUBLE, 'double');
// this->typeMap->data()->insert(TYPE_FLOAT, 'real');
// this->typeMap->data()->insert(TYPE_DECIMAL, 'decimal');
// this->typeMap->data()->insert(TYPE_DECIMAL, 'numeric');
// this->typeMap->data()->insert(TYPE_TEXT, 'tinytext');
// this->typeMap->data()->insert(TYPE_TEXT, 'mediumtext');
// this->typeMap->data()->insert(TYPE_TEXT, 'longtext');
// this->typeMap->data()->insert(TYPE_TEXT, 'text');
// this->typeMap->data()->insert(TYPE_STRING, 'varchar');
// this->typeMap->data()->insert(TYPE_STRING, 'string');
// this->typeMap->data()->insert(TYPE_STRING, 'char');
// this->typeMap->data()->insert(TYPE_BINARY, 'blob');
// this->typeMap->data()->insert(TYPE_DATETIME, 'datetime');
// this->typeMap->data()->insert(TYPE_DATE, 'year');
// this->typeMap->data()->insert(TYPE_DATE, 'date');
// this->typeMap->data()->insert(TYPE_TIME, 'time');
// this->typeMap->data()->insert(TYPE_TIMESTAMP, 'timestamp');
// this->typeMap->data()->insert(TYPE_STRING, 'enum');
}
return this->typeMap.data();
}
//QHash<QString, QString> *MysqlSchema::getTypeMap() {
// if (this->typeMap.data()->empty()) {
//// this->typeMap->data()->insert(TYPE_SMALLINT, 'tinyint');
//// this->typeMap->data()->insert(TYPE_SMALLINT, 'bit');
//// this->typeMap->data()->insert(TYPE_BOOLEAN, 'boolean');
//// this->typeMap->data()->insert(TYPE_BOOLEAN, 'bool');
//// this->typeMap->data()->insert(TYPE_SMALLINT, 'smallint');
//// this->typeMap->data()->insert(TYPE_INTEGER, 'mediumint');
//// this->typeMap->data()->insert(TYPE_INTEGER, 'int');
//// this->typeMap->data()->insert(TYPE_INTEGER, 'integer');
//// this->typeMap->data()->insert(TYPE_BIGINT, 'bigint');
//// this->typeMap->data()->insert(TYPE_FLOAT, 'float');
//// this->typeMap->data()->insert(TYPE_DOUBLE, 'double');
//// this->typeMap->data()->insert(TYPE_FLOAT, 'real');
//// this->typeMap->data()->insert(TYPE_DECIMAL, 'decimal');
//// this->typeMap->data()->insert(TYPE_DECIMAL, 'numeric');
//// this->typeMap->data()->insert(TYPE_TEXT, 'tinytext');
//// this->typeMap->data()->insert(TYPE_TEXT, 'mediumtext');
//// this->typeMap->data()->insert(TYPE_TEXT, 'longtext');
//// this->typeMap->data()->insert(TYPE_TEXT, 'text');
//// this->typeMap->data()->insert(TYPE_STRING, 'varchar');
//// this->typeMap->data()->insert(TYPE_STRING, 'string');
//// this->typeMap->data()->insert(TYPE_STRING, 'char');
//// this->typeMap->data()->insert(TYPE_BINARY, 'blob');
//// this->typeMap->data()->insert(TYPE_DATETIME, 'datetime');
//// this->typeMap->data()->insert(TYPE_DATE, 'year');
//// this->typeMap->data()->insert(TYPE_DATE, 'date');
//// this->typeMap->data()->insert(TYPE_TIME, 'time');
//// this->typeMap->data()->insert(TYPE_TIMESTAMP, 'timestamp');
//// this->typeMap->data()->insert(TYPE_STRING, 'enum');
// }
// return this->typeMap.data();
//}
////QString Database::mysqlTableList() {
//// return "SHOW TABLES;";
////}
src/schema/mysqlschema.h
#ifndef MYSQLSCHEMA_H
#define MYSQLSCHEMA_H
#include <memory>
#include "../database.h"
#include "../schema.h"
namespace CuteEntityManager {
class MysqlSchema : public Schema {
public:
MysqlSchema(std::shared_ptr<Database> database);
~MysqlSchema();
QHash<QString, QString> *getTypeMap();
};
}
#endif // MYSQLSCHEMA_H
//#ifndef MYSQLSCHEMA_H
//#define MYSQLSCHEMA_H
//#include "../schema.h"
//namespace CuteEntityManager {
//class MysqlSchema : public Schema {
// public:
// MysqlSchema(std::shared_ptr<Database> database);
// ~MysqlSchema();
// QHash<QString, QString> *getTypeMap();
//};
//}
//#endif // MYSQLSCHEMA_H
src/schema/pgsqlschema.cpp
#include "pgsqlschema.h"
using namespace CuteEntityManager;
PgSqlSchema::PgSqlSchema(std::shared_ptr<Database> database) : Schema(database) {
}
PgSqlSchema::~PgSqlSchema() {
}
QHash<QString, QString> *PgSqlSchema::getTypeMap() {
if (this->typeMap.data()->empty()) {
// this->typeMap->data()->insert(TYPE_SMALLINT, 'tinyint');
// this->typeMap->data()->insert(TYPE_SMALLINT, 'bit');
// this->typeMap->data()->insert(TYPE_BOOLEAN, 'boolean');
// this->typeMap->data()->insert(TYPE_BOOLEAN, 'bool');
// this->typeMap->data()->insert(TYPE_SMALLINT, 'smallint');
// this->typeMap->data()->insert(TYPE_INTEGER, 'mediumint');
// this->typeMap->data()->insert(TYPE_INTEGER, 'int');
// this->typeMap->data()->insert(TYPE_INTEGER, 'integer');
// this->typeMap->data()->insert(TYPE_BIGINT, 'bigint');
// this->typeMap->data()->insert(TYPE_FLOAT, 'float');
// this->typeMap->data()->insert(TYPE_DOUBLE, 'double');
// this->typeMap->data()->insert(TYPE_FLOAT, 'real');
// this->typeMap->data()->insert(TYPE_DECIMAL, 'decimal');
// this->typeMap->data()->insert(TYPE_DECIMAL, 'numeric');
// this->typeMap->data()->insert(TYPE_TEXT, 'tinytext');
// this->typeMap->data()->insert(TYPE_TEXT, 'mediumtext');
// this->typeMap->data()->insert(TYPE_TEXT, 'longtext');
// this->typeMap->data()->insert(TYPE_TEXT, 'text');
// this->typeMap->data()->insert(TYPE_STRING, 'varchar');
// this->typeMap->data()->insert(TYPE_STRING, 'string');
// this->typeMap->data()->insert(TYPE_STRING, 'char');
// this->typeMap->data()->insert(TYPE_BINARY, 'blob');
// this->typeMap->data()->insert(TYPE_DATETIME, 'datetime');
// this->typeMap->data()->insert(TYPE_DATE, 'year');
// this->typeMap->data()->insert(TYPE_DATE, 'date');
// this->typeMap->data()->insert(TYPE_TIME, 'time');
// this->typeMap->data()->insert(TYPE_TIMESTAMP, 'timestamp');
// this->typeMap->data()->insert(TYPE_STRING, 'enum');
}
return this->typeMap.data();
}
//#include "pgsqlschema.h"
//using namespace CuteEntityManager;
//PgSqlSchema::PgSqlSchema(std::shared_ptr<Database> database) : Schema(database) {
//}
//PgSqlSchema::~PgSqlSchema() {
//}
//QHash<QString, QString> *PgSqlSchema::getTypeMap() {
// if (this->typeMap.data()->empty()) {
//// this->typeMap->data()->insert(TYPE_SMALLINT, 'tinyint');
//// this->typeMap->data()->insert(TYPE_SMALLINT, 'bit');
//// this->typeMap->data()->insert(TYPE_BOOLEAN, 'boolean');
//// this->typeMap->data()->insert(TYPE_BOOLEAN, 'bool');
//// this->typeMap->data()->insert(TYPE_SMALLINT, 'smallint');
//// this->typeMap->data()->insert(TYPE_INTEGER, 'mediumint');
//// this->typeMap->data()->insert(TYPE_INTEGER, 'int');
//// this->typeMap->data()->insert(TYPE_INTEGER, 'integer');
//// this->typeMap->data()->insert(TYPE_BIGINT, 'bigint');
//// this->typeMap->data()->insert(TYPE_FLOAT, 'float');
//// this->typeMap->data()->insert(TYPE_DOUBLE, 'double');
//// this->typeMap->data()->insert(TYPE_FLOAT, 'real');
//// this->typeMap->data()->insert(TYPE_DECIMAL, 'decimal');
//// this->typeMap->data()->insert(TYPE_DECIMAL, 'numeric');
//// this->typeMap->data()->insert(TYPE_TEXT, 'tinytext');
//// this->typeMap->data()->insert(TYPE_TEXT, 'mediumtext');
//// this->typeMap->data()->insert(TYPE_TEXT, 'longtext');
//// this->typeMap->data()->insert(TYPE_TEXT, 'text');
//// this->typeMap->data()->insert(TYPE_STRING, 'varchar');
//// this->typeMap->data()->insert(TYPE_STRING, 'string');
//// this->typeMap->data()->insert(TYPE_STRING, 'char');
//// this->typeMap->data()->insert(TYPE_BINARY, 'blob');
//// this->typeMap->data()->insert(TYPE_DATETIME, 'datetime');
//// this->typeMap->data()->insert(TYPE_DATE, 'year');
//// this->typeMap->data()->insert(TYPE_DATE, 'date');
//// this->typeMap->data()->insert(TYPE_TIME, 'time');
//// this->typeMap->data()->insert(TYPE_TIMESTAMP, 'timestamp');
//// this->typeMap->data()->insert(TYPE_STRING, 'enum');
// }
// return this->typeMap.data();
//}
////QString Database::pgsqlTableList() {
//// return "SELECT table_name FROM information_schema.tables WHERE table_catalog = '"+this->database.databaseName()+"';";
////}
src/schema/pgsqlschema.h
#ifndef PGSQLSCHEMA_H
#define PGSQLSCHEMA_H
#include <memory>
#include "../database.h"
#include "../schema.h"
namespace CuteEntityManager {
class PgSqlSchema : public Schema {
public:
PgSqlSchema(std::shared_ptr<Database>database);
~PgSqlSchema();
QHash<QString, QString> *getTypeMap();
};
}
//#ifndef PGSQLSCHEMA_H
//#define PGSQLSCHEMA_H
//#include "../schema.h"
//namespace CuteEntityManager {
//class PgSqlSchema : public Schema {
// public:
// PgSqlSchema(std::shared_ptr<Database>database);
// ~PgSqlSchema();
// QHash<QString, QString> *getTypeMap();
//};
//}
#endif // PGSQLSCHEMA_H
//#endif // PGSQLSCHEMA_H
src/schema/sqliteschema.cpp
#include "sqliteschema.h"
#include "../database.h"
#include <QSqlRecord>
#include <QSqlResult>
using namespace CuteEntityManager;
SqliteSchema::SqliteSchema(std::shared_ptr<Database> database) : Schema(database) {
SqliteSchema::SqliteSchema(QSharedPointer<Database> database) : Schema(database) {
}
......
}
QHash<QString, QString>* SqliteSchema::getTypeMap() {
if(this->typeMap.data()->empty()) {
QHash<QString, QString> *SqliteSchema::getTypeMap() {
if (this->typeMap.data()->empty()) {
this->typeMap.data()->insert(TYPE_SMALLINT, "tinyint");
this->typeMap.data()->insert(TYPE_SMALLINT, "bit");
this->typeMap.data()->insert(TYPE_BOOLEAN, "boolean");
this->typeMap.data()->insert(TYPE_BOOLEAN, "bool");
this->typeMap.data()->insert(TYPE_SMALLINT, "smallint");
this->typeMap.data()->insert(TYPE_INTEGER, "mediumint");
this->typeMap.data()->insert(TYPE_INTEGER, "int");
this->typeMap.data()->insert(TYPE_INTEGER, "integer");
this->typeMap.data()->insert(TYPE_BIGINT, "bigint");
this->typeMap.data()->insert(TYPE_FLOAT, "float");
this->typeMap.data()->insert(TYPE_DOUBLE, "double");
this->typeMap.data()->insert(TYPE_FLOAT, "real");
this->typeMap.data()->insert(TYPE_DECIMAL, "decimal");
this->typeMap.data()->insert(TYPE_DECIMAL, "numeric");
this->typeMap.data()->insert(TYPE_TEXT, "tinytext");
this->typeMap.data()->insert(TYPE_TEXT, "mediumtext");
this->typeMap.data()->insert(TYPE_TEXT, "longtext");
this->typeMap.data()->insert(TYPE_TEXT, "text");
this->typeMap.data()->insert(TYPE_STRING, "varchar");
this->typeMap.data()->insert(TYPE_STRING, "string");
this->typeMap.data()->insert(TYPE_STRING, "char");
this->typeMap.data()->insert(TYPE_CHAR, "char");
this->typeMap.data()->insert(TYPE_BINARY, "blob");
this->typeMap.data()->insert(TYPE_DATETIME, "datetime");
this->typeMap.data()->insert(TYPE_DATE, "year");
this->typeMap.data()->insert(TYPE_DATE, "date");
this->typeMap.data()->insert(TYPE_TIME, "time");
this->typeMap.data()->insert(TYPE_TIMESTAMP, "timestamp");
this->typeMap.data()->insert(TYPE_STRING, "enum");
}
return this->typeMap.data();
}
QStringList SqliteSchema::findTableNames(QString schema) {
auto l = QStringList();
QString sql = "SELECT DISTINCT tbl_name FROM sqlite_master WHERE tbl_name<>'sqlite_sequence' ORDER BY tbl_name";
auto q = this->database.data()->getQuery();
q.prepare(sql);
this->database.data()->select(q);
while (q.next()) {
l.append(q.value(0).toString());
}
return l;
}
QHash<QString, QStringList> SqliteSchema::findUniqueIndexes(const QSharedPointer<TableSchema> &table) {
QHash<QString, QStringList> uniqueIndexes = QHash<QString, QStringList>();
QSqlQuery q = this->database.data()->getQuery();
q.setForwardOnly(true);
q.exec("PRAGMA index_list(" + this->quoteSimpleTableName(table->getName()) + ')');
while (q.next()) {
QString indexName = q.value("name").toString();
QSqlQuery q2 = this->database.data()->getQuery();
q2.setForwardOnly(true);
if (q.value("unique").toBool()) {
q2.exec("PRAGMA index_info(" + this->quoteValue(indexName) + ")");
QStringList indexInfo = QStringList();
while (q2.next()) {
indexInfo.append(q2.value("name").toString());
}
uniqueIndexes.insert(indexName, indexInfo);
}
}
return uniqueIndexes;
}
void SqliteSchema::findConstraints(const QSharedPointer<TableSchema> &ts) {
QSqlQuery q = this->database.data()->getQuery();
q.setForwardOnly(true);
q.exec("PRAGMA foreign_key_list(" + this->quoteSimpleTableName(ts.data()->getName()) + ')');
auto foreignKeys = ts.data()->getRelations();
while (q.next()) {
bool ok;
int id = q.value("id").toInt(&ok);
if (ok) {
auto rel = new QSqlRelation(q.value("table").toString(), q.value("from").toString(), q.value("to").toString());
auto ptr = QSharedPointer<QSqlRelation>(rel);
foreignKeys.insert(QString::number(id), ptr);
}
}
ts.data()->setRelations(foreignKeys);
}
//QString Database::sqliteTableList() {
// return "SELECT tbl_name FROM sqlite_master WHERE type="table";";
//}
bool SqliteSchema::findColumns(const QSharedPointer<TableSchema> &ts) {
QSqlQuery q = this->database.data()->getQuery();
q.setForwardOnly(true);
q.exec("SELECT * FROM " + this->quoteSimpleTableName(ts.data()->getName()) + " LIMIT 0");
QHash<QString, QSharedPointer<QSqlField>> columns = QHash<QString, QSharedPointer<QSqlField>>();
auto rec = q.record();
int count = rec.count();
if (count == 0) {
return false;
}
for (int var = 0; var < count; ++var) {
QSqlField f = rec.field(var);
columns.insert(f.name(), QSharedPointer<QSqlField>(new QSqlField(f)));
}
ts.data()->setColumns(columns);
return true;
}
QSharedPointer<TableSchema> SqliteSchema::loadTableSchema(QString name) {
auto table = new TableSchema();
auto ptr = QSharedPointer<TableSchema>(table);
table->setName(name);
table->setFullName(name);
if (this->findColumns(ptr)) {
this->findConstraints(ptr);
} else {
ptr.clear();
}
return ptr;
}
src/schema/sqliteschema.h
#ifndef SQLITESCHEMA_H
#define SQLITESCHEMA_H
#include <memory>
#include "../database.h"
#include "../schema.h"
namespace CuteEntityManager {
class TableSchema;
class SqliteSchema : public Schema {
public:
SqliteSchema(std::shared_ptr<Database> database);
SqliteSchema(QSharedPointer<Database> database);
~SqliteSchema();
QHash<QString, QString> *getTypeMap();
protected:
virtual QStringList findTableNames(QString schema = "");
virtual QHash<QString, QStringList> findUniqueIndexes(const QSharedPointer<TableSchema> &table);
virtual void findConstraints(const QSharedPointer<TableSchema> &ts);
virtual bool findColumns(const QSharedPointer<TableSchema> &ts);
virtual QSharedPointer<TableSchema> loadTableSchema(QString name);
};
}
#endif // SQLITESCHEMA_H
src/tableschema.cpp
}
const ColumnSchema TableSchema::getColumn(QString name) const {
const QSharedPointer<QSqlField> TableSchema::getColumn(QString name) const {
auto columns = this->getColumns();
foreach (auto schema, columns) {
if (schema.data()->name() == name) {
return schema;
}
}
return QSharedPointer<QSqlField>();
}
const QList<QString> TableSchema::getColumnNames() {
const QStringList TableSchema::getColumnNames() {
QStringList l;
auto columns = this->getColumns();
foreach (auto schema, columns) {
l.append(schema.data()->name());
}
return l;
}
QString TableSchema::getSchemaName() const {
......
void TableSchema::setFullName(const QString &value) {
fullName = value;
}
QList<QString> TableSchema::getPrimaryKeys() const {
QStringList TableSchema::getPrimaryKeys() const {
return primaryKeys;
}
void TableSchema::setPrimaryKeys(const QList<QString> &value) {
void TableSchema::setPrimaryKeys(const QStringList &value) {
primaryKeys = value;
}
QString TableSchema::getSequenceName() const {
......
void TableSchema::setSequenceName(const QString &value) {
sequenceName = value;
}
QHash<QString, QString> TableSchema::getForeignKeys() const {
return foreignKeys;
}
void TableSchema::setForeignKeys(const QHash<QString, QString> &value) {
foreignKeys = value;
}
QList<ColumnSchema> TableSchema::getColumns() const {
QHash<QString, QSharedPointer<QSqlField> > TableSchema::getColumns() const {
return columns;
}
void TableSchema::setColumns(const QList<ColumnSchema> &value) {
void TableSchema::setColumns(const QHash<QString, QSharedPointer<QSqlField> > &value) {
columns = value;
}
QHash<QString, QSharedPointer<QSqlRelation> > TableSchema::getRelations() const {
return relations;
}
void TableSchema::setRelations(const QHash<QString, QSharedPointer<QSqlRelation> > &value) {
relations = value;
}
src/tableschema.h
#define TABLESCHEMA_H
#include <QString>
#include <QList>
#include <QStringList>
#include <QHash>
#include "columnschema.h"
#include <QSharedPointer>
#include <QSqlField>
#include <QSqlRelation>
namespace CuteEntityManager {
class TableSchema {
public:
TableSchema();
~TableSchema();
virtual ColumnSchema const getColumn(QString name) const;
virtual QList<QString> const getColumnNames();
virtual QSharedPointer<QSqlField> const getColumn(QString name) const;
virtual const QStringList getColumnNames();
QString getSchemaName() const;
void setSchemaName(const QString &value);
......
QString getFullName() const;
void setFullName(const QString &value);
QList<QString> getPrimaryKeys() const;
void setPrimaryKeys(const QList<QString> &value);
QStringList getPrimaryKeys() const;
void setPrimaryKeys(const QStringList &value);
QString getSequenceName() const;
void setSequenceName(const QString &value);
QHash<QString, QString> getForeignKeys() const;
void setForeignKeys(const QHash<QString, QString> &value);
QHash<QString, QSharedPointer<QSqlField> > getColumns() const;
void setColumns(const QHash<QString, QSharedPointer<QSqlField> > &value);
QList<ColumnSchema> getColumns() const;
void setColumns(const QList<ColumnSchema> &value);
QHash<QString, QSharedPointer<QSqlRelation> > getRelations() const;
void setRelations(const QHash<QString, QSharedPointer<QSqlRelation> > &value);
private:
private:
QString schemaName;
QString name;
QString fullName;
QList<QString> primaryKeys;
QStringList primaryKeys;
QString sequenceName;
QHash<QString, QString> foreignKeys;
QList<ColumnSchema> columns;
QHash<QString, QSharedPointer<QSqlRelation>> relations;
QHash<QString, QSharedPointer<QSqlField>> columns;
};
}

Auch abrufbar als: Unified diff