This commit is contained in:
Hamed Masafi 2019-02-08 12:09:24 +03:30
parent afcfa39ada
commit f5c10e8759
38 changed files with 130 additions and 69 deletions

55
nut.pro
View File

@ -1,53 +1,6 @@
QT += sql TEMPLATE = subdirs
QT -= gui
TARGET = nut SUBDIRS += \
TEMPLATE = lib src \
CONFIG += c++11 test
DEFINES += QT_DEPRECATED_WARNINGS
HEADERS += \
$$PWD/src/generators/sqlgeneratorbase_p.h \
$$PWD/src/generators/postgresqlgenerator.h \
$$PWD/src/generators/mysqlgenerator.h \
$$PWD/src/generators/sqlitegenerator.h \
$$PWD/src/generators/sqlservergenerator.h \
$$PWD/src/types/dbgeography.h \
$$PWD/src/tableset.h \
$$PWD/src/defines_p.h \
$$PWD/src/defines.h \
$$PWD/src/query.h \
$$PWD/src/databasemodel.h \
$$PWD/src/changelogtable.h \
$$PWD/src/tablesetbase_p.h \
$$PWD/src/querybase_p.h \
$$PWD/src/tablemodel.h \
$$PWD/src/query_p.h \
$$PWD/src/table.h \
$$PWD/src/database.h \
$$PWD/src/database_p.h \
$$PWD/src/serializableobject.h \
$$PWD/src/sqlmodel.h \
$$PWD/src/sqlmodel_p.h \
$$PWD/src/phrase.h
SOURCES += \
$$PWD/src/generators/sqlgeneratorbase.cpp \
$$PWD/src/generators/postgresqlgenerator.cpp \
$$PWD/src/generators/mysqlgenerator.cpp \
$$PWD/src/generators/sqlitegenerator.cpp \
$$PWD/src/generators/sqlservergenerator.cpp \
$$PWD/src/types/dbgeography.cpp \
$$PWD/src/tableset.cpp \
$$PWD/src/query.cpp \
$$PWD/src/databasemodel.cpp \
$$PWD/src/tablesetbase.cpp \
$$PWD/src/changelogtable.cpp \
$$PWD/src/querybase.cpp \
$$PWD/src/tablemodel.cpp \
$$PWD/src/table.cpp \
$$PWD/src/database.cpp \
$$PWD/src/serializableobject.cpp \
$$PWD/src/sqlmodel.cpp \
$$PWD/src/phrase.cpp

View File

@ -137,6 +137,17 @@ bool DatabasePrivate::updateDatabase()
return true; return true;
} }
foreach (TableModel *tm, current) {
foreach (FieldModel *fm, tm->fields()) {
if (sqlGenertor->fieldType(fm).isEmpty()) {
qWarning("The type (%s) is not supported for field %s::%s",
QMetaType::typeName(fm->type),
qPrintable(tm->className()),
qPrintable(fm->name));
return false;
}
}
}
if (!last.count()) if (!last.count())
qDebug("Databse is new"); qDebug("Databse is new");
else else

View File

@ -31,6 +31,7 @@
#include "../table.h" #include "../table.h"
#include "../databasemodel.h" #include "../databasemodel.h"
#include "../tablemodel.h" #include "../tablemodel.h"
#include "stringserializer.h"
NUT_BEGIN_NAMESPACE NUT_BEGIN_NAMESPACE
@ -56,6 +57,8 @@ SqlGeneratorBase::SqlGeneratorBase(Database *parent)
{ {
if (parent) if (parent)
_database = parent; _database = parent;
_serializer = new StringSerializer;
} }
SqlGeneratorBase::~SqlGeneratorBase() SqlGeneratorBase::~SqlGeneratorBase()
@ -792,6 +795,13 @@ void SqlGeneratorBase::removeTableNames(QString &command)
QString SqlGeneratorBase::escapeValue(const QVariant &v) const QString SqlGeneratorBase::escapeValue(const QVariant &v) const
{ {
QString serialized = _serializer->toString(v);
if (serialized.isEmpty()) {
qWarning("No field escape rule for: %s", v.typeName());
return QString();
}
return "'" + serialized + "'";
switch (v.type()) { switch (v.type()) {
case QVariant::Bool: case QVariant::Bool:
return v.toBool() ? "1" : "0"; return v.toBool() ? "1" : "0";
@ -823,15 +833,11 @@ QString SqlGeneratorBase::escapeValue(const QVariant &v) const
case QVariant::List: case QVariant::List:
return "('" + v.toStringList().join("', '") + "')"; return "('" + v.toStringList().join("', '") + "')";
case QVariant::Point: { case QVariant::Point:
QPoint pt = v.toPoint(); case QVariant::PointF:
return QString("POINT(%1 %2)").arg(pt.x()).arg(pt.y()); case QVariant::Polygon:
} case QVariant::PolygonF:
return "'" + _serializer->toString(v) + "'";
case QVariant::PointF: {
QPointF pt = v.toPointF();
return QString("POINT(%1 %2)").arg(pt.x()).arg(pt.y());
}
case QVariant::Invalid: case QVariant::Invalid:
qFatal("Invalud field value"); qFatal("Invalud field value");

View File

@ -27,6 +27,8 @@
#include "../phrase.h" #include "../phrase.h"
//#include "../wherephrase.h" //#include "../wherephrase.h"
class StringSerializer;
NUT_BEGIN_NAMESPACE NUT_BEGIN_NAMESPACE
class Table; class Table;
@ -40,6 +42,8 @@ class SqlGeneratorBase : public QObject
// Q_OBJECT // Q_OBJECT
Database *_database; Database *_database;
StringSerializer *_serializer;
public: public:
//TODO: remove this enum //TODO: remove this enum
enum CommandType{ enum CommandType{

View File

@ -67,6 +67,10 @@ QString SqliteGenerator::fieldType(FieldModel *field)
case QMetaType::QJsonValue: case QMetaType::QJsonValue:
case QMetaType::QJsonObject: case QMetaType::QJsonObject:
case QMetaType::QJsonDocument: case QMetaType::QJsonDocument:
case QMetaType::QPoint:
case QMetaType::QPointF:
case QMetaType::QPolygon:
case QMetaType::QPolygonF:
case QMetaType::QUuid: return "text"; case QMetaType::QUuid: return "text";
// if (field->isAutoIncrement) // if (field->isAutoIncrement)
@ -78,8 +82,8 @@ QString SqliteGenerator::fieldType(FieldModel *field)
else else
return "TEXT"; return "TEXT";
default: default:
qWarning("The type (%s) does not supported", // qWarning("The type (%s) does not supported",
QMetaType::typeName(field->type)); // QMetaType::typeName(field->type));
return QString(); return QString();
} }
} }

55
src/src.pro Normal file
View File

@ -0,0 +1,55 @@
QT += sql
QT -= gui
TARGET = nut
TEMPLATE = lib
CONFIG += c++11
DEFINES += QT_DEPRECATED_WARNINGS
HEADERS += \
$$PWD/generators/sqlgeneratorbase_p.h \
$$PWD/generators/postgresqlgenerator.h \
$$PWD/generators/mysqlgenerator.h \
$$PWD/generators/sqlitegenerator.h \
$$PWD/generators/sqlservergenerator.h \
$$PWD/types/dbgeography.h \
$$PWD/tableset.h \
$$PWD/defines_p.h \
$$PWD/defines.h \
$$PWD/query.h \
$$PWD/databasemodel.h \
$$PWD/changelogtable.h \
$$PWD/tablesetbase_p.h \
$$PWD/querybase_p.h \
$$PWD/tablemodel.h \
$$PWD/query_p.h \
$$PWD/table.h \
$$PWD/database.h \
$$PWD/database_p.h \
$$PWD/serializableobject.h \
$$PWD/sqlmodel.h \
$$PWD/sqlmodel_p.h \
$$PWD/phrase.h
SOURCES += \
$$PWD/generators/sqlgeneratorbase.cpp \
$$PWD/generators/postgresqlgenerator.cpp \
$$PWD/generators/mysqlgenerator.cpp \
$$PWD/generators/sqlitegenerator.cpp \
$$PWD/generators/sqlservergenerator.cpp \
$$PWD/types/dbgeography.cpp \
$$PWD/tableset.cpp \
$$PWD/query.cpp \
$$PWD/databasemodel.cpp \
$$PWD/tablesetbase.cpp \
$$PWD/changelogtable.cpp \
$$PWD/querybase.cpp \
$$PWD/tablemodel.cpp \
$$PWD/table.cpp \
$$PWD/database.cpp \
$$PWD/serializableobject.cpp \
$$PWD/sqlmodel.cpp \
$$PWD/phrase.cpp
include($$PWD/../3rdparty/serializer/src/src.pri)

View File

@ -16,8 +16,8 @@
#define DRIVER "QSQLITE" #define DRIVER "QSQLITE"
#define HOST "127.0.0.1" #define HOST "127.0.0.1"
#define DATABASE "nutdb1" #define DATABASE "nutdb1"
//#define USERNAME "root" #define USERNAME "root"
//#define PASSWORD "onlyonlyi" #define PASSWORD "onlyonlyi"
//#define DRIVER "QODBC" //#define DRIVER "QODBC"
//#define HOST "127.0.0.1" //#define HOST "127.0.0.1"

View File

@ -11,5 +11,5 @@ Post::Post(QObject *parent) : Table(parent),
} }
NUT_IMPLEMENT_CHILD_TABLE(Post, Comment, comments) //NUT_IMPLEMENT_CHILD_TABLE(Post, Comment, comments)
NUT_IMPLEMENT_CHILD_TABLE(Post, Score, scores) //NUT_IMPLEMENT_CHILD_TABLE(Post, Score, scores)

11
test/test.pro Normal file
View File

@ -0,0 +1,11 @@
TEMPLATE = subdirs
SUBDIRS += \
tst_basic \
tst_benckmark \
tst_commands \
tst_datatypes \
#tst_join \
tst_phrases \
tst_quuid

View File

@ -103,7 +103,24 @@ void MainTest::types()
Q_ASSERT(!fn.isEmpty()); Q_ASSERT(!fn.isEmpty());
} }
// for (int i = 0; i < en.keyCount(); i++) // for (int i = 0; i < en.keyCount(); i++)
// qDebug() << en.value(i); // qDebug() << en.value(i);
}
void MainTest::insert()
{
SampleTable t;
t.setFint8(1);
t.setFreal(1.2);
t.setFfloat(4.5f);
t.setFint16(16);
t.setFint32(65000);
t.setFint64(3255465232);
t.setFuint8(2);
t.setPoint(QPoint(1, 2));
t.setPolygon(QPolygon() << QPoint(1, 2) << QPoint(3, 4) << QPoint(5, 6));
db.sampleTables()->append(&t);
db.saveChanges();
} }
void MainTest::cleanupTestCase() void MainTest::cleanupTestCase()

View File

@ -20,7 +20,7 @@ private slots:
void initTestCase(); void initTestCase();
void types(); void types();
void insert();
void cleanupTestCase(); void cleanupTestCase();
}; };

View File

@ -26,7 +26,7 @@ class SampleTable : public Nut::Table
NUT_DECLARE_FIELD(qreal, freal, freal, setFreal) NUT_DECLARE_FIELD(qreal, freal, freal, setFreal)
NUT_DECLARE_FIELD(float, ffloat, ffloat, setFfloat) NUT_DECLARE_FIELD(float, ffloat, ffloat, setFfloat)
NUT_DECLARE_FIELD(long double, fldouble, fldouble, setFldouble) // NUT_DECLARE_FIELD(long double, fldouble, fldouble, setFldouble)
NUT_DECLARE_FIELD(QString, string, string, setString) NUT_DECLARE_FIELD(QString, string, string, setString)
NUT_DECLARE_FIELD(QPoint, point, point, setPoint) NUT_DECLARE_FIELD(QPoint, point, point, setPoint)
NUT_DECLARE_FIELD(QPolygon, polygon, polygon, setPolygon) NUT_DECLARE_FIELD(QPolygon, polygon, polygon, setPolygon)