Revision 40cf6a8c
Von Sebastian Diel vor etwa 7 Jahren hinzugefügt
- ID 40cf6a8c712767178893a61ab44f3db3d2c9c5ef
- Vorgänger 48379924
| EntityManager.pro | ||
|---|---|---|
|
CONFIG += c++14
|
||
|
tests.depends = src
|
||
|
samples.depends = tests
|
||
|
|
||
| samples/example/main.cpp | ||
|---|---|---|
|
EntityInstanceFactory::registerClass<Contact>();
|
||
|
EntityInstanceFactory::registerClass<Address>();
|
||
|
CuteEntityManager::EntityManager *e = new
|
||
|
|
||
|
|
||
|
// CuteEntityManager::EntityManager("QSQLITECIPHER",
|
||
|
// QDir::currentPath() + "/db.sqlite", "", "", "test", 0, true);
|
||
|
|
||
|
CuteEntityManager::EntityManager("QSQLITE",
|
||
|
QDir::currentPath() + "/db.sqlite", "", "", "", 0, true);
|
||
|
|
||
|
|
||
|
// CuteEntityManager::EntityManager("QSQLITE",
|
||
|
// ":memory:", "", "", "", "", true, "foreign_keys = ON");
|
||
|
// SqliteBackupProcessor *sqliteproc = new SqliteBackupProcessor(e->getDb(),
|
||
| src/database.cpp | ||
|---|---|---|
|
}
|
||
|
|
||
|
void Database::init() {
|
||
|
// qDebug()<<"db init pre: "<< this->database;
|
||
|
this->database.open();
|
||
|
// qDebug()<<"db init post: "<< this->database;
|
||
|
this->supportTransactions = this->database.driver()->hasFeature(
|
||
|
QSqlDriver::Transactions);
|
||
|
}
|
||
| ... | ... | |
|
if (this->logger && this->logErrors) {
|
||
|
this->logger->lastError(query, this->logQueries);
|
||
|
} else {
|
||
|
qDebug() << query.executedQuery();
|
||
|
// qDebug() << query.executedQuery();
|
||
|
}
|
||
|
}
|
||
|
|
||
| src/database.h | ||
|---|---|---|
|
|
||
|
#ifndef DATABASE_H
|
||
|
#define DATABASE_H
|
||
|
//#include "../../../../QtCipherSqlitePlugin/QtCipherSqlitePlugin/sqlitecipher/sqlite3/sqlite3.h"
|
||
|
//#include "../../../../QtCipherSqlitePlugin/QtCipherSqlitePlugin/sqlitecipher/sqlite3/sqlite3ext.h"
|
||
|
#include <QtSql/QSqlDatabase>
|
||
|
#include <QtSql/QSqlDriver>
|
||
|
#include <QtSql/QSqlQuery>
|
||
| ... | ... | |
|
static Schema *getSchema(DatabaseType db,
|
||
|
QSharedPointer<Database> database);
|
||
|
Logger *getLogger() const;
|
||
|
QSqlDatabase getQSqlDatabase() {return database;}
|
||
|
private:
|
||
|
QSqlDatabase database;
|
||
|
QString connectionName;
|
||
| src/entityinspector.cpp | ||
|---|---|---|
|
|
||
|
bool EntityInspector::checkRegisteredEntities() {
|
||
|
QStringList classes = EntityInstanceFactory::getRegisteredClasses();
|
||
|
classes.sort();
|
||
|
QString msg = QDateTime::currentDateTime().toString(Qt::ISODate) +
|
||
|
" - Start checking entities\n";
|
||
|
this->logger->logMsg(msg, MsgType::INFO);
|
||
| ... | ... | |
|
void EntityInspector::checkMetaProperties(QHash<QString, QMetaProperty>
|
||
|
&metaProperties, bool &ok, QHash<QString, Relation> &relations) {
|
||
|
QString msg = "";
|
||
|
for (auto i = metaProperties.constBegin(); i != metaProperties.constEnd();
|
||
|
++i) {
|
||
|
|
||
|
#ifdef DIFFABLEOUTPUT
|
||
|
QMap<QString, QMetaProperty> metaPropertiesMap;
|
||
|
for (auto i = metaProperties.constBegin(); i != metaProperties.constEnd();
|
||
|
++i) {
|
||
|
metaPropertiesMap[i.key()] = i.value();
|
||
|
}
|
||
|
for (auto i = metaPropertiesMap.constBegin(); i != metaPropertiesMap.constEnd(); i++) {
|
||
|
#else
|
||
|
for (auto i = metaProperties.constBegin(); i != metaProperties.constEnd();
|
||
|
++i) {
|
||
|
#endif
|
||
|
QString typeName = QString(i.value().typeName());
|
||
|
if (!i.value().isWritable()) {
|
||
|
ok = false;
|
||
| ... | ... | |
|
auto relations = entity->getRelations();
|
||
|
QString msg = "";
|
||
|
this->checkMetaProperties(metaProperties, ok, relations);
|
||
|
for (auto i = relations.constBegin(); i != relations.constEnd(); ++i) {
|
||
|
#ifdef DIFFABLEOUTPUT
|
||
|
QMap<QString, Relation> relationsMap;
|
||
|
for (auto i = relations.constBegin(); i != relations.constEnd(); i++) {
|
||
|
relationsMap[i.key()] = i.value();
|
||
|
}
|
||
|
for (auto i = relationsMap.constBegin(); i != relationsMap.constEnd(); ++i) {
|
||
|
#else
|
||
|
for (auto i = relations.constBegin(); i != relations.constEnd(); ++i) {
|
||
|
#endif
|
||
|
|
||
|
this->checkRelationTypos(i.key(), i.value(), ok);
|
||
|
if (!metaProperties.contains(i.key())) {
|
||
|
msg += "For relation " + i.key() + " no property exists!";
|
||
| src/entityinspector.h | ||
|---|---|---|
|
*/
|
||
|
#ifndef ENTITYINSPECTOR_H
|
||
|
#define ENTITYINSPECTOR_H
|
||
|
#define DIFFABLEOUTPUT
|
||
|
#include <QString>
|
||
|
#include <QHash>
|
||
|
#include "entity.h"
|
||
| 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()<<")";
|
||
|
}
|
||
|
}
|
||
|
}
|
||
| src/entitymanager.h | ||
|---|---|---|
|
|
||
|
#ifndef ENTITYMANAGER_H
|
||
|
#define ENTITYMANAGER_H
|
||
|
#define DIFFABLEOUTPUT
|
||
|
#include <QtSql/QSqlDatabase>
|
||
|
#include <QtSql/QSqlRecord>
|
||
|
#include <QtSql/QSqlField>
|
||
| ... | ... | |
|
return newList;
|
||
|
}
|
||
|
|
||
|
protected:
|
||
|
static bool lessThanEntity(Entity *&a, Entity *&b);
|
||
|
protected:
|
||
|
bool saveObject(QSharedPointer<Entity> &entity, QList<Entity *> &mergedObjects,
|
||
|
const bool persistRelations = true,
|
||
|
const bool ignoreHasChanged = false, const bool validate = true,
|
||
| ... | ... | |
|
*/
|
||
|
void savePostPersistedRelations(const QSharedPointer<Entity> &entity,
|
||
|
QList<Entity *> &mergedObjects, bool ignoreHasChanged = false,
|
||
|
bool newItem = false);
|
||
|
bool newItem = false, bool forceOut = false);
|
||
|
|
||
|
QList<QSharedPointer<Entity>> saveRelationEntities(const
|
||
|
QList<QSharedPointer<Entity>> &list, const Relation &r,
|
||
| src/logger.cpp | ||
|---|---|---|
|
if (logQuery || q.lastError().isValid()) {
|
||
|
const QString errorMsg = this->generateLogMsg(q.lastError());
|
||
|
if (logQuery || !errorMsg.isEmpty()) {
|
||
|
QString msg = "{" + QString("\"time\":\"") +
|
||
|
QDateTime::currentDateTime().toString(Qt::ISODate) + QString("\"") + errorMsg;
|
||
|
// QString msg = "{" + QString("\"time\":\"") +
|
||
|
// QDateTime::currentDateTime().toString(Qt::ISODate) + QString("\"") + errorMsg;
|
||
|
QString timeStamp;
|
||
|
#ifndef DIFFABLEOUTPUT
|
||
|
timeStamp = QString("\"time\":\"") +
|
||
|
QDateTime::currentDateTime().toString(Qt::ISODate) + QString("\"");
|
||
|
#endif
|
||
|
QString msg = "{" + timeStamp + errorMsg;
|
||
|
|
||
|
msg += this->generateLogMsg(q) + "}";
|
||
|
this->logMsg(msg, errorMsg.isEmpty() ? MsgType::DEBUG : MsgType::WARNING);
|
||
|
}
|
||
| src/logger.h | ||
|---|---|---|
|
*/
|
||
|
#ifndef LOGGER_H
|
||
|
#define LOGGER_H
|
||
|
|
||
|
#define DIFFABLEOUTPUT
|
||
|
#include <QString>
|
||
|
#include <QFile>
|
||
|
#include <QSqlError>
|
||
| ... | ... | |
|
class Logger {
|
||
|
#ifdef QT_DEBUG
|
||
|
#define DEFAULTMSGTYPE MsgType::DEBUG
|
||
|
//#define DIFFABLEOUTPUT
|
||
|
#else
|
||
|
#define DEFAULTMSGTYPE MsgType::CRITICAL
|
||
|
#endif
|
||
|
|
||
|
|
||
|
public:
|
||
|
Logger(QString path = "", MsgType min = DEFAULTMSGTYPE);
|
||
|
~Logger();
|
||
| src/relation.cpp | ||
|---|---|---|
|
}
|
||
|
|
||
|
|
||
|
|
||
| src/relation.h | ||
|---|---|---|
|
QList<CascadeType> getCascadeType() const;
|
||
|
void setCascadeType(const QList<CascadeType> &value);
|
||
|
|
||
|
// bool operator<(const CuteEntityManager::Relation b);
|
||
|
// bool operator<(const CuteEntityManager::Relation* b);
|
||
|
// bool operator<(const CuteEntityManager::Relation& b);
|
||
|
|
||
|
|
||
|
inline bool operator<(const CuteEntityManager::Relation b) const
|
||
|
{
|
||
|
return this->propertyName < b.propertyName;
|
||
|
}
|
||
|
|
||
|
// inline bool operator<(const CuteEntityManager::Relation* b) const
|
||
|
// {
|
||
|
// return this->propertyName < b->propertyName;
|
||
|
// }
|
||
|
|
||
|
// inline bool operator<(const CuteEntityManager::Relation &b) const
|
||
|
// {
|
||
|
// return this->propertyName < b.propertyName;
|
||
|
// }
|
||
|
|
||
|
// inline bool operator <(const Relation& a, const Relation& b);
|
||
|
// inline bool operator <(const CuteEntityManager::Relation &a, const CuteEntityManager::Relation &b)
|
||
|
// {
|
||
|
// return a.propertyName < b.propertyName;
|
||
|
// }
|
||
|
|
||
|
|
||
|
protected:
|
||
|
QString propertyName;
|
||
|
QString mappedBy;
|
||
| src/sqlitebackupprocessor.cpp | ||
|---|---|---|
|
* You should have received a copy of the GNU Lesser General Public License
|
||
|
* along with this program; if not, see <http://www.gnu.org/licenses/>.
|
||
|
*/
|
||
|
//#include "../../../../../../QtCipherSqlitePlugin/QtCipherSqlitePlugin/sqlitecipher/sqlite3/sqlite3ext.h"
|
||
|
//#include "../../../../../../QtCipherSqlitePlugin/QtCipherSqlitePlugin/sqlitecipher/sqlite3/sqlite3.h"
|
||
|
//#include "../../../../../../QtCipherSqlitePlugin/QtCipherSqlitePlugin/sqlitecipher/sqlite3/sqlite3userauth.h"
|
||
|
//#include "../../../../../../QtCipherSqlitePlugin/QtCipherSqlitePlugin/sqlitecipher/sqlite3/rijndael.h"
|
||
|
//#include "../../../../../../QtCipherSqlitePlugin/QtCipherSqlitePlugin/sqlitecipher/sqlite3/sha2.h"
|
||
|
//#include "../../../../../../QtCipherSqlitePlugin/QtCipherSqlitePlugin/sqlitecipher/sqlitecipher_p.h"
|
||
|
//#include "../../../../../../QtCipherSqlitePlugin/QtCipherSqlitePlugin/sqlitecipher/sqlitecipher_global.h"
|
||
|
//#include "../../../../../../QtCipherSqlitePlugin/QtCipherSqlitePlugin/sqlitecipher/sqlitechipher_global.h"
|
||
|
//#include "../../../../../../QtCipherSqlitePlugin/QtCipherSqlitePlugin/sqlitecipher/sqlcachedresult_p.h"
|
||
|
|
||
|
#include "sqlitebackupprocessor.h"
|
||
|
#include <sqlite3.h>
|
||
|
#include <QFileInfoList>
|
||
| ... | ... | |
|
*/
|
||
|
bool SqliteBackupProcessor::sqliteDBMemFile(bool save, QString fileName) {
|
||
|
bool state = false;
|
||
|
// qDebug()<<"111";
|
||
|
QVariant v = this->database->getDatabase().driver()->handle();
|
||
|
if ( v.isValid() && qstrcmp(v.typeName(), "sqlite3*") == 0 ) {
|
||
|
// qDebug()<<"222";
|
||
|
// v.data() returns a pointer to the handle
|
||
|
sqlite3 *handle = *static_cast<sqlite3 **>(v.data());
|
||
|
if ( handle != 0 ) { // check that it is not NULL
|
||
|
// qDebug()<<"333";
|
||
|
sqlite3 *pInMemory = handle;
|
||
|
QByteArray array = QString(this->destination + "/" + fileName).toLocal8Bit();
|
||
|
const char *zFilename = array.data();
|
||
|
// const char *zFilename = array.data();
|
||
|
const char *zFilename = array;
|
||
|
int rc; /* Function return code */
|
||
|
sqlite3 *pFile; /* Database connection opened on zFilename */
|
||
|
/* Open the database file identified by zFilename. Exit early if this fails
|
||
|
** for any reason. */
|
||
|
rc = sqlite3_open( zFilename, &pFile );
|
||
|
// pFile->setPassword("test");
|
||
|
// sqlite3_key(pFile, "test", strlen("test"));
|
||
|
// qDebug()<<"keyrc: "<<keyrc;
|
||
|
|
||
|
if ( rc == SQLITE_OK ) {
|
||
|
// qDebug()<<"444";
|
||
|
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) */
|
||
| ... | ... | |
|
** and return the result of this function. */
|
||
|
(void)sqlite3_close(pFile);
|
||
|
if ( rc == SQLITE_OK ) {
|
||
|
// qDebug()<<"666";
|
||
|
state = true;
|
||
|
}
|
||
|
}
|
||
| src/sqlitebackupprocessor.h | ||
|---|---|---|
|
#ifndef SQLITEBACKUPPROCESSOR_H
|
||
|
#define SQLITEBACKUPPROCESSOR_H
|
||
|
|
||
|
#define SQLITE_HAS_CODEC
|
||
|
|
||
|
#include <QObject>
|
||
|
#include <QtSql/QSqlDriver>
|
||
|
#include <QString>
|
||
| src/src.pro | ||
|---|---|---|
|
attributeresolver.cpp
|
||
|
|
||
|
windows|android: {
|
||
|
# DEFINES += SQLITE_HAS_CODEC SQLITE_TEMP_STORE=2
|
||
|
DEFINES += SQLITE_OMIT_LOAD_EXTENSION SQLITE_OMIT_COMPLETE SQLITE_ENABLE_FTS3 SQLITE_ENABLE_FTS3_PARENTHESIS SQLITE_ENABLE_RTREE
|
||
|
!contains(CONFIG, largefile):DEFINES += SQLITE_DISABLE_LFS
|
||
|
INCLUDEPATH += $$[QT_INSTALL_PREFIX]/../Src/qtbase/src/3rdparty/sqlite
|
||
|
SOURCES += $$[QT_INSTALL_PREFIX]/../Src/qtbase/src/3rdparty/sqlite/sqlite3.c
|
||
|
|
||
|
# INCLUDEPATH += C:/Users/SeDi/cpp/QtCipherSqlitePlugin/QtCipherSqlitePlugin/sqlitecipher/sqlite3
|
||
|
# SOURCES += C:/Users/SeDi/cpp/QtCipherSqlitePlugin/QtCipherSqlitePlugin/sqlitecipher/sqlite3/sqlite3.c
|
||
|
|
||
|
|
||
|
}
|
||
|
unix:!android: {
|
||
|
system-sqlite:!contains(LIBS, .*sqlite3.*) {
|
||
Auch abrufbar als: Unified diff
debugging heritage