Revision d7727319
Von Christian Ehringfeld vor mehr als 10 Jahren hinzugefügt
| EntityManager.pro | ||
|---|---|---|
| #-------------------------------------------------
 | ||
| #
 | ||
| # Project created by QtCreator 2013-08-01T15:03:24
 | ||
| #
 | ||
| #-------------------------------------------------
 | ||
|  | ||
| QT       += core
 | ||
| QT       += sql
 | ||
| QT       -= gui
 | ||
| samples/example/Example.pro | ||
|---|---|---|
| #-------------------------------------------------
 | ||
| #
 | ||
| # Project created by QtCreator 2013-08-01T15:03:24
 | ||
| #
 | ||
| #-------------------------------------------------
 | ||
|  | ||
| QT       += core
 | ||
| QT       += sql
 | ||
|  | ||
| QT       -= gui
 | ||
|  | ||
| #TARGET = EntityManager
 | ||
| samples/example/main.cpp | ||
|---|---|---|
|     CuteEntityManager::EntityManager *e = new
 | ||
|     CuteEntityManager::EntityManager("QSQLITE",
 | ||
|                                      QDir::currentPath() + "/db.sqlite");
 | ||
|     Enums::ContactCategory::EMAIL_CONTACT;
 | ||
|     EntityInstanceFactory::registerClass<Group>();
 | ||
|     EntityInstanceFactory::registerClass<Person>();
 | ||
|     EntityInstanceFactory::registerClass<Pupil>();
 | ||
| samples/example/models/enums.h | ||
|---|---|---|
| struct Enums {
 | ||
|     Q_GADGET
 | ||
|   public:
 | ||
|     enum class ContactCategory {EMAIL_CONTACT, MOBILE_CONTACT, LANDLINE_CONTACT, MESSENGER_CONTACT, EXTRA1_CONTACT, EXTRA2_CONTACT, EXTRA3_CONTACT, EXTRA4_CONTACT, EXTRA5_CONTACT, EXTRA6_CONTACT} ;
 | ||
|     enum ContactCategory {EMAIL_CONTACT, MOBILE_CONTACT, LANDLINE_CONTACT, MESSENGER_CONTACT, EXTRA1_CONTACT, EXTRA2_CONTACT, EXTRA3_CONTACT, EXTRA4_CONTACT, EXTRA5_CONTACT, EXTRA6_CONTACT} ;
 | ||
|     Q_ENUM(ContactCategory)
 | ||
|     enum class Orientation {LANDSCAPE_ORIENTATION, PORTRAIT_ORIENTATION, LANDSCAPE_180_ORIENTATION, PORTRAIT_180_ORIENTATION};
 | ||
|     Q_ENUM(Orientation)
 | ||
| src/entityinstancefactory.cpp | ||
|---|---|---|
| Entity *EntityInstanceFactory::createInstance(const QMetaObject *object) {
 | ||
|     return qobject_cast<Entity *>(object->newInstance());
 | ||
| }
 | ||
|  | ||
| QList<QSharedPointer<Entity> > EntityInstanceFactory::castQVariantList(
 | ||
|     QVariant &list) {
 | ||
|     return *reinterpret_cast<QList<QSharedPointer<Entity>>*>(list.data());
 | ||
| }
 | ||
|  | ||
| QSharedPointer<Entity> EntityInstanceFactory::castQVariant(
 | ||
|     QVariant &entity) {
 | ||
|     return *reinterpret_cast<QSharedPointer<Entity>*>(entity.data());
 | ||
| }
 | ||
| src/entityinstancefactory.h | ||
|---|---|---|
|     static const QString extractEntityType(const QString &s);
 | ||
|     static Entity *newSuperClassInstance(const Entity *e);
 | ||
|     static Entity *createInstance(const QMetaObject *object);
 | ||
|     static QList<QSharedPointer<Entity>> castQVariantList(QVariant &list);
 | ||
|     static QSharedPointer<Entity> castQVariant(QVariant &entity);
 | ||
|  | ||
|     template<typename T>
 | ||
|     static Entity *createInstance() {
 | ||
| src/entitymanager.cpp | ||
|---|---|---|
| void EntityManager::addEntityToListProperty(const QSharedPointer<Entity>
 | ||
|         &entity, QSharedPointer<Entity> add, const QMetaProperty &property) {
 | ||
|     QVariant var = property.read(entity.data());
 | ||
|     if (!var.isNull() && var.canConvert<QList<QSharedPointer<Entity>>>()) {
 | ||
|         QList<QSharedPointer<Entity>> list = var.value<QList<QSharedPointer<Entity>>>();
 | ||
|     if (!var.isNull() && var.canConvert<QList<QVariant>>()) {
 | ||
|         auto list = EntityInstanceFactory::castQVariantList(var);
 | ||
|         if (!list.contains(add)) {
 | ||
|             list.append(add);
 | ||
|             var.setValue<QList<QSharedPointer<Entity>>>(list);
 | ||
|             property.write(entity.data(), var);
 | ||
|              this->setListProperty(entity,list,property);
 | ||
|         }
 | ||
|     }
 | ||
| }
 | ||
| ... | ... | |
|                                   builder->generateManyToManyColumnName(entity),
 | ||
|                                   builder->generateManyToManyColumnName(ptr));
 | ||
|     q.bindValue(0, entity->getId());
 | ||
|     QMetaProperty prop;
 | ||
|     bool first = true;
 | ||
|     auto prop = this->mappedProperty(r,ptr);
 | ||
|     QSharedPointer<Entity> item;
 | ||
|     for (int var = 0; var < saved.size(); ++var) {
 | ||
|         item = list.at(var);
 | ||
|         if (first && !r.getMappedBy().isEmpty()) {
 | ||
|             auto props = ptr->getMetaProperties();
 | ||
|             if (props.contains(r.getMappedBy())) {
 | ||
|                 prop = props.value(r.getMappedBy());
 | ||
|             }
 | ||
|         }
 | ||
|         qDebug() << "Property valid:" << prop.isValid();
 | ||
|         /**
 | ||
|           @todo wip
 | ||
|           **/
 | ||
|         if (ptr->property(ptr->getPrimaryKey()).toLongLong() > -1) {
 | ||
|             q.bindValue(1, ptr->property(ptr->getPrimaryKey()));
 | ||
|             q.exec();
 | ||
| ... | ... | |
|     }
 | ||
| }
 | ||
|  | ||
|  | ||
| QMetaProperty EntityManager::mappedProperty(const Relation &r, const QSharedPointer<Entity> &foreignEntity) const
 | ||
| {
 | ||
|     QMetaProperty prop;
 | ||
|     auto props = foreignEntity->getMetaProperties();
 | ||
|     if (!r.getMappedBy().isEmpty()) {
 | ||
|         if (props.contains(r.getMappedBy())) {
 | ||
|             prop = props.value(r.getMappedBy());
 | ||
|         }
 | ||
|     } else {
 | ||
|         auto relations = foreignEntity->getRelations();
 | ||
|         for (auto iterator = relations.constBegin();iterator != relations.constEnd(); ++iterator) {
 | ||
|             auto rel = iterator.value();
 | ||
|             if(rel.getMappedBy() == r.getPropertyName()) {
 | ||
|                 prop = props.value(rel.getPropertyName());
 | ||
|                 break;
 | ||
|             }
 | ||
|         }
 | ||
|     }
 | ||
|     return prop;
 | ||
| }
 | ||
|  | ||
|  | ||
| bool EntityManager::shouldBeSaved(QSharedPointer<Entity> &entity,
 | ||
|                                   const Relation &r) {
 | ||
|     return entity && (r.getCascadeType().contains(ALL)
 | ||
| ... | ... | |
|     }
 | ||
| }
 | ||
|  | ||
|  | ||
| void EntityManager::removeEntity(QVariant &var) {
 | ||
|     if (!var.isNull() && var.canConvert<QSharedPointer<Entity>>()) {
 | ||
|         auto e = qvariant_cast<QSharedPointer<Entity>>(var);
 | ||
| ... | ... | |
|     auto list = property.value<QList<QVariant>>();
 | ||
|     if (!list.isEmpty()) {
 | ||
|         if (!list.at(0).isNull()) {
 | ||
|             QVariant var = list.at(0);
 | ||
|             auto ptr = *reinterpret_cast<QSharedPointer<Entity>*>(var.data());
 | ||
|             auto var = list.at(0);
 | ||
|             auto ptr = EntityInstanceFactory::castQVariant(var);
 | ||
|             auto builder = this->schema->getQueryBuilder();
 | ||
|             QString tblName = builder->generateManyToManyTableName(entity, ptr);
 | ||
|             if (this->schema->getTables().contains(tblName)) {
 | ||
| ... | ... | |
|                                   tblName, builder->generateManyToManyColumnName(entity),
 | ||
|                                   entity->property(entity->getPrimaryKey()).toLongLong());
 | ||
|                 if (this->db->transaction(q)) {
 | ||
|                     auto nList = *reinterpret_cast<QList<QSharedPointer<Entity>>*>(property.data());
 | ||
|                     auto nList = EntityInstanceFactory::castQVariantList(property);
 | ||
|                     this->persistMappedByRelation(nList, q, entity, ptr, r, tblName);
 | ||
|                 }
 | ||
|             } else {
 | ||
| src/entitymanager.h | ||
|---|---|---|
|     void removeEntity(QVariant &var);
 | ||
|     void setNullOneToManyRelation(QVariant &var, const Relation &r);
 | ||
|     void setNullEntityPropertyRelation(QVariant &var, const Relation &r);
 | ||
|     QMetaProperty mappedProperty(const Relation &r,const QSharedPointer<Entity> &foreignEntity) const;
 | ||
|  | ||
|   public:
 | ||
|     EntityManager(QSqlDatabase database);
 | ||
Auch abrufbar als: Unified diff
update