Todo List
phpDataSet
- Über die Implementierung des Attributs DataSet::Relations.
Was ist DataSet::Relations? Ein Attribut, das eine Kollektion aller Relationen dieses DataSets darstellt. Diese Kollektion enthält genau die Objekte in Form einer Zusammenfassung, die über DataTable::$ChildRelations und DataTable::$ParentRelations erreichbar sind. »Zusammenfassung« bedeutet dabei: Änderungen an diesem Attribut sollen automatisch an den anderen beiden Kollektionen nachvollzogen werden, und andersherum. In jedem DataSet mit konsistentem Zustand kann also jedes DataRelation-Objekt in drei Kollektionen erreicht werden: - in DataTable::$ChildRelations der DataTable, die die Kindrolle in dieser
DataRelation hat
- in DataTable::$ParentRelations der DataTable, die die Elternrolle in
dieser DataRelation hat
- in Relations des DataSets, zu der die beiden
DataTables gehören.
Wann kann implementiert werden? Dieses Attribut bietet bequemen, aber redundanten Zugriff auf die DataRelations. Auf eine Implementierung kann also verzichtet werden, zumal sie vor Version 1.0 zur Zeit nicht sinnvoll möglich ist. Derzeit werden nämlich PHP-Arrays zur Implementierung von Kollektionen verwendet. Die set-Methode gibt eine Referenz auf dieses Array zurück, somit ist (direkter) schreibender Zugriff möglich. So gibt es aber keine Möglichkeit für die set-Methode, nach einem solchen direkten Schreibzugriff eigenen Code auszuführen und so die Änderungen an den Attributen der jeweiligen DataTables nachzuvollziehen. Dazu müsste die Kollektion als Klasse implementiert werden, was erst nach Version 1.0 zusammen mit einer einheitlichen Überarbeitung aller anderen Kollektionen geschehen wird. Alternativ wäre es auch möglich, das Attribut DataSet::Relations als Array von Referenzen auf die Arrays DataTable::$ParentRelations und DataTable::$ChildRelations jeder enthaltenen DataTable zu implementieren, so dass sich Änderungen bereits durch die verwendeten Sprachmittel zumindest in entweder einem ParentRelations- oder einem ChildRelations-Array automatisch auswirken. Das macht jedoch die von diesem Attribut erwartete bequemen Bedienung zunichte, der Zugriff ist nicht einfacher als direkt auf die Arrays der DataTables.
- Es ist nicht möglich, eine DataTable, die einem DataSet zugehört, wieder unabhängig zu machen. Denn wenn null als Argument übergeben wird (genauer: eine Referenz auf eine Variable, die den wert null hat), so wird das so interpretiert, dass die Methode nur als get-Methode eingesetzt wird.
- Beschreibe, wie die Fehlerbehandlung aussieht.
- Diese Methode wird auch in den Klassen DataTable und DataRow gebraucht, um ihre Instanzen in typisierte Pendants umwandeln zu können. Dazu sollte diese Methode in eine gemeinsame Oberklasse »Typable« ausgegliedert werden.
- Deklaration und Implementierung der hier zum Argument $signalQueue beschriebenen Exception-Klassen.
- Exception-Behandlung entsprechend dem .NET-Vorbild dieser Methode implementieren (nach Version 1.0). Dabei sind folgende vier Exceptions unter jeweils spezifischen Voraussetzungen zu implementieren:
- ArgumentException: wenn das übergebene Feld mehr Werte als diese Tabelle Spalten hat.
Kann bereits jetzt implementiert werden.
- InvalidCastException: wenn ein oder mehr Werte des übergeben Feldes einen Typ haben,
der nicht zum Typ der entsprechenden Column passt. Dazu muss zuerst ein System eingeführt
werden, um Typsicherheit in PHP4 zu simulieren.
- ConstraintException: wenn das Hinzufügen der DataRow eine Constraint verletzt. Wird
zusammen mit der Klasse Constraint implementiert.
- NoNullAllowedException: wenn ein null-Wert in einer Spalte eingefügt würde, die keine
null-Werte erlaubt. Dazu mus zuerst das Attribut AllowDBNull in Klasse DataColumn
implementiert werden.
- Beschreibe und implementiere die Fehlerbehandlung, wenn in Quell- und Zieldaten eine Zeile mit gleichen Primärschlüsselwerten vorkommt und EnforceConstraints==true ist. Wie im Microsoft .NET-DataSet soll das zu einem MergeFailed-Event führen. Wird nach Version 1.0 implementiert, weil erst dann das Constraint-Handling implementiert wird und die von LoadDataRow erzeugten Exceptions, an denen Merge diesen Fehler nur erkennen kann.