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

Adding database loading and data conversion to orm module

File:
1 edited

Legend:

Unmodified
Added
Removed
  • 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
Note: See TracChangeset for help on using the changeset viewer.