4
1
mirror of https://github.com/QuasarApp/Heart.git synced 2025-05-02 20:49:40 +00:00
This commit is contained in:
Andrei Yankovich 2019-10-25 18:18:28 +03:00
parent 0742aa1901
commit dcee108c20
9 changed files with 137 additions and 119 deletions

@ -28,20 +28,20 @@ bool DBObject::getSaveQueryString(QSqlQuery *query) const {
bool DBObject::getSelectQueryString(QSqlQuery *query) const { bool DBObject::getSelectQueryString(QSqlQuery *query) const {
if (_dbId < 0) { if (_id < 0) {
return false; return false;
} }
QString queryString = "SELECT (%1) from %0 where id=" + QString::number(_dbId); QString queryString = "SELECT (%1) from %0 where id=" + QString::number(_id);
return getBaseQueryString(queryString, query); return getBaseQueryString(queryString, query);
} }
bool DBObject::getDeleteQueryString(QSqlQuery *query) const { bool DBObject::getDeleteQueryString(QSqlQuery *query) const {
if (_dbId < 0) { if (_id < 0) {
return false; return false;
} }
QString queryString = "DELETE FROM %0 where id=" + QString::number(_dbId); QString queryString = "DELETE FROM %0 where id=" + QString::number(_id);
return getBaseQueryString(queryString, query); return getBaseQueryString(queryString, query);
} }
@ -145,6 +145,16 @@ QDataStream &DBObject::toStream(QDataStream &stream) const {
return stream; return stream;
} }
QVariantMap &DBObject::fromVariantMap(QVariantMap &map) {
_dataTable = map;
return map;
}
QVariantMap &DBObject::toVariantmap(QVariantMap &map) const {
map = _dataTable;
return map;
}
int DBObject::getId() const { int DBObject::getId() const {
return _id; return _id;
} }

@ -88,13 +88,14 @@ protected:
QVariantMap _dataTable; QVariantMap _dataTable;
IDbTable * _tableStruct = nullptr; IDbTable * _tableStruct = nullptr;
int _dbId = -1;
int _id = -1; int _id = -1;
//// StreamBase interface //// StreamBase interface
QDataStream &fromStream(QDataStream &stream) override; QDataStream &fromStream(QDataStream &stream) override;
QDataStream &toStream(QDataStream &stream) const override; QDataStream &toStream(QDataStream &stream) const override;
QVariantMap &fromVariantMap(QVariantMap &map) override;
QVariantMap &toVariantmap(QVariantMap &map) const override;
}; };
} }

@ -12,35 +12,35 @@ QString DbTableBase::name() const {
return _name; return _name;
} }
QString DbTableBase::toStringQuery() const { //QString DbTableBase::toStringQuery() const {
QString table = "CREATE TABLE IF NOT EXISTS" + _name + "(%0);"; // QString table = "CREATE TABLE IF NOT EXISTS" + _name + "(%0);";
QString columns = " id INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL,"; // QString columns = " id INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL,";
columns += " updateTime DATETIME NOT NULL DEFAULT NOW(),"; // columns += " updateTime DATETIME NOT NULL DEFAULT NOW(),";
for (auto it = _tableMap.begin(); it != _tableMap.end(); ++it) { // for (auto it = _tableMap.begin(); it != _tableMap.end(); ++it) {
columns += it.key(); // columns += it.key();
auto val = it.value().toString(); // auto val = it.value().toString();
if (val.isEmpty()) { // if (val.isEmpty()) {
columns += "BLOB"; // columns += "BLOB";
} else { // } else {
columns += val; // columns += val;
} // }
columns += ','; // columns += ',';
} // }
for (auto it = _dependencies.begin(); it != _dependencies.end(); ++it) { // for (auto it = _dependencies.begin(); it != _dependencies.end(); ++it) {
QString dep = " FOREIGN KEY(_group) REFERENCES groups(id) // QString dep = " FOREIGN KEY(_group) REFERENCES groups(id)
columns += " FOREIGN KEY(_group) REFERENCES groups(id)" // columns += " FOREIGN KEY(_group) REFERENCES groups(id)"
ON UPDATE CASCADE // ON UPDATE CASCADE
ON DELETE CASCADE," // ON DELETE CASCADE,"
} // }
return table.arg(columns); // return table.arg(columns);
} //}
QHash<QString, QVariant::Type> DbTableBase::keys() const { QHash<QString, QVariant::Type> DbTableBase::keys() const {
return _keys; return _keys;
@ -54,57 +54,8 @@ DbTableBase::~DbTableBase() {
} }
QVariantMap DbTableBase::tableMap() const { void DbTableBase::setKeys(const QHash<QString, QVariant::Type> &keys) {
return _tableMap; _keys = keys;
} }
void DbTableBase::setTableMap(const QVariantMap &tableMap) {
_tableMap = tableMap;
for (auto it = _tableMap.begin(); it != _tableMap.end(); ++it) {
_keys[it.key()] = getType(it.value().toString());
}
}
QHash<QString, QString> DbTableBase::dependencies() const {
return _dependencies;
}
void DbTableBase::setDependencies(const QHash<QString, QString> &dependencies) {
_dependencies = dependencies;
}
#define c(x) str.contains(x, Qt::CaseInsensitive)
QVariant::Type DbTableBase::getType(const QString &str) {
if (str.isEmpty() || c(" BINARY") || c(" BLOB") || c(" TINYBLOB") || c(" MEDIUMBLOB") || c(" LONGBLOB")) {
return QVariant::ByteArray;
} else if (c(" INT")) {
return QVariant::Int;
} else if (c(" VARCHAR") || c(" TEXT") || c(" TINYTEXT") || c(" MEDIUMTEXT") || c(" LONGTEXT")) {
return QVariant::String;
} else if (c(" FLOAT") || c(" DOUBLE") || c(" REAL")) {
return QVariant::Double;
} else if (c(" BOOL")) {
return QVariant::Bool;
} else if (c(" DATETIME")) {
return QVariant::DateTime;
} else if (c(" DATE")) {
return QVariant::Date;
} else if (c(" TIME")) {
return QVariant::Time;
}
return QVariant::ByteArray;
}
bool DbTableBase::addDependecies(const IDbTable *table, const QString &val) {
if (table->keys().contains(val)) {
_dependencies[table->name()] = val;
return true;
}
return false;
}
} }

