-
-
Notifications
You must be signed in to change notification settings - Fork 212
Contao 3.0.6 - Dateisystem #5556
Comments
Wie lässt sich das in der Onlinedemo reproduzieren? |
Dazu bräuchte ich FTP-Zugang zur Demo, da die entsprechenden Ordner per FTP hochgeladen wurden. |
Ok, anders gefragt: Wie kann ich das in der Music Academy reproduzieren? |
Es wird etwas länglich... Habe mehrere Ordnertiefen und dann eine Datei erzeugt:
(für Tippfehler und mangelde Kreativität bitte ich um Nachsicht). Sync: in
In Der Fehler liegt m.E in den viel zu kurzen Spaltenlängen von |
MySQL 5 limitiert leider die key length auf 1000, und bei utf8 offenbar sicherheitshalber /4 (utf8 Zeichen können 4 bytes lang sein) - der Versuch |
Die Spalte |
Ok, das erklärt warum der Key nur 64 Zeichen lang ist. Ich kann das Problem auch reproduzieren, weiß aber ad hoc keine gute Lösung dafür. Die Spalte "path" ganz wegzulassen, würde eine zusätzliche DB-Abfrage pro Resource bedeuten (vgl. Den UNIQUE-Index möchte ich aber eigentlich auch nicht weglassen, denn der trägt nicht unerheblich zur Datenkonsistenz bei. Eventuell würde es helfen, das Feld auf @contao/workgroup-core |
Eine andere mögliche Lösung wäre eine zusätzliche Spalte mit dem MD5-Wert der "path"-Spalte und dem UNIQUE-Key auf dieser statt der "path"-Spalte. |
Leo, das Problem mit der path-Bestimmung kenne ich auch von Oracle Anwendungen, wo das zwar mit SQL CONNECT BY bequem und auch schnell geht, aber doch intern viele zusätzliche Zugriffe erzeugt. Deswegen von daher mein Vorschlag mit der Hilfstabelle: Tabelle Das UNIQUE constraint muss nur auf filename (basename) + folder id gesetzt werden - die files müssen ja nur innerhalb eines Folders unique sein (wie im richtigen Dateisystem). So habe ich es auch erfolgreich getestet. [arroganz]Als altem high-end Datenbankler (Oracle) kräuseln sich mir manchmal die Fußnägel, wenn ich die DB Designs der meisten CMSe sehe[/arroganz]. Das ist verständlich aus dem meist non-DB Hintergrund der Entwickler. Deswegen halte ich mich noch zurück und lese mich erst weiter ein, einschließlich der neuen dbafs classes (***** dafür!). Ich hoffe, dass ich Zeit finde, meinem Vorschlag mal auszuprobieren. |
Hm, nach meiner mySQL Doku ist
wobei ich |
Das Problem daran ist, dass die Änderung nicht rückwärtskompatibel ist. // Aktuell
$file = FilesModel::findByPk(2);
dump($file->path);
// Nach der Änderung
$file = FilesModel::findByPk(2);
dump($file->getRelated('pid')->path); Der Code könnte also frühestens in Contao 4 einfließen.
Da hat Du absolut Recht. Und das ist auch glaube ich die momentan besten Lösung :) |
Nein, leider doch nicht. Denn dann haben wir wieder das Problem, dass MySQL nur maximal 64 Zeichen in den Index schreibt. Auch wenn das bei reinen Dateinamen weniger wahrscheinlich ist als bei Pfaden, bleibt es ein Problem :( |
Das müssen wir mal auf der Konferenz beschnacken, das wird hier zu lang. Der Zwecke der Models ist doch, den Datenspeicher zu kapseln, also müssen/sollten sie nicht unbedingt Tabellen 1:1 abbilden (Model clients dürfen gar nicht von den unterliegende Strukturen wissen). D.h. es spricht gar nichts dagegen (aber viel dafür), dass |
Das Limit 64 finde ich nicht. laut Doku ist bei Engine MyISAM das Limit 1000 bytes, schon seit 4.1 Zeiten. Das wird zwar auch als uralter Bug moniert (http://bugs.mysql.com/bug.php?id=4541), erlaubt aber allemal 250+ utf8 Zeichen. Ich habe meinem Testcase eine weiter Datei hinzugefügt, die sich von der ersten nur durch weitere angehängte Zeichen unterscheidet (Dateiname insgesamt 211 Zeichen lang). File sync geht problemlos, ebenso Export und anschließender Import (als neu) der Tabelle. Der Index (pid, name) sollte also funktionieren. |
Ich habe es gerade getestet und dieselbe Exception wie eingangs erhalten. Ist ja auch klar, wenn der Index-Eintrag nach 64 Zeichen abgeschnitten wird :) |
Verstehe ich nicht. Wer schneidet da ab, wenn du doch die column verlängert hast? Der einzige Grund wäre eine column prefix length a la 'create index xxx on tl_files(path(64))' (http://dev.mysql.com/doc/refman/5.1/en/create-index.html). Sicherheitshalber zitiere ich mich von oben noch mal, weil ich bei deinem Commit fd7245f keine Verlängerung von
Wie auch immer, schöne Ostertage! |
Nicht die Spalte wird abgeschnitten, sondern der Index-Eintrag (siehe oben). Schau doch mal die Fehlermeldungen an, die Du gepostet hast, z.B.
Du wirst sehen, dass der Eintrag immer exakt 64 Zeichen lang ist, unabhängig davon, wie lange das Feld ist. Ich habe es mit |
Dann reden wir noch aneinander vorbei. Ich bekomme keinen Fehler bei meiner modifizierten
Ich habe direkt die Tabelle geändert (phpmyadmin), DCA nicht. Alle noch so langen filenames sind drin, die Cardinality des unique Index ist dieselbe wie des primary Index. Drop und recreate des unique Index funktionieren fehlerfrei. Export und Re-Import der Tabelle geht ebenfalls. Meine mySQL Version ist 5.1.41-3ubuntu12.6. Collation ist überall utf8_general_ci. Kann es sein, dass du einem mysql bug aufsitzt (dass es sich irgendwo gemerkt hat, dass der key nur 64 Zeichen hat)? Hast du mal den Index gedroppt und neu erstellt? |
Hab ich. Das Problem ist, dass der Fehler nicht so einfach zu reproduzieren ist. Am einfachsten geht es wie folgt:
Auf diese Weise stellst Du sicher, dass zwei neue Einträge in die Datenbank geschrieben werden, deren erste 77 Zeichen übereinstimmen. Da der Key bei 64 Zeichen abgeschnitten wird, sollte der zweite Eintrag die "Duplicate Key"-Exception triggern. |
Leo, ich habe sinngemäß gleiche Testcases als alter command-liner natürlich direkt im filesystem angelegt, mit Pfadlänger über 350 Zeichen (und Gleichaheit auf den ersten 350 Zeichen). Natürlich kracht es wie in einer unmodifizierten 3.0.6 so wie du schreibst. Ich habe aber meine Test in mit modifizierter Inzwischen hast du ja in der 3.1.RC.1 |
Dagegen habe ich ja auch gar nichts, außer das es eben bei mir nicht funktioniert hat. Aber ich versuche es gerne noch mal. |
Ah, dann sind wir auf einer Schiene. Welche mysql Version nutzt du? Ich habe noch einen Webspace, auf dem eine alte 5.0.18 läuft (die es aber auch schon richtig machen sollte), werde ich mal testen. |
Ein erneuter Test hat fehlerfrei funktioniert. Ich habe daher in 78ef640 den Unique-Index über |
Der neue Unique-Index scheint genau mein Problem beim Update von 3.0.6 auf 3.1.1 zu sein. Wenn der Unique-Index nur 64 Zeichen lang sein darf (bei mir wird er genau nach 64 Zeichen abgeschnitten), warum wird dann pid und name (gar 255 Zeichen!) zusammengelegt? Da ist doch klar, daß es früher oder später kracht, vor allen Dingen weil ja auch eine pid vielfach vorkommen kann. Die Frage ist jetzt auch ob ich trotzdem die 3.1.1er so laufen lassen ohne das |
@leofeyer ich hatte das Problem jetzt auch. Sobald der Dateiname > 64 Zeichen ist und du mehrere Dateien hast, deren erste 64 Zeichen identisch sind kracht es. |
@leofeyer Ich habe genau das gleiche Problem gerade bei einem meiner Kunden hier auch. Mehre Dateien mit gleichem, sehr langem Namen und am Ende nur durch _1 ... _5 unterschieden... :-( Update von 3.0 auf 3.1.1 |
Behoben in d0ee006. |
Leider tritt der Fehler auch mit diese Datei noch auf, wenn Kunden solche traumhaften Kandidaten in der Dateiverwaltung liegen haben: XYZ-September-´09 (1).JPG Dann knallt das Update in der install.php dennoch (obwohl ich die obige Datei ausgetauscht habe) weg:
|
@NinaG das ist wieder ein anderes Problem, entstanden durch das "kaputte" Sonderzeichen. Ich vermute dass es sich dabei nicht um einen UTF-8 codierten Dateinamen handelt. Um den Key zu bestimmen, schneidet die DB vor dem |
Beim Synchronisieren des Dateisystems in 3.0.6 tritt folgender Fehler auf:
Die entsprechenden Pfade habe ich durch PATH und PATH1 ersetzt.
Erstaunlich ist, dass der PATH maximal 64 Zeichen lang ist, sobald der reale Pfad länger ist, wird er abgeschnitten.
Ein ähnlicher Fehler wurde bereits im Forum beschrieben, ich habe die Datenbank-Felder überprüft, diese haben allerdings eine maximal-Länge von 255 Zeichen.
Weiterhin habe ich festgestellt,dass PATH1 immer einen Ordner angibt, der keine Dateien enthält. Sobald alle leeren Ordner aus dem Datei-System entfernt sind, tritt keine Fehlermeldung mehr auf.
The text was updated successfully, but these errors were encountered: