Revision 4e75d5a1
Von Christian Ehringfeld vor fast 10 Jahren hinzugefügt
| src/attribute.cpp | ||
|---|---|---|
|
#include "attribute.h"
|
||
|
using namespace CuteEntityManager;
|
||
|
Attribute::Attribute()
|
||
|
{
|
||
|
|
||
|
}
|
||
|
|
||
| src/attribute.h | ||
|---|---|---|
|
#ifndef ATTRIBUTE_H
|
||
|
#define ATTRIBUTE_H
|
||
|
#include <QString>
|
||
|
namespace CuteEntityManager {
|
||
|
|
||
|
|
||
|
class Attribute {
|
||
|
public:
|
||
|
Attribute();
|
||
|
private:
|
||
|
QString name;
|
||
|
QString className;
|
||
|
QString relatedClass;
|
||
|
QString relatedTable;
|
||
|
};
|
||
|
}
|
||
|
#endif // ATTRIBUTE_H
|
||
| src/entityhelper.cpp | ||
|---|---|---|
|
return newInstance;
|
||
|
}
|
||
|
|
||
|
Entity *EntityHelper::getBaseClassObject(const QSharedPointer<Entity> &entity,
|
||
|
QString attributeName) {
|
||
|
auto superObject = EntityInstanceFactory::createInstance(entity->metaObject());
|
||
|
auto objectBefore = superObject;
|
||
|
bool first = true;
|
||
|
while(superObject) {
|
||
|
auto props = EntityHelper::getMetaProperties(superObject);
|
||
|
if(!props.contains(attributeName) ||
|
||
|
superObject->getInheritanceStrategy() == InheritanceStrategy::PER_CLASS_TABLE) {
|
||
|
break;
|
||
|
} else if(!first){
|
||
|
delete objectBefore;
|
||
|
objectBefore = nullptr;
|
||
|
} else {
|
||
|
first = false;
|
||
|
}
|
||
|
objectBefore = superObject;
|
||
|
superObject = EntityInstanceFactory::newSuperClassInstance(superObject);
|
||
|
}
|
||
|
return objectBefore;
|
||
|
}
|
||
|
|
||
|
const char *EntityHelper::getClassname(const Entity *entity) {
|
||
|
return entity->metaObject()->className();
|
||
|
}
|
||
| src/entityhelper.h | ||
|---|---|---|
|
const Entity *entity);
|
||
|
static const QHash<QString, QMetaProperty> getMetaProperties(
|
||
|
const QMetaObject *object);
|
||
|
static const QHash<QString, QMetaProperty> getNonInheritedMetaProperties(const Entity *entity);
|
||
|
static const QHash<QString, QMetaProperty> getNonInheritedMetaProperties(
|
||
|
const Entity *entity);
|
||
|
static const QHash<QString, QMetaProperty> getInheritedMetaProperties(
|
||
|
const Entity *entity);
|
||
|
static const QHash<Relation, QMetaProperty> getRelationProperties(
|
||
|
const Entity *entity);
|
||
|
static Entity* copyObject(const Entity *entity);
|
||
|
|
||
|
static Entity* getBaseClassObject(const QSharedPointer<Entity> &entity, QString attributeName);
|
||
|
|
||
|
static const char *getClassname(const Entity *entity);
|
||
|
static const QString getClassName(const Entity *entity);
|
||
| ... | ... | |
|
QSharedPointer<Entity> add, const QMetaProperty &property);
|
||
|
static void removeEntityFromListProperty(const QSharedPointer<Entity> &entity,
|
||
|
QSharedPointer<Entity> remove, const QMetaProperty &property);
|
||
|
static void clearEntityListProperty(const QSharedPointer<Entity> &entity, const QMetaProperty &property);
|
||
|
static void clearEntityListProperty(const QSharedPointer<Entity> &entity,
|
||
|
const QMetaProperty &property);
|
||
|
static void setListProperty(const QSharedPointer<Entity> &entity,
|
||
|
QList<QSharedPointer<Entity>> &list,
|
||
|
const QMetaProperty &property);
|
||
| ... | ... | |
|
static QMetaProperty mappedProperty(const Relation &r,
|
||
|
const QSharedPointer<Entity> &foreignEntity);
|
||
|
static QHash<QString, QVariant> getEntityAttributes(const
|
||
|
QHash<QString, QMetaProperty>
|
||
|
&props,
|
||
|
QHash<QString, QMetaProperty> &props,
|
||
|
const QSharedPointer<Entity> &entity);
|
||
|
};
|
||
|
}
|
||
| src/entitymanager.cpp | ||
|---|---|---|
|
this->db->startTransaction();
|
||
|
auto builder = this->schema->getQueryBuilder();
|
||
|
q = builder->manyToManyInsert(tblName,
|
||
|
builder->generateManyToManyColumnName(entity),
|
||
|
builder->generateManyToManyColumnName(ptr));
|
||
|
builder->generateManyToManyColumnName(entity,r.getPropertyName()),
|
||
|
builder->generateManyToManyColumnName(ptr,r.getMappedBy()));
|
||
|
q.bindValue(0, entity->getProperty(entity->getPrimaryKey()));
|
||
|
auto prop = EntityHelper::mappedProperty(r, ptr);
|
||
|
QSharedPointer<Entity> item;
|
||
| ... | ... | |
|
QString tblName = builder->generateManyToManyTableName(e, ptr, r);
|
||
|
if (this->schema->getTables().contains(tblName)) {
|
||
|
QSqlQuery q = builder->manyToManyDelete(
|
||
|
tblName, builder->generateManyToManyColumnName(e),
|
||
|
tblName, builder->generateManyToManyColumnName(e,r.getPropertyName()),
|
||
|
e->getProperty(e->getPrimaryKey()).toLongLong());
|
||
|
if (this->db->exec(q)) {
|
||
|
bool refresh = r.getCascadeType().contains(CascadeType::REFRESH)
|
||
| ... | ... | |
|
* @todo diff and remove entity from relational object when association is deleted
|
||
|
*/
|
||
|
q = builder->manyToManyDelete(
|
||
|
tblName, builder->generateManyToManyColumnName(entity),
|
||
|
tblName, builder->generateManyToManyColumnName(entity,r.getPropertyName()),
|
||
|
entity->getProperty(entity->getPrimaryKey()).toLongLong());
|
||
|
ok = this->db->exec(q);
|
||
|
} else {
|
||
| ... | ... | |
|
relation);
|
||
|
if (this->schema->getTables().contains(tblName)) {
|
||
|
QSqlQuery q = builder->manyToMany(tblName,
|
||
|
builder->generateManyToManyColumnName(entity),
|
||
|
builder->generateManyToManyColumnName(entity,relation.getPropertyName()),
|
||
|
entity->getProperty(entity->getPrimaryKey()).toLongLong());
|
||
|
auto listMap = this->convertQueryResult(q);
|
||
|
auto secClassName = EntityHelper::getClassName(secEntityPtr.data());
|
||
|
QSharedPointer<Entity> e;
|
||
|
for (int var = 0; var < listMap.size(); ++var) {
|
||
|
auto id = listMap.at(var).value(builder->generateManyToManyColumnName(secEntityPtr));
|
||
|
auto id = listMap.at(var).value(builder->generateManyToManyColumnName(secEntityPtr,relation.getMappedBy()));
|
||
|
if (refresh || !(this->cache.contains(id.toLongLong(), secClassName) &&
|
||
|
(e = this->cache.get(id.toLongLong(), secClassName)))) {
|
||
|
e = this->findById(id.toLongLong(), secClassName);
|
||
| src/querybuilder.cpp | ||
|---|---|---|
|
QString QueryBuilder::createForeignKeyManyToMany(const QString &tableName,
|
||
|
const QSharedPointer<Entity> &entity, const QString &update,
|
||
|
const QString &remove) const {
|
||
|
QString fkColumn = this->generateManyToManyColumnName(entity);
|
||
|
QString fkColumn = this->generateManyToManyColumnName(entity, "id");
|
||
|
QString indexName = this->generateIndexName(fkColumn,
|
||
|
tableName, fkColumn,
|
||
|
entity->getTablename(), true);
|
||
| ... | ... | |
|
QString QueryBuilder::generateManyToManyTableName(const QSharedPointer<Entity>
|
||
|
&firstEntity,
|
||
|
const QSharedPointer<Entity> &secondEntity, const Relation &r) const {
|
||
|
if (r.getMappedBy().isEmpty()) {
|
||
|
return firstEntity->getTablename() + "_" + r.getPropertyName();
|
||
|
} else {
|
||
|
return secondEntity->getTablename() + "_" + r.getMappedBy();
|
||
|
auto ptr = firstEntity;
|
||
|
QString attributeName = r.getPropertyName();
|
||
|
if (!r.getMappedBy().isEmpty()) {
|
||
|
ptr = secondEntity;
|
||
|
attributeName = r.getMappedBy();
|
||
|
}
|
||
|
auto obj = EntityHelper::getBaseClassObject(ptr, attributeName);
|
||
|
QString tblName = obj->getTablename() + "_" + attributeName;
|
||
|
delete obj;
|
||
|
return tblName;
|
||
|
}
|
||
|
|
||
|
QHash<QString, QHash<QString, QString>> QueryBuilder::generateRelationTables(
|
||
| ... | ... | |
|
if (r.getType() == RelationType::MANY_TO_MANY && r.getMappedBy().isEmpty()) {
|
||
|
QHash<QString, QString> h = QHash<QString, QString>();
|
||
|
h.insert(entity->getPrimaryKey(), this->schema->TYPE_BIGPK);
|
||
|
h.insert(this->generateManyToManyColumnName(entity),
|
||
|
h.insert(this->generateManyToManyColumnName(entity, r.getPropertyName()),
|
||
|
this->schema->TYPE_BIGINT);
|
||
|
auto meta = props.value(r.getPropertyName());
|
||
|
QSharedPointer<Entity> ptr = QSharedPointer<Entity>
|
||
|
(EntityInstanceFactory::createInstance(EntityInstanceFactory::extractEntityType(
|
||
|
QMetaType::typeName(meta.userType()))));
|
||
|
h.insert(this->generateManyToManyColumnName(ptr),
|
||
|
h.insert(this->generateManyToManyColumnName(ptr, r.getMappedBy()),
|
||
|
this->schema->TYPE_BIGINT);
|
||
|
relations.insert(this->generateManyToManyTableName(entity, ptr, r), h);
|
||
|
}
|
||
| ... | ... | |
|
}
|
||
|
|
||
|
QString QueryBuilder::generateManyToManyColumnName(const QSharedPointer<Entity>
|
||
|
&entity) const {
|
||
|
&entity, QString attribute) const {
|
||
|
if (entity) {
|
||
|
return this->generateColumnNameID(entity->getTablename());
|
||
|
auto obj = EntityHelper::getBaseClassObject(entity, attribute);
|
||
|
QString tblName = obj->getTablename();
|
||
|
delete obj;
|
||
|
return this->generateColumnNameID(tblName);
|
||
|
}
|
||
|
this->database->getLogger()->logMsg("Entity is empty!", MsgType::WARNING);
|
||
|
return "";
|
||
| src/querybuilder.h | ||
|---|---|---|
|
const QSharedPointer<Entity> &entity) const;
|
||
|
QString generateManyToManyTableName(const QSharedPointer<Entity> &firstEntity,
|
||
|
const QSharedPointer<Entity> &secondEntity, const Relation &r) const;
|
||
|
QString generateManyToManyColumnName(const QSharedPointer<Entity> &entity)
|
||
|
const;
|
||
|
QString generateManyToManyColumnName(const QSharedPointer<Entity> &entity, QString attribute) const;
|
||
|
QString buildCreateQuery(QHash<QString, QVariant>::const_iterator i,
|
||
|
QHash<QString, QVariant>::const_iterator end,
|
||
|
QString &p1, QString &p2) const;
|
||
| src/sqlitebackupprocessor.cpp | ||
|---|---|---|
|
sqlite3_backup *pBackup; /* Backup object used to copy data */
|
||
|
sqlite3 *pTo; /* Database to copy to (pFile or pInMemory) */
|
||
|
sqlite3 *pFrom; /* Database to copy from (pFile or pInMemory) */
|
||
|
|
||
|
/* Open the database file identified by zFilename. Exit early if this fails
|
||
|
** for any reason. */
|
||
|
rc = sqlite3_open( zFilename, &pFile );
|
||
| src/src.pro | ||
|---|---|---|
|
validators/lengthvalidator.h \
|
||
|
schema/mysqlquerybuilder.h \
|
||
|
entityinspector.h \
|
||
|
sqlitebackupprocessor.h
|
||
|
sqlitebackupprocessor.h \
|
||
|
attribute.h
|
||
|
|
||
|
SOURCES += \
|
||
|
entity.cpp \
|
||
| ... | ... | |
|
validators/lengthvalidator.cpp \
|
||
|
schema/mysqlquerybuilder.cpp \
|
||
|
entityinspector.cpp \
|
||
|
sqlitebackupprocessor.cpp
|
||
|
sqlitebackupprocessor.cpp \
|
||
|
attribute.cpp
|
||
|
|
||
|
win32:!system-sqlite:!contains(LIBS, .*sqlite3.*) {
|
||
|
include($$[QT_INSTALL_PREFIX]/../Src/qtbase/src/3rdparty/sqlite.pri)
|
||
Auch abrufbar als: Unified diff
many-to-many table name resolve