Changeset 20a6010


Ignore:
Timestamp:
12/30/09 14:50:23 (12 years ago)
Author:
komarma <komarma@…>
Branches:
master, qt5
Children:
489f262
Parents:
5a73d27
Message:

Adding database loading and data conversion to orm module

Location:
src
Files:
2 deleted
5 edited

Legend:

Unmodified
Added
Removed
  • src/model/event.cpp

    r5a73d27 r20a6010  
    11#include "event.h"
    22
    3 QStringList const Event::sColNames = QStringList()
    4     << "id" << "xid_conference" << "start" << "duration" << "xid_activity" << "type" << "language";
     3QSqlRecord const Event::sColumns = Event::toRecord(QList<QSqlField>()
     4    << QSqlField("id", QVariant::Int)
     5    << QSqlField("xid_conference", QVariant::Int)
     6    << QSqlField("start", QVariant::DateTime)
     7    << QSqlField("duration", QVariant::Int)
     8    << QSqlField("xid_activity", QVariant::Int)
     9    << QSqlField("type", QVariant::String)
     10    << QSqlField("language", QVariant::String));
    511
    612QString const Event::sTableName = QString("event");
     13
     14Event Event::getById(int id, int conferenceId)
     15{
     16    QString query = selectQuery() + "WHERE id = :id AND xid_conference = :conf";
     17
     18    QSqlQuery q;
     19    q.prepare(query);
     20    q.bindValue(":id", id);
     21    q.bindValue(":conf", conferenceId);
     22    return loadOne(q);
     23}
  • src/model/event.h

    r5a73d27 r20a6010  
    1616};
    1717
    18 class Event : public OrmRecord <Event>
     18class Event : public OrmRecord<Event>
    1919{
    2020public:
    21     // column definition
    22     enum Column
    23     {
    24         Id = 0,
    25         Conference,
    26         Start,
    27         Duration,
    28         Activity,
    29         Type,
    30         Language
    31     };
    32 
    33     static QStringList const sColNames;
    34 
     21    static QSqlRecord const sColumns;
    3522    static QString const sTableName;
    3623
    3724public:
    38     static Event getById(int id, int conferenceId) { return Event(); } //EventTable::selectOne("id=1"); }
     25    static Event getById(int id, int conferenceId);
    3926
    4027public:
    41     int id() const { return value(Id).toInt(); }
    42     int conferenceId() const { return value(Conference).toInt(); }
    43     QDateTime start() const { return value(Start).toDateTime(); }
    44     int duration() const { return value(Duration).toInt(); }
    45     int activityId() const { return value(Activity).toInt(); }
    46     int typeId() const { return value(Type).toInt(); }
    47     int languageId() const { return value(Language).toInt(); }
     28    int id() const { return value("id").toInt(); }
     29    int conferenceId() const { return value("xid_conference").toInt(); }
     30    QDateTime start() const { return value("start").toDateTime(); }
     31    int duration() const { return value("duration").toInt(); }
     32    int activityId() const { return value("xid_activity").toInt(); }
     33    int typeId() const { return value("type").toInt(); }
     34    int languageId() const { return value("language").toInt(); }
    4835
    49     void setId(int id) { setValue(Id, id); }
    50     void setConferenceId(int conferenceId) { setValue(Conference, conferenceId); }
    51     void setStart(const QDateTime& start) { setValue(Start, start); }
    52     void setDuration(int duration) { setValue(Duration, duration); }
    53     void setActivityId(int activityId) { setValue(Activity, activityId); }
    54     void setTypeId(int typeId) { setValue(Type, typeId); }
    55     void setLanguageId(int languageId) { setValue(Language, languageId); }
     36    void setId(int id) { setValue("id", id); }
     37    void setConferenceId(int conferenceId) { setValue("xid_conference", conferenceId); }
     38    void setStart(const QDateTime& start) { setValue("start", start); }
     39    void setDuration(int duration) { setValue("duration", duration); }
     40    void setActivityId(int activityId) { setValue("xid_activity", activityId); }
     41    void setTypeId(int typeId) { setValue("type", typeId); }
     42    void setLanguageId(int languageId) { setValue("language", languageId); }
     43
     44friend class EventTest;
    5645};
    5746
  • src/orm/ormrecord.h

    r5a73d27 r20a6010  
     1#ifndef ORMRECORD_H
     2#define ORMRECORD_H
     3
     4#include <QSqlQuery>
    15#include <QSqlRecord>
    26#include <QSqlField>
     7#include <QSqlError>
     8#include <QStringList>
     9#include <QDateTime>
     10#include <QDebug>
     11
     12class OrmException
     13{
     14};
     15
     16class OrmNoObjectException : OrmException
     17{
     18};
     19
     20class OrmSqlException : OrmException
     21{
     22public:
     23    OrmSqlException(const QString& text) : mText(text) {}
     24    QString text() const { return mText; }
     25
     26private:
     27    QString mText;
     28};
    329
    430template <typename T>
     
    632{
    733public:
    8     static QString colName(int col);
     34    OrmRecord();
     35    static T hydrate(const QSqlRecord& record);
    936
    1037protected:
    11     QVariant value(int col) const;
    12     void setValue(int col, QVariant value);
     38    QVariant value(QString col) const;
     39    void setValue(QString col, QVariant value);
     40
     41    static T loadOne(QSqlQuery query);
     42    static QList<T> load(QSqlQuery query);
     43
     44    // auxiliary methods
     45    static QString columnsForSelect(const QString& prefix = QString());
     46    static QString selectQuery();
     47    static QSqlRecord toRecord(const QList<QSqlField> & columnList);
     48
     49    static QVariant convertToC(QVariant value, QVariant::Type colType);
     50    static QVariant convertToDb(QVariant value, QVariant::Type colType);
    1351};
    1452
    1553template <typename T>
    16 QString OrmRecord<T>::colName(int col)
     54OrmRecord<T>::OrmRecord()
    1755{
    18     return T::sColNames.at(col);
     56    QSqlRecord::operator=(T::sColumns);
    1957}
    2058
    2159template <typename T>
    22 QVariant OrmRecord<T>::value(int col) const
     60T OrmRecord<T>::hydrate(const QSqlRecord& record)
    2361{
    24     Q_ASSERT(col >= 0 && col < T::sColNames.count());
    25 
    26     return QSqlRecord::value(T::sColNames.at(col));
     62    T object;
     63    object.QSqlRecord::operator=(record);
     64    return object;
    2765}
    2866
    2967template <typename T>
    30 void OrmRecord<T>::setValue(int col, QVariant value)
     68QVariant OrmRecord<T>::value(QString col) const
    3169{
    32     Q_ASSERT(col >= 0 && col < T::sColNames.count());
     70    return convertToC(QSqlRecord::value(col), T::sColumns.field(col).type());
     71}
    3372
    34     QString fieldName = T::sColNames.at(col);
     73template <typename T>
     74void OrmRecord<T>::setValue(QString col, QVariant value)
     75{
     76    QSqlRecord::setValue(col, convertToDb(value, T::sColumns.field(col).type()));
     77}
    3578
    36     if (!contains(fieldName))
     79template <typename T>
     80T OrmRecord<T>::loadOne(QSqlQuery query)
     81{
     82    if (!query.isActive())
    3783    {
    38         append(QSqlField(fieldName, value.type()));
     84        if (!query.exec())
     85        {
     86            throw new OrmSqlException(query.lastError().text());
     87        }
    3988    }
    4089
    41     QSqlRecord::setValue(fieldName, value);
     90    if (!query.next())
     91    {
     92        throw new OrmNoObjectException();
     93    }
     94
     95    return hydrate(query.record());
    4296}
     97
     98template <typename T>
     99QList<T> OrmRecord<T>::load(QSqlQuery query)
     100{
     101    if (!query.isActive())
     102    {
     103        if (!query.exec())
     104        {
     105            throw new OrmSqlException(query.lastError().text());
     106        }
     107    }
     108
     109    QList<T> objects;
     110    while (query.next())
     111    {
     112        objects << hydrate(query.record());
     113    }
     114
     115    return objects;
     116}
     117
     118template <typename T>
     119QString OrmRecord<T>::columnsForSelect(const QString& prefix)
     120{
     121    QStringList prefixedColumns;
     122    for (int i=0; i<T::sColumns.count(); i++)
     123    {
     124        prefixedColumns.append(prefix.isEmpty() ?
     125            T::sColumns.field(i).name() :
     126            QString("%1.%2").arg(prefix, T::sColumns.field(i).name()));
     127    }
     128    return prefixedColumns.join(",");
     129}
     130
     131template <typename T>
     132QString OrmRecord<T>::selectQuery()
     133{
     134    return QString("SELECT %1 FROM %2 ").arg(columnsForSelect(), T::sTableName);
     135}
     136
     137template <typename T>
     138QSqlRecord OrmRecord<T>::toRecord(const QList<QSqlField> & columnList)
     139{
     140    QSqlRecord record;
     141    foreach (const QSqlField & col, columnList)
     142    {
     143        record.append(col);
     144    }
     145    return record;
     146}
     147
     148template <typename T>
     149QVariant OrmRecord<T>::convertToC(QVariant value, QVariant::Type colType)
     150{
     151    if (colType == QVariant::DateTime &&
     152        (value.type() == QVariant::UInt || value.type() == QVariant::Int))
     153    {
     154        QDateTime date;
     155        date.setTime_t(value.toUInt());
     156        return date;
     157    }
     158
     159    return value;
     160}
     161
     162template <typename T>
     163QVariant OrmRecord<T>::convertToDb(QVariant value, QVariant::Type colType)
     164{
     165    if (colType == QVariant::DateTime && value.type() == QVariant::DateTime)
     166    {
     167        return value.toDateTime().toTime_t();
     168    }
     169
     170    return value;
     171}
     172
     173#endif // ORMRECORD_H
  • src/test/model/eventtest.cpp

    r5a73d27 r20a6010  
    1212    // Connect to the test database. Ask Mr. Pavelka to generate one for you :)
    1313    QSqlDatabase db = QSqlDatabase::addDatabase("QSQLITE");
    14     db.setDatabaseName("fostem-test.sqlite");
     14    db.setDatabaseName("fosdem-test.sqlite");
    1515    QVERIFY(db.open());
    1616}
     
    2828}
    2929
    30 void EventTest::colNames()
    31 {
    32     QCOMPARE(Event::colName(Event::Id), QString("id"));
    33     QCOMPARE(Event::colName(Event::Conference), QString("xid_conference"));
    34     QCOMPARE(Event::colName(Event::Start), QString("start"));
    35     QCOMPARE(Event::colName(Event::Duration), QString("duration"));
    36     QCOMPARE(Event::colName(Event::Activity), QString("xid_activity"));
    37     QCOMPARE(Event::colName(Event::Type), QString("type"));
    38     QCOMPARE(Event::colName(Event::Language), QString("language"));
    39 }
    40 
    4130void EventTest::storingValues()
    4231{
    4332    Event event;
    44     QCOMPARE(event.id(), 0);
    4533
    4634    event.setId(10);
     35    event.setConferenceId(20);
     36    event.setStart(QDateTime::fromString("Sat Feb 7 11:30:00 2009"));
     37    event.setDuration(30);
     38    event.setActivityId(40);
     39    event.setTypeId(50);
     40    event.setLanguageId(60);
     41
    4742    QCOMPARE(event.id(), 10);
    48 
    49     event.setConferenceId(20);
    5043    QCOMPARE(event.conferenceId(), 20);
    51 
    52     event.setStart(QDateTime::fromString("Sat Feb 7 11:30:00 2009"));
    5344    QCOMPARE(event.start(), QDateTime::fromString("Sat Feb 7 11:30:00 2009"));
    54 
    55     event.setDuration(30);
    5645    QCOMPARE(event.duration(), 30);
    57 
    58     event.setActivityId(40);
    5946    QCOMPARE(event.activityId(), 40);
    60 
    61     event.setTypeId(50);
    6247    QCOMPARE(event.typeId(), 50);
    63 
    64     event.setLanguageId(60);
    6548    QCOMPARE(event.languageId(), 60);
    6649}
     50
     51
     52void EventTest::hydrate()
     53{
     54    QSqlRecord record;
     55    record.append(QSqlField("duration", QVariant::Int));
     56    record.append(QSqlField("id", QVariant::Int));
     57    record.setValue(0, 10);
     58    record.setValue(1, 20);
     59
     60    Event event = Event::hydrate(record);
     61    QCOMPARE(event.id(), 20);
     62    QCOMPARE(event.duration(), 10);
     63}
     64
     65void EventTest::columnsForSelect()
     66{
     67    QCOMPARE(Event::columnsForSelect(), QString("id,xid_conference,start,duration,xid_activity,type,language"));
     68    QCOMPARE(Event::columnsForSelect("t0"),
     69             QString("t0.id,t0.xid_conference,t0.start,t0.duration,t0.xid_activity,t0.type,t0.language"));
     70}
     71
     72void EventTest::selectQuery()
     73{
     74    QCOMPARE(Event::selectQuery(), QString("SELECT id,xid_conference,start,duration,xid_activity,type,language FROM event "));
     75}
  • src/test/model/eventtest.h

    r5a73d27 r20a6010  
    1212
    1313    void getById();
    14     void colNames();
    1514    void storingValues();
     15    void hydrate();
     16    void columnsForSelect();
     17    void selectQuery();
    1618};
    1719
Note: See TracChangeset for help on using the changeset viewer.