Merge pull request #17 from HamedMasafi/master
Merge back new commits into dev branch
This commit is contained in:
commit
dd30844ee5
|
|
@ -448,7 +448,7 @@ QString Database::tableName(QString className)
|
||||||
if (m)
|
if (m)
|
||||||
return m->name();
|
return m->name();
|
||||||
else
|
else
|
||||||
return QString::null;;
|
return QString();
|
||||||
}
|
}
|
||||||
|
|
||||||
void Database::setDatabaseName(QString databaseName)
|
void Database::setDatabaseName(QString databaseName)
|
||||||
|
|
@ -534,7 +534,7 @@ bool Database::open(bool updateDatabase)
|
||||||
else if (d->driver == "QSQLITE" || d->driver == "QSQLITE3")
|
else if (d->driver == "QSQLITE" || d->driver == "QSQLITE3")
|
||||||
d->sqlGenertor = new SqliteGenerator(this);
|
d->sqlGenertor = new SqliteGenerator(this);
|
||||||
else if (d->driver == "QODBC" || d->driver == "QODBC3") {
|
else if (d->driver == "QODBC" || d->driver == "QODBC3") {
|
||||||
QString driverName = QString::null;
|
QString driverName = QString();
|
||||||
QStringList parts = d->databaseName.toLower().split(';');
|
QStringList parts = d->databaseName.toLower().split(';');
|
||||||
foreach (QString p, parts)
|
foreach (QString p, parts)
|
||||||
if (p.trimmed().startsWith("driver="))
|
if (p.trimmed().startsWith("driver="))
|
||||||
|
|
|
||||||
|
|
@ -31,13 +31,13 @@ QMap<QString, DatabaseModel*> DatabaseModel::_models;
|
||||||
#define NODE_VERSION "version"
|
#define NODE_VERSION "version"
|
||||||
#define NODE_TABLES "tables"
|
#define NODE_TABLES "tables"
|
||||||
DatabaseModel::DatabaseModel(const QString &name) :
|
DatabaseModel::DatabaseModel(const QString &name) :
|
||||||
QList<TableModel*>(), _databaseClassName(name), _version(QString::null)
|
QList<TableModel*>(), _databaseClassName(name), _version(QString())
|
||||||
{
|
{
|
||||||
_models.insert(name, this);
|
_models.insert(name, this);
|
||||||
}
|
}
|
||||||
|
|
||||||
DatabaseModel::DatabaseModel(const DatabaseModel &other) :
|
DatabaseModel::DatabaseModel(const DatabaseModel &other) :
|
||||||
QList<TableModel*>(other), _version(QString::null)
|
QList<TableModel*>(other), _version(QString())
|
||||||
{
|
{
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
@ -173,7 +173,7 @@ RelationModel *DatabaseModel::relationByTableNames(const QString &masterTableNam
|
||||||
|
|
||||||
DatabaseModel DatabaseModel::fromJson(QJsonObject &json)
|
DatabaseModel DatabaseModel::fromJson(QJsonObject &json)
|
||||||
{
|
{
|
||||||
DatabaseModel model(QString::null);
|
DatabaseModel model(QString());
|
||||||
|
|
||||||
model.setVersion(json.value(NODE_VERSION).toString());
|
model.setVersion(json.value(NODE_VERSION).toString());
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -40,7 +40,7 @@ class DatabaseModel : public QList<TableModel *>
|
||||||
static QMap<QString, DatabaseModel *> _models;
|
static QMap<QString, DatabaseModel *> _models;
|
||||||
|
|
||||||
public:
|
public:
|
||||||
DatabaseModel(const QString &name = QString::null);
|
DatabaseModel(const QString &name = QString());
|
||||||
DatabaseModel(const DatabaseModel &other);
|
DatabaseModel(const DatabaseModel &other);
|
||||||
DatabaseModel(const QJsonObject &json);
|
DatabaseModel(const QJsonObject &json);
|
||||||
~DatabaseModel();
|
~DatabaseModel();
|
||||||
|
|
|
||||||
|
|
@ -88,7 +88,7 @@ QString MySqlGenerator::fieldType(FieldModel *field)
|
||||||
qPrintable(field->name),
|
qPrintable(field->name),
|
||||||
QMetaType::typeName(field->type),
|
QMetaType::typeName(field->type),
|
||||||
field->type);
|
field->type);
|
||||||
dbType = "";
|
dbType = QString();
|
||||||
}
|
}
|
||||||
|
|
||||||
if(field->typeName == QStringLiteral("Nut::DbGeography"))
|
if(field->typeName == QStringLiteral("Nut::DbGeography"))
|
||||||
|
|
|
||||||
|
|
@ -92,7 +92,7 @@ QString PostgreSqlGenerator::fieldType(FieldModel *field)
|
||||||
|
|
||||||
default:
|
default:
|
||||||
qDebug() << "Type for " << (int)field->type << field->type << "(" << QMetaType::typeName(field->type) << ")" << "nut supported";
|
qDebug() << "Type for " << (int)field->type << field->type << "(" << QMetaType::typeName(field->type) << ")" << "nut supported";
|
||||||
dbType = "";
|
dbType = QString();
|
||||||
}
|
}
|
||||||
|
|
||||||
if(field->type == (unsigned)QMetaType::type("Nut::DbGeography"))
|
if(field->type == (unsigned)QMetaType::type("Nut::DbGeography"))
|
||||||
|
|
@ -103,10 +103,10 @@ QString PostgreSqlGenerator::fieldType(FieldModel *field)
|
||||||
|
|
||||||
QString PostgreSqlGenerator::diff(FieldModel *oldField, FieldModel *newField)
|
QString PostgreSqlGenerator::diff(FieldModel *oldField, FieldModel *newField)
|
||||||
{
|
{
|
||||||
QString sql = "";
|
QString sql = QString();
|
||||||
if(oldField && newField)
|
if(oldField && newField)
|
||||||
if(*oldField == *newField)
|
if(*oldField == *newField)
|
||||||
return QString::null;
|
return QString();
|
||||||
|
|
||||||
if(!newField){
|
if(!newField){
|
||||||
sql = "DROP COLUMN " + oldField->name;
|
sql = "DROP COLUMN " + oldField->name;
|
||||||
|
|
|
||||||
|
|
@ -65,13 +65,13 @@ SqlGeneratorBase::~SqlGeneratorBase()
|
||||||
QString SqlGeneratorBase::masterDatabaseName(QString databaseName)
|
QString SqlGeneratorBase::masterDatabaseName(QString databaseName)
|
||||||
{
|
{
|
||||||
Q_UNUSED(databaseName);
|
Q_UNUSED(databaseName);
|
||||||
return "";
|
return QString();
|
||||||
}
|
}
|
||||||
|
|
||||||
QString SqlGeneratorBase::createTable(TableModel *table)
|
QString SqlGeneratorBase::createTable(TableModel *table)
|
||||||
{
|
{
|
||||||
Q_UNUSED(table)
|
Q_UNUSED(table)
|
||||||
return "";
|
return QString();
|
||||||
}
|
}
|
||||||
|
|
||||||
QString SqlGeneratorBase::saveRecord(Table *t, QString tableName)
|
QString SqlGeneratorBase::saveRecord(Table *t, QString tableName)
|
||||||
|
|
@ -92,15 +92,15 @@ QString SqlGeneratorBase::saveRecord(Table *t, QString tableName)
|
||||||
Q_UNREACHABLE();
|
Q_UNREACHABLE();
|
||||||
}
|
}
|
||||||
|
|
||||||
return "";
|
return QString();
|
||||||
}
|
}
|
||||||
|
|
||||||
QString SqlGeneratorBase::recordsPhrase(TableModel *table)
|
QString SqlGeneratorBase::recordsPhrase(TableModel *table)
|
||||||
{
|
{
|
||||||
if (!table)
|
if (!table)
|
||||||
return "";
|
return QString();
|
||||||
|
|
||||||
QString ret = "";
|
QString ret = QString();
|
||||||
foreach (FieldModel *f, table->fields()) {
|
foreach (FieldModel *f, table->fields()) {
|
||||||
if (!ret.isEmpty())
|
if (!ret.isEmpty())
|
||||||
ret.append(", ");
|
ret.append(", ");
|
||||||
|
|
@ -144,10 +144,10 @@ QStringList SqlGeneratorBase::diff(DatabaseModel lastModel,
|
||||||
|
|
||||||
QString SqlGeneratorBase::diff(FieldModel *oldField, FieldModel *newField)
|
QString SqlGeneratorBase::diff(FieldModel *oldField, FieldModel *newField)
|
||||||
{
|
{
|
||||||
QString sql = "";
|
QString sql = QString();
|
||||||
if (oldField && newField)
|
if (oldField && newField)
|
||||||
if (*oldField == *newField)
|
if (*oldField == *newField)
|
||||||
return QString::null;
|
return QString();
|
||||||
|
|
||||||
if (!newField) {
|
if (!newField) {
|
||||||
sql = "DROP COLUMN " + oldField->name;
|
sql = "DROP COLUMN " + oldField->name;
|
||||||
|
|
@ -165,7 +165,7 @@ QString SqlGeneratorBase::diff(TableModel *oldTable, TableModel *newTable)
|
||||||
{
|
{
|
||||||
if (oldTable && newTable)
|
if (oldTable && newTable)
|
||||||
if (*oldTable == *newTable)
|
if (*oldTable == *newTable)
|
||||||
return "";
|
return QString();
|
||||||
|
|
||||||
if (!newTable)
|
if (!newTable)
|
||||||
return "DROP TABLE " + oldTable->name();
|
return "DROP TABLE " + oldTable->name();
|
||||||
|
|
@ -235,7 +235,7 @@ QString SqlGeneratorBase::diff(TableModel *oldTable, TableModel *newTable)
|
||||||
QString SqlGeneratorBase::diffRelation(TableModel *oldTable, TableModel *newTable)
|
QString SqlGeneratorBase::diffRelation(TableModel *oldTable, TableModel *newTable)
|
||||||
{
|
{
|
||||||
if (!newTable)
|
if (!newTable)
|
||||||
return "";
|
return QString();
|
||||||
|
|
||||||
QList<QString> relations;
|
QList<QString> relations;
|
||||||
|
|
||||||
|
|
@ -264,7 +264,7 @@ QString SqlGeneratorBase::diffRelation(TableModel *oldTable, TableModel *newTabl
|
||||||
return "ALTER TABLE " + newTable->name() + "\n"
|
return "ALTER TABLE " + newTable->name() + "\n"
|
||||||
+ columnSql.join(",\n");
|
+ columnSql.join(",\n");
|
||||||
else
|
else
|
||||||
return "";
|
return QString();
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -297,7 +297,7 @@ QString SqlGeneratorBase::diff(RelationModel *oldRel, RelationModel *newRel)
|
||||||
.arg(oldRel->foreignColumn);
|
.arg(oldRel->foreignColumn);
|
||||||
|
|
||||||
// if (*oldRel == *newRel)
|
// if (*oldRel == *newRel)
|
||||||
return "";
|
return QString();
|
||||||
}
|
}
|
||||||
|
|
||||||
QString SqlGeneratorBase::join(const QString &mainTable,
|
QString SqlGeneratorBase::join(const QString &mainTable,
|
||||||
|
|
@ -340,7 +340,7 @@ QString SqlGeneratorBase::join(const QStringList &list, QStringList *order)
|
||||||
*/
|
*/
|
||||||
|
|
||||||
if (!list.count())
|
if (!list.count())
|
||||||
return "";
|
return QString();
|
||||||
|
|
||||||
if (list.count() == 1)
|
if (list.count() == 1)
|
||||||
return "[" + list.first() + "]";
|
return "[" + list.first() + "]";
|
||||||
|
|
@ -394,7 +394,7 @@ QString SqlGeneratorBase::join(const QStringList &list, QStringList *order)
|
||||||
|
|
||||||
QString SqlGeneratorBase::insertRecord(Table *t, QString tableName)
|
QString SqlGeneratorBase::insertRecord(Table *t, QString tableName)
|
||||||
{
|
{
|
||||||
QString sql = "";
|
QString sql = QString();
|
||||||
QString key = t->primaryKey();
|
QString key = t->primaryKey();
|
||||||
QStringList values;
|
QStringList values;
|
||||||
|
|
||||||
|
|
@ -403,7 +403,7 @@ QString SqlGeneratorBase::insertRecord(Table *t, QString tableName)
|
||||||
values.append("'" + t->property(f.toLatin1().data()).toString()
|
values.append("'" + t->property(f.toLatin1().data()).toString()
|
||||||
+ "'");
|
+ "'");
|
||||||
|
|
||||||
QString changedPropertiesText = "";
|
QString changedPropertiesText = QString();
|
||||||
QSet<QString> props = t->changedProperties();
|
QSet<QString> props = t->changedProperties();
|
||||||
foreach (QString s, props) {
|
foreach (QString s, props) {
|
||||||
if (changedPropertiesText != "")
|
if (changedPropertiesText != "")
|
||||||
|
|
@ -422,7 +422,7 @@ QString SqlGeneratorBase::insertRecord(Table *t, QString tableName)
|
||||||
|
|
||||||
QString SqlGeneratorBase::updateRecord(Table *t, QString tableName)
|
QString SqlGeneratorBase::updateRecord(Table *t, QString tableName)
|
||||||
{
|
{
|
||||||
QString sql = "";
|
QString sql = QString();
|
||||||
QString key = t->primaryKey();
|
QString key = t->primaryKey();
|
||||||
QStringList values;
|
QStringList values;
|
||||||
|
|
||||||
|
|
@ -476,7 +476,7 @@ QString SqlGeneratorBase::agregateText(const AgregateType &t,
|
||||||
break;
|
break;
|
||||||
|
|
||||||
default:
|
default:
|
||||||
return QString::null;
|
return QString();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -502,7 +502,7 @@ QString SqlGeneratorBase::fromTableText(const QString &tableName,
|
||||||
qPrintable(tableName),
|
qPrintable(tableName),
|
||||||
qPrintable(joinClassName),
|
qPrintable(joinClassName),
|
||||||
qPrintable(joinTableName.isNull() ? "NULL" : joinTableName));
|
qPrintable(joinTableName.isNull() ? "NULL" : joinTableName));
|
||||||
joinClassName = QString::null;
|
joinClassName = QString();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -511,7 +511,7 @@ QString SqlGeneratorBase::fromTableText(const QString &tableName,
|
||||||
|
|
||||||
QString SqlGeneratorBase::deleteRecords(QString tableName, QString where)
|
QString SqlGeneratorBase::deleteRecords(QString tableName, QString where)
|
||||||
{
|
{
|
||||||
QString sql = "";
|
QString sql = QString();
|
||||||
if (where.isEmpty() || where.isNull())
|
if (where.isEmpty() || where.isNull())
|
||||||
sql = "DELETE FROM " + tableName;
|
sql = "DELETE FROM " + tableName;
|
||||||
else
|
else
|
||||||
|
|
@ -540,7 +540,7 @@ QString SqlGeneratorBase::selectCommand(const QString &tableName,
|
||||||
foreach (RelationModel *rel, joins)
|
foreach (RelationModel *rel, joins)
|
||||||
tables << rel->masterTable << rel->slaveTable;
|
tables << rel->masterTable << rel->slaveTable;
|
||||||
|
|
||||||
selectText = "";
|
selectText = QString();
|
||||||
foreach (TableModel *t, tables) {
|
foreach (TableModel *t, tables) {
|
||||||
if (!selectText.isEmpty())
|
if (!selectText.isEmpty())
|
||||||
selectText.append(", ");
|
selectText.append(", ");
|
||||||
|
|
@ -625,7 +625,7 @@ QString SqlGeneratorBase::updateCommand(const QString &tableName,
|
||||||
const AssignmentPhraseList &assigments,
|
const AssignmentPhraseList &assigments,
|
||||||
const ConditionalPhrase &where)
|
const ConditionalPhrase &where)
|
||||||
{
|
{
|
||||||
QString assigmentTexts = "";
|
QString assigmentTexts = QString();
|
||||||
foreach (PhraseData *d, assigments.data) {
|
foreach (PhraseData *d, assigments.data) {
|
||||||
if (assigmentTexts != "")
|
if (assigmentTexts != "")
|
||||||
assigmentTexts.append(", ");
|
assigmentTexts.append(", ");
|
||||||
|
|
@ -821,7 +821,7 @@ QString SqlGeneratorBase::escapeValue(const QVariant &v) const
|
||||||
|
|
||||||
default:
|
default:
|
||||||
Q_UNREACHABLE();
|
Q_UNREACHABLE();
|
||||||
return "";
|
return QString();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -834,7 +834,7 @@ QVariant SqlGeneratorBase::readValue(const QVariant::Type &type,
|
||||||
|
|
||||||
QString SqlGeneratorBase::phrase(const PhraseData *d) const
|
QString SqlGeneratorBase::phrase(const PhraseData *d) const
|
||||||
{
|
{
|
||||||
QString ret = "";
|
QString ret = QString();
|
||||||
|
|
||||||
switch (d->type) {
|
switch (d->type) {
|
||||||
case PhraseData::Field:
|
case PhraseData::Field:
|
||||||
|
|
@ -939,9 +939,9 @@ void SqlGeneratorBase::appendSkipTake(QString &sql, int skip, int take)
|
||||||
QString SqlGeneratorBase::createConditionalPhrase(const PhraseData *d) const
|
QString SqlGeneratorBase::createConditionalPhrase(const PhraseData *d) const
|
||||||
{
|
{
|
||||||
if (!d)
|
if (!d)
|
||||||
return "";
|
return QString();
|
||||||
|
|
||||||
QString ret = "";
|
QString ret = QString();
|
||||||
|
|
||||||
PhraseData::Condition op = d->operatorCond;
|
PhraseData::Condition op = d->operatorCond;
|
||||||
//apply not (!)
|
//apply not (!)
|
||||||
|
|
@ -999,7 +999,7 @@ QString SqlGeneratorBase::createConditionalPhrase(const PhraseData *d) const
|
||||||
|
|
||||||
QString SqlGeneratorBase::createOrderPhrase(const PhraseList &ph)
|
QString SqlGeneratorBase::createOrderPhrase(const PhraseList &ph)
|
||||||
{
|
{
|
||||||
QString ret = "";
|
QString ret = QString();
|
||||||
foreach (const PhraseData *d, ph.data) {
|
foreach (const PhraseData *d, ph.data) {
|
||||||
if (ret != "")
|
if (ret != "")
|
||||||
ret.append(", ");
|
ret.append(", ");
|
||||||
|
|
@ -1013,7 +1013,7 @@ QString SqlGeneratorBase::createOrderPhrase(const PhraseList &ph)
|
||||||
|
|
||||||
QString SqlGeneratorBase::createFieldPhrase(const PhraseList &ph)
|
QString SqlGeneratorBase::createFieldPhrase(const PhraseList &ph)
|
||||||
{
|
{
|
||||||
QString ret = "";
|
QString ret = QString();
|
||||||
foreach (const PhraseData *d, ph.data) {
|
foreach (const PhraseData *d, ph.data) {
|
||||||
if (ret != "")
|
if (ret != "")
|
||||||
ret.append(", ");
|
ret.append(", ");
|
||||||
|
|
|
||||||
|
|
@ -131,7 +131,7 @@ protected:
|
||||||
QString createOrderPhrase(const PhraseList &ph);
|
QString createOrderPhrase(const PhraseList &ph);
|
||||||
void createInsertPhrase(const AssignmentPhraseList &ph, QString &fields, QString &values);
|
void createInsertPhrase(const AssignmentPhraseList &ph, QString &fields, QString &values);
|
||||||
|
|
||||||
QString agregateText(const AgregateType &t, const QString &arg = QString::null) const;
|
QString agregateText(const AgregateType &t, const QString &arg = QString()) const;
|
||||||
QString fromTableText(const QString &tableName, QString &joinClassName, QString &orderBy) const;
|
QString fromTableText(const QString &tableName, QString &joinClassName, QString &orderBy) const;
|
||||||
// QString createWhere(QList<WherePhrase> &wheres);
|
// QString createWhere(QList<WherePhrase> &wheres);
|
||||||
void replaceTableNames(QString &command);
|
void replaceTableNames(QString &command);
|
||||||
|
|
|
||||||
|
|
@ -65,7 +65,7 @@ QString SqliteGenerator::fieldType(FieldModel *field)
|
||||||
dbType = "text";
|
dbType = "text";
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
dbType = "";
|
dbType = QString();
|
||||||
}
|
}
|
||||||
|
|
||||||
return dbType;
|
return dbType;
|
||||||
|
|
|
||||||
|
|
@ -92,7 +92,7 @@ QString SqlServerGenerator::fieldType(FieldModel *field)
|
||||||
|
|
||||||
default:
|
default:
|
||||||
Q_UNREACHABLE();
|
Q_UNREACHABLE();
|
||||||
dbType = "";
|
dbType = QString();
|
||||||
}
|
}
|
||||||
|
|
||||||
return dbType;
|
return dbType;
|
||||||
|
|
@ -100,10 +100,10 @@ QString SqlServerGenerator::fieldType(FieldModel *field)
|
||||||
|
|
||||||
QString SqlServerGenerator::diff(FieldModel *oldField, FieldModel *newField)
|
QString SqlServerGenerator::diff(FieldModel *oldField, FieldModel *newField)
|
||||||
{
|
{
|
||||||
QString sql = "";
|
QString sql = QString();
|
||||||
if (oldField && newField)
|
if (oldField && newField)
|
||||||
if (*oldField == *newField)
|
if (*oldField == *newField)
|
||||||
return QString::null;
|
return QString();
|
||||||
|
|
||||||
if (!newField) {
|
if (!newField) {
|
||||||
sql = "DROP COLUMN " + oldField->name;
|
sql = "DROP COLUMN " + oldField->name;
|
||||||
|
|
|
||||||
|
|
@ -402,7 +402,7 @@ QString TableModel::primaryKey() const
|
||||||
foreach (FieldModel *f, _fields)
|
foreach (FieldModel *f, _fields)
|
||||||
if(f->isPrimaryKey)
|
if(f->isPrimaryKey)
|
||||||
return f->name;
|
return f->name;
|
||||||
return QString::null;
|
return QString();
|
||||||
}
|
}
|
||||||
|
|
||||||
FieldModel::FieldModel(const QJsonObject &json)
|
FieldModel::FieldModel(const QJsonObject &json)
|
||||||
|
|
|
||||||
|
|
@ -31,7 +31,7 @@ NUT_BEGIN_NAMESPACE
|
||||||
|
|
||||||
class TableModel;
|
class TableModel;
|
||||||
struct FieldModel{
|
struct FieldModel{
|
||||||
explicit FieldModel() : name(QString::null), length(0), defaultValue(QString::null),
|
explicit FieldModel() : name(QString()), length(0), defaultValue(QString()),
|
||||||
notNull(false), isPrimaryKey(false), isAutoIncrement(false), isUnique(false)
|
notNull(false), isPrimaryKey(false), isAutoIncrement(false), isUnique(false)
|
||||||
{
|
{
|
||||||
|
|
||||||
|
|
@ -70,8 +70,8 @@ struct FieldModel{
|
||||||
};
|
};
|
||||||
|
|
||||||
struct RelationModel{
|
struct RelationModel{
|
||||||
RelationModel() : localColumn(""), localProperty(""), slaveTable(0),
|
RelationModel() : localColumn(QString()), localProperty(QString()), slaveTable(0),
|
||||||
foreignColumn(""), masterTable(0), masterClassName("")
|
foreignColumn(QString()), masterTable(0), masterClassName(QString())
|
||||||
{}
|
{}
|
||||||
explicit RelationModel(const QJsonObject &obj);
|
explicit RelationModel(const QJsonObject &obj);
|
||||||
|
|
||||||
|
|
@ -92,7 +92,7 @@ bool operator !=(const RelationModel &l, const RelationModel &r);
|
||||||
class TableModel
|
class TableModel
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
explicit TableModel(int typeId, QString tableName = QString::null);
|
explicit TableModel(int typeId, QString tableName = QString());
|
||||||
explicit TableModel(QJsonObject json, QString tableName);
|
explicit TableModel(QJsonObject json, QString tableName);
|
||||||
virtual ~TableModel();
|
virtual ~TableModel();
|
||||||
|
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue