====== Änderungen in der Datenbank einbauen ======
==== Wo dokumentiere ich Änderungen ? ====
Wir haben ein graphische Darstellung des Datenbankmodells mit Hilfe der kostenlosen Software [[http://www.mysql.de/products/workbench/|MySQL-Workbench]] ([[http://dev.mysql.com/downloads/workbench/|Download]]) erstellt. Die aktuelle Projektdatei mit unserem Datenmodell für MySQL-Workbench kann unter folgendem Link über Subversion geladen werden: https://admidio.svn.sourceforge.net/svnroot/admidio/trunk/documentation/admidio.mwb
Zu folgenden Versionen kannst du das Datenmodell hier herunterladen:
* {{:de:entwickler:datenbank:admidio_datenmodell_2-0.pdf|Datenmodell für Admidio Version 2.0}}
* {{:de:entwickler:datenbank:admidio_datenmodell_2-1.pdf|Datenmodell für Admidio Version 2.1}}
* {{:de:entwickler:datenbank:admidio_datenmodell_2-3.pdf|Datenmodell für Admidio Version 2.3}}
**Änderungen oder Erweiterungen zu dem Datenmodell müssen zuerst über die MySQL-Workbench in der admidio.mwb gepflegt werden!** Erst danach sollen die Änderungen in die Installationsscripte von Admidio eingebaut und im Sourcecode verwendet werden.
==== Wo baue ich die Änderungen im Sourcecode ein ? ====
Änderungen in der Datenbankstruktur müssen an zwei Stellen eingebaut werden. Einmal im Installationsscript, welches die Datenbank bei Neuinstallationen einrichtet und zum anderen im Updatescript, welches bestehende Datenbanken mit den Neuerungen anpasst.
Das Installationsscript greift im Ordern **adm_program/installation/db_scripts** auf die Datei **db.sql** zu. Diese beinhaltet die Struktur der kompletten Admidio-Datenbank und ist identisch mit dem Datenmodell aus der MySQL-Workbench. Hier müssen die Änderungen aus dem Datenmodell 1 zu 1 umgesetzt werden.
Für das Update gibt es bis einschließlich Version 2.x 2 Dateien im Ordner **adm_program/installation/db_scripts** zu. Es gibt eine SQL-Datei **upd_2_4_0_db.sql** in der nur SQL-Statements mit Semikolon getrennt eingetragen werden können. Die Datei muss ggf. mit der aktuellen Versionsnummer, in der die Änderungen eingebaut werden sollen, noch erstellt werden. Zusätzlich gibt es noch eine PHP-Datei **upd_2_4_0_conv.php**, welche z.B. Datenkonvertierungen ermöglichen soll oder weitere Logik beinhalten kann. Auch diese muss ggf. mit der aktuellen Versionsnummer noch erstellt werden.
Ab Version 3.0 gibt es nur nocht eine Dateien im Ordner **adm_program/installation/db_scripts**. Die beiden Dateien wurden durch eine flexiblere **xml** Datei ersetzt. Hierzu gibt es im nächsten Kapitel eine ausführliche Beschreibung.
==== Wie wird die XML-Datei bearbeitet ? ====
Die XML-Datei wird auch in dem Ordner **adm_program/installation/db_scripts** abgelegt und folgt dem Namenschema **update_//Hauptversion//_//Unterversion//.xml**. Für Version 3.0.0 wäre das //update_3_0.xml//. Der XML-Aufbau sieht dann folgendermaßen aus:
1. SQL-Statement
2. SQL-Statement
usw...
stop
Hieran kann man schon erkennen, wie das Update funktioniert. Es werden mit aufsteigender ID einfach jeweils ein Befehl in einen **step** geschrieben. UPDATE %PREFIX%_organizations SET org_homepage = 'http://www.example.com' WHERE org_homepage IS NULL
Bei Tabellen muss immer hier der Platzhalter **%PREFIX%** genutzt werden, damit die installationsspezifischen Tabellenpräfixe berücksichtigt werden. Wichtig ist auch der letzte **step** mit dem Inhalt **stop**. Hieran erkennt das System das das gewünschte Ende erreicht wurde und das Script nicht irgendwo abgebrochen ist.
Möchte man datenbankabhängige SQL-Befehle erstellen, welche nur auf einer bestimmten Datenbank ausgeführt werden sollen, so muss noch das Attribut **database** mit dem definierten Namen der Datenbank als Wert hinterlegt werden. ALTER TABLE %PREFIX%_organizations ADD COLUMN org_example varchar(255)
Zusätzlich zu den SQL-Befehlen ist es auch möglich PHP-Code ausführen zu lassen. Dies geschieht durch den Aufruf einer Methode aus der Klasse **ComponentUpdate**. Du kannst also dieser Klasse eine neue Methode hinzufügen, die einen Codeschnipsel enthält, der z.B. eine Schleife über alle Organisationen macht und dann ein SQL-Statement für jede Organisation ausführt. Aufrufen kann man diese Methode dann indem man in der XML-Datei im **step** diese Methode wie eine statische Methode aufruft ComponentUpdate::updateStepDeleteDateRoles