@ -20,56 +20,25 @@ public:
// IDbTable interface: // IDbTable interface:
QString name() const override; QString name() const override;
QString toStringQuery() const override;
QHash<QString, QVariant::Type> keys() const override; QHash<QString, QVariant::Type> keys() const override;
void setKeys(const QHash<QString, QVariant::Type> &keys) override;
QString lastIdQuery() const override; QString lastIdQuery() const override;
~DbTableBase() override; ~DbTableBase() override;
/**
* @brief tableMap
* @return
*/
QVariantMap tableMap() const;
/** /**
* @brief setTableMap * @brief setTableMap
* @param tableMap * @param tableMap
*/ */
void setTableMap(const QVariantMap &tableMap); void setTableMap(const QHash<QString, QVariant::Type> &);
/**
* @brief dependencies
* @return
*/
QHash<QString, QString> dependencies() const;
protected: protected:
/**
* @brief setDependencies
* @param dependencies
*/
void setDependencies(const QHash<QString, QString> &dependencies);
/**
* @brief addDependecies
* @param table
* @param val
* @return
*/
bool addDependecies(const IDbTable* table, const QString &val);
QString _name; QString _name;
QVariantMap _tableMap;
QHash<QString, QString> _dependencies;
private: private:
/**
* @brief getType
* @param str
* @return
*/
QVariant::Type getType(const QString& str);
QHash<QString, QVariant::Type> _keys; QHash<QString, QVariant::Type> _keys;
}; };

@ -1 +1,6 @@
#include "idbtable.h" #include "idbtable.h"
ClientProtocol::IDbTable::IDbTable()
{
}

@ -24,26 +24,28 @@ public:
*/ */
virtual QString name() const = 0; virtual QString name() const = 0;
/**
* @brief toStringQuery
* @return
*/
virtual QString toStringQuery() const = 0;
/** /**
* @brief keys * @brief keys
* @return * @return
*/ */
virtual QHash<QString, QVariant::Type> keys() const = 0; virtual QHash<QString, QVariant::Type> keys() const = 0;
/**
* @brief setKeys
* @param keys
*/
virtual void setKeys(const QHash<QString, QVariant::Type> &keys) = 0;
/** /**
* @brief lastId * @brief lastId
* @return query for get last id of table in db * @return query for get last id of table in db
*/ */
virtual QString lastIdQuery() const = 0; virtual QString lastIdQuery() const = 0;
virtual ~IDbTable() = 0; virtual ~IDbTable() = 0;
}; };
} }
#endif // IDBTABLE_H #endif // IDBTABLE_H

@ -23,16 +23,24 @@ bool SqlDBWriter::exec(QSqlQuery *sq,const QString& sqlFile) {
stream.setCodec("UTF8"); stream.setCodec("UTF8");
while(!stream.atEnd()) { while(!stream.atEnd()) {
temp += stream.readLine(); temp += stream.readLine();
if (temp.lastIndexOf("delimiter", -1, Qt::CaseInsensitive) > -1) { if (temp.lastIndexOf("delimiter", -1, Qt::CaseInsensitive) > -1) {
temp.remove("delimiter", Qt::CaseInsensitive); temp.remove("delimiter", Qt::CaseInsensitive);
int last = temp.indexOf(QRegularExpression("[^ \f\n\r\t\v]")) + 1; int last = temp.indexOf(QRegularExpression("[^ \f\n\r\t\v]")) + 1;
int begin = temp.lastIndexOf(QRegularExpression("[^ \f\n\r\t\v]")); int begin = temp.lastIndexOf(QRegularExpression("[^ \f\n\r\t\v]"));
delimiter = temp.mid(begin, last - begin); delimiter = temp.mid(begin, last - begin);
temp = ""; temp = "";
} else { } else {
if (temp.lastIndexOf(delimiter) >- 1) { if (temp.lastIndexOf(delimiter) >- 1) {
temp.remove(delimiter); temp.remove(delimiter);
result = result && sq->exec(temp); result = result && sq->exec(temp);
if (!result) { if (!result) {
@ -41,6 +49,18 @@ bool SqlDBWriter::exec(QSqlQuery *sq,const QString& sqlFile) {
return false; return false;
} }
if (temp.contains("CREATE TABLE ", Qt::CaseInsensitive)) {
int tableBegin = temp.indexOf('(');
int tableEnd = temp.indexOf(')');
QStringList columns = temp.mid(tableBegin, tableEnd - tableBegin).split(',');
for (QString & col : columns) {
getType(col);
}
}
temp = ""; temp = "";
} }
} }
@ -105,6 +125,11 @@ QVariantMap SqlDBWriter::defaultInitPararm() const {
return params; return params;
} }
QHash<QString, IDbTable *> SqlDBWriter::getDbStruct() const
{
return _dbStruct;
}
SqlDBWriter::SqlDBWriter() { SqlDBWriter::SqlDBWriter() {
} }
@ -173,4 +198,28 @@ SqlDBWriter::~SqlDBWriter() {
} }
#define c(x) str.contains(x, Qt::CaseInsensitive)
QVariant::Type SqlDBWriter::getType(const QString &str) {
if (str.isEmpty() || c(" BINARY") || c(" BLOB") || c(" TINYBLOB") || c(" MEDIUMBLOB") || c(" LONGBLOB")) {
return QVariant::ByteArray;
} else if (c(" INT")) {
return QVariant::Int;
} else if (c(" VARCHAR") || c(" TEXT") || c(" TINYTEXT") || c(" MEDIUMTEXT") || c(" LONGTEXT")) {
return QVariant::String;
} else if (c(" FLOAT") || c(" DOUBLE") || c(" REAL")) {
return QVariant::Double;
} else if (c(" BOOL")) {
return QVariant::Bool;
} else if (c(" DATETIME")) {
return QVariant::DateTime;
} else if (c(" DATE")) {
return QVariant::Date;
} else if (c(" TIME")) {
return QVariant::Time;
}
return QVariant::ByteArray;
}
} }

@ -7,6 +7,7 @@
#include <QSqlQuery> #include <QSqlQuery>
#include "clientprotocol_global.h" #include "clientprotocol_global.h"
#include "config.h" #include "config.h"
#include <QVariant>
class QSqlQuery; class QSqlQuery;
class QSqlDatabase; class QSqlDatabase;
@ -15,6 +16,8 @@ class PlayerDBData;
namespace ClientProtocol { namespace ClientProtocol {
class IDbTable;
/** /**
* @brief The SqlDBWriter class * @brief The SqlDBWriter class
*/ */
@ -27,6 +30,12 @@ private:
protected: protected:
/**
* @brief getDbStruct
* @return structure of the data base
*/
QHash<QString, IDbTable*> getDbStruct() const;
/** /**
* @brief enableFK - enavle forign ke for sqlite db * @brief enableFK - enavle forign ke for sqlite db
* @return return true if all good * @return return true if all good
@ -64,8 +73,16 @@ protected:
*/ */
virtual QVariantMap defaultInitPararm() const; virtual QVariantMap defaultInitPararm() const;
/**
* @brief getType
* @param str
* @return
*/
virtual QVariant::Type getType(const QString& str);
QSqlQuery query; QSqlQuery query;
QSqlDatabase db; QSqlDatabase db;
QHash<QString, IDbTable *> _dbStruct;
public: public:

@ -4,7 +4,7 @@
#include <QByteArray> #include <QByteArray>
#include "clientprotocol_global.h" #include "clientprotocol_global.h"
class QVariantMap;
class QDataStream; class QDataStream;
namespace ClientProtocol { namespace ClientProtocol {
@ -42,6 +42,20 @@ public:
*/ */
virtual QDataStream& toStream(QDataStream& stream) const = 0; virtual QDataStream& toStream(QDataStream& stream) const = 0;
/**
* @brief fromVariantMap
* @param map
* @return
*/
virtual QVariantMap& fromVariantMap(QVariantMap& map) = 0;
/**
* @brief toVariantmap
* @param map
* @return
*/
virtual QVariantMap& toVariantmap(QVariantMap& map) const = 0;
}; };
} }
#endif // STREAMBASE_H #endif // STREAMBASE_H