Changeset 20a6010
- Timestamp:
- 12/30/09 14:50:23 (13 years ago)
- Branches:
- master, qt5
- Children:
- 489f262
- Parents:
- 5a73d27
- Location:
- src
- Files:
-
- 2 deleted
- 5 edited
Legend:
- Unmodified
- Added
- Removed
-
src/model/event.cpp
r5a73d27 r20a6010 1 1 #include "event.h" 2 2 3 QStringList const Event::sColNames = QStringList() 4 << "id" << "xid_conference" << "start" << "duration" << "xid_activity" << "type" << "language"; 3 QSqlRecord 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)); 5 11 6 12 QString const Event::sTableName = QString("event"); 13 14 Event 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 16 16 }; 17 17 18 class Event : public OrmRecord 18 class Event : public OrmRecord<Event> 19 19 { 20 20 public: 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; 35 22 static QString const sTableName; 36 23 37 24 public: 38 static Event getById(int id, int conferenceId) { return Event(); } //EventTable::selectOne("id=1"); }25 static Event getById(int id, int conferenceId); 39 26 40 27 public: 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(); } 48 35 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 44 friend class EventTest; 56 45 }; 57 46 -
src/orm/ormrecord.h
r5a73d27 r20a6010 1 #ifndef ORMRECORD_H 2 #define ORMRECORD_H 3 4 #include <QSqlQuery> 1 5 #include <QSqlRecord> 2 6 #include <QSqlField> 7 #include <QSqlError> 8 #include <QStringList> 9 #include <QDateTime> 10 #include <QDebug> 11 12 class OrmException 13 { 14 }; 15 16 class OrmNoObjectException : OrmException 17 { 18 }; 19 20 class OrmSqlException : OrmException 21 { 22 public: 23 OrmSqlException(const QString& text) : mText(text) {} 24 QString text() const { return mText; } 25 26 private: 27 QString mText; 28 }; 3 29 4 30 template <typename T> … … 6 32 { 7 33 public: 8 static QString colName(int col); 34 OrmRecord(); 35 static T hydrate(const QSqlRecord& record); 9 36 10 37 protected: 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); 13 51 }; 14 52 15 53 template <typename T> 16 QString OrmRecord<T>::colName(int col)54 OrmRecord<T>::OrmRecord() 17 55 { 18 return T::sColNames.at(col);56 QSqlRecord::operator=(T::sColumns); 19 57 } 20 58 21 59 template <typename T> 22 QVariant OrmRecord<T>::value(int col) const 60 T OrmRecord<T>::hydrate(const QSqlRecord& record) 23 61 { 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; 27 65 } 28 66 29 67 template <typename T> 30 void OrmRecord<T>::setValue(int col, QVariant value) 68 QVariant OrmRecord<T>::value(QString col) const 31 69 { 32 Q_ASSERT(col >= 0 && col < T::sColNames.count()); 70 return convertToC(QSqlRecord::value(col), T::sColumns.field(col).type()); 71 } 33 72 34 QString fieldName = T::sColNames.at(col); 73 template <typename T> 74 void OrmRecord<T>::setValue(QString col, QVariant value) 75 { 76 QSqlRecord::setValue(col, convertToDb(value, T::sColumns.field(col).type())); 77 } 35 78 36 if (!contains(fieldName)) 79 template <typename T> 80 T OrmRecord<T>::loadOne(QSqlQuery query) 81 { 82 if (!query.isActive()) 37 83 { 38 append(QSqlField(fieldName, value.type())); 84 if (!query.exec()) 85 { 86 throw new OrmSqlException(query.lastError().text()); 87 } 39 88 } 40 89 41 QSqlRecord::setValue(fieldName, value); 90 if (!query.next()) 91 { 92 throw new OrmNoObjectException(); 93 } 94 95 return hydrate(query.record()); 42 96 } 97 98 template <typename T> 99 QList<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 118 template <typename T> 119 QString 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 131 template <typename T> 132 QString OrmRecord<T>::selectQuery() 133 { 134 return QString("SELECT %1 FROM %2 ").arg(columnsForSelect(), T::sTableName); 135 } 136 137 template <typename T> 138 QSqlRecord 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 148 template <typename T> 149 QVariant 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 162 template <typename T> 163 QVariant 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 12 12 // Connect to the test database. Ask Mr. Pavelka to generate one for you :) 13 13 QSqlDatabase db = QSqlDatabase::addDatabase("QSQLITE"); 14 db.setDatabaseName("fos tem-test.sqlite");14 db.setDatabaseName("fosdem-test.sqlite"); 15 15 QVERIFY(db.open()); 16 16 } … … 28 28 } 29 29 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 41 30 void EventTest::storingValues() 42 31 { 43 32 Event event; 44 QCOMPARE(event.id(), 0);45 33 46 34 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 47 42 QCOMPARE(event.id(), 10); 48 49 event.setConferenceId(20);50 43 QCOMPARE(event.conferenceId(), 20); 51 52 event.setStart(QDateTime::fromString("Sat Feb 7 11:30:00 2009"));53 44 QCOMPARE(event.start(), QDateTime::fromString("Sat Feb 7 11:30:00 2009")); 54 55 event.setDuration(30);56 45 QCOMPARE(event.duration(), 30); 57 58 event.setActivityId(40);59 46 QCOMPARE(event.activityId(), 40); 60 61 event.setTypeId(50);62 47 QCOMPARE(event.typeId(), 50); 63 64 event.setLanguageId(60);65 48 QCOMPARE(event.languageId(), 60); 66 49 } 50 51 52 void 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 65 void 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 72 void 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 12 12 13 13 void getById(); 14 void colNames();15 14 void storingValues(); 15 void hydrate(); 16 void columnsForSelect(); 17 void selectQuery(); 16 18 }; 17 19
Note: See TracChangeset
for help on using the changeset viewer.