sqlite passed tst_datetime
This commit is contained in:
parent
f02e409ee2
commit
3cee4dae4f
|
|
@ -788,12 +788,24 @@ void SqlGeneratorBase::removeTableNames(QString &command)
|
||||||
QString SqlGeneratorBase::dateTimePartName(const PhraseData::Condition &op) const
|
QString SqlGeneratorBase::dateTimePartName(const PhraseData::Condition &op) const
|
||||||
{
|
{
|
||||||
switch (op) {
|
switch (op) {
|
||||||
case PhraseData::AddYears: return "YEAR";
|
case PhraseData::AddYears:
|
||||||
case PhraseData::AddMonths: return "MONTH";
|
case PhraseData::AddYearsDateTime:
|
||||||
case PhraseData::AddDays: return "DAY";
|
return "YEAR";
|
||||||
case PhraseData::AddHours: return "HOUR";
|
case PhraseData::AddMonths:
|
||||||
case PhraseData::AddMinutes: return "MINUTE";
|
case PhraseData::AddMonthsDateTime:
|
||||||
case PhraseData::AddSeconds: return "SECOND";
|
return "MONTH";
|
||||||
|
case PhraseData::AddDays:
|
||||||
|
case PhraseData::AddDaysDateTime:
|
||||||
|
return "DAY";
|
||||||
|
case PhraseData::AddHours:
|
||||||
|
case PhraseData::AddHoursDateTime:
|
||||||
|
return "HOUR";
|
||||||
|
case PhraseData::AddMinutes:
|
||||||
|
case PhraseData::AddMinutesDateTime:
|
||||||
|
return "MINUTE";
|
||||||
|
case PhraseData::AddSeconds:
|
||||||
|
case PhraseData::AddSecondsDateTime:
|
||||||
|
return "SECOND";
|
||||||
}
|
}
|
||||||
return QString();
|
return QString();
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -219,22 +219,73 @@ QString SqliteGenerator::createConditionalPhrase(const PhraseData *d) const
|
||||||
|
|
||||||
if (d->type == PhraseData::WithVariant) {
|
if (d->type == PhraseData::WithVariant) {
|
||||||
QString part;
|
QString part;
|
||||||
|
|
||||||
switch (op) {
|
switch (op) {
|
||||||
case PhraseData::AddYears:
|
case PhraseData::AddYears:
|
||||||
case PhraseData::AddMonths:
|
case PhraseData::AddMonths:
|
||||||
case PhraseData::AddDays:
|
case PhraseData::AddDays: {
|
||||||
case PhraseData::AddHours:
|
|
||||||
case PhraseData::AddMinutes:
|
|
||||||
case PhraseData::AddSeconds:
|
|
||||||
int i = d->operand.toInt();
|
int i = d->operand.toInt();
|
||||||
return QString("DATE(%1,'%2 %3')")
|
return QString("DATE(%1,'%2 %3')")
|
||||||
.arg(createConditionalPhrase(d->left),
|
.arg(createConditionalPhrase(d->left),
|
||||||
(i < 0 ? "-" : "+") + QString::number(i),
|
(i < 0 ? "" : "+") + QString::number(i),
|
||||||
dateTimePartName(op));
|
dateTimePartName(op));
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
case PhraseData::AddHours:
|
||||||
|
case PhraseData::AddMinutes:
|
||||||
|
case PhraseData::AddSeconds: {
|
||||||
|
int i = d->operand.toInt();
|
||||||
|
return QString("TIME(%1,'%2 %3')")
|
||||||
|
.arg(createConditionalPhrase(d->left),
|
||||||
|
(i < 0 ? "" : "+") + QString::number(i),
|
||||||
|
dateTimePartName(op));
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
case PhraseData::AddYearsDateTime:
|
||||||
|
case PhraseData::AddMonthsDateTime:
|
||||||
|
case PhraseData::AddDaysDateTime:
|
||||||
|
case PhraseData::AddHoursDateTime:
|
||||||
|
case PhraseData::AddMinutesDateTime:
|
||||||
|
case PhraseData::AddSecondsDateTime: {
|
||||||
|
int i = d->operand.toInt();
|
||||||
|
return QString("DATETIME(%1,'%2 %3')")
|
||||||
|
.arg(createConditionalPhrase(d->left),
|
||||||
|
(i < 0 ? "" : "+") + QString::number(i),
|
||||||
|
dateTimePartName(op));
|
||||||
|
break;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
return SqlGeneratorBase::createConditionalPhrase(d);
|
return SqlGeneratorBase::createConditionalPhrase(d);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
QString SqliteGenerator::escapeValue(const QVariant &v) const
|
||||||
|
{
|
||||||
|
if (v.type() == QVariant::Time)
|
||||||
|
return "'" + v.toTime().toString("HH:mm:ss") + "'";
|
||||||
|
|
||||||
|
if (v.type() == QVariant::Date)
|
||||||
|
return "'" + v.toDate().toString("yyyy-MM-dd") + "'";
|
||||||
|
|
||||||
|
if (v.type() == QVariant::DateTime)
|
||||||
|
return "'" + v.toDateTime().toString("yyyy-MM-dd HH:mm:ss") + "'";
|
||||||
|
|
||||||
|
return SqlGeneratorBase::escapeValue(v);
|
||||||
|
}
|
||||||
|
|
||||||
|
QVariant SqliteGenerator::unescapeValue(const QMetaType::Type &type, const QVariant &dbValue)
|
||||||
|
{
|
||||||
|
if (type == QMetaType::QDateTime)
|
||||||
|
return dbValue.toDateTime();
|
||||||
|
|
||||||
|
if (type == QMetaType::QTime)
|
||||||
|
return dbValue.toTime();
|
||||||
|
|
||||||
|
if (type == QMetaType::QDate)
|
||||||
|
return dbValue.toDate();
|
||||||
|
|
||||||
|
return SqlGeneratorBase::unescapeValue(type, dbValue);
|
||||||
|
}
|
||||||
|
|
||||||
NUT_END_NAMESPACE
|
NUT_END_NAMESPACE
|
||||||
|
|
|
||||||
|
|
@ -42,6 +42,9 @@ public:
|
||||||
QStringList diff(TableModel *oldTable, TableModel *newTable) override;
|
QStringList diff(TableModel *oldTable, TableModel *newTable) override;
|
||||||
|
|
||||||
QString createConditionalPhrase(const PhraseData *d) const override;
|
QString createConditionalPhrase(const PhraseData *d) const override;
|
||||||
|
|
||||||
|
QString escapeValue(const QVariant &v) const override;
|
||||||
|
QVariant unescapeValue(const QMetaType::Type &type, const QVariant &dbValue) override;
|
||||||
};
|
};
|
||||||
|
|
||||||
NUT_END_NAMESPACE
|
NUT_END_NAMESPACE
|
||||||
|
|
|
||||||
|
|
@ -102,32 +102,45 @@ public:
|
||||||
ConditionalPhrase addYears(int val) {
|
ConditionalPhrase addYears(int val) {
|
||||||
if (!is_valid_template<T, QDate>())
|
if (!is_valid_template<T, QDate>())
|
||||||
return ConditionalPhrase();
|
return ConditionalPhrase();
|
||||||
|
if (std::is_same<T, QDateTime>::value)
|
||||||
|
return ConditionalPhrase(this, PhraseData::AddYearsDateTime, val);
|
||||||
|
|
||||||
return ConditionalPhrase(this, PhraseData::AddYears, val);
|
return ConditionalPhrase(this, PhraseData::AddYears, val);
|
||||||
}
|
}
|
||||||
ConditionalPhrase addMonths(int val) {
|
ConditionalPhrase addMonths(int val) {
|
||||||
if (!is_valid_template<T, QDate>())
|
if (!is_valid_template<T, QDate>())
|
||||||
return ConditionalPhrase();
|
return ConditionalPhrase();
|
||||||
|
if (std::is_same<T, QDateTime>::value)
|
||||||
|
return ConditionalPhrase(this, PhraseData::AddMonthsDateTime, val);
|
||||||
return ConditionalPhrase(this, PhraseData::AddMonths, val);
|
return ConditionalPhrase(this, PhraseData::AddMonths, val);
|
||||||
}
|
}
|
||||||
ConditionalPhrase addDays(int val) {
|
ConditionalPhrase addDays(int val) {
|
||||||
if (!is_valid_template<T, QDate>())
|
if (!is_valid_template<T, QDate>())
|
||||||
return ConditionalPhrase();
|
return ConditionalPhrase();
|
||||||
|
if (std::is_same<T, QDateTime>::value)
|
||||||
|
return ConditionalPhrase(this, PhraseData::AddDaysDateTime, val);
|
||||||
return ConditionalPhrase(this, PhraseData::AddDays, val);
|
return ConditionalPhrase(this, PhraseData::AddDays, val);
|
||||||
}
|
}
|
||||||
|
|
||||||
ConditionalPhrase addHours(int val) {
|
ConditionalPhrase addHours(int val) {
|
||||||
if (!is_valid_template<T, QTime>())
|
if (!is_valid_template<T, QTime>())
|
||||||
return ConditionalPhrase();
|
return ConditionalPhrase();
|
||||||
|
if (std::is_same<T, QDateTime>::value)
|
||||||
|
return ConditionalPhrase(this, PhraseData::AddHoursDateTime, val);
|
||||||
return ConditionalPhrase(this, PhraseData::AddHours, val);
|
return ConditionalPhrase(this, PhraseData::AddHours, val);
|
||||||
}
|
}
|
||||||
ConditionalPhrase addMinutes(int val) {
|
ConditionalPhrase addMinutes(int val) {
|
||||||
if (!is_valid_template<T, QTime>())
|
if (!is_valid_template<T, QTime>())
|
||||||
return ConditionalPhrase();
|
return ConditionalPhrase();
|
||||||
|
if (std::is_same<T, QDateTime>::value)
|
||||||
|
return ConditionalPhrase(this, PhraseData::AddMinutesDateTime, val);
|
||||||
return ConditionalPhrase(this, PhraseData::AddMinutes, val);
|
return ConditionalPhrase(this, PhraseData::AddMinutes, val);
|
||||||
}
|
}
|
||||||
ConditionalPhrase addSeconds(int val) {
|
ConditionalPhrase addSeconds(int val) {
|
||||||
if (!is_valid_template<T, QTime>())
|
if (!is_valid_template<T, QTime>())
|
||||||
return ConditionalPhrase();
|
return ConditionalPhrase();
|
||||||
|
if (std::is_same<T, QDateTime>::value)
|
||||||
|
return ConditionalPhrase(this, PhraseData::AddSecondsDateTime, val);
|
||||||
return ConditionalPhrase(this, PhraseData::AddSeconds, val);
|
return ConditionalPhrase(this, PhraseData::AddSeconds, val);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -64,6 +64,14 @@ public:
|
||||||
AddMinutes,
|
AddMinutes,
|
||||||
AddSeconds,
|
AddSeconds,
|
||||||
|
|
||||||
|
// sqlite need to know works with qdate, qtime or qdatetime
|
||||||
|
AddYearsDateTime,
|
||||||
|
AddMonthsDateTime,
|
||||||
|
AddDaysDateTime,
|
||||||
|
AddHoursDateTime,
|
||||||
|
AddMinutesDateTime,
|
||||||
|
AddSecondsDateTime,
|
||||||
|
|
||||||
DatePartYear,
|
DatePartYear,
|
||||||
DatePartMonth,
|
DatePartMonth,
|
||||||
DatePartDay,
|
DatePartDay,
|
||||||
|
|
|
||||||
|
|
@ -35,19 +35,103 @@ void DateTimeTest::initTestCase()
|
||||||
db.sampleTables()->query()->remove();
|
db.sampleTables()->query()->remove();
|
||||||
}
|
}
|
||||||
|
|
||||||
void DateTimeTest::date()
|
#define TEST_DATE(date, command, n) \
|
||||||
|
do { \
|
||||||
|
auto s = Nut::create<SampleTable>(); \
|
||||||
|
s->setD(date); \
|
||||||
|
db.sampleTables()->append(s); \
|
||||||
|
db.saveChanges(); \
|
||||||
|
auto count = db.sampleTables()->query() \
|
||||||
|
->where(SampleTable::dField().command(n) == date.command(n)) \
|
||||||
|
->count(); \
|
||||||
|
QTEST_ASSERT(count); \
|
||||||
|
} while (false)
|
||||||
|
|
||||||
|
#define TEST_TIME(time, command, n, num) \
|
||||||
|
do { \
|
||||||
|
auto s = Nut::create<SampleTable>(); \
|
||||||
|
s->setT(time); \
|
||||||
|
db.sampleTables()->append(s); \
|
||||||
|
db.saveChanges(); \
|
||||||
|
auto count = db.sampleTables()->query() \
|
||||||
|
->where(SampleTable::tField().command(n) == time.addSecs(num)) \
|
||||||
|
->count(); \
|
||||||
|
QTEST_ASSERT(count); \
|
||||||
|
} while (false)
|
||||||
|
|
||||||
|
#define TEST_DATE2(datetime, command, n) \
|
||||||
|
do { \
|
||||||
|
auto s = Nut::create<SampleTable>(); \
|
||||||
|
s->setDT(datetime); \
|
||||||
|
db.sampleTables()->append(s); \
|
||||||
|
db.saveChanges(); \
|
||||||
|
auto count = db.sampleTables()->query() \
|
||||||
|
->where(SampleTable::dtField().command(n) == datetime.command(n)); \
|
||||||
|
->count(); \
|
||||||
|
QTEST_ASSERT(count); \
|
||||||
|
} while (false)
|
||||||
|
|
||||||
|
#define TEST_TIME2(datetime, command, n, num) \
|
||||||
|
do { \
|
||||||
|
auto s = Nut::create<SampleTable>(); \
|
||||||
|
s->setDT(datetime); \
|
||||||
|
db.sampleTables()->append(s); \
|
||||||
|
db.saveChanges(); \
|
||||||
|
auto count = db.sampleTables()->query() \
|
||||||
|
->where(SampleTable::dtField().command(n) == datetime.addSecs(num)); \
|
||||||
|
->count(); \
|
||||||
|
QTEST_ASSERT(count); \
|
||||||
|
} while (false)
|
||||||
|
|
||||||
|
#define MINUTE(m) m * 60
|
||||||
|
#define HOUR(h) MINUTE(h) * 60
|
||||||
|
|
||||||
|
void DateTimeTest::dateAdd()
|
||||||
{
|
{
|
||||||
auto s = Nut::create<SampleTable>();
|
QDate d = QDate::currentDate();
|
||||||
s->setD(_baseDateTime.addDays(10).date());
|
|
||||||
db.sampleTables()->append(s);
|
|
||||||
db.saveChanges();
|
|
||||||
|
|
||||||
auto q = db.sampleTables()->query()
|
TEST_DATE(d, addYears, 10);
|
||||||
->where(SampleTable::dField().addDays(9) < QDate::currentDate().addDays(10));
|
TEST_DATE(d, addMonths, 10);
|
||||||
|
TEST_DATE(d, addDays, 10);
|
||||||
|
|
||||||
auto count = q->count();
|
TEST_DATE(d, addYears, -10);
|
||||||
qDebug() << q->sqlCommand();
|
TEST_DATE(d, addMonths, -10);
|
||||||
QTEST_ASSERT(count);
|
TEST_DATE(d, addDays, -10);
|
||||||
|
}
|
||||||
|
|
||||||
|
void DateTimeTest::timeAdd()
|
||||||
|
{
|
||||||
|
QTime t = QTime::currentTime();
|
||||||
|
|
||||||
|
TEST_TIME(t, addHours, 10, HOUR(10));
|
||||||
|
TEST_TIME(t, addMinutes, 10, MINUTE(10));
|
||||||
|
TEST_TIME(t, addSeconds, 10, 10);
|
||||||
|
|
||||||
|
TEST_TIME(t, addHours, -10, HOUR(-10));
|
||||||
|
TEST_TIME(t, addMinutes, -10, MINUTE(-10));
|
||||||
|
TEST_TIME(t, addSeconds, -10, -10);
|
||||||
|
}
|
||||||
|
|
||||||
|
void DateTimeTest::dateTimeAdd()
|
||||||
|
{
|
||||||
|
QDateTime dt = QDateTime::currentDateTime();
|
||||||
|
|
||||||
|
TEST_DATE2(dt, addYears, 10);
|
||||||
|
TEST_DATE2(dt, addMonths, 10);
|
||||||
|
TEST_DATE2(dt, addDays, 10);
|
||||||
|
|
||||||
|
TEST_DATE2(dt, addYears, -10);
|
||||||
|
TEST_DATE2(dt, addMonths, -10);
|
||||||
|
TEST_DATE2(dt, addDays, -10);
|
||||||
|
|
||||||
|
|
||||||
|
TEST_TIME2(dt, addHours, 10, HOUR(10));
|
||||||
|
TEST_TIME2(dt, addMinutes, 10, MINUTE(10));
|
||||||
|
TEST_TIME2(dt, addSeconds, 10, 10);
|
||||||
|
|
||||||
|
TEST_TIME2(dt, addHours, -10, HOUR(-10));
|
||||||
|
TEST_TIME2(dt, addMinutes, -10, MINUTE(-10));
|
||||||
|
TEST_TIME2(dt, addSeconds, -10, -10);
|
||||||
}
|
}
|
||||||
|
|
||||||
void DateTimeTest::cleanupTestCase()
|
void DateTimeTest::cleanupTestCase()
|
||||||
|
|
|
||||||
|
|
@ -30,7 +30,9 @@ signals:
|
||||||
|
|
||||||
private slots:
|
private slots:
|
||||||
void initTestCase();
|
void initTestCase();
|
||||||
void date();
|
void dateAdd();
|
||||||
|
void timeAdd();
|
||||||
|
void dateTimeAdd();
|
||||||
void cleanupTestCase();
|
void cleanupTestCase();
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue