mirror of
https://github.com/qelectrotech/qelectrotech-source-mirror.git
synced 2026-09-20 15:24:14 +02:00
Don't let the wiring list lose a wire to the diagram join
The comment above this view promised that it "returns exactly as many rows as the conductor table holds", and argued carefully for the two joins that could have broken that -- no inner join to element, and element_info LEFT joined. Then it ended with an inner join to diagram that it never mentioned, which can drop rows just as easily. Feeding the real schema a conductor whose diagram_uuid has no diagram row returned 2 view rows for 3 conductors. With the join made LEFT it returns 3, with a null folio instead of a missing wire. In practice this should never fire: QETProject::diagramAdded is connected to addDiagram(), so the folio exists before anything can be drawn on it. But an inner join turns that into an assumption the view enforces silently, and of all the things this view can get wrong, dropping a wire from a wiring list is the one that matters most. The comment now says which joins are inner and why those two are safe. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
@@ -643,10 +643,18 @@ void projectDataBase::createSummaryView()
|
||||
back with an empty label rather than vanishing. Losing a wire from a
|
||||
wiring list is a worse failure than showing one with a blank end.
|
||||
|
||||
- diagram is LEFT joined for the same reason. It should
|
||||
always match, since QETProject::diagramAdded is wired to addDiagram()
|
||||
and a conductor cannot exist before its folio -- but an inner join here
|
||||
would make that an assumption the view silently enforces, and a wire
|
||||
missing from a wiring list is the one failure this view must not have.
|
||||
|
||||
The result is that this view returns exactly as many rows as the
|
||||
conductor table holds -- what is already excluded upstream (conductors
|
||||
on legacy terminals without uuids) stays excluded, and nothing new is
|
||||
dropped here.
|
||||
dropped here. Only the terminal joins are inner, and both are guaranteed
|
||||
by insertTerminal() running for each endpoint before the conductor row
|
||||
is written.
|
||||
*/
|
||||
void projectDataBase::createWiringListView()
|
||||
{
|
||||
@@ -665,7 +673,7 @@ void projectDataBase::createWiringListView()
|
||||
" JOIN terminal t2 ON c.terminal2_uuid = t2.uuid AND c.terminal2_element_uuid = t2.element_uuid"
|
||||
" LEFT JOIN element_info ei1 ON t1.element_uuid = ei1.element_uuid"
|
||||
" LEFT JOIN element_info ei2 ON t2.element_uuid = ei2.element_uuid"
|
||||
" JOIN diagram d ON c.diagram_uuid = d.uuid");
|
||||
" LEFT JOIN diagram d ON c.diagram_uuid = d.uuid");
|
||||
|
||||
QSqlQuery query(m_data_base);
|
||||
if (!query.exec(create_view)) {
|
||||
|
||||
Reference in New Issue
Block a user