CuteEntityManager: Tickets
https://synlos.net/redmine/
https://synlos.net/redmine/redmine/favicon.ico?1669909233
2017-08-20T10:18:05Z
Redmine
Redmine
Fehler #645 (Erledigt): Bei refresh() zunächst id auf >0 checken
https://synlos.net/redmine/issues/645
2017-08-20T10:18:05Z
Sebastian Diel
sebastian.diel@web.de
<p>Bei einer abgeleiteten Entity (PupilChangeIncident: public Incident), welche noch nicht persistiert ist, wird eine Relation (QList<QSP<Group>> groupsBefore) gelöscht, sobald ich für die Basisklasse einen refresh() ausführe. Workaround: <br /><pre><code class="cpp syntaxhl" data-language="cpp"> <span class="k">if</span> <span class="p">(</span><span class="n">inc</span><span class="o">-></span><span class="n">getId</span><span class="p">()</span> <span class="o">></span> <span class="mi">0</span><span class="p">)</span> <span class="p">{</span>
<span class="n">em</span><span class="o">-></span><span class="n">refresh</span><span class="p">(</span><span class="n">inc</span><span class="p">);</span>
<span class="p">}</span>
</code></pre><br />Das sollte imho von refresh() selbst als allererstes geprüft werden. Refresh ergibt - wenn ich es recht verstehe - bei noch nicht persistierten Entities wenig Sinn.</p>
Fehler #644 (Abgewiesen): Rückgabewert beim Persistieren einer unveränderten Entity
https://synlos.net/redmine/issues/644
2017-08-15T18:38:19Z
Sebastian Diel
sebastian.diel@web.de
<p>Wird eine Entity unverändert persistiert, lautet der Rückgabewert von false. <br />Das erscheint kontraintuitiv: auch wenn objektiv "nichts neues gespeichert" wurde, so hat doch der Speichervorgang insofern funktioniert, dass das Gewünschte in der DB steht.</p>
<p>Selbiges gilt wahrscheinlich auch für merge().</p>
Fehler #642 (Erledigt): Sortierte Ausgabe bei EntityInspector und Logger
https://synlos.net/redmine/issues/642
2017-05-21T15:34:28Z
Sebastian Diel
sebastian.diel@web.de
<p>Bei der Fehlersuche umfangreicher Programme wird die ungeordnete Ausgabe der inspizierten Entities sehr unübersichtlich und lässt sich nicht sinnvoll automatisch diffen. Ein QStringList::sort kostet nicht allzuviel (bei ClassInTouch2: t.elapsed() < 1 ms!) und bringt dafür einen deutlichen Zugewinn in der Nutzbarkeit. Dafür muss nur eine Zeile eingefügt werden:</p>
<pre><code class="cpp syntaxhl" data-language="cpp"><span class="kt">bool</span> <span class="n">EntityInspector</span><span class="o">::</span><span class="n">checkRegisteredEntities</span><span class="p">()</span> <span class="p">{</span>
<span class="n">QStringList</span> <span class="n">classes</span> <span class="o">=</span> <span class="n">EntityInstanceFactory</span><span class="o">::</span><span class="n">getRegisteredClasses</span><span class="p">();</span>
<span class="n">classes</span><span class="p">.</span><span class="n">sort</span><span class="p">();</span> <span class="c1">// <<<<<<<<<<<<<<<<<<<<<<<<< NEUE ZEILE <<<<<<<<<<<<<<<<<<<<<<<<<</span>
<span class="n">QString</span> <span class="n">msg</span> <span class="o">=</span> <span class="n">QDateTime</span><span class="o">::</span><span class="n">currentDateTime</span><span class="p">().</span><span class="n">toString</span><span class="p">(</span><span class="n">Qt</span><span class="o">::</span><span class="n">ISODate</span><span class="p">)</span> <span class="o">+</span>
<span class="s">" - Start checking entities</span><span class="se">\n</span><span class="s">"</span><span class="p">;</span>
<span class="k">this</span><span class="o">-></span><span class="n">logger</span><span class="o">-></span><span class="n">logMsg</span><span class="p">(</span><span class="n">msg</span><span class="p">,</span> <span class="n">MsgType</span><span class="o">::</span><span class="n">INFO</span><span class="p">);</span>
<span class="kt">bool</span> <span class="n">ok</span> <span class="o">=</span> <span class="nb">true</span><span class="p">;</span>
<span class="k">for</span> <span class="p">(</span><span class="kt">int</span> <span class="n">i</span> <span class="o">=</span> <span class="mi">0</span><span class="p">;</span> <span class="n">i</span> <span class="o"><</span> <span class="n">classes</span><span class="p">.</span><span class="n">size</span><span class="p">();</span> <span class="o">++</span><span class="n">i</span><span class="p">)</span> <span class="p">{</span>
<span class="kt">bool</span> <span class="n">r</span> <span class="o">=</span> <span class="k">this</span><span class="o">-></span><span class="n">checkEntity</span><span class="p">(</span><span class="n">classes</span><span class="p">.</span><span class="n">at</span><span class="p">(</span><span class="n">i</span><span class="p">));</span>
<span class="k">if</span> <span class="p">(</span><span class="o">!</span><span class="n">r</span><span class="p">)</span> <span class="p">{</span>
<span class="n">msg</span> <span class="o">=</span> <span class="s">"###############################"</span><span class="p">;</span>
<span class="n">msg</span> <span class="o">+=</span> <span class="s">"</span><span class="se">\n</span><span class="s">"</span><span class="p">;</span>
<span class="n">msg</span> <span class="o">+=</span> <span class="n">classes</span><span class="p">.</span><span class="n">at</span><span class="p">(</span><span class="n">i</span><span class="p">)</span> <span class="o">+</span> <span class="s">" is erroneous!"</span><span class="p">;</span>
<span class="n">msg</span> <span class="o">+=</span> <span class="s">"</span><span class="se">\n</span><span class="s">"</span><span class="p">;</span>
<span class="n">msg</span> <span class="o">+=</span> <span class="s">"###############################</span><span class="se">\n</span><span class="s">"</span><span class="p">;</span>
<span class="k">this</span><span class="o">-></span><span class="n">logger</span><span class="o">-></span><span class="n">logMsg</span><span class="p">(</span><span class="n">msg</span><span class="p">,</span> <span class="n">MsgType</span><span class="o">::</span><span class="n">CRITICAL</span><span class="p">);</span>
<span class="n">ok</span> <span class="o">=</span> <span class="nb">false</span><span class="p">;</span>
<span class="p">}</span> <span class="k">else</span> <span class="p">{</span>
<span class="n">msg</span> <span class="o">=</span> <span class="s">"Entity class "</span> <span class="o">+</span> <span class="n">classes</span><span class="p">.</span><span class="n">at</span><span class="p">(</span><span class="n">i</span><span class="p">)</span> <span class="o">+</span> <span class="s">" seems ok.</span><span class="se">\n</span><span class="s">"</span><span class="p">;</span>
<span class="k">this</span><span class="o">-></span><span class="n">logger</span><span class="o">-></span><span class="n">logMsg</span><span class="p">(</span><span class="n">msg</span><span class="p">,</span> <span class="n">MsgType</span><span class="o">::</span><span class="n">INFO</span><span class="p">);</span>
<span class="p">}</span>
<span class="p">}</span>
<span class="n">msg</span> <span class="o">=</span> <span class="n">QDateTime</span><span class="o">::</span><span class="n">currentDateTime</span><span class="p">().</span><span class="n">toString</span><span class="p">(</span><span class="n">Qt</span><span class="o">::</span><span class="n">ISODate</span><span class="p">)</span> <span class="o">+</span>
<span class="s">" - End checking entities</span><span class="se">\n</span><span class="s">"</span><span class="p">;</span>
<span class="k">this</span><span class="o">-></span><span class="n">logger</span><span class="o">-></span><span class="n">logMsg</span><span class="p">(</span><span class="n">msg</span><span class="p">,</span> <span class="n">MsgType</span><span class="o">::</span><span class="n">INFO</span><span class="p">);</span>
<span class="k">return</span> <span class="n">ok</span><span class="p">;</span>
<span class="p">}</span>
</code></pre>
Fehler #634 (Abgewiesen): reinstantiated()-Methode für Entity
https://synlos.net/redmine/issues/634
2016-12-29T14:05:01Z
Sebastian Diel
sebastian.diel@web.de
<p>Wenn man ->find nach einer Basisklasse macht, erhält man vom em nicht die vollen Informationen der abgeleiteten Klasse.<br />Hierfür wird man im Allgemeinen einen switch nachschalten müssen, der die Entities mit ihren abgeleiteten Klassen reinstantiiert. Innerhalb eines switches führt das aber zu unschönen Scope-Konstrukten: <br /><pre><code class="cpp syntaxhl" data-language="cpp"> <span class="k">case</span> <span class="n">Enums</span><span class="o">::</span><span class="n">AppType</span><span class="o">::</span><span class="n">ATTENDANCE</span><span class="p">:</span>
<span class="p">{</span>
<span class="k">auto</span> <span class="n">attendanceData</span> <span class="o">=</span> <span class="n">em</span><span class="o">-></span><span class="n">findById</span><span class="o"><</span><span class="n">AppAttendanceData</span><span class="o">></span><span class="p">(</span><span class="k">this</span><span class="o">-></span><span class="n">getId</span><span class="p">(),</span><span class="nb">true</span><span class="p">);</span>
<span class="n">result</span> <span class="o">=</span> <span class="n">attendanceData</span><span class="p">;</span>
<span class="p">}</span>
<span class="k">break</span><span class="p">;</span>
</code></pre></p>
<p>Schöner ist ein Template, das an dieser Stelle den switch vereinfacht:<br /><pre><code class="cpp syntaxhl" data-language="cpp"> <span class="k">template</span> <span class="o"><</span><span class="k">class</span> <span class="nc">T</span><span class="p">></span> <span class="n">QSharedPointer</span><span class="o"><</span><span class="n">T</span><span class="o">></span> <span class="n">reinstantiated</span><span class="p">()</span> <span class="p">{</span>
<span class="k">return</span> <span class="n">EntityManager</span><span class="o">::</span><span class="n">getDefaultInstance</span><span class="p">()</span><span class="o">-></span><span class="n">findById</span><span class="o"><</span><span class="n">T</span><span class="o">></span><span class="p">(</span><span class="k">this</span><span class="o">-></span><span class="n">getId</span><span class="p">(),</span><span class="nb">true</span><span class="p">);</span>
<span class="p">}</span>
</code></pre></p>
<p>Damit sähe der switch so aus: <br /><pre><code class="cpp syntaxhl" data-language="cpp"> <span class="k">case</span> <span class="n">Enums</span><span class="o">::</span><span class="n">AppType</span><span class="o">::</span><span class="n">ATTENDANCE</span><span class="p">:</span>
<span class="n">result</span> <span class="o">=</span> <span class="k">this</span><span class="o">-></span><span class="n">reinstantiated</span><span class="o"><</span><span class="n">AppAttendanceData</span><span class="o">></span><span class="p">();</span>
<span class="k">break</span><span class="p">;</span>
</code></pre></p>
Fehler #629 (Erledigt): Crash im em beim Abspeichern des RatingSystem
https://synlos.net/redmine/issues/629
2016-11-13T01:56:43Z
Sebastian Diel
sebastian.diel@web.de
<p>Nachstellen:</p>
<p>Aktuelle DB erzeugen und abspeichern:<br />- sqlite.db löschen<br />- Revision 5dba7f4d starten, cit beenden (Speichern der DB)</p>
<p>Fehler reproduzieren:<br />CIT starten<br />Auf teacherDesk "Bewertung 1-6" klicken<br />Links unten zur Tabellenansicht wechseln<br />Z.B. bei Carsten Ernst in die (z.B.) <span><del>Spalte klicken. <br />Incident mit ok bestätigen.<br />Auf teacherDesk "Bewertung 1-6" klicken (als Screen-Updater)<br />Den jetzt zu sehenden Incident (NB 0</span>) anklicken<br />Incident erneut mit ok bestätigen.<br />-</del>> SigIll <br />Zwei unterschiedliche Szenarien treten auf: <br /><a class="external" href="http://etherpad.danfai.de/savePrePersistedRelationsCrash">http://etherpad.danfai.de/savePrePersistedRelationsCrash</a><br />und<br /><a class="external" href="http://etherpad.danfai.de/savePostPersistedRelationsCrash">http://etherpad.danfai.de/savePostPersistedRelationsCrash</a></p>
<p>Interessant dabei: das Erzeugen und Persistieren von RatingMarkIncidents funkioniert in der Klassenraum-Übersicht. (Button klicken, Note wählen), wiederholen. Hier gibt es keine FM.</p>
Fehler #625 (Erledigt): findById<type>(-1) should always return nullptr
https://synlos.net/redmine/issues/625
2016-10-12T11:49:42Z
Sebastian Diel
sebastian.diel@web.de
<p>findById called with any invalid id (especially when called with -1!) should return nullptr, but it seems it doesn't.</p>
<p><code>auto incId = this->get_dbId(); <br />// debug evaluation: incId == -1 here<br />auto em = EntityManager::getDefaultInstance();<br />auto oldInc = em->findById<AttendanceIncident>(incId);<br />// debug evaluation: oldInc == 0x6d3.... now<br />if (oldInc.isNull()) { <br /> // never enters this<br />}</code></p>
Fehler #624 (Erledigt): Enumerator Attribute write Regression
https://synlos.net/redmine/issues/624
2016-10-10T01:20:12Z
Sebastian Diel
sebastian.diel@web.de
<p>In File entityinstancefactory.cpp wurde in der Methode<br /><pre><code class="cpp syntaxhl" data-language="cpp"><span class="kt">void</span> <span class="n">EntityInstanceFactory</span><span class="o">::</span><span class="n">setAttributes</span><span class="p">(</span><span class="n">Entity</span> <span class="o">*&</span><span class="n">e</span><span class="p">,</span>
<span class="k">const</span> <span class="n">QHash</span><span class="o"><</span><span class="n">QString</span><span class="p">,</span> <span class="n">QVariant</span><span class="o">></span> <span class="o">&</span><span class="n">attributes</span><span class="p">,</span>
<span class="n">QHash</span><span class="o"><</span><span class="n">QString</span><span class="p">,</span> <span class="n">QMetaProperty</span><span class="o">></span> <span class="n">metaprops</span><span class="p">)</span>
</code></pre> die Zeile <br /><pre><code class="cpp syntaxhl" data-language="cpp"> <span class="n">prop</span><span class="p">.</span><span class="n">write</span><span class="p">(</span><span class="n">e</span><span class="p">,</span> <span class="n">prop</span><span class="p">.</span><span class="n">enumerator</span><span class="p">().</span><span class="n">valueToKey</span><span class="p">(</span><span class="n">iterator</span><span class="p">.</span><span class="n">value</span><span class="p">().</span><span class="n">toInt</span><span class="p">()));</span>
</code></pre><br />geändert zu<br /><pre><code class="cpp syntaxhl" data-language="cpp"> <span class="n">prop</span><span class="p">.</span><span class="n">write</span><span class="p">(</span><span class="n">e</span><span class="p">,</span> <span class="n">prop</span><span class="p">.</span><span class="n">enumerator</span><span class="p">().</span><span class="n">key</span><span class="p">(</span><span class="n">iterator</span><span class="p">.</span><span class="n">value</span><span class="p">().</span><span class="n">toInt</span><span class="p">()));</span>
</code></pre></p>
<p>Das führt dazu, dass nach dem Auslesen aus der DB das jeweilige Enum zyklisch um eine Position verschoben ins Attribut geschrieben wird. Im Falle der Anwesenheitsstatus gelten folgende Definitionen:<br /><pre><code class="cpp syntaxhl" data-language="cpp"> <span class="k">enum</span> <span class="k">class</span> <span class="nc">AttendanceState</span> <span class="p">{</span>
<span class="n">PRESENT</span><span class="o">=</span><span class="mi">1</span><span class="p">,</span>
<span class="n">MISSING</span><span class="o">=</span><span class="mi">2</span><span class="p">,</span>
<span class="n">LATE</span><span class="o">=</span><span class="mi">3</span><span class="p">,</span>
<span class="n">ATSCHOOL</span><span class="o">=</span><span class="mi">4</span><span class="p">,</span>
<span class="n">UNDEFINED</span><span class="o">=-</span><span class="mi">1</span>
<span class="p">};</span>
</code></pre></p>
<p>Statt "MISSING" wird nun "LATE" geschrieben, statt "LATE" kommt "ATSCHOOL", statt "ATSCHOOL" kommt "UNDEFINED". Ob auf "UNDEFINED" dann "PRESENT" kommt, habe ich nicht getestet.</p>
<p>Eine Rücknahme der o. a. Änderung stellt wieder das gewünschte Verhalten her.</p>
Fehler #615 (Abgewiesen): QueryBuilder single quotes
https://synlos.net/redmine/issues/615
2016-03-21T23:21:54Z
Sebastian Diel
sebastian.diel@web.de
<p><code>q.appendJoin(Join("incident", "attendanceincident.id = incident.id"));</code><br />führt zu <br /><pre>
LEFT JOIN `incident` ON `attendanceincident`.`id` = `incident`.`id`
</pre></p>
<p>Workaround: <br /><code>q.appendJoin(Join("incident", "`attendanceincident.id` = `incident.id`"));</code><br />führt zum erwartungsgemäßen <br /><pre>
LEFT JOIN `incident` ON `attendanceincident.id` = `incident.id`
</pre></p>
<p>Gleiches Verhalten ist bspw. bei arbitraryOperator und isNull zu beobachten.</p>
Fehler #614 (Erledigt): EntityChecker: Warning when Entity only has one attribute(id)
https://synlos.net/redmine/issues/614
2016-03-18T21:27:47Z
Christian Ehringfeld
c.ehringfeld@t-online.de
Fehler #610 (Erledigt): Testcase ONE_TO_MANY Relations
https://synlos.net/redmine/issues/610
2016-01-01T01:38:38Z
Christian Ehringfeld
c.ehringfeld@t-online.de
<p>Atm there is no testcase for queries of ONE_TO_MANY Relations<br />And it seems that there is a bug:</p>
<pre><code>QSharedPointer&lt;Room&gt; room2= em->findEntityByAttributes&lt;Room&gt;(attributeHash);</code></pre>
<p>produces:<br /><code>
"{'time':'2016-01-01T02:19:57', 'query':'SELECT * FROM `room` WHERE `name`=? LIMIT 1', 'values': {'name':'R. 1202'}}"
"{'time':'2016-01-01T02:19:57', 'query':'SELECT * FROM `room` WHERE `id`=?', 'values': {'id':'2'}}"
</code></p>
Fehler #601 (Erledigt): Absturz bei mehrfachem Anklicken einer Person in AppAttendance
https://synlos.net/redmine/issues/601
2015-10-22T09:47:08Z
Sebastian Diel
sebastian.diel@web.de
<p>Reproduzieren: cit2 starten, eine Person mehrfach klicken <br />FM; Segmentation fault.</p>
<p>Stack:<br /><pre>
0 QScopedPointer<QObjectData, QScopedPointerDeleter<QObjectData>>::data C:/Qt/5.5/mingw492_32/bin/Qt5Cored.dll 135 0x6ba58ae8
1 qGetPtrHelper<QScopedPointer<QObjectData>> C:/Qt/5.5/mingw492_32/bin/Qt5Cored.dll 983 0x6b909879
2 QObject::d_func C:/Qt/5.5/mingw492_32/bin/Qt5Cored.dll 110 0x6ba704e7
3 QObject::property C:/Qt/5.5/mingw492_32/bin/Qt5Cored.dll 3875 0x6b907992
4 CuteEntityManager::Entity::getProperty entity.cpp 126 0x27a51e3a
5 CuteEntityManager::EntityManager::hasChanged entitymanager.cpp 386 0x27a54d2a
6 CuteEntityManager::EntityManager::saveObject entitymanager.cpp 92 0x27a52b3a
7 CuteEntityManager::EntityManager::save entitymanager.cpp 219 0x27a536ea
8 AppAttendance::buttonAction appattendance.cpp 103 0x4521a5
9 AppAttendance::qt_static_metacall moc_appattendance.cpp 72 0x4605ce
10 QMetaObject::activate C:/Qt/5.5/mingw492_32/bin/Qt5Cored.dll 3713 0x6b907249
11 QMetaObject::activate C:/Qt/5.5/mingw492_32/bin/Qt5Cored.dll 3578 0x6b906b8e
12 GroupContent::buttonClicked moc_groupcontent.cpp 527 0x45a64b
13 GroupContent::qt_static_metacall moc_groupcontent.cpp 164 0x459aaa
14 QMetaObject::activate C:/Qt/5.5/mingw492_32/bin/Qt5Cored.dll 3713 0x6b907249
15 QMetaObject::activate C:/Qt/5.5/mingw492_32/bin/Qt5Cored.dll 3578 0x6b906b8e
16 ButtonContent::clicked moc_buttoncontent.cpp 934 0x459509
17 ButtonContent::onClicked buttoncontent.h 88 0x475685
18 ButtonContent::qt_static_metacall moc_buttoncontent.cpp 368 0x4580e7
19 ButtonContent::qt_metacall moc_buttoncontent.cpp 813 0x45913d
... <More>
</pre></p>
<p>In entitymanager.cpp 385 ist offensichtlich</p>
<p><code>auto e = EntityInstanceFactory::castQVariant(v);</code></p>
<p>nicht erfolgreich, wodurch die folgende Zeile</p>
<p><code>if (e->getProperty(entity->getPrimaryKey()) != i.value()) {</code></p>
<p>zum Crash führt.</p>
<p>An ebender stelle ist:</p>
<pre>
Locals
this "em[0]" CuteEntityManager::EntityManager
[QObject] "em[0]" QObject
cache CuteEntityManager::Cache
connectionNames <1 items> QStringList
db QSharedPointer<CuteEntityManager::Database>
id "" QString
instances <1 items> QHash<QString, CuteEntityManager::EntityManager*>
logger QSharedPointer<CuteEntityManager::Logger>
queryInterpreter QSharedPointer<CuteEntityManager::QueryInterpreter>
schema QSharedPointer<CuteEntityManager::Schema>
staticMetaObject QMetaObject
[parent] 0x0 QObject *
[children] <0 items> QObjectList
[properties] <>0 items>
[methods] <50 items>
[signals] <0 items>
appendix "_id" QString
[0] 95 QChar
[1] 105 QChar
[2] 100 QChar
changed false bool
e (null) QSharedPointer<CuteEntityManager::Entity>
entity QSharedPointer<CuteEntityManager::Entity> &
data AttendanceIncident
weakref 5 int
strongref 4 int
i QHash<QString, QVariant>::const_iterator
listmap <15 items> QHash<QString, QVariant>
[0] QHashNode<QString, QVariant>
[1] QHashNode<QString, QVariant>
[2] QHashNode<QString, QVariant>
[3] QHashNode<QString, QVariant>
[4] QHashNode<QString, QVariant>
[5] QHashNode<QString, QVariant>
[6] QHashNode<QString, QVariant>
[7] QHashNode<QString, QVariant>
[8] QHashNode<QString, QVariant>
[9] QHashNode<QString, QVariant>
[10] QHashNode<QString, QVariant>
[11] QHashNode<QString, QVariant>
[12] QHashNode<QString, QVariant>
[13] QHashNode<QString, QVariant>
[14] QHashNode<QString, QVariant>
relKey "room" QString
[0] 114 QChar
[1] 111 QChar
[2] 111 QChar
[3] 109 QChar
relations <4 items> QHash<QString, CuteEntityManager::Relation>
[0] QHashNode<QString, CuteEntityManager::Relation>
[1] QHashNode<QString, CuteEntityManager::Relation>
[2] QHashNode<QString, CuteEntityManager::Relation>
[3] QHashNode<QString, CuteEntityManager::Relation>
rels <4 items> QStringList
[0] "appData_id" QString
[1] "room_id" QString
[2] "pupil_id" QString
[3] "group_id" QString
v QVariant (QSharedPointer<Room>)
</pre>
<p>Der dbcon0.log zeigt folgende letzte Meldungen im DEBUG-Modus:<br /><pre>
{"time":"2015-10-22T11:34:54", "query":"SELECT * FROM `attendanceincident` LEFT JOIN `incident` ON `incident`.`id` = `attendanceincident`.`id` WHERE `bookedAt` <= ? AND `bookedFor` <= ? AND ( `cancelledAt`IS NULL OR ( `cancelledAt` > ? AND `cancelledAt`IS NOT NULL ) ) AND `pupil_id`=? AND `appData_id`=? ORDER BY `bookedFor` DESC", "values": {"appData_id":"1", "bookedAt":"2015-09-14T10:11:00", "bookedFor":"2015-09-14T10:11:00", "cancelledAt":"2015-09-14T10:11:00", "pupil_id":"21"}}
{"time":"2015-10-22T11:34:54", "query":"SELECT * FROM `appattendancedata` LEFT JOIN `appdata` ON `appdata`.`id`=`appattendancedata`.`id` WHERE `appattendancedata`.`id`= ? LIMIT 1", "values": {"id":"1"}}
{"time":"2015-10-22T11:34:54", "query":"SELECT * FROM `pupil` LEFT JOIN `person` ON `person`.`id`=`pupil`.`id` WHERE `pupil`.`id`= ? LIMIT 1", "values": {"id":"21"}}
{"time":"2015-10-22T11:34:54", "query":"SELECT * FROM `group` WHERE `group`.`id`= ? LIMIT 1", "values": {"id":"1"}}
{"time":"2015-10-22T11:34:54", "query":"INSERT INTO `incident`(`additionalInfo`,`pupil_id`,`bookedFor`,`locked`,`bookedAt`,`group_id`,`cancelledAt`,`appData_id`)VALUES(?,?,?,?,?,?,?,?);", "values": {"additionalInfo":"Neuer Incident!", "appData_id":"1", "bookedAt":"2015-09-14T10:11:00", "bookedFor":"2015-09-14T10:11:00", "cancelledAt":"", "group_id":"1", "locked":"false", "pupil_id":"21"}}
{"time":"2015-10-22T11:34:55", "query":"INSERT INTO `attendanceincident`(`excusedAt`,`state`,`notExcusable`,`lessonsMissed`,`id`,`minutesLate`)VALUES(?,?,?,?,?,?);", "values": {"excusedAt":"", "id":"8", "lessonsMissed":"2", "minutesLate":"0", "notExcusable":"false", "state":"2"}}
{"time":"2015-10-22T11:34:55", "query":"SELECT * FROM `attendanceincident` LEFT JOIN `incident` ON `incident`.`id` = `attendanceincident`.`id` WHERE `bookedAt` <= ? AND `bookedFor` <= ? AND ( `cancelledAt`IS NULL OR ( `cancelledAt` > ? AND `cancelledAt`IS NOT NULL ) ) AND `pupil_id`=? AND `appData_id`=? ORDER BY `bookedFor` DESC", "values": {"appData_id":"1", "bookedAt":"2015-09-14T10:11:00", "bookedFor":"2015-09-14T10:11:00", "cancelledAt":"2015-09-14T10:11:00", "pupil_id":"21"}}
{"time":"2015-10-22T11:34:55", "query":"SELECT * FROM `appdata` WHERE `appdata`.`id`= ? LIMIT 1", "values": {"id":"1"}}
{"time":"2015-10-22T11:34:55", "query":"SELECT * FROM `group_appDatasAssociated` WHERE `appdata_id` = ?;", "values": {"id":"1"}}
{"time":"2015-10-22T11:34:55", "query":"SELECT * FROM `attendanceincident` LEFT JOIN `incident` ON `incident`.`id`=`attendanceincident`.`id` WHERE `attendanceincident`.`id`= ? LIMIT 1", "values": {"id":"8"}}
</pre></p>
Fehler #596 (Erledigt): Q_INVOKABLE wird benötigt, aber vom Inspector nicht geprüft
https://synlos.net/redmine/issues/596
2015-10-06T11:14:43Z
Sebastian Diel
sebastian.diel@web.de
<p>Fehlt Q_INVOKABLE vor dem Konstruktor<br /><code>public:<br /> Room();</code><br />dann zeigt der Inspector:<br /><pre>
"--------------------Checking Room now."
"Room is instantiable."
"Entity class Room seems ok."
</pre><br />Allerdings heißt es später:<br /><pre>
"Instance of Room could not be created"
"Transaction rolled back! "
Die Tabelle bleibt in dem Fall leer.
Mit
@public:
Q_INVOKABLE Room();@
Ist alles in Ordnung
</pre></p>
Fehler #595 (Erledigt): In table room gibt es duplikate, wenn String "name" leer ist
https://synlos.net/redmine/issues/595
2015-10-06T11:04:30Z
Sebastian Diel
sebastian.diel@web.de
<p>Beim Erzeugen von room wird trotz duplicate check (create mit true, true) ein Duplikat zum in der db bestehenden Raum erzeugt, wenn das Attribut "name" ein Leerstring ist.<br />Der Select-Aufruf bringt bei einem Raum ohne Namen<br /><pre>
"{'time':'2015-10-06T12:55:00', 'query':'SELECT COUNT(*) FROM `room` WHERE `name`=? AND `orientation`=? AND `zoom`=?', 'values': {'name':'', 'orientation':'0', 'zoom':'0'}}"
</pre><br />null Ergebnisse, gibt man ihm einen Namen, wird der Raum mit <br /><pre>
"{'time':'2015-10-06T12:55:00', 'query':'SELECT COUNT(*) FROM `room` WHERE `name`=? AND `orientation`=? AND `zoom`=?', 'values': {'name':'Testraum', 'orientation':'0', 'zoom':'0'}}"
</pre> hingegen gefunden.</p>
<p>In <br /><code>void CreateFakeModelData::fillRoom(QSharedPointer<Room> &room)</code> <br />wird daher als workaround ein Name vergeben:<br /><code>room->setName("Testraum");</code></p>
Fehler #594 (Erledigt): In Tabelle desk bleibt Spalte room_id leer, wenn keine explizite Zuweisun...
https://synlos.net/redmine/issues/594
2015-10-06T10:38:30Z
Sebastian Diel
sebastian.diel@web.de
<p>In <code>void CreateFakeModelData::fillRoom(QSharedPointer<Room> &room)</code> wird ein neuer Room erzeugt, diesem werden Desks hinzugefüg:<br /><code>QSharedPointer<Desk> desk = room->addDesk();</code></p>
<p>In der db bleibt aber bei desk die room_id leer, wenn nicht explizit zugewiesen wird:<br /><code>desk->setRoom(room);</code></p>
<p>Dieser Workaround ist zurzeit im Code vorhanden.</p>
Fehler #592 (Erledigt): No separated tables with Inherited Relations and table strategy JOINED_TABLE
https://synlos.net/redmine/issues/592
2015-09-26T23:22:40Z
Christian Ehringfeld
c.ehringfeld@t-online.de
<p>see Line 441 - 443 in querybuilder.cpp</p>