Revision da3ce9cf
Von Christian Ehringfeld vor mehr als 10 Jahren hinzugefügt
| example/main.cpp | ||
|---|---|---|
|
qDebug() << "Dauer:" << t.elapsed();
|
||
|
//QSharedPointer<Artikel> aPtr = QSharedPointer<Artikel>(entity);
|
||
|
Pupil *p = new Pupil();
|
||
|
|
||
|
// auto iterator = hash.constBegin();
|
||
|
// while(iterator != hash.constEnd()) {
|
||
|
// qDebug() << iterator.key() << " Value:" << iterator.value().read(p);
|
||
| src/entity.cpp | ||
|---|---|---|
|
return JOINED_TABLE;
|
||
|
}
|
||
|
|
||
|
bool Entity::isInheritanceCascaded() const {
|
||
|
return true;
|
||
|
}
|
||
|
|
||
|
QString Entity::getPrimaryKey() const {
|
||
|
return "id";
|
||
|
}
|
||
|
|
||
|
const QStack<const QMetaObject *> Entity::superClasses(bool
|
||
|
const QList<const QMetaObject *> Entity::superClasses(bool
|
||
|
stopAtSingleTableInheritance) const {
|
||
|
QStack<const QMetaObject *> classes = QStack<const QMetaObject *>();
|
||
|
QList<const QMetaObject *> classes = QList<const QMetaObject *>();
|
||
|
auto superMetaObject = this->metaObject()->superClass();
|
||
|
if (this->getInheritanceStrategy() == JOINED_TABLE) {
|
||
|
Entity *e = 0;
|
||
| ... | ... | |
|
QString("CuteEntityManager::Entity")) {
|
||
|
e = EntityInstanceFactory::createInstance(superMetaObject->className());
|
||
|
if (e) {
|
||
|
classes.push(superMetaObject);
|
||
|
classes.append(superMetaObject);
|
||
|
superMetaObject = superMetaObject->superClass();
|
||
|
quint8 s = e->getInheritanceStrategy();
|
||
|
delete e;
|
||
| ... | ... | |
|
const QHash<QString, QMetaProperty> Entity::getInheritedMetaProperties() const {
|
||
|
auto classes = this->superClasses();
|
||
|
auto wholeProperties = QHash<QString, QMetaProperty>();
|
||
|
while (!classes.isEmpty()) {
|
||
|
auto metaObject = classes.pop();
|
||
|
for (int var = classes.size() - 1; var >= 0; --var) {
|
||
|
auto metaObject = classes.at(var);
|
||
|
auto properties = Entity::getMetaProperties(metaObject);
|
||
|
auto iterator = properties.constBegin();
|
||
|
while (iterator != properties.constEnd()) {
|
||
| ... | ... | |
|
return this->metaObject()->className();
|
||
|
}
|
||
|
|
||
|
QVariant Entity::property(const QString &name) const {
|
||
|
return this->property(name.toLatin1().constData());
|
||
|
}
|
||
|
|
||
|
qint64 Entity::getId() const {
|
||
|
return id;
|
||
|
}
|
||
| src/entity.h | ||
|---|---|---|
|
virtual QString toString() const;
|
||
|
virtual ~Entity();
|
||
|
virtual QString getTablename() const;
|
||
|
/**
|
||
|
* @brief getRelations
|
||
|
* @return
|
||
|
*/
|
||
|
virtual const QHash<QString, Relation> getRelations() const;
|
||
|
virtual const QHash<QString, Relation> getNonInheritedRelations() const;
|
||
|
virtual const QStringList getTransientAttributes() const;
|
||
|
virtual const QStringList getBLOBColumns() const;
|
||
|
virtual InheritanceStrategy getInheritanceStrategy() const;
|
||
|
virtual bool isInheritanceCascaded() const;
|
||
|
|
||
|
//return value must be the exact name defined in Q_PROPERTY
|
||
|
virtual QString getPrimaryKey() const;
|
||
|
const QStack<const QMetaObject *> superClasses(bool stopAtSingleTableInheritance
|
||
|
const QList<const QMetaObject *> superClasses(bool stopAtSingleTableInheritance
|
||
|
= false) const;
|
||
|
const QHash<QString, QMetaProperty> getMetaProperties() const;
|
||
|
const QHash<QString, QMetaProperty> getSuperMetaProperties() const;
|
||
| ... | ... | |
|
const QHash<QString, QMetaProperty> getInheritedMetaProperties() const;
|
||
|
const QHash<Relation, QMetaProperty> getRelationProperties() const;
|
||
|
const char *getClassname() const;
|
||
|
QVariant property(const QString &name) const;
|
||
|
|
||
|
qint64 getId() const;
|
||
|
void setId(const qint64 &value);
|
||
| src/querybuilder.cpp | ||
|---|---|---|
|
Relation r = i.value();
|
||
|
if (r.getType() == MANY_TO_MANY && r.getMappedBy().isEmpty()) {
|
||
|
QHash<QString, QString> h = QHash<QString, QString>();
|
||
|
h.insert("id", this->schema.data()->TYPE_BIGPK);
|
||
|
h.insert(entity.data()->getPrimaryKey(), this->schema.data()->TYPE_BIGPK);
|
||
|
h.insert(this->generateManyToManyColumnName(entity),
|
||
|
this->schema.data()->TYPE_BIGINT);
|
||
|
auto m = props.value(r.getPropertyName());
|
||
|
Entity *e = EntityInstanceFactory::createInstance(m.type());
|
||
|
QSharedPointer<Entity> ptr = QSharedPointer<Entity>(e);
|
||
|
QSharedPointer<Entity> ptr = QSharedPointer<Entity>
|
||
|
(EntityInstanceFactory::createInstance(m.type()));
|
||
|
h.insert(this->generateManyToManyColumnName(ptr),
|
||
|
this->schema.data()->TYPE_BIGINT);
|
||
|
relations.insert(this->generateManyToManyTableName(entity, ptr), h);
|
||
| ... | ... | |
|
QList<QSqlQuery> QueryBuilder::remove(const QSharedPointer<Entity> &entity)
|
||
|
const {
|
||
|
QList<QSqlQuery> queries = QList<QSqlQuery>();
|
||
|
if (entity.data()->getInheritanceStrategy() != PER_CLASS_TABLE) {
|
||
|
auto stack = entity.data()->superClasses(true);
|
||
|
while (!stack.isEmpty()) {
|
||
|
auto item = stack.pop();
|
||
|
queries.append(this->remove(entity.data()->getTablename(),
|
||
|
entity.data()->property(entity.data()->getPrimaryKey()).toLongLong()));
|
||
|
if (entity.data()->getInheritanceStrategy() != PER_CLASS_TABLE
|
||
|
&& entity.data()->isInheritanceCascaded()) {
|
||
|
auto classes = entity.data()->superClasses(true);
|
||
|
for (int var = 0; var < classes.size(); ++var) {
|
||
|
auto item = classes.at(var);
|
||
|
auto instance = EntityInstanceFactory::createInstance(item->className());
|
||
|
if (instance) {
|
||
|
queries.append(this->remove(instance->getTablename(), entity.data()->getId()));
|
||
|
queries.append(this->remove(instance->getTablename(),
|
||
|
entity.data()->property(entity.data()->getPrimaryKey()).toLongLong()));
|
||
|
delete instance;
|
||
|
instance = 0;
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
queries.append(this->remove(entity.data()->getTablename(),
|
||
|
entity.data()->getId()));
|
||
|
return queries;
|
||
|
}
|
||
|
|
||
|
|
||
|
QSqlQuery QueryBuilder::remove(const QString &tableName,
|
||
|
const qint64 &id) const {
|
||
|
const qint64 &id, const QString &primaryKey) const {
|
||
|
QSqlQuery q = this->database->getQuery("DELETE FROM " +
|
||
|
this->schema.data()->quoteTableName(
|
||
|
tableName) + " WHERE " +
|
||
|
this->schema.data()->quoteColumnName("id") + "=:id;");
|
||
|
this->schema.data()->quoteColumnName(primaryKey) + "=:id;");
|
||
|
q.bindValue(":id", id);
|
||
|
return q;
|
||
|
}
|
||
|
|
||
|
|
||
|
QSqlQuery QueryBuilder::findId(const QSharedPointer<Entity> &entity) const {
|
||
|
QHash<QString, QVariant> values = this->getEntityAttributes(
|
||
|
entity.data()->getMetaProperties(),
|
||
|
entity);
|
||
|
QSqlQuery q = this->database.data()->getQuery(this->selectBase(QStringList(
|
||
|
entity.data()->getTablename()), QStringList("id")) + this->where(values,
|
||
|
"AND", true) + " LIMIT 1");
|
||
|
entity.data()->getTablename()),
|
||
|
QStringList(entity.data()->getPrimaryKey())) + this->where(values,
|
||
|
"AND", true) + " LIMIT 1");
|
||
|
this->bindValues(values, q);
|
||
|
return q;
|
||
|
}
|
||
| ... | ... | |
|
QSqlQuery q = this->database.data()->getQuery("UPDATE " +
|
||
|
this->schema.data()->quoteTableName(
|
||
|
entity->getTablename()) + " SET " + this->attributes(
|
||
|
values) + " WHERE " + this->schema.data()->quoteColumnName("id") + "=:id;");
|
||
|
values) + " WHERE " + this->schema.data()->quoteColumnName(
|
||
|
entity.data()->getPrimaryKey()) + "=:id;");
|
||
|
this->bindValues(values, q);
|
||
|
return q;
|
||
|
}
|
||
|
|
||
|
QSqlQuery QueryBuilder::create(const QSharedPointer<Entity> &entity) const {
|
||
|
QHash<QString, QVariant> values = this->saveAttributes(entity);
|
||
|
values.remove("id");
|
||
|
return this->insert(entity.data()->getTablename(), values,
|
||
|
entity.data()->getPrimaryKey());
|
||
|
}
|
||
|
|
||
|
QSqlQuery QueryBuilder::insert(const QString &tableName,
|
||
|
QHash<QString, QVariant> &attributes, const QString &primaryKey) const {
|
||
|
attributes.remove(primaryKey);
|
||
|
QSqlQuery q = this->database.data()->getQuery();
|
||
|
QString p1 = "INSERT INTO " + this->schema.data()->quoteTableName(
|
||
|
entity->getTablename()) + "(";
|
||
|
tableName) + "(";
|
||
|
QString p2 = "VALUES(";
|
||
|
if (!values.isEmpty()) {
|
||
|
q.prepare(this->buildCreateQuery(values.constBegin(), values.constEnd(),
|
||
|
if (!attributes.isEmpty()) {
|
||
|
q.prepare(this->buildCreateQuery(attributes.constBegin(), attributes.constEnd(),
|
||
|
p1, p2));
|
||
|
}
|
||
|
this->bindValues(values, q);
|
||
|
this->bindValues(attributes, q);
|
||
|
return q;
|
||
|
}
|
||
|
|
||
|
|
||
|
QSqlQuery QueryBuilder::oneToMany(const QString &tableName,
|
||
|
const QString &attribute,
|
||
|
const qint64 &id,
|
||
| ... | ... | |
|
|
||
|
QString QueryBuilder::joinSuperClasses(const QSharedPointer<Entity> &entity)
|
||
|
const {
|
||
|
auto stack = entity.data()->superClasses();
|
||
|
auto classes = entity.data()->superClasses(true);
|
||
|
QString joined = "";
|
||
|
Entity *e = 0;
|
||
|
while (!stack.isEmpty()) {
|
||
|
auto metaObject = stack.pop();
|
||
|
for (int var = 0; var < classes.size(); ++var) {
|
||
|
auto metaObject = classes.at(var);
|
||
|
e = EntityInstanceFactory::createInstance(metaObject->className());
|
||
|
if (e) {
|
||
|
joined.append(" ");
|
||
| ... | ... | |
|
void QueryBuilder::insertRelationId(const Entity *e,
|
||
|
QHash<QString, QVariant> &map,
|
||
|
QString relName) const {
|
||
|
if (e && e->getId() > -1) {
|
||
|
map.insert(this->generateColumnNameID(relName), e->getId());
|
||
|
if (e && e->property(e->getPrimaryKey()).toLongLong() > -1) {
|
||
|
map.insert(this->generateColumnNameID(relName),
|
||
|
e->property(e->getPrimaryKey()));
|
||
|
}
|
||
|
}
|
||
|
|
||
| ... | ... | |
|
}
|
||
|
|
||
|
void QueryBuilder::bindValues(const QHash<QString, QVariant> &h, QSqlQuery &q,
|
||
|
bool ignoreID) const {
|
||
|
bool ignoreID, const QString &primaryKey) const {
|
||
|
QHash<QString, QVariant>::const_iterator i = h.constBegin();
|
||
|
while (i != h.constEnd()) {
|
||
|
if (!ignoreID || (ignoreID && !(i.key() == "id"))) {
|
||
|
if (!ignoreID || (ignoreID && !(i.key() == primaryKey))) {
|
||
|
q.bindValue(":" + i.key(), i.value());
|
||
|
}
|
||
|
++i;
|
||
| ... | ... | |
|
bool ignoreID) const {
|
||
|
return this->where(this->getEntityAttributes(entity.data()->getMetaProperties(),
|
||
|
entity),
|
||
|
conjunction, ignoreID);
|
||
|
conjunction, ignoreID, entity.data()->getPrimaryKey());
|
||
|
}
|
||
|
|
||
|
QString QueryBuilder::where(const QHash<QString, QVariant> &m,
|
||
|
const QString &conjunction,
|
||
|
bool ignoreID) const {
|
||
|
if (m.size() == 0 || (ignoreID && m.contains("id") && m.size() == 1)) {
|
||
|
bool ignoreID, const QString &primaryKey) const {
|
||
|
if (m.size() == 0 || (ignoreID && m.contains(primaryKey) && m.size() == 1)) {
|
||
|
return "";
|
||
|
}
|
||
|
return " WHERE " + this->attributes(m, conjunction, ignoreID);
|
||
|
return " WHERE " + this->attributes(m, conjunction, ignoreID, primaryKey);
|
||
|
}
|
||
|
|
||
|
QString QueryBuilder::attributes(const QHash<QString, QVariant> &m,
|
||
|
const QString &conjunction,
|
||
|
bool ignoreID) const {
|
||
|
bool ignoreID, const QString &primaryKey) const {
|
||
|
QString rc = "";
|
||
|
if (!m.isEmpty()) {
|
||
|
QHash<QString, QVariant>::const_iterator i = m.constBegin();
|
||
|
while (i != m.constEnd()) {
|
||
|
if (!ignoreID || (ignoreID && !(i.key() == "id"))) {
|
||
|
if (!ignoreID || (ignoreID && !(i.key() == primaryKey))) {
|
||
|
if (!(rc == "")) {
|
||
|
rc += " " + conjunction + " ";
|
||
|
}
|
||
| src/querybuilder.h | ||
|---|---|---|
|
QSqlQuery getQuery() const;
|
||
|
|
||
|
protected:
|
||
|
QSqlQuery remove(const QString &tableName, const qint64 &id) const;
|
||
|
QSqlQuery remove(const QString &tableName, const qint64 &id,
|
||
|
const QString &primaryKey = "id") const;
|
||
|
QSqlQuery insert(const QString &tableName, QHash<QString, QVariant> &attributes,
|
||
|
const QString &primaryKey = "id") const;
|
||
|
virtual void createRelationFK(QStringList &queries,
|
||
|
const QSharedPointer<Entity> &entity, const Relation &relation,
|
||
|
const QMetaProperty &metaProperty, const QString &update,
|
||
| ... | ... | |
|
QHash<QString, QVariant>::const_iterator end,
|
||
|
QString &p1, QString &p2) const;
|
||
|
void bindValues(const QHash<QString, QVariant> &h, QSqlQuery &q,
|
||
|
bool ignoreID = false) const;
|
||
|
bool ignoreID = false, const QString &primaryKey = "id") const;
|
||
|
QString where(const QSharedPointer<Entity> &entity, QString conjunction = ",",
|
||
|
bool ignoreID = false) const;
|
||
|
QString where(const QHash<QString, QVariant> &m,
|
||
|
const QString &conjunction = ",",
|
||
|
bool ignoreID = false) const;
|
||
|
bool ignoreID = false, const QString &primaryKey = "id") const;
|
||
|
QString attributes(const QHash<QString, QVariant> &m,
|
||
|
const QString &conjunction = ",",
|
||
|
bool ignoreID = false) const;
|
||
|
bool ignoreID = false, const QString &primaryKey = "id") const;
|
||
|
QHash<QString, QVariant> saveAttributes(const QSharedPointer<Entity> &entity)
|
||
|
const;
|
||
|
QString leftJoin(const QString &foreignTable, const QString &tableName,
|
||
Auch abrufbar als: Unified diff
improved usage of primary keys