16 class OrmNoObjectException : OrmException
20 class OrmSqlException : OrmException
23 OrmSqlException(const QString& text) : mText(text) {}
24 QString text() const { return mText; }
31 class OrmRecord : protected QSqlRecord
35 static T hydrate(const QSqlRecord& record);
38 QVariant value(QString col) const;
39 void setValue(QString col, QVariant value);
41 static T loadOne(QSqlQuery query);
42 static QList<T> load(QSqlQuery query);
45 static QString columnsForSelect(const QString& prefix = QString());
46 static QString selectQuery();
47 static QSqlRecord toRecord(const QList<QSqlField> & columnList);
49 static QVariant convertToC(QVariant value, QVariant::Type colType);
50 static QVariant convertToDb(QVariant value, QVariant::Type colType);
54 OrmRecord<T>::OrmRecord()
56 QSqlRecord::operator=(T::sColumns);
60 T OrmRecord<T>::hydrate(const QSqlRecord& record)
63 object.QSqlRecord::operator=(record);
68 QVariant OrmRecord<T>::value(QString col) const
70 return convertToC(QSqlRecord::value(col), T::sColumns.field(col).type());
74 void OrmRecord<T>::setValue(QString col, QVariant value)
76 QSqlRecord::setValue(col, convertToDb(value, T::sColumns.field(col).type()));
80 T OrmRecord<T>::loadOne(QSqlQuery query)
82 if (!query.isActive())
86 throw new OrmSqlException(query.lastError().text());
92 throw new OrmNoObjectException();
95 return hydrate(query.record());
99 QList<T> OrmRecord<T>::load(QSqlQuery query)
101 if (!query.isActive())
105 throw new OrmSqlException(query.lastError().text());
112 objects << hydrate(query.record());
118 template <typename T>
119 QString OrmRecord<T>::columnsForSelect(const QString& prefix)
121 QStringList prefixedColumns;
122 for (int i=0; i<T::sColumns.count(); i++)
124 prefixedColumns.append(prefix.isEmpty() ?
125 T::sColumns.field(i).name() :
126 QString("%1.%2").arg(prefix, T::sColumns.field(i).name()));
128 return prefixedColumns.join(",");
131 template <typename T>
132 QString OrmRecord<T>::selectQuery()
134 return QString("SELECT %1 FROM %2 ").arg(columnsForSelect(), T::sTableName);
137 template <typename T>
138 QSqlRecord OrmRecord<T>::toRecord(const QList<QSqlField> & columnList)
141 foreach (const QSqlField & col, columnList)
148 template <typename T>
149 QVariant OrmRecord<T>::convertToC(QVariant value, QVariant::Type colType)
151 if (colType == QVariant::DateTime &&
152 (value.type() == QVariant::UInt || value.type() == QVariant::Int))
155 date.setTime_t(value.toUInt());
162 template <typename T>
163 QVariant OrmRecord<T>::convertToDb(QVariant value, QVariant::Type colType)
165 if (colType == QVariant::DateTime && value.type() == QVariant::DateTime)
167 return value.toDateTime().toTime_t();
173 #endif // ORMRECORD_H