Adding orm module
authorkomarma <komarma@localhost>
Tue, 29 Dec 2009 17:04:41 +0000 (17:04 +0000)
committerkomarma <komarma@localhost>
Tue, 29 Dec 2009 17:04:41 +0000 (17:04 +0000)
src/fosdem.pro
src/model/event.cpp
src/model/event.h
src/model/model.pro
src/orm/orm.pro [new file with mode: 0644]
src/orm/ormrecord.h [new file with mode: 0644]
src/orm/sqlcondition.cpp [new file with mode: 0644]
src/orm/sqlcondition.h [new file with mode: 0644]
src/test/model/eventtest.cpp
src/test/model/eventtest.h
src/test/test.pro

index 2f6d07c..ce4a843 100644 (file)
@@ -1,4 +1,4 @@
 TEMPLATE = subdirs
-SUBDIRS  = model gui app test
+SUBDIRS  = orm model gui app test
 CONFIG += ordered
 
index fafbe20..58b6730 100644 (file)
@@ -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");
index 8a63407..50890ef 100644 (file)
@@ -2,32 +2,59 @@
 #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
index 4c0e441..726488f 100644 (file)
@@ -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 (file)
index 0000000..91472fe
--- /dev/null
@@ -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 (file)
index 0000000..754bc4f
--- /dev/null
@@ -0,0 +1,42 @@
+#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);
+}
diff --git a/src/orm/sqlcondition.cpp b/src/orm/sqlcondition.cpp
new file mode 100644 (file)
index 0000000..6aece67
--- /dev/null
@@ -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 (file)
index 0000000..6b1a455
--- /dev/null
@@ -0,0 +1,74 @@
+#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
index 793154d..2219f62 100644 (file)
@@ -3,6 +3,8 @@
 #include <QtTest>
 #include <QSqlDatabase>
 
+#include <QDebug>
+
 #include <event.h>
 
 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);
+}
index b20386f..4e479b0 100644 (file)
@@ -11,6 +11,8 @@ private slots:
     void initTestCase();
 
     void getById();
+    void colNames();
+    void storingValues();
 };
 
 
index af4e3e9..47ab4b4 100644 (file)
@@ -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