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