Revision 40cf6a8c
Von Sebastian Diel vor mehr als 5 Jahren hinzugefügt
- ID 40cf6a8c712767178893a61ab44f3db3d2c9c5ef
- Vorgänger 48379924
src/entitymanager.cpp | ||
---|---|---|
EntityManager::EntityManager(QSqlDatabase database, bool logQueries,
|
||
const bool inspectEntities,
|
||
MsgType logActions) : QObject() {
|
||
// Q_IMPORT_PLUGIN(SqliteCipherDriverPlugin)
|
||
this->db = QSharedPointer<Database>(new Database(database, true, logQueries, logActions));
|
||
this->init(inspectEntities, logActions);
|
||
}
|
||
... | ... | |
databasename, username,
|
||
password,
|
||
port.toInt(), true, logQueries, databaseOptions, logActions));
|
||
|
||
this->init(inspectEntities, logActions);
|
||
}
|
||
|
||
... | ... | |
QList<Entity *> &mergedObjects, const bool persistRelations,
|
||
const bool ignoreHasChanged, const bool validate,
|
||
const bool relationsIgnoreHasChanged) {
|
||
static bool out = false;
|
||
if (entity.data()->metaObject()->className() == QByteArray("TestPupilGreatGrandChild")) {
|
||
qDebug()<<"~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~";
|
||
out = true;
|
||
}
|
||
bool merged = mergedObjects.contains(entity.data());
|
||
std::sort(mergedObjects.begin(), mergedObjects.end(), lessThanEntity);
|
||
if (entity && !merged && (ignoreHasChanged || this->hasChanged(entity))) {
|
||
if (entity->getProperty(entity->getPrimaryKey()).toLongLong() > -1) {
|
||
return this->mergeObject(entity, mergedObjects, persistRelations, validate,
|
||
... | ... | |
bool EntityManager::mergeObject(QSharedPointer<Entity> &entity,
|
||
QList<Entity *> &mergedObjects, bool withRelations, const bool validate,
|
||
const bool relationsIgnoreHasChanged) {
|
||
static bool out = false;
|
||
if (entity.data()->metaObject()->className() == QByteArray("TestPupilGreatGrandChild")) {
|
||
qDebug()<<"~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~";
|
||
out = true;
|
||
}
|
||
bool ok = true;
|
||
std::sort(mergedObjects.begin(), mergedObjects.end(), lessThanEntity);
|
||
if (entity && !mergedObjects.contains(entity.data())) {
|
||
mergedObjects.append(entity.data());
|
||
ok = false;
|
||
... | ... | |
this->savePrePersistedRelations(entity, mergedObjects,
|
||
relationsIgnoreHasChanged);
|
||
}
|
||
qDebug()<<"mergeObject startTransaction";
|
||
this->db->startTransaction();
|
||
QList<QSqlQuery> q = this->schema->getQueryBuilder()->merge(
|
||
entity);
|
||
... | ... | |
this->savePrePersistedRelations(entity, mergedObjects,
|
||
relationsIgnoreHasChanged);
|
||
}
|
||
qDebug()<<"createObject startTransaction";
|
||
this->db->startTransaction();
|
||
QList<QSqlQuery> q = this->schema->getQueryBuilder()->create(
|
||
entity);
|
||
... | ... | |
|
||
bool EntityManager::startup(QString version, QStringList toInitialize,
|
||
bool createIndices) {
|
||
|
||
// #ifdef DIFFABLEOUTPUT
|
||
qSetGlobalQHashSeed(0);
|
||
// #endif
|
||
|
||
QSharedPointer<Entity> dbm = QSharedPointer<DatabaseMigration>
|
||
(new DatabaseMigration());
|
||
QHash<QString, QVariant> map = QHash<QString, QVariant>();
|
||
... | ... | |
}
|
||
}
|
||
|
||
bool EntityManager::lessThanEntity( Entity* &a, Entity* &b) {
|
||
if (a->metaObject()->className() == b->metaObject()->className()) {
|
||
return a->getId() < b->getId();
|
||
} else {
|
||
return a->metaObject()->className() < b->metaObject()->className();
|
||
}
|
||
}
|
||
|
||
void EntityManager::savePrePersistedRelations(const QSharedPointer<Entity>
|
||
&mainEntityToBeSaved, QList<Entity *> &mergedObjects, bool ignoreHasChanged) {
|
||
static bool out = false;
|
||
if (mainEntityToBeSaved.data()->metaObject()->className() == QByteArray("TestPupilGreatGrandChild")) {
|
||
qDebug()<<"~~~~~~~~~~~~~savePrePersistedRelations~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~";
|
||
out = true;
|
||
}
|
||
if (out) {
|
||
std::sort(mergedObjects.begin(), mergedObjects.end(), lessThanEntity);
|
||
}
|
||
if (out) qDebug()<<"savePrePersistedRelations: "<<mainEntityToBeSaved->metaObject()->className()<<", mO: "<<mergedObjects.count();
|
||
auto relations = EntityHelper::getRelationProperties(mainEntityToBeSaved.data());
|
||
auto relationIterator = relations.constBegin();
|
||
while (relationIterator != relations.constEnd()) {
|
||
if(out) qDebug()<<"relationProperties: "<<relations.count();
|
||
QMap<Relation, QMetaProperty> relationsMap;
|
||
|
||
for (auto i = relations.begin(); i != relations.end(); i++ ) {
|
||
relationsMap.insert(i.key(), i.value());
|
||
}
|
||
|
||
|
||
auto relationIterator = relationsMap.constBegin();
|
||
while (relationIterator != relationsMap.constEnd()) {
|
||
const Relation relation = relationIterator.key();
|
||
const QMetaProperty relationProperty = relationIterator.value();
|
||
if (out) qDebug()<<"Relation.key: "<<relation.getPropertyName()<<", value: "<<relationIterator.value().typeName();
|
||
auto varFromRelationsValue = relationProperty.read(mainEntityToBeSaved.data());
|
||
if (out) qDebug()<< "varFromRelationsValueNull? "<<varFromRelationsValue.isNull() <<", "<<varFromRelationsValue;
|
||
if(!varFromRelationsValue.isNull() && varFromRelationsValue.data()) {
|
||
if(out) qDebug()<< "relationType is "<<int(relation.getType());
|
||
if (relation.getType() == RelationType::MANY_TO_ONE) {
|
||
if (out) qDebug()<<"MANY_TO_ONE";
|
||
auto relationEntity = EntityInstanceFactory::castQVariant(varFromRelationsValue);
|
||
if (relationEntity && this->shouldBeSaved(relationEntity, relation)) {
|
||
if (out) qDebug()<< "relationEntity->metaObject()->className(): "<<relationEntity->metaObject()->className();
|
||
if (out) qDebug()<< "into recursion:";
|
||
// into recursion:
|
||
this->saveObject(relationEntity, mergedObjects, true, ignoreHasChanged);
|
||
|
||
bool r;
|
||
r= this->saveObject(relationEntity, mergedObjects, true, ignoreHasChanged);
|
||
if (out) qDebug()<< "saveObjectm21: "<<r<<" ("<<relationEntity->metaObject()->className()<<")";
|
||
// Is this mapped by the opposite party?
|
||
auto foreignKeyProp = EntityHelper::mappedProperty(relation, relationEntity);
|
||
if (foreignKeyProp.isValid()) {
|
||
// fixes ticket #629
|
||
auto relations = relationEntity->getRelations();
|
||
auto i = relations.constBegin();
|
||
while(i != relations.constEnd()) {
|
||
QMap<QString, Relation> relationsMap;
|
||
for (auto i = relations.begin(); i != relations.end(); i++ ) {
|
||
relationsMap.insert(i.key(), i.value());
|
||
}
|
||
if (out) qDebug() << "foreignKeyProp.isValid()m21, "<<relations.count()<<" relations";
|
||
auto i = relationsMap.constBegin();
|
||
while(i != relationsMap.constEnd()) {
|
||
QString foreignKeyPropString = QString(foreignKeyProp.name());
|
||
if (out) qDebug()<< "is "<<foreignKeyPropString<<" mapping this?";
|
||
if(i.value().getMappedBy() == foreignKeyPropString) {
|
||
if (out) qDebug()<< "yes";
|
||
EntityHelper::addEntityToListProperty(relationEntity, mainEntityToBeSaved, foreignKeyProp);
|
||
break;
|
||
}
|
||
} else if (out) qDebug()<< "no";
|
||
++i;
|
||
}
|
||
}
|
||
}
|
||
} else if (relation.getType() == RelationType::ONE_TO_ONE
|
||
&& relation.getMappedBy().isEmpty()) {
|
||
if (out) qDebug()<<"ONE_TO_ONE";
|
||
auto e = EntityInstanceFactory::castQVariant(varFromRelationsValue);
|
||
if(e) {
|
||
this->saveObject(e, mergedObjects, true, ignoreHasChanged);
|
||
if (out) qDebug()<<"saving "<<e->metaObject()->className();
|
||
bool r;
|
||
r = this->saveObject(e, mergedObjects, true, ignoreHasChanged);
|
||
if (out) qDebug()<<"saving "<<e->metaObject()->className()<<" resulted in "<<r;
|
||
auto prop = EntityHelper::mappedProperty(relation, e);
|
||
if (out) qDebug()<<"prop: "<<prop.name()<<"/"<<prop.typeName();
|
||
EntityHelper::setProperty(e, mainEntityToBeSaved, prop);
|
||
}
|
||
}
|
||
... | ... | |
}
|
||
|
||
void EntityManager::savePostPersistedRelations(const QSharedPointer<Entity>
|
||
&entity, QList<Entity *> &mergedObjects, bool ignoreHasChanged, bool newItem) {
|
||
&entity, QList<Entity *> &mergedObjects, bool ignoreHasChanged, bool newItem
|
||
, bool forceOut) {
|
||
static bool out = false;
|
||
if (entity.data()->metaObject()->className() == QByteArray("TestPupilGreatGrandChild")) {
|
||
qDebug()<<"~~~~~~~~~~~~~~savePostPersistedRelations~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~";
|
||
out = true;
|
||
}
|
||
if (forceOut) {
|
||
qDebug()<< "~~~~~~~~~~~~~~~~~~~~savePostPersistedRelations FORCEOUT~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~";
|
||
out = true;
|
||
}
|
||
if (out) qDebug()<<"savePostPersistedRelations: "<<entity->metaObject()->className()<<", mO: "<<mergedObjects.count()<<", new: "<<newItem;
|
||
auto relations = EntityHelper::getRelationProperties(entity.data());
|
||
if (out) qDebug()<<"relationProperties: "<<relations.count();
|
||
for (auto i = relations.constBegin(); i != relations.constEnd(); ++i) {
|
||
if (out) qDebug()<<"Relation.key: "<<i.key().getPropertyName()<<", value: "<<i.value().typeName();
|
||
const Relation r = i.key();
|
||
auto var = i.value().read(entity.data());
|
||
if (r.getType() == RelationType::MANY_TO_MANY) {
|
||
if (out) qDebug()<<"MANY_TO_MANY";
|
||
this->persistManyToMany(entity, r, var, mergedObjects, ignoreHasChanged,
|
||
newItem);
|
||
} else if (r.getType() == RelationType::ONE_TO_MANY && var.canConvert<QList<QVariant>>()) {
|
||
if (out) qDebug()<<"ONE_TO_MANY";
|
||
QList<QSharedPointer<Entity>> list = EntityInstanceFactory::castQVariantList(
|
||
var);
|
||
if (!list.isEmpty()) {
|
||
if (out) qDebug()<<"is NOT Empty12m";
|
||
auto foreignKeyProp = EntityHelper::mappedProperty(r, list.at(0));
|
||
if (out) qDebug()<<"foreignKeyProp12m: "<<foreignKeyProp.name()<<"/"<<foreignKeyProp.typeName();
|
||
for (int var = 0; var < list.size(); ++var) {
|
||
auto e = list.at(var);
|
||
if (out) qDebug()<<"e->metaObject()->className()12m: "<<e->metaObject()->className();
|
||
if (e && this->shouldBeSaved(e, r)) {
|
||
if (out) qDebug()<<"shouldBeSaved";
|
||
EntityHelper::setProperty(e, entity, foreignKeyProp);
|
||
this->saveObject(e, mergedObjects, true, ignoreHasChanged);
|
||
bool r;
|
||
r = this->saveObject(e, mergedObjects, true, ignoreHasChanged);
|
||
if (out) qDebug()<<"saveObject12m: "<<r<<" ("<<e->metaObject()->className()<<")";
|
||
}
|
||
}
|
||
}
|
||
} else if (r.getType() == RelationType::ONE_TO_ONE
|
||
&& !r.getMappedBy().isEmpty()) {
|
||
if (out) qDebug()<<"ONE_TO_ONE";
|
||
auto e = EntityInstanceFactory::castQVariant(var);
|
||
if(e) {
|
||
auto foreignKeyProp = EntityHelper::mappedProperty(r, e);
|
||
if (out) qDebug()<<"foreignKeyProp121: "<<foreignKeyProp.name()<<"/"<<foreignKeyProp.typeName();
|
||
if (out) qDebug()<<"e->metaObject()->className()121: "<<e->metaObject()->className();
|
||
EntityHelper::setProperty(e, entity, foreignKeyProp);
|
||
this->saveObject(e, mergedObjects, true, ignoreHasChanged);
|
||
bool r;
|
||
r = this->saveObject(e, mergedObjects, true, ignoreHasChanged);
|
||
if (out) qDebug()<<"saveObject121: "<<r<<" ("<<e->metaObject()->className()<<")";
|
||
}
|
||
}
|
||
}
|
Auch abrufbar als: Unified diff
debugging heritage