diff --git a/src/database.cpp b/src/database.cpp index d9d6251..f70c7c9 100644 --- a/src/database.cpp +++ b/src/database.cpp @@ -69,7 +69,8 @@ bool DatabasePrivate::open(bool update) db = QSqlDatabase::addDatabase(driver, connectionName); db.setHostName(hostName); - db.setPort(port); + if (port) + db.setPort(port); db.setDatabaseName(databaseName); db.setUserName(userName); db.setPassword(password); diff --git a/src/generators/postgresqlgenerator.cpp b/src/generators/postgresqlgenerator.cpp index a791922..7d75100 100644 --- a/src/generators/postgresqlgenerator.cpp +++ b/src/generators/postgresqlgenerator.cpp @@ -18,6 +18,8 @@ ** **************************************************************************/ +#include + #include "postgresqlgenerator.h" #include "../table.h" #include "../tablemodel.h" @@ -34,62 +36,95 @@ QString PostgreSqlGenerator::fieldType(FieldModel *field) QString dbType; switch (field->type) { - case QVariant::Bool: + case QMetaType::Bool: dbType = "BOOLEAN"; break; - case QVariant::ByteArray: + case QMetaType::QByteArray: dbType = "BYTEA"; break; - case QVariant::Date: + case QMetaType::QDate: dbType = "DATE"; break; - case QVariant::DateTime: + case QMetaType::QDateTime: dbType = "TIMESTAMP"; break; - case QVariant::Time: + case QMetaType::QTime: dbType = "TIME"; break; - case QVariant::Int: - case QVariant::UInt: + case QMetaType::SChar: + case QMetaType::UChar: + case QMetaType::Short: + case QMetaType::UShort: + dbType = "SMALLINT"; + break; + + case QMetaType::Float: + dbType = "FLOAT"; + break; + + case QMetaType::Double: + dbType = "REAL"; + break; + + case QMetaType::Int: + case QMetaType::UInt: if(field->isAutoIncrement) dbType = "SERIAL"; else dbType = "INTEGER"; break; - case QVariant::ULongLong: - case QVariant::LongLong: + case QMetaType::ULongLong: + case QMetaType::LongLong: if(field->isAutoIncrement) dbType = "BIGSERIAL"; else dbType = "BIGINT"; break; - case QVariant::Double: - dbType = "REAL"; - break; - case QVariant::String: + case QMetaType::QString: if(field->length) dbType = QString("VARCHAR(%1)").arg(field->length); else dbType = "TEXT"; break; - case QVariant::Point: - case QVariant::PointF: + case QMetaType::QPoint: + case QMetaType::QPointF: dbType="POINT"; break; - case QVariant::Uuid: + case QMetaType::QUuid: dbType = "UUID"; break; - case QVariant::Polygon: - case QVariant::PolygonF: + case QMetaType::QPolygon: + case QMetaType::QPolygonF: dbType = "POLYGON"; break; + case QMetaType::QLine: + case QMetaType::QLineF: + return "LINE"; + + case QMetaType::QRect: + case QMetaType::QRectF: + return "BOX"; + + case QMetaType::QJsonArray: + case QMetaType::QJsonValue: + case QMetaType::QJsonObject: + case QMetaType::QJsonDocument: + return "JSON"; + + case QMetaType::QStringList: + return "TEXT[]"; + + case QMetaType::QUrl: + case QMetaType::QColor: + return "TEXT"; + default: qDebug() << "Type for " << (int)field->type << field->type << "(" << QMetaType::typeName(field->type) << ")" << "nut supported"; dbType = QString(); @@ -122,5 +157,21 @@ QString PostgreSqlGenerator::diff(FieldModel *oldField, FieldModel *newField) return sql; } +QString PostgreSqlGenerator::escapeValue(const QVariant &v) const +{ + if (v.type() == QVariant::DateTime) + return "'" + v.toDateTime().toString("yyyy-MM-dd HH:mm:ss") + "'"; + + return SqlGeneratorBase::escapeValue(v); +} + +QVariant PostgreSqlGenerator::readValue(const QMetaType::Type &type, const QVariant &dbValue) +{ + if (type == QMetaType::QDateTime) + return dbValue.toDateTime();// QDateTime::fromString(dbValue.toString(), "yyyy-MM-dd HH:mm:ss"); + + return SqlGeneratorBase::readValue(type, dbValue); +} + NUT_END_NAMESPACE diff --git a/src/generators/postgresqlgenerator.h b/src/generators/postgresqlgenerator.h index 028cea4..ecc1d46 100644 --- a/src/generators/postgresqlgenerator.h +++ b/src/generators/postgresqlgenerator.h @@ -34,6 +34,11 @@ public: QString fieldType(FieldModel *field); QString diff(FieldModel *oldField, FieldModel *newField); + + // SqlGeneratorBase interface +public: + QString escapeValue(const QVariant &v) const; + QVariant readValue(const QMetaType::Type &type, const QVariant &dbValue); }; NUT_END_NAMESPACE diff --git a/src/generators/sqlgeneratorbase.cpp b/src/generators/sqlgeneratorbase.cpp index 0ef93f7..90b0923 100644 --- a/src/generators/sqlgeneratorbase.cpp +++ b/src/generators/sqlgeneratorbase.cpp @@ -103,7 +103,7 @@ QString SqlGeneratorBase::recordsPhrase(TableModel *table) foreach (FieldModel *f, table->fields()) { if (!ret.isEmpty()) ret.append(", "); - ret.append(QString("%1.%2 AS [%1.%2]").arg(table->name(), f->name)); + ret.append(QString("%1.%2 AS \"%1.%2\"").arg(table->name(), f->name)); } return ret; } @@ -721,7 +721,7 @@ void SqlGeneratorBase::replaceTableNames(QString &command) { foreach (TableModel *m, TableModel::allModels()) command = command - .replace("[" + m->className() + "]", "`" + m->name() + "`"); + .replace("[" + m->className() + "]", m->name()); } void SqlGeneratorBase::removeTableNames(QString &command) diff --git a/test/common/consts.h b/test/common/consts.h index 7e63c0e..91f0797 100644 --- a/test/common/consts.h +++ b/test/common/consts.h @@ -8,11 +8,11 @@ .arg(timer.elapsed() / 1000.) \ .arg(__func__) -#define DRIVER "QSQLITE" -#define DATABASE QString(typeid(*this).name()) + ".db" -#define HOST "" -#define USERNAME "" -#define PASSWORD "" +#define DRIVER "QPSQL" +#define DATABASE QString(metaObject()->className()).toLower() + "_db" +#define HOST "127.0.0.1" +#define USERNAME "postgres" +#define PASSWORD "856856" #ifdef Q_OS_LINUX # define OS "Linux" diff --git a/test/tst_basic/tst_basic.cpp b/test/tst_basic/tst_basic.cpp index b6761f4..c3bcb77 100644 --- a/test/tst_basic/tst_basic.cpp +++ b/test/tst_basic/tst_basic.cpp @@ -102,7 +102,7 @@ void BasicTest::createPost2() (Post::titleField() = "This is a sample") & (Post::isPublicField() = true)); - QTEST_ASSERT(postIdVar.type() == QVariant::LongLong); + QTEST_ASSERT(postIdVar.type() == QVariant::LongLong || postIdVar.type() == QVariant::ULongLong); int postId = postIdVar.toInt(); for(int i = 0 ; i < 3; i++){ @@ -217,6 +217,7 @@ void BasicTest::testDate() ->setWhere(Post::idField() == newPost->id()) ->first(); + qDebug() << q->saveDate() << d; QTEST_ASSERT(q->saveDate() == d); }