TEMPLATE = subdirs
-SUBDIRS = model gui app test
+SUBDIRS = orm model gui app test
CONFIG += ordered
#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");
#define EVENT_H
#include <QDateTime>
+#include <QVector>
+#include <QStringList>
-class Event
+#include <ormrecord.h>
+
+
+/**
+ NoSuchEventException is thrown when required event does not exist.
+*/
+class NoSuchEventException
+{
+};
+
+class Event : public OrmRecord <Event>
{
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
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
--- /dev/null
+TEMPLATE = lib
+TARGET = orm
+DESTDIR = ../bin
+CONFIG += static
+QT += sql
+
+# module dependencies
+DEPENDPATH += .
+HEADERS += ormrecord.h
--- /dev/null
+#include <QSqlRecord>
+#include <QSqlField>
+
+template <typename T>
+class OrmRecord : protected QSqlRecord
+{
+public:
+ static QString colName(int col);
+
+protected:
+ QVariant value(int col) const;
+ void setValue(int col, QVariant value);
+};
+
+template <typename T>
+QString OrmRecord<T>::colName(int col)
+{
+ return T::sColNames.at(col);
+}
+
+template <typename T>
+QVariant OrmRecord<T>::value(int col) const
+{
+ Q_ASSERT(col >= 0 && col < T::sColNames.count());
+
+ return QSqlRecord::value(T::sColNames.at(col));
+}
+
+template <typename T>
+void OrmRecord<T>::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);
+}
--- /dev/null
+#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());
+//}
--- /dev/null
+#ifndef SQLCONDITION_H
+#define SQLCONDITION_H
+
+//#include <QVariant>
+
+//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
#include <QtTest>
#include <QSqlDatabase>
+#include <QDebug>
+
#include <event.h>
void EventTest::initTestCase()
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);
+}
void initTestCase();
void getById();
+ void colNames();
+ void storingValues();
};
# 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