de.svws_nrw.db.schema.SchemaRevisionUpdateSQL Maven / Gradle / Ivy
Go to download
Show more of this group Show more artifacts with this name
Show all versions of svws-db Show documentation
Show all versions of svws-db Show documentation
Diese Bibliothek regelt den Zugriff auf Datenbanken für die Schulverwaltungssoftware in NRW
package de.svws_nrw.db.schema;
import java.util.Arrays;
import java.util.Collections;
import java.util.LinkedHashMap;
import java.util.List;
import java.util.ArrayList;
import de.svws_nrw.core.logger.Logger;
import de.svws_nrw.db.DBDriver;
import de.svws_nrw.db.DBEntityManager;
/**
* Diese Klasse ist die Basisklasse für die Definition von
* SQL-Befehlen, welche bei einem Update auf die zugehörige
* SVWS-Datenbank-Revision ausgeführt werden.
*/
public class SchemaRevisionUpdateSQL {
/** Die Revision der die Befehle zugeordnet sind */
private final SchemaRevisionen _revision;
/** Eine Liste mit den erläuternden Kommentaren der SQL-Befehle */
private final ArrayList _kommentare = new ArrayList<>();
/** Eine Liste mit den durch den SQL-Befehl betroffen Tabellen. */
private final ArrayList _tabellen = new ArrayList<>();
/** Der Vektor mit den SQL-Befehlen in Bezug aud das jeweilige DBMS */
private final LinkedHashMap> _sql = new LinkedHashMap<>();
/**
* Erzeugt eine neue Instanz von SQL-Befehlen für Updates
* auf die angebene Revision
*
* @param revision die Revision, für welche die Update-Befehle
* definiert wurden.
*/
protected SchemaRevisionUpdateSQL(final SchemaRevisionen revision) {
this._revision = revision;
}
/**
* Gibt die Revision zurück, welcher die SQL-Befehle zugeordnet sind.
*
* @return diw SQL-Befehle
*/
public SchemaRevisionen revision() {
return _revision;
}
/**
* Gibt die Liste der SQL-Befehle für das angegebene DBMS zurück.
*
* @param dbms das DBMS
*
* @return die Liste der SQL-Befehle oder null, falls keine vorhanden sind.
*/
public List getSQL(final DBDriver dbms) {
final var liste = _sql.get(dbms);
return (liste == null) ? Collections.emptyList() : liste;
}
/**
* Fügt der Liste der SQL-Befehle für das angegebene DBMS
* einen weiteren Befehl hinzu.
*
* @param dbms das DBMS
* @param sql der SQL-Befehl
*/
private void add(final DBDriver dbms, final String sql) {
final var liste = _sql.computeIfAbsent(dbms, d -> new ArrayList<>());
liste.add(sql);
}
/**
* Fügt den übergebenen SQL-Befehl einheitlich für alle DBMS hinzu.
*
* @param kommentar die Bezeichnung/Kurz-Erläuterung des SQL-Befehls
* @param sql der SQL-Befehl
* @param tabellen die Tabellen, welche durch den SQL-Befehle gelesen oder beschrieben werden.
*/
public void add(final String kommentar, final String sql, final SchemaTabelle... tabellen) {
add(kommentar, sql, null, null, tabellen);
}
/**
* Fügt den übergebenen SQL-Befehl allen DBMS hinzu,
* außer dem spezifizierten DBMS. Diesem wird der
* danach angegeben Befehl hinzugefügt.
*
* @param kommentar die Bezeichnung/Kurz-Erläuterung des SQL-Befehls
* @param sql der SQL-Befehl
* @param dbms2 das DBMS mit einer Variante
* @param sql2 der SQL-Befehl für die Variante
* @param tabellen die Tabellen, welche durch den SQL-Befehle gelesen oder beschrieben werden.
*/
public void add(final String kommentar, final String sql, final DBDriver dbms2, final String sql2, final SchemaTabelle... tabellen) {
add(kommentar, sql, dbms2, sql2, null, null, tabellen);
}
/**
* Fügt den übergebenen SQL-Befehl allen DBMS hinzu,
* außer den beiden spezifizierten DBMS. Diesen wird
* jeweils der nach dem DBMS angegebene Befehl hinzugefügt.
*
* @param kommentar der erläuternde Kommentar zum SQL-Befehl
* @param sql der SQL-Befehl
* @param dbms2 das erste DBMS mit einer Variante
* @param sql2 der SQL-Befehl für die erste Variante
* @param dbms3 das zweite DBMS mit einer Variante
* @param sql3 der SQL-Befehl für die zweite Variante
* @param tabellen die Tabellen, welche durch den SQL-Befehle gelesen oder beschrieben werden.
*/
public void add(final String kommentar, final String sql, final DBDriver dbms2, final String sql2, final DBDriver dbms3, final String sql3,
final SchemaTabelle... tabellen) {
_kommentare.add(kommentar);
_tabellen.addAll(Arrays.asList(tabellen));
for (final DBDriver dbms : DBDriver.values()) {
if (dbms == dbms2)
add(dbms, sql2);
else
add(dbms, (dbms == dbms3) ? sql3 : sql);
}
}
/**
* Gibt die Anzahl der SQL-Befehle zurück.
*
* @return die Anzahl der SQL-Befehle
*/
public int size() {
return _kommentare.size();
}
/**
* Gibt den Kommentar zum i-ten SQL-Befehl zurück.
*
* @param i der Index für welchen der Kommentar zum SQL-Befehl
* zurückgegeben werden soll.
*
* @return der Kommentar
*/
public String getKommentar(final int i) {
if ((i < 0) || (i >= _kommentare.size()))
throw new ArrayIndexOutOfBoundsException();
return _kommentare.get(i);
}
/**
* Die Tabellen des Schemas, welche durch den SQL-Befehle
* gelesen oder beschrieben werden.
*
* @return die Liste der Tabellen
*/
public List tabellen() {
return this._tabellen;
}
/**
* Gibt den i-ten SQL-Befehl für das angegebene DBMS zurück.
*
* @param dbms das DBMS
* @param i der Index des SQL-Befehls
*
* @return der Kommentar
*/
public String getSQL(final DBDriver dbms, final int i) {
if ((i < 0) || (i >= _kommentare.size()))
throw new ArrayIndexOutOfBoundsException();
final var liste = getSQL(dbms);
if (liste == null)
throw new ArrayIndexOutOfBoundsException();
return _sql.get(dbms).get(i);
}
/**
* Führt den Code vor den für die Revision registrierten SQL-Befehle aus.
* Die Methode muss bei Bedarf überschrieben werden.
*
* @param conn die Datenbankverbindung
* @param logger der Logger
*
* @return true im Erfolgsfall und ansonsten false
*/
public boolean runFirst(final DBEntityManager conn, final Logger logger) {
return true;
}
/**
* Führt den Code nach den für die Revision registrierten SQL-Befehle aus.
* Die Methode muss bei Bedarf überschrieben werden.
*
* @param conn die Datenbankverbindung
* @param logger der Logger
*
* @return true im Erfolgsfall und ansonsten false
*/
public boolean runLast(final DBEntityManager conn, final Logger logger) {
return true;
}
}