From 5a73d273c52b554484cf5e3ae56deee9255d9389 Mon Sep 17 00:00:00 2001 From: komarma Date: Tue, 29 Dec 2009 17:04:41 +0000 Subject: [PATCH] Adding orm module --- src/fosdem.pro | 2 +- src/model/event.cpp | 9 ++--- src/model/event.h | 69 +++++++++++++++++++++++---------- src/model/model.pro | 6 ++- src/orm/orm.pro | 9 +++++ src/orm/ormrecord.h | 42 ++++++++++++++++++++ src/orm/sqlcondition.cpp | 23 +++++++++++ src/orm/sqlcondition.h | 74 ++++++++++++++++++++++++++++++++++++ src/test/model/eventtest.cpp | 40 +++++++++++++++++++ src/test/model/eventtest.h | 2 + src/test/test.pro | 6 +-- 11 files changed, 251 insertions(+), 31 deletions(-) create mode 100644 src/orm/orm.pro create mode 100644 src/orm/ormrecord.h create mode 100644 src/orm/sqlcondition.cpp create mode 100644 src/orm/sqlcondition.h diff --git a/src/fosdem.pro b/src/fosdem.pro index 2f6d07c..ce4a843 100644 --- a/src/fosdem.pro +++ b/src/fosdem.pro @@ -1,4 +1,4 @@ TEMPLATE = subdirs -SUBDIRS = model gui app test +SUBDIRS = orm model gui app test CONFIG += ordered diff --git a/src/model/event.cpp b/src/model/event.cpp index fafbe20..58b6730 100644 --- a/src/model/event.cpp +++ b/src/model/event.cpp @@ -1,7 +1,6 @@ #include "event.h" -Event Event::getById(int id, int conferenceId) -{ - Event newEvent; - return newEvent; -} +QStringList const Event::sColNames = QStringList() + << "id" << "xid_conference" << "start" << "duration" << "xid_activity" << "type" << "language"; + +QString const Event::sTableName = QString("event"); diff --git a/src/model/event.h b/src/model/event.h index 8a63407..50890ef 100644 --- a/src/model/event.h +++ b/src/model/event.h @@ -2,32 +2,59 @@ #define EVENT_H #include +#include +#include -class Event +#include + + +/** + NoSuchEventException is thrown when required event does not exist. +*/ +class NoSuchEventException +{ +}; + +class Event : public OrmRecord { public: - static Event getById(int id, int conferenceId); + // column definition + enum Column + { + Id = 0, + Conference, + Start, + Duration, + Activity, + Type, + Language + }; + + static QStringList const sColNames; + + static QString const sTableName; + +public: + static Event getById(int id, int conferenceId) { return Event(); } //EventTable::selectOne("id=1"); } public: - int id() const { return mId; } - int conferenceId() const { return mConferenceId; } - QDateTime start() const { return mStart; } - int duration() const { return mDuration; } - int activityId() const { return mActivityId; } - int typeId() const { return mTypeId; } - int languageId() const { return mLanguageId; } - -private: - Event() {}; // private constructor, use static methods to access instances - -private: - int mId; - int mConferenceId; - QDateTime mStart; - int mDuration; - int mActivityId; - int mTypeId; - int mLanguageId; + int id() const { return value(Id).toInt(); } + int conferenceId() const { return value(Conference).toInt(); } + QDateTime start() const { return value(Start).toDateTime(); } + int duration() const { return value(Duration).toInt(); } + int activityId() const { return value(Activity).toInt(); } + int typeId() const { return value(Type).toInt(); } + int languageId() const { return value(Language).toInt(); } + + void setId(int id) { setValue(Id, id); } + void setConferenceId(int conferenceId) { setValue(Conference, conferenceId); } + void setStart(const QDateTime& start) { setValue(Start, start); } + void setDuration(int duration) { setValue(Duration, duration); } + void setActivityId(int activityId) { setValue(Activity, activityId); } + void setTypeId(int typeId) { setValue(Type, typeId); } + void setLanguageId(int languageId) { setValue(Language, languageId); } }; + + #endif // EVENT_H diff --git a/src/model/model.pro b/src/model/model.pro index 4c0e441..726488f 100644 --- a/src/model/model.pro +++ b/src/model/model.pro @@ -2,9 +2,13 @@ TEMPLATE = lib TARGET = model DESTDIR = ../bin CONFIG += static +QT += sql # module dependencies -DEPENDPATH += . +LIBS += -L$$DESTDIR -lorm +INCLUDEPATH += ../orm +DEPENDPATH += . ../orm +TARGETDEPS += $$DESTDIR/liborm.a HEADERS += event.h SOURCES += event.cpp diff --git a/src/orm/orm.pro b/src/orm/orm.pro new file mode 100644 index 0000000..91472fe --- /dev/null +++ b/src/orm/orm.pro @@ -0,0 +1,9 @@ +TEMPLATE = lib +TARGET = orm +DESTDIR = ../bin +CONFIG += static +QT += sql + +# module dependencies +DEPENDPATH += . +HEADERS += ormrecord.h diff --git a/src/orm/ormrecord.h b/src/orm/ormrecord.h new file mode 100644 index 0000000..754bc4f --- /dev/null +++ b/src/orm/ormrecord.h @@ -0,0 +1,42 @@ +#include +#include + +template +class OrmRecord : protected QSqlRecord +{ +public: + static QString colName(int col); + +protected: + QVariant value(int col) const; + void setValue(int col, QVariant value); +}; + +template +QString OrmRecord::colName(int col) +{ + return T::sColNames.at(col); +} + +template +QVariant OrmRecord::value(int col) const +{ + Q_ASSERT(col >= 0 && col < T::sColNames.count()); + + return QSqlRecord::value(T::sColNames.at(col)); +} + +template +void OrmRecord::setValue(int col, QVariant value) +{ + Q_ASSERT(col >= 0 && col < T::sColNames.count()); + + QString fieldName = T::sColNames.at(col); + + if (!contains(fieldName)) + { + append(QSqlField(fieldName, value.type())); + } + + QSqlRecord::setValue(fieldName, value); +} diff --git a/src/orm/sqlcondition.cpp b/src/orm/sqlcondition.cpp new file mode 100644 index 0000000..6aece67 --- /dev/null +++ b/src/orm/sqlcondition.cpp @@ -0,0 +1,23 @@ +#include "sqlcondition.h" + +//static char* SqlTerm::sOperatorNames[] = {"=", "<>", ">", ">=", "<", "<="}; +// +//QString SqlTerm::toString() const +//{ +// return QString("%1 %2 %3").arg(mColumn, sOperatorNames[mOperator], mValue); +//} +// +//QString SqlAndCondition::toString() const +//{ +// return QString("(%1) AND (%2)").arg(mLeft.toString(), mRight.toString()); +//} +// +//QString SqlOrCondition::toString() const +//{ +// return QString("(%1) OR (%2)").arg(mLeft.toString(), mRight.toString()); +//} +// +//QString SqlNotCondition::toString() const +//{ +// return QString("!(%1)").arg(mCond.toString()); +//} diff --git a/src/orm/sqlcondition.h b/src/orm/sqlcondition.h new file mode 100644 index 0000000..6b1a455 --- /dev/null +++ b/src/orm/sqlcondition.h @@ -0,0 +1,74 @@ +#ifndef SQLCONDITION_H +#define SQLCONDITION_H + +//#include + +//class SqlCondition +//{ +//public: +// enum Operator { eq = 0, ne, gt, ge, lt, le }; +// +//public: +// SqlCondition(const QLatin1String& column, Operator op, const QVariant& value) : +// mColumn(column), mValue(value), mOperator(op) {} +// +// virtual QString toString() const; +//private: +// QLatin1String mColumn; +// QVariant mValue; +// Operator mOperator; +// +//private: +// static char* sOperatorNames[]; +//}; +// +//class SqlAndCondition : public SqlCondition +//{ +// SqlCondition mLeft; +// SqlCondition mRight; +// +//public: +// SqlAndCondition(const SqlCondition& left, const SqlCondition& right): +// mLeft(left), mRight(right) {} +// +// QString toString() const; +//}; +// +//class SqlOrCondition : public SqlCondition +//{ +// SqlCondition mLeft; +// SqlCondition mRight; +// +//public: +// SqlOrCondition(const SqlCondition& left, const SqlCondition& right): +// mLeft(left), mRight(right) {} +// +// QString toString() const; +//}; +// +//class SqlNotCondition : public SqlCondition +//{ +// SqlCondition mCond; +//public: +// SqlNotCondition(const SqlCondition& cond): mCond(new SqlCondition(cond)) {} +// +// QString toString() const; +//}; +// +//class SqlColumn +//{ +//public: +// SqlColumn(const QLatin1String& column) : mColumn(column) {} +// +// SqlCondition const operator==(const QVariant& value) { return SqlCondition(mColumn, SqlCondition::eq, value); } +// SqlCondition const operator!=(const QVariant& value) { return SqlCondition(mColumn, SqlCondition::ne, value); } +// SqlCondition const operator>=(const QVariant& value) { return SqlCondition(mColumn, SqlCondition::ge, value); } +// SqlCondition const operator> (const QVariant& value) { return SqlCondition(mColumn, SqlCondition::gt, value); } +// SqlCondition const operator<=(const QVariant& value) { return SqlCondition(mColumn, SqlCondition::le, value); } +// SqlCondition const operator< (const QVariant& value) { return SqlCondition(mColumn, SqlCondition::lt, value); } +//private: +// QLatin1String mColumn; +//}; + + +#endif // SQLCONDITION_H diff --git a/src/test/model/eventtest.cpp b/src/test/model/eventtest.cpp index 793154d..2219f62 100644 --- a/src/test/model/eventtest.cpp +++ b/src/test/model/eventtest.cpp @@ -3,6 +3,8 @@ #include #include +#include + #include void EventTest::initTestCase() @@ -24,3 +26,41 @@ void EventTest::getById() QCOMPARE(event.typeId(), 0); QCOMPARE(event.languageId(), 0); } + +void EventTest::colNames() +{ + QCOMPARE(Event::colName(Event::Id), QString("id")); + QCOMPARE(Event::colName(Event::Conference), QString("xid_conference")); + QCOMPARE(Event::colName(Event::Start), QString("start")); + QCOMPARE(Event::colName(Event::Duration), QString("duration")); + QCOMPARE(Event::colName(Event::Activity), QString("xid_activity")); + QCOMPARE(Event::colName(Event::Type), QString("type")); + QCOMPARE(Event::colName(Event::Language), QString("language")); +} + +void EventTest::storingValues() +{ + Event event; + QCOMPARE(event.id(), 0); + + event.setId(10); + QCOMPARE(event.id(), 10); + + event.setConferenceId(20); + QCOMPARE(event.conferenceId(), 20); + + event.setStart(QDateTime::fromString("Sat Feb 7 11:30:00 2009")); + QCOMPARE(event.start(), QDateTime::fromString("Sat Feb 7 11:30:00 2009")); + + event.setDuration(30); + QCOMPARE(event.duration(), 30); + + event.setActivityId(40); + QCOMPARE(event.activityId(), 40); + + event.setTypeId(50); + QCOMPARE(event.typeId(), 50); + + event.setLanguageId(60); + QCOMPARE(event.languageId(), 60); +} diff --git a/src/test/model/eventtest.h b/src/test/model/eventtest.h index b20386f..4e479b0 100644 --- a/src/test/model/eventtest.h +++ b/src/test/model/eventtest.h @@ -11,6 +11,8 @@ private slots: void initTestCase(); void getById(); + void colNames(); + void storingValues(); }; diff --git a/src/test/test.pro b/src/test/test.pro index af4e3e9..47ab4b4 100644 --- a/src/test/test.pro +++ b/src/test/test.pro @@ -6,9 +6,9 @@ QT += sql # module dependencies LIBS += -L$$DESTDIR -lgui -lmodel -INCLUDEPATH += ../gui ../model -DEPENDPATH += . ../gui ../model -TARGETDEPS += $$DESTDIR/libmodel.a $$DESTDIR/libgui.a +INCLUDEPATH += ../gui ../model ../orm +DEPENDPATH += . ../gui ../model ../orm +TARGETDEPS += $$DESTDIR/libmodel.a $$DESTDIR/libgui.a $$DESTDIR/liborm.a SOURCES += main.cpp \ model/EventTest.cpp -- 2.39.5