Revision 6d91d381
Von Christian Ehringfeld vor mehr als 9 Jahren hinzugefügt
example/main.cpp | ||
---|---|---|
*/
|
||
using namespace CuteEntityManager;
|
||
int main(int argc, char *argv[]) {
|
||
// Q_UNUSED(argc) Q_UNUSED(argv)
|
||
Q_UNUSED(argc) Q_UNUSED(argv)
|
||
CuteEntityManager::EntityManager *e = new
|
||
CuteEntityManager::EntityManager("QSQLITE",
|
||
QDir::currentPath() + "/db.sqlite");
|
||
QSharedPointer<Artikel> a = QSharedPointer<Artikel>(new Artikel(20.0,
|
||
"Müsli"));
|
||
auto ep = a.dynamicCast<CuteEntityManager::Entity>();
|
||
qDebug() << e;
|
||
qDebug() << "Tabelle artikel erstellt:" << e->createTable(ep);
|
||
e->create(ep);
|
||
//qDebug() << e->findById<Artikel *>(1); //not working grml!
|
||
auto artikel = e->findById<Artikel *>(1);
|
||
// QSharedPointer<CuteEntityManager::Entity> p = QSharedPointer<CuteEntityManager::Entity>(new Person("Max", "Mustermann", Person::MALE, "", "", "",
|
||
// QDate::currentDate()));
|
||
// auto pptr = p.dynamicCast<CuteEntityManager::Entity>();
|
||
... | ... | |
// e->save(a);
|
||
// }
|
||
// qDebug() << "Dauer:" << t.elapsed();
|
||
//QSharedPointer<Artikel> aPtr = QSharedPointer<Artikel>(entity);
|
||
Pupil *p = new Pupil();
|
||
auto hash = p->getMetaProperties();
|
||
// auto iterator = hash.constBegin();
|
||
// while(iterator != hash.constEnd()) {
|
||
// qDebug() << iterator.key() << " Value:" << iterator.value().read(p);
|
||
|
||
// iterator++;
|
||
// }
|
||
qDebug() << p->metaObject()->superClass()->className();
|
||
|
||
return 0;
|
||
}
|
example/models/artikel.cpp | ||
---|---|---|
|
||
}
|
||
|
||
Artikel::Artikel(QObject *parent) : Entity(parent)
|
||
{
|
||
|
||
Artikel::Artikel() : Entity() {
|
||
this->preis = 0.0;
|
||
this->name = "";
|
||
}
|
||
|
||
Artikel::Artikel(double preis, QString name) : Entity(){
|
||
Artikel::Artikel(double preis, QString name) : Entity() {
|
||
this->preis = preis;
|
||
this->name = name;
|
||
}
|
||
|
||
|
example/models/artikel.h | ||
---|---|---|
#include <QHash>
|
||
#include <QVariant>
|
||
|
||
class Artikel : virtual public CuteEntityManager::Entity {
|
||
class Artikel : public CuteEntityManager::Entity {
|
||
Q_OBJECT
|
||
Q_PROPERTY(double preis READ getPreis WRITE setPreis)
|
||
Q_PROPERTY(QString name READ getName WRITE setName)
|
||
... | ... | |
QString name;
|
||
|
||
public:
|
||
~Artikel();
|
||
explicit Artikel(QObject *parent = 0);
|
||
virtual ~Artikel();
|
||
Q_INVOKABLE Artikel();
|
||
Artikel(double preis, QString name);
|
||
double getPreis() const;
|
||
void setPreis(double value);
|
src/entity.h | ||
---|---|---|
void idChanged();
|
||
|
||
public:
|
||
Entity (QObject *parent = 0);
|
||
explicit Entity (QObject *parent = 0);
|
||
virtual QString toString() const;
|
||
virtual ~Entity();
|
||
virtual QString getTablename() const;
|
||
... | ... | |
|
||
//return value must be the exact name defined in Q_PROPERTY
|
||
virtual QString getPrimaryKey() const;
|
||
const QStack<const QMetaObject *> superClasses(bool stopAtSingleTableInheritance = false) const;
|
||
const QStack<const QMetaObject *> superClasses(bool stopAtSingleTableInheritance
|
||
= false) const;
|
||
const QHash<QString, QMetaProperty> getMetaProperties() const;
|
||
const QHash<QString, QMetaProperty> getSuperMetaProperties() const;
|
||
static const QHash<QString, QMetaProperty> getMetaProperties(const QMetaObject* object);
|
||
static const QHash<QString, QMetaProperty> getMetaProperties(
|
||
const QMetaObject *object);
|
||
const QHash<QString, QMetaProperty> getInheritedMetaProperties() const;
|
||
const QHash<Relation, QMetaProperty> getRelationProperties() const;
|
||
const char *getClassname() const;
|
src/entityinstancefactory.cpp | ||
---|---|---|
}
|
||
|
||
Entity *EntityInstanceFactory::createInstance(const char *className) {
|
||
return EntityInstanceFactory::createInstance(QMetaType::type(className));
|
||
QString s = QString(className);
|
||
if (!s.contains("*")) {
|
||
s.append("*");
|
||
}
|
||
return EntityInstanceFactory::createInstance(QMetaType::type(
|
||
s.toUtf8().constData()));
|
||
}
|
||
|
||
Entity *EntityInstanceFactory::createInstance(const QString &className) {
|
||
... | ... | |
Entity *EntityInstanceFactory::createInstance(int metaTypeId) {
|
||
Entity *e = 0;
|
||
if (metaTypeId != QMetaType::UnknownType) {
|
||
e = static_cast<Entity *>(QMetaType::create(metaTypeId));
|
||
if(!e) {
|
||
auto metaObject = QMetaType::metaObjectForType(metaTypeId);
|
||
e = static_cast<Entity *>(metaObject->newInstance());
|
||
if (!e) {
|
||
qDebug() << "Entity instance could not created!";
|
||
throw -2; //testing
|
||
}
|
||
} else {
|
||
qDebug() << metaTypeId <<" is NOT registered! Please register it!";
|
||
throw -1; //testing
|
||
throw - 2; //testing
|
||
}
|
||
} else {
|
||
qDebug() << metaTypeId << "EntityClass NOT registered! Please register it!";
|
||
throw - 1; //testing
|
||
}
|
||
return e;
|
||
}
|
||
|
||
Entity *EntityInstanceFactory::createInstance(const char *className,
|
||
const QHash<QString, QVariant> &attributes) {
|
||
Entity *e = EntityInstanceFactory::createInstance(className);
|
||
EntityInstanceFactory::setAttributes(e, attributes);
|
||
e = EntityInstanceFactory::setAttributes(e, attributes);
|
||
return e;
|
||
}
|
||
|
||
Entity *EntityInstanceFactory::setAttributes(Entity *e,
|
||
Entity *EntityInstanceFactory::setAttributes(Entity *&e,
|
||
const QHash<QString, QVariant> &attributes,
|
||
QHash<QString, QMetaProperty> metaprops) {
|
||
if (e) {
|
||
... | ... | |
while (iterator != attributes.constEnd()) {
|
||
if (metaprops.contains(iterator.key())) {
|
||
QMetaProperty prop = metaprops.value(iterator.key());
|
||
if (!prop.isWritable() && !prop.write(e, iterator.value())) {
|
||
if (!(prop.isWritable() && prop.write(e, iterator.value()))) {
|
||
qDebug() << prop.name() << "on Entity" << e->getClassname() << "not writeable!";
|
||
}
|
||
}
|
||
... | ... | |
return e;
|
||
}
|
||
|
||
Entity *EntityInstanceFactory::setAttributes(Entity *e,
|
||
Entity *EntityInstanceFactory::setAttributes(Entity *&e,
|
||
const QHash<QString, QVariant> &attributes) {
|
||
auto metaprops = e->getMetaProperties();
|
||
return EntityInstanceFactory::setAttributes(e, attributes, metaprops);
|
src/entityinstancefactory.h | ||
---|---|---|
static Entity *createInstance(int metaTypeId);
|
||
static Entity *createInstance(const char *className,
|
||
const QHash<QString, QVariant> &attributes);
|
||
static Entity *setAttributes(Entity *e,
|
||
static Entity *setAttributes(Entity *&e,
|
||
const QHash<QString, QVariant> &attributes,
|
||
QHash<QString, QMetaProperty> metaprops);
|
||
static Entity *setAttributes(Entity *e,
|
||
static Entity *setAttributes(Entity *&e,
|
||
const QHash<QString, QVariant> &attributes);
|
||
static const QString extractEntityType(const QString &s);
|
||
static Entity *newSuperClassInstance(const Entity *e);
|
src/entitymanager.cpp | ||
---|---|---|
const bool refresh) {
|
||
QSharedPointer<Entity> r;
|
||
if (!e.isNull()) {
|
||
if (refresh || ((r = this->cache.get(id, QString(e.data()->getClassname())))
|
||
&& !r.data())) {
|
||
auto map = this->findByPk(e);
|
||
if (refresh || !(r = this->cache.get(id, QString(e.data()->getClassname())))) {
|
||
e.data()->setId(id);
|
||
auto map = this->findByPk(id, e);
|
||
r = this->convert(map, e->getClassname(), refresh);
|
||
}
|
||
}
|
||
... | ... | |
QSqlQuery q = this->schema.data()->getQueryBuilder().data()->create(entity);
|
||
rc = this->db->transaction(q);
|
||
if (rc) {
|
||
entity.data()->setId(this->schema.data()->getLastInsertID().toLongLong(&rc));
|
||
entity.data()->setId(q.lastInsertId().toLongLong(&rc));
|
||
if (persistRelations) {
|
||
this->saveRelations(entity);
|
||
}
|
||
... | ... | |
return EntityManager::connectionNames;
|
||
}
|
||
|
||
QHash<QString, QVariant> EntityManager::findByPk(const QSharedPointer<Entity>
|
||
QHash<QString, QVariant> EntityManager::findByPk(qint64 id,
|
||
const QSharedPointer<Entity>
|
||
&e) {
|
||
QSqlQuery q = this->schema.data()->getQueryBuilder().data()->find(e);
|
||
QSqlQuery q = this->schema.data()->getQueryBuilder().data()->find(id, e);
|
||
auto listMap = this->convertQueryResult(q);
|
||
if (!listMap.isEmpty()) {
|
||
return listMap.at(0);
|
src/entitymanager.h | ||
---|---|---|
QList<QHash<QString, QVariant> > findAll(const QSharedPointer<Entity> &e);
|
||
void resolveRelations(const QSharedPointer<Entity> &entity,
|
||
const QHash<QString, QVariant> &map, const bool refresh = false);
|
||
QHash<QString, QVariant> findByPk(const QSharedPointer<Entity> &e);
|
||
QHash<QString, QVariant> findByPk(qint64 id, const QSharedPointer<Entity> &e);
|
||
QSharedPointer<Entity> convert(const QHash<QString, QVariant> &map,
|
||
const char *classname, const bool refresh = false);
|
||
QList<QSharedPointer<Entity>> convert(QList<QHash<QString, QVariant> > maps,
|
||
... | ... | |
}
|
||
|
||
template<class T> QList<QSharedPointer<Entity>> findAll() {
|
||
QSharedPointer<Entity> ptr = QSharedPointer<Entity>(EntityInstanceFactory::createInstance<T>());
|
||
if (!ptr.isNull()) {
|
||
QSharedPointer<Entity> ptr = QSharedPointer<Entity>
|
||
(EntityInstanceFactory::createInstance<T>());
|
||
if (ptr) {
|
||
auto maps = this->findAll(ptr);
|
||
const char *className = ptr.data()->getClassname();
|
||
return this->convert(maps, className);
|
src/querybuilder.cpp | ||
---|---|---|
QString r = "";
|
||
auto superMetaObject = e->metaObject()->superClass();
|
||
if (e->getInheritanceStrategy() == JOINED_TABLE
|
||
&& QString(superMetaObject->className()) != QString("CuteEntityManager::Entity")) {
|
||
qDebug() << superMetaObject->className();
|
||
&& QString(superMetaObject->className()) !=
|
||
QString("CuteEntityManager::Entity")) {
|
||
Entity *superClass = EntityInstanceFactory::createInstance(
|
||
superMetaObject->className());
|
||
if (superClass) {
|
||
... | ... | |
}
|
||
}
|
||
}
|
||
if (QString(superMetaObject->className()) != QString("CuteEntityManager::Entity")
|
||
&& entity.data()->getInheritanceStrategy() != JOINED_TABLE) {
|
||
if (!(QString(superMetaObject->className()) !=
|
||
QString("CuteEntityManager::Entity")
|
||
&& entity.data()->getInheritanceStrategy() == JOINED_TABLE)) {
|
||
map.insert(entity.data()->getPrimaryKey(), this->schema.data()->TYPE_BIGPK);
|
||
}
|
||
return map;
|
||
... | ... | |
return r;
|
||
}
|
||
|
||
QSqlQuery QueryBuilder::find(const QSharedPointer<Entity> &entity,
|
||
qint64 offset) const {
|
||
QSqlQuery QueryBuilder::find(const qint64 &id, const QSharedPointer<Entity> &entity, qint64 offset) const
|
||
{
|
||
QSqlQuery q = this->database.data()->getQuery(this->selectBase(QStringList(
|
||
entity.data()->getTablename())) + " " + this->joinSuperClasses(
|
||
entity) + " WHERE id= :id " + this->limit(1, offset));
|
||
q.bindValue(":id", entity.data()->getId());
|
||
entity.data()->getTablename())) + this->joinSuperClasses(
|
||
entity) + " WHERE id= :id" + this->limit(1, offset));
|
||
q.bindValue(":id", id);
|
||
return q;
|
||
}
|
||
|
||
... | ... | |
const qint64 limit, qint64 offset) {
|
||
return this->database->getQuery(this->selectBase(QStringList(
|
||
entity.data()->getTablename())) + " " + this->joinSuperClasses(
|
||
entity) + " " + this->limit(limit, offset) + ";");
|
||
entity) + this->limit(limit, offset) + ";");
|
||
}
|
||
|
||
/**
|
||
... | ... | |
const {
|
||
auto stack = entity.data()->superClasses();
|
||
QString joined = "";
|
||
bool first = true;
|
||
Entity *e = 0;
|
||
while (!stack.isEmpty()) {
|
||
auto metaObject = stack.pop();
|
||
e = EntityInstanceFactory::createInstance(metaObject->className());
|
||
if (first) {
|
||
first = false;
|
||
} else {
|
||
if (e) {
|
||
joined.append(" ");
|
||
}
|
||
}
|
||
if (e) {
|
||
joined.append(" ");
|
||
joined.append(this->leftJoin(e->getTablename(), entity.data()->getTablename(),
|
||
e->getPrimaryKey(), entity.data()->getPrimaryKey()));
|
||
}
|
src/querybuilder.h | ||
---|---|---|
QString transformAbstractTypeToRealDbType(QString typeName) const;
|
||
QString getColumnType(const QString &type) const;
|
||
QSqlQuery find(const qint64 &id, const QString &tableName) const;
|
||
QSqlQuery find(const QSharedPointer<Entity> &entity,
|
||
QSqlQuery find(const qint64 &id, const QSharedPointer<Entity> &entity,
|
||
qint64 offset = 0) const;
|
||
QSqlQuery findByAttributes(const QHash<QString, QVariant> &m,
|
||
const QString &tableName,
|
src/schema.cpp | ||
---|---|---|
|
||
QVariant Schema::getLastInsertID() {
|
||
QSqlQuery q(this->database.data()->getDatabase());
|
||
return q.lastInsertId();
|
||
auto lastId = q.lastInsertId();
|
||
return lastId;
|
||
}
|
||
|
||
void Schema::refresh() {
|
Auch abrufbar als: Unified diff
some bug fixes, caching works