Anzeigen aktualisieren schlägt fehl

  • Kann mal jemand von WolLab erklären, ob der Fehler gefixt wird ? KLAR, es ist eine BETA Version, wäre trotzdem mal schön, wenn auch dem kleinen Mann geantwortet wird :)

  • Hallo,

    Kann mal jemand von WolLab erklären, ob der Fehler gefixt wird ? KLAR, es ist eine BETA Version, wäre trotzdem mal schön, wenn auch dem kleinen Mann geantwortet wird :)

    Da ja ganz offensichtlich relativ viele Nutzer betroffen sind: Ja, es ist selbstverständlich geplant den Fehler zu beheben. Ich habe auch bereits Zugangsdaten zu einem System erhalten, welches diesen Fehler reproduzierbar erzeugt, hatte aber über die Feiertage Urlaub.


    Kurz: Stay tuned, ich werde es mir auf jeden Fall noch ansehen :-)

  • Hallo,


    eines vorweg: Der Fehler wird mit Community Framework 2.1 Beta 3 behoben sein. Jeden, den nur das interessiert braucht nun nicht weiter zu lesen. Für die anderen (insb. Entwickler) folgt die technische Erklärung:


    Community Framework 2.1 verwendet echte Prepared Statements. Vorher (2.0) wurden die von PDO emulierten Prepared Statements verwendet. Diese unterscheiden sich darin, dass erstere der Datenbank bekannt sind und dadurch a) ggf. besser optimiert werden können b) potentiell in einigen Fällen sicherer sind. Auch ist es wichtig zu wissen, wie die Ergebnisse von Datenbankabfragen bei der Datenbank abgeholt werden:
    a) „Buffered Queries“: PDO holt in diesem Falle bereits alle Zeilen des Ergebnisses ab und gibt dadurch die Verbindung wieder frei
    b) „Unbuffered Queries“: Hier werden die Zeilen erst dann abgeholt, sobald der Programmierer explizit anfragt. Die Verbindung wird freigegeben, sobald eine explizite Anfrage fehlgeschlagen ist (weil nichts übrig ist)


    Das Problem lag nun im letzten Satz: Im „Anzeigen aktualisieren“ sind einige Datenbankabfragen enthalten, welche aus Sicht des Programmiers offensichtlich nur ein Ergebnis liefern können (weil nur maximal eines angefragt wurde). Daher wurde nur eine Zeile abgeholt, der Datenbank ist zu diesem Zeitpunkt aber noch nicht bekannt, dass gar keine Ergebnisse übrig sind – weil die Anfrage noch nicht fehlgeschlagen ist.


    Die Lösung lag nun darin der Datenbank explizit mitzuteilen, dass der Rest des Ergebnisses uninteressant ist. Dieses wird dann verworfen und die Verbindung freigegeben. Dies wird automatisch erledigt, sobald das Prepared Statement vom Garbage Collector entfernt wird. Sobald ein Prepared Statement durch den Programmierer nicht mehr angesprochen werden kann (beispielsweise durch Überschreiben der Variable) wird dieses komplett aufgeräumt und geschlossen. Offenbar war dies auch der Fall, wenn eine andere Abfrage durchgeführt wird und die Prepared Statements durch PDO emuliert wurden.


    Entwickler können über folgenden Linux-Kommandozeilenbefehl alle Datenbankabfragen im Plugin finden, welche nicht in einer Variable namens $statement gespeichert werden. Dies dürfte den Großteil der potentiell betroffenen Abfragen finden:


    Code
    grep --color=always -R '= WCF::getDB()->pre' . |grep -v '$statement'

    Ich danke @Coolman die Bereitstellung eines Testsystems!

  • Hallo,


    je nach Inhalt der entsprechenden Beiträge wurden bestimmte Datenbankabfragen im Anzeigen aktualisieren nicht ausgeführt.