mirror of
https://github.com/QuasarApp/Heart.git
synced 2025-04-27 10:14:36 +00:00
added support of the autoincerement fields of db
This commit is contained in:
parent
bfe8b75e0f
commit
b698f200d9
@ -402,6 +402,29 @@ protected:
|
||||
return false;
|
||||
};
|
||||
|
||||
/**
|
||||
* @brief insert a new value into database, and save into @a resultId autoincremented id of inserted object.
|
||||
*
|
||||
* @tparam Object The type of object to save.
|
||||
* @param obj The object to save.
|
||||
* @return true if the object is successfully saved, false otherwise.
|
||||
*
|
||||
* Example:
|
||||
*
|
||||
* @code{cpp}
|
||||
* auto&& id = QSharedPointe<unsigned int>:: create();
|
||||
insertObj(role.dynamicCast<Role>(), id.toWeekRef());
|
||||
* @endcode
|
||||
*/
|
||||
template <class Object>
|
||||
bool insertObj(const Object& obj, const QWeakPointer<unsigned int>& resultId = {}) {
|
||||
if (auto&& database = db()) {
|
||||
return database->insertObject(obj, resultId.isNull(), resultId);
|
||||
}
|
||||
|
||||
return false;
|
||||
};
|
||||
|
||||
/**
|
||||
* @brief Get a list of all objects from a specified table.
|
||||
*
|
||||
|
@ -98,9 +98,13 @@ public:
|
||||
* @note This method insert object into database only. IF object is exits in the database then this method return false.
|
||||
* @param saveObject This is object for inserting.
|
||||
* @param wait This arguments force current thread wait for the function finishing.
|
||||
* @return true if objects is saved successful else false.
|
||||
* @param autoincrementIdResult is id of the insert query to the Table with autoincrement id field.
|
||||
* @return true if objects is saved successful else false. Note return two value. First is boolean result, second is id of inserted value.
|
||||
* @note id will be returned only for the autoincement records.
|
||||
*/
|
||||
virtual bool insertObject(const QSharedPointer<PKG::DBObject>& saveObject, bool wait) = 0;
|
||||
virtual bool insertObject(const QSharedPointer<PKG::DBObject>& saveObject,
|
||||
bool wait,
|
||||
const QWeakPointer<unsigned int>& autoincrementIdResult) = 0;
|
||||
|
||||
/**
|
||||
* @brief deleteObject This method execute a delete method of obj and remove current object from database.
|
||||
|
@ -23,7 +23,7 @@ void ISqlDB::globalUpdateDataBase(SqlDBCasheWriteMode mode) {
|
||||
qint64 currentTime = QDateTime::currentMSecsSinceEpoch();
|
||||
|
||||
if (currentTime - lastUpdateTime > updateInterval ||
|
||||
static_cast<bool>(mode & SqlDBCasheWriteMode::Force)) {
|
||||
static_cast<bool>(mode & SqlDBCasheWriteMode::Force)) {
|
||||
|
||||
if (static_cast<bool>(mode & SqlDBCasheWriteMode::On_New_Thread)) {
|
||||
|
||||
@ -48,13 +48,13 @@ void ISqlDB::globalUpdateDataBase(SqlDBCasheWriteMode mode) {
|
||||
}
|
||||
|
||||
bool ISqlDB::updateObjectP(const QSharedPointer<DBObject> &saveObject,
|
||||
bool wait) {
|
||||
bool wait) {
|
||||
|
||||
if (updateCache(saveObject)) {
|
||||
|
||||
if (getMode() == SqlDBCasheWriteMode::Force) {
|
||||
return _writer && _writer->isValid() &&
|
||||
_writer->updateObject(saveObject, wait);
|
||||
_writer->updateObject(saveObject, wait);
|
||||
}
|
||||
|
||||
pushToQueue(saveObject, CacheAction::Update);
|
||||
@ -64,11 +64,11 @@ bool ISqlDB::updateObjectP(const QSharedPointer<DBObject> &saveObject,
|
||||
}
|
||||
|
||||
return _writer && _writer->isValid() &&
|
||||
_writer->updateObject(saveObject, wait);
|
||||
_writer->updateObject(saveObject, wait);
|
||||
}
|
||||
|
||||
bool ISqlDB::deleteObjectP(const QSharedPointer<DBObject> &delObj,
|
||||
bool wait) {
|
||||
bool wait) {
|
||||
|
||||
deleteFromCache(delObj);
|
||||
pushToQueue(delObj, CacheAction::Delete);
|
||||
@ -81,14 +81,15 @@ bool ISqlDB::deleteObjectP(const QSharedPointer<DBObject> &delObj,
|
||||
}
|
||||
|
||||
bool ISqlDB::insertObjectP(const QSharedPointer<DBObject> &saveObject,
|
||||
bool wait) {
|
||||
bool wait,
|
||||
const QWeakPointer<unsigned int>& autoincrementIdResult) {
|
||||
|
||||
if (insertToCache(saveObject)) {
|
||||
|
||||
if (getMode() == SqlDBCasheWriteMode::Force) {
|
||||
|
||||
return _writer && _writer->isValid() &&
|
||||
_writer->insertObject(saveObject, wait);
|
||||
_writer->insertObject(saveObject, wait, autoincrementIdResult);
|
||||
}
|
||||
|
||||
pushToQueue(saveObject, CacheAction::Update);
|
||||
@ -98,7 +99,7 @@ bool ISqlDB::insertObjectP(const QSharedPointer<DBObject> &saveObject,
|
||||
}
|
||||
|
||||
return _writer && _writer->isValid() &&
|
||||
_writer->insertObject(saveObject, wait);
|
||||
_writer->insertObject(saveObject, wait, autoincrementIdResult);
|
||||
}
|
||||
|
||||
bool ISqlDB::replaceObjectP(const QSharedPointer<PKG::DBObject> &saveObject, bool wait) {
|
||||
@ -129,7 +130,7 @@ void ISqlDB::setLastUpdateTime(const qint64 &value) {
|
||||
}
|
||||
|
||||
void ISqlDB::pushToQueue(const QSharedPointer<DBObject> &obj,
|
||||
CacheAction type) {
|
||||
CacheAction type) {
|
||||
_saveLaterMutex.lock();
|
||||
_changes.insert(type, obj);
|
||||
_saveLaterMutex.unlock();
|
||||
@ -155,7 +156,7 @@ void ISqlDB::setWriter(SqlDBWriter *writer) {
|
||||
}
|
||||
|
||||
bool ISqlDB::getAllObjects(const DBObject &templateObject,
|
||||
QList<QSharedPointer<QH::PKG::DBObject>> &result) {
|
||||
QList<QSharedPointer<QH::PKG::DBObject>> &result) {
|
||||
|
||||
result = getFromCache(&templateObject);
|
||||
if(result.size()) {
|
||||
@ -170,7 +171,7 @@ bool ISqlDB::getAllObjects(const DBObject &templateObject,
|
||||
for (const auto &object: std::as_const(result)) {
|
||||
if (object->isCached() && !insertToCache(object)) {
|
||||
QuasarAppUtils::Params::log("Selected object from database can not be saved into database cache. " +
|
||||
object->toString(),
|
||||
object->toString(),
|
||||
QuasarAppUtils::Warning);
|
||||
}
|
||||
}
|
||||
@ -182,7 +183,7 @@ bool ISqlDB::getAllObjects(const DBObject &templateObject,
|
||||
}
|
||||
|
||||
bool ISqlDB::deleteObject(const QSharedPointer<DBObject> &delObj,
|
||||
bool wait) {
|
||||
bool wait) {
|
||||
|
||||
if (!delObj)
|
||||
return false;
|
||||
@ -201,7 +202,7 @@ bool ISqlDB::deleteObject(const QSharedPointer<DBObject> &delObj,
|
||||
}
|
||||
|
||||
bool ISqlDB::updateObject(const QSharedPointer<DBObject> &saveObject,
|
||||
bool wait) {
|
||||
bool wait) {
|
||||
|
||||
if (!saveObject || !saveObject->isValid()) {
|
||||
return false;
|
||||
@ -216,12 +217,13 @@ bool ISqlDB::updateObject(const QSharedPointer<DBObject> &saveObject,
|
||||
return true;
|
||||
}
|
||||
|
||||
bool ISqlDB::insertObject(const QSharedPointer<DBObject> &saveObject, bool wait) {
|
||||
bool ISqlDB::insertObject(const QSharedPointer<DBObject> &saveObject, bool wait,
|
||||
const QWeakPointer<unsigned int>& autoincrementIdResult) {
|
||||
if (!saveObject || !saveObject->isValid()) {
|
||||
return false;
|
||||
}
|
||||
|
||||
if (!insertObjectP(saveObject, wait)) {
|
||||
if (!insertObjectP(saveObject, wait, autoincrementIdResult)) {
|
||||
return false;
|
||||
}
|
||||
|
||||
@ -291,7 +293,7 @@ void ISqlDB::prepareForDelete() {
|
||||
}
|
||||
|
||||
bool ISqlDB::changeObjects(const DBObject &templateObject,
|
||||
const std::function<bool (const QSharedPointer<QH::PKG::DBObject>&)> &changeAction) {
|
||||
const std::function<bool (const QSharedPointer<QH::PKG::DBObject>&)> &changeAction) {
|
||||
|
||||
QList<QSharedPointer<DBObject>> list;
|
||||
if (!getAllObjects(templateObject, list)) {
|
||||
@ -337,7 +339,7 @@ void ISqlDB::globalUpdateDataBasePrivate(qint64 currentTime) {
|
||||
|
||||
QuasarAppUtils::Params::log("writeUpdateItemIntoDB failed when"
|
||||
" db object is not valid! obj=" +
|
||||
obj->toString(),
|
||||
obj->toString(),
|
||||
QuasarAppUtils::VerboseLvl::Error);
|
||||
continue;
|
||||
}
|
||||
@ -359,7 +361,7 @@ void ISqlDB::globalUpdateDataBasePrivate(qint64 currentTime) {
|
||||
}
|
||||
default: {
|
||||
QuasarAppUtils::Params::log("The Object of the cache have wrong type " +
|
||||
obj->toString(),
|
||||
obj->toString(),
|
||||
QuasarAppUtils::VerboseLvl::Warning);
|
||||
|
||||
continue;
|
||||
@ -369,7 +371,7 @@ void ISqlDB::globalUpdateDataBasePrivate(qint64 currentTime) {
|
||||
if (!saveResult ) {
|
||||
QuasarAppUtils::Params::log("writeUpdateItemIntoDB failed when"
|
||||
" work globalUpdateDataRelease!!! obj=" +
|
||||
obj->toString(),
|
||||
obj->toString(),
|
||||
QuasarAppUtils::VerboseLvl::Error);
|
||||
}
|
||||
} else {
|
||||
|
@ -80,7 +80,7 @@ public:
|
||||
* @param mode See the SqlDBCache::setMode method for more information.
|
||||
*/
|
||||
ISqlDB(qint64 updateInterval = DEFAULT_UPDATE_INTERVAL,
|
||||
SqlDBCasheWriteMode mode = SqlDBCasheWriteMode::Default);
|
||||
SqlDBCasheWriteMode mode = SqlDBCasheWriteMode::Default);
|
||||
~ISqlDB() override;
|
||||
|
||||
/**
|
||||
@ -103,10 +103,11 @@ public:
|
||||
bool deleteObject(const QSharedPointer<QH::PKG::DBObject>& delObj,
|
||||
bool wait = false) override;
|
||||
bool insertObject(const QSharedPointer<QH::PKG::DBObject>& saveObject,
|
||||
bool wait = false) override;
|
||||
bool wait = false,
|
||||
const QWeakPointer<unsigned int>& autoincrementIdResult = {}) override;
|
||||
|
||||
bool replaceObject(const QSharedPointer<QH::PKG::DBObject>& saveObject,
|
||||
bool wait = false) override;
|
||||
bool wait = false) override;
|
||||
|
||||
bool doQuery(const QString &query, const QVariantMap& bindValues,
|
||||
bool wait = false, QSqlQuery* result = nullptr) const override;
|
||||
@ -231,13 +232,14 @@ protected:
|
||||
private:
|
||||
|
||||
bool updateObjectP(const QSharedPointer<QH::PKG::DBObject>& saveObject,
|
||||
bool wait = false);
|
||||
bool deleteObjectP(const QSharedPointer<QH::PKG::DBObject>& delObj,
|
||||
bool wait = false);
|
||||
bool insertObjectP(const QSharedPointer<QH::PKG::DBObject>& saveObject,
|
||||
bool wait = false);
|
||||
bool replaceObjectP(const QSharedPointer<QH::PKG::DBObject>& saveObject,
|
||||
bool wait = false);
|
||||
bool deleteObjectP(const QSharedPointer<QH::PKG::DBObject>& delObj,
|
||||
bool wait = false);
|
||||
bool insertObjectP(const QSharedPointer<QH::PKG::DBObject>& saveObject,
|
||||
bool wait,
|
||||
const QWeakPointer<unsigned int>& autoincrementIdResult);
|
||||
bool replaceObjectP(const QSharedPointer<QH::PKG::DBObject>& saveObject,
|
||||
bool wait = false);
|
||||
|
||||
qint64 lastUpdateTime = 0;
|
||||
qint64 updateInterval = DEFAULT_UPDATE_INTERVAL;
|
||||
|
@ -77,7 +77,7 @@ bool SqlDBWriter::initDbPrivate(const QVariantMap ¶ms) {
|
||||
delete _db;
|
||||
|
||||
_db = new QSqlDatabase(initSqlDataBasse(_config["DBDriver"].toString(),
|
||||
_config["DBFilePath"].toString()));
|
||||
_config["DBFilePath"].toString()));
|
||||
|
||||
if (_config.contains("DBFilePath")) {
|
||||
|
||||
@ -311,14 +311,24 @@ bool SqlDBWriter::deleteObject(const QSharedPointer<DBObject> &ptr, bool wait) {
|
||||
return asyncLauncher(job, wait);
|
||||
}
|
||||
|
||||
bool SqlDBWriter::insertObject(const QSharedPointer<DBObject> &ptr, bool wait) {
|
||||
bool SqlDBWriter::insertObject(const QSharedPointer<DBObject> &ptr,
|
||||
bool wait,
|
||||
const QWeakPointer<unsigned int>& autoincrementIdResult) {
|
||||
|
||||
Async::Job job = [this, ptr]() {
|
||||
return insertQuery(ptr);
|
||||
};
|
||||
if (wait) {
|
||||
auto resultId = QSharedPointer<int>::create();
|
||||
Async::Job job = [this, ptr, autoincrementIdResult]() {
|
||||
return insertQuery(ptr, autoincrementIdResult);
|
||||
};
|
||||
|
||||
return asyncLauncher(job, wait);
|
||||
return asyncLauncher(job, wait);
|
||||
} else {
|
||||
Async::Job job = [this, ptr]() {
|
||||
return insertQuery(ptr);
|
||||
};
|
||||
|
||||
return asyncLauncher(job, wait);
|
||||
}
|
||||
}
|
||||
|
||||
bool SqlDBWriter::replaceObject(const QSharedPointer<PKG::DBObject> &ptr, bool wait) {
|
||||
@ -354,7 +364,8 @@ SqlDBWriter::~SqlDBWriter() {
|
||||
|
||||
}
|
||||
|
||||
bool SqlDBWriter::insertQuery(const QSharedPointer<DBObject> &ptr) const {
|
||||
bool SqlDBWriter::insertQuery(const QSharedPointer<DBObject> &ptr,
|
||||
const QWeakPointer<unsigned int>& autoincrementIdResult) const {
|
||||
if (!ptr)
|
||||
return false;
|
||||
|
||||
@ -368,7 +379,14 @@ bool SqlDBWriter::insertQuery(const QSharedPointer<DBObject> &ptr) const {
|
||||
return ptr->prepareInsertQuery(q, false);
|
||||
};
|
||||
|
||||
auto cb = [](){return true;};
|
||||
auto cb = [&q, autoincrementIdResult]() {
|
||||
|
||||
if (auto&& ptr = autoincrementIdResult.lock()) {
|
||||
*ptr = q.lastInsertId().toInt();
|
||||
}
|
||||
|
||||
return true;
|
||||
};
|
||||
|
||||
return workWithQuery(q, prepare, cb);
|
||||
}
|
||||
@ -438,7 +456,7 @@ bool SqlDBWriter::selectQuery(const DBObject& requestObject,
|
||||
if (!newObject->fromSqlRecord(q.record())) {
|
||||
QuasarAppUtils::Params::log("Select query finished successful but, "
|
||||
"the fromSqlRecord method return false." +
|
||||
newObject->toString(),
|
||||
newObject->toString(),
|
||||
QuasarAppUtils::Error);
|
||||
return false;
|
||||
}
|
||||
|
@ -67,7 +67,8 @@ public:
|
||||
QList<QSharedPointer<PKG::DBObject>> &result) override;
|
||||
bool updateObject(const QSharedPointer<PKG::DBObject> &ptr, bool wait = false) override;
|
||||
bool deleteObject(const QSharedPointer<PKG::DBObject> &ptr, bool wait = false) override;
|
||||
bool insertObject(const QSharedPointer<PKG::DBObject> &ptr, bool wait = false) override;
|
||||
bool insertObject(const QSharedPointer<PKG::DBObject> &ptr, bool wait = false,
|
||||
const QWeakPointer<unsigned int>& autoincrementIdResult = {}) override;
|
||||
bool replaceObject(const QSharedPointer<PKG::DBObject> &ptr, bool wait = false) override;
|
||||
|
||||
void setSQLSources(const QStringList &list) override;
|
||||
@ -110,9 +111,12 @@ public:
|
||||
/**
|
||||
* @brief insertQuery This method prepare the insert object query.
|
||||
* @param insertObject This is strong pointer of object for generate the insert query.
|
||||
* @param autoIncrementID Week pointer to result id of new inserteed record.
|
||||
* @return true if query generated successful.
|
||||
* @note Works only of the int autoincrement ids...
|
||||
*/
|
||||
virtual bool insertQuery(const QSharedPointer<QH::PKG::DBObject>& insertObject) const;
|
||||
virtual bool insertQuery(const QSharedPointer<QH::PKG::DBObject>& insertObject,
|
||||
const QWeakPointer<unsigned int>& autoIncrementID = {}) const;
|
||||
|
||||
/**
|
||||
* @brief replaceQuery This method prepare the replce object query.
|
||||
|
Loading…
x
Reference in New Issue
Block a user