/*******************************************************************************
* Copyright (c) 2005-2012, G. Weirich and Elexis
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0
* which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/epl-v10.html
*
* Contributors:
* G. Weirich - initial implementation
* MEDEVIT - several contributions
*******************************************************************************/
package ch.elexis.core.data.util;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.net.URL;
import java.util.ArrayList;
import java.util.List;
import java.util.stream.Collectors;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import ch.elexis.core.data.activator.CoreHub;
import ch.elexis.core.data.events.ElexisEventDispatcher;
import ch.elexis.core.data.extension.AbstractCoreOperationAdvisor;
import ch.elexis.core.data.extension.CoreOperationExtensionPoint;
import ch.elexis.core.data.status.ElexisStatus;
import ch.elexis.data.BezugsKontakt;
import ch.elexis.data.Brief;
import ch.elexis.data.Leistungsblock;
import ch.elexis.data.PersistentObject;
import ch.elexis.data.Prescription;
import ch.elexis.data.Reminder;
import ch.rgw.tools.VersionInfo;
/**
* Änderungen der Datenbank im Rahmen eines update durchführen.
*
* @author Gerry
*
*/
public class DBUpdate {
private static final String ALTER_TABLE = "ALTER TABLE ";
private static final String ADD = " ADD ";
/**
* Changeset is located in external file
*/
private static final String FILE_LOCATED = "FILE";
private static AbstractCoreOperationAdvisor cod =
CoreOperationExtensionPoint.getCoreOperationAdvisor();
//@formatter:off
static final String[] versions = {
"1.3.0", "1.3.1", "1.3.2", "1.3.3", "1.3.4", "1.3.5", "1.3.6", "1.3.7", "1.3.8", "1.3.9",
"1.3.10", "1.3.11", "1.3.12", "1.3.13", "1.4.0", "1.4.1", "1.4.2", "1.4.3", "1.4.4",
"1.4.5", "1.4.6", "1.5.0", "1.6.0", "1.6.1", "1.6.2", "1.6.3", "1.6.4", "1.7.0", "1.7.1",
"1.7.2", "1.8.0", "1.8.1", "1.8.2", "1.8.3", "1.8.4", "1.8.5", "1.8.6", "1.8.7", "1.8.8",
"1.8.9", "1.8.10", "1.8.11", "1.8.12", "1.8.13", "1.8.14", "1.8.15", "1.8.16", "1.9.0", "3.0.0",
"3.1.0", "3.2.0", "3.2.1", "3.2.2", "3.2.3", "3.2.4", "3.2.5", "3.2.6", "3.2.7"
};
static final String[] cmds =
{
"CREATE TABLE EIGENLEISTUNGEN(" + "ID VARCHAR(25) primary key,"
+ "Code VARCHAR(20)," + "Bezeichnung VARCHAR(80)," + "EK_PREIS CHAR(6),"
+ "VK_PREIS CHAR(6)," + "ZEIT CHAR(4) );",
"ALTER TABLE PATIENT_ARTIKEL_JOINT DROP COLUMN PATIENTID;"
+ "ALTER TABLE PATIENT_ARTIKEL_JOINT add ID VARCHAR(25);"
+ "ALTER TABLE PATIENT_ARTIKEL_JOINT add PATIENTID VARCHAR(25);"
+ "CREATE INDEX PAJ1 ON PATIENT_ARTIKEL_JOINT (PATIENTID);",
"CREATE TABLE HEAP2(" + "ID VARCHAR(50) primary key," + "Contents BLOB);",
"ALTER TABLE FAELLE ADD EXTINFO BLOB;"
+ "ALTER TABLE LEISTUNGEN ADD SCALE CHAR(4) DEFAULT '100';"
+ "ALTER TABLE LEISTUNGEN ADD DETAIL BLOB;",
"ALTER TABLE LEISTUNGEN ADD VK_TP CHAR(6);"
+ "ALTER TABLE LEISTUNGEN ADD VK_SCALE CHAR(6);"
+ "ALTER TABLE KONTAKT ADD TITEL VARCHAR(20);",
"ALTER TABLE FAELLE ADD Status VARCHAR(80);"
+ "ALTER TABLE REZEPTE ADD RpZusatz VARCHAR(80);"
+ "ALTER TABLE AUF ADD AUFZusatz VARCHAR(80)",
"ALTER TABLE REZEPTE ADD BriefID VARCHAR(25);"
+ "ALTER TABLE AUF ADD BriefID VARCHAR(25);",
"ALTER TABLE ARTIKEL ADD Name_intern VARCHAR(80);",
"ALTER TABLE PATIENT_ARTIKEL_JOINT ADD REZEPTID VARCHAR(25);"
+ "ALTER TABLE PATIENT_ARTIKEL_JOINT ADD DATEFROM CHAR(8);"
+ "ALTER TABLE PATIENT_ARTIKEL_JOINT ADD DATEUNTIL CHAR(8);"
+ "ALTER TABLE PATIENT_ARTIKEL_JOINT ADD ANZAHL CHAR(3);"
+ "CREATE INDEX PAJ2 ON PATIENT_ARTIKEL_JOINT(REZEPTID);",
"ALTER TABLE REMINDERS ADD RESPONSIBLE VARCHAR(25);"
+ "CREATE INDEX rem3 ON REMINDERS (RESPONSIBLE);"
+ "ALTER TABLE TARMED ADD NICKNAME VARCHAR(25);",
"ALTER TABLE RECHNUNGEN ADD STATUSDATUM CHAR(8);" + "CREATE TABLE USERCONFIG("
+ "UserID VARCHAR(25) primary key," + "Param VARCHAR(80)," + "Value BLOB);"
+ "CREATE INDEX UCFG ON USERCONFIG(Param);",
"ALTER TABLE USERCONFIG DROP Value;" + "ALTER TABLE USERCONFIG ADD VALUE TEXT;",
"DROP TABLE USERCONFIG;" + "CREATE TABLE USERCONFIG(" + "UserID VARCHAR(25),"
+ "Param VARCHAR(80)," + "Value TEXT);"
+ "CREATE INDEX UCFG ON USERCONFIG(Param);"
+ "CREATE INDEX UCFG2 ON USERCONFIG(UserID)",
"S1",
"ALTER TABLE BRIEFE DROP format;" + "ALTER TABLE BRIEFE ADD MimeType VARCHAR(80);"
+ "ALTER TABLE BRIEFE ADD Path TEXT;",
"ALTER TABLE KONTO ADD RechnungsID VARCHAR(25);"
+ "ALTER TABLE KONTO ADD ZahlungsID VARCHAR(25);"
+ "ALTER TABLE TARMED ADD GueltigVon CHAR(8);"
+ "ALTER TABLE TARMED ADD GueltigBis CHAR(8);",
"ALTER TABLE LABORWERTE ADD Flags VARCHAR(10);",
"CREATE TABLE LABGROUPS( ID VARCHAR(25) primary key, name VARCHAR(30));"
+ "CREATE TABLE LABGROUP_ITEM_JOINT(GroupID VARCHAR(25),"
+ "ItemID VARCHAR(25), Comment TEXT );",
// 1.4.4
"ALTER TABLE REMINDERS ADD OriginID VARCHAR(25);"
+ "CREATE TABLE REMINDERS_RESPONSIBLE_LINK(" + "ID VARCHAR(25) primary key,"
+ "ReminderID VARCHAR(25)," + "ResponsibleID VARCHAR(25)" + ");"
+ "CREATE INDEX rrl1 on REMINDERS_RESPONSIBLE_LINK (ReminderID);"
+ "CREATE INDEX rrl2 on REMINDERS_RESPONSIBLE_LINK (ResponsibleID);"
+ "ALTER TABLE PATIENT_ARTIKEL_JOINT ADD ExtInfo BLOB;",
// 1.4.5
"ALTER TABLE ARTIKEL ADD Klasse VARCHAR(80);",
// 1.4.6
"ALTER TABLE LABORITEMS MODIFY titel VARCHAR(80);"
+ "ALTER TABLE LABORITEMS MODIFY kuerzel VARCHAR(80);",
// 1.5.0
"ALTER TABLE HEAP MODIFY ID VARCHAR(80);",
// 1.6.0
"ALTER TABLE HEAP ADD datum CHAR(8);"
+ "ALTER TABLE KONTAKT ADD deleted CHAR(1) default '0';"
+ "ALTER TABLE KONTAKT_ADRESS_JOINT ADD deleted CHAR(1) default '0';"
+ "ALTER TABLE FAELLE ADD deleted CHAR(1) default '0';"
+ "ALTER TABLE BEHANDLUNGEN ADD deleted CHAR(1) default '0';"
+ "ALTER TABLE LABORWERTE ADD deleted CHAR(1) default '0';"
+ "ALTER TABLE ARTIKEL ADD deleted CHAR(1) default '0';"
+ "ALTER TABLE PATIENT_ARTIKEL_JOINT ADD deleted CHAR(1) default '0';"
+ "ALTER TABLE KONTO ADD deleted CHAR(1) default '0';"
+ "ALTER TABLE LEISTUNGEN ADD deleted CHAR(1) default '0';"
+ "ALTER TABLE LEISTUNGSBLOCK ADD deleted CHAR(1) default '0';"
+ "ALTER TABLE DIAGNOSEN ADD deleted CHAR(1) default '0';"
+ "ALTER TABLE BEHDL_DG_JOINT ADD deleted CHAR(1) default '0';"
+ "ALTER TABLE BRIEFE ADD deleted CHAR(1) default '0';"
+ "ALTER TABLE RECHNUNGEN ADD deleted CHAR(1) default '0';"
+ "ALTER TABLE ZAHLUNGEN ADD deleted CHAR(1) default '0';"
+ "ALTER TABLE REMINDERS ADD deleted CHAR(1) default '0';"
+ "ALTER TABLE REMINDERS_RESPONSIBLE_LINK ADD deleted CHAR(1) default '0';"
+ "ALTER TABLE BBS ADD deleted CHAR(1) default '0';"
+ "ALTER TABLE LABORITEMS ADD deleted CHAR(1) default '0';"
+ "ALTER TABLE LABGROUPS ADD deleted CHAR(1) default '0';"
+ "ALTER TABLE REZEPTE ADD deleted CHAR(1) default '0';"
+ "ALTER TABLE HEAP ADD deleted CHAR(1) default '0';"
+ "ALTER TABLE AUF ADD deleted CHAR(1) default '0';"
+ "ALTER TABLE EIGENLEISTUNGEN ADD deleted CHAR(1) default '0';"
+ "ALTER TABLE HEAP2 ADD deleted CHAR(1) default '0';"
+ "ALTER TABLE HEAP2 MODIFY ID VARCHAR(80);"
+ "ALTER TABLE HEAP2 ADD datum CHAR(8);"
+ "ALTER TABLE TARMED ADD deleted CHAR(1) default '0';"
+ "ALTER TABLE LABORWERTE ADD Origin VARCHAR(30);"
+ "INSERT INTO TARMED (ID,Nickname) VALUES ('Version','1.0.1');"
+ "CREATE TABLE LOGS(ID VARCHAR(25) primary key," + "OID VARCHAR(80),"
+ "datum CHAR(8)," + "typ VARCHAR(20)," + "userID VARCHAR(25),"
+ "station VARCHAR(40)," + "ExtInfo BLOB);",
// 1.6.1
"CREATE TABLE XID(" + "ID VARCHAR(25) primary key," + "deleted CHAR(1) default '0',"
+ "type VARCHAR(80)," + "object VARCHAR(25)," + "domain VARCHAR(255),"
+ "domain_id VARCHAR(255)," + "quality CHAR(1) default '0'" + ");"
+ "CREATE INDEX XIDIDX1 on XID(domain);"
+ "CREATE INDEX XIDIDX2 on XID(domain_id);"
+ "CREATE INDEX XIDIDX3 on XID(object);",
// 1.6.2
"ALTER TABLE AUF ADD DatumAUZ CHAR(8);" + "ALTER TABLE ARTIKEL ADD LastUpdate CHAR(8);",
// 1.6.3.
"ALTER TABLE ARTIKEL ADD EAN VARCHAR(15);",
// 1.6.4
"ALTER TABLE HEAP ADD lastupdate CHAR(14);"
+ "ALTER TABLE HEAP2 ADD lastupdate CHAR(14)",
// 1.7.0
"CREATE TABLE ETIKETTEN(" + "ID VARCHAR(25) primary key,"
+ "Image VARCHAR(25)," + "deleted CHAR(1) default '0',"
+ "importance integer," + "Name VARCHAR(40)," + "foreground CHAR(6),"
+ "background CHAR(6)" + ");" + "CREATE INDEX ETIKETTE1 on ETIKETTEN(Name);" +
"CREATE TABLE ETIKETTEN_OBJECT_LINK(" + " obj VARCHAR(25),"
+ " etikette VARCHAR(25)" + ");"
+ "CREATE INDEX ETIKETTE2 on ETIKETTEN_OBJECT_LINK(obj);"
+ "CREATE INDEX ETIKETTE3 on ETIKETTEN_OBJECT_LINK(etikette);" +
"CREATE TABLE DBIMAGE (" + "ID VARCHAR(25) primary key,"
+ "deleted CHAR(1) default '0'," + "Datum CHAR(8)," + "Title VARCHAR(80),"
+ "Bild BLOB" + ");" + "CREATE INDEX DBIMAGE1 on DBIMAGE(Title);",
// 1.7.1
"ALTER TABLE LABORITEMS MODIFY Einheit VARCHAR(20);"
+ "ALTER TABLE ETIKETTEN MODIFY importance VARCHAR(7);",
// 1.7.2
"ALTER TABLE LEISTUNGEN ADD SCALE2 CHAR(4);"
+ "ALTER TABLE ETIKETTEN ADD classes VARCHAR(255);"
+ "ALTER TABLE LABORWERTE ADD zeit CHAR(6);",
// 1.8.0
"DROP TABLE PATIENT_GARANT_JOINT;" + "DROP TABLE PLZ;"
+ "ALTER TABLE KONTAKT ADD lastupdate BIGINT;"
+ "ALTER TABLE KONTAKT_ADRESS_JOINT ADD lastupdate BIGINT;"
+ "ALTER TABLE FAELLE ADD lastupdate BIGINT;"
+ "ALTER TABLE BEHANDLUNGEN ADD lastupdate BIGINT;"
+ "ALTER TABLE ARTIKEL DROP lastupdate;"
+ "ALTER TABLE ARTIKEL ADD lastupdate BIGINT;"
+ "ALTER TABLE PATIENT_ARTIKEL_JOINT ADD lastupdate BIGINT;"
+ "ALTER TABLE KONTO ADD lastupdate BIGINT;"
+ "ALTER TABLE LEISTUNGEN ADD lastupdate BIGINT;"
+ "ALTER TABLE LEISTUNGSBLOCK ADD lastupdate BIGINT;"
+ "ALTER TABLE EK_PREISE ADD lastupdate BIGINT;"
+ "ALTER TABLE VK_PREISE ADD lastupdate BIGINT;"
+ "ALTER TABLE DIAGNOSEN ADD lastupdate BIGINT;"
+ "ALTER TABLE BEHDL_DG_JOINT ADD lastupdate BIGINT;"
+ "ALTER TABLE CONFIG ADD lastupdate BIGINT;"
+ "ALTER TABLE BRIEFE ADD lastupdate BIGINT;"
+ "ALTER TABLE RECHNUNGEN ADD lastupdate BIGINT;"
+ "ALTER TABLE ZAHLUNGEN ADD lastupdate BIGINT;"
+ "ALTER TABLE REMINDERS ADD lastupdate BIGINT;"
+ "ALTER TABLE REMINDERS_RESPONSIBLE_LINK ADD lastupdate BIGINT;"
+ "ALTER TABLE BBS ADD lastupdate BIGINT;"
+ "ALTER TABLE LABORITEMS ADD lastupdate BIGINT;"
+ "ALTER TABLE LABORWERTE ADD lastupdate BIGINT;"
+ "ALTER TABLE LABGROUPS ADD lastupdate BIGINT;"
+ "ALTER TABLE LABGROUP_ITEM_JOINT ADD lastupdate BIGINT;"
+ "ALTER TABLE REZEPTE ADD lastupdate BIGINT;"
+ "ALTER TABLE HEAP DROP lastupdate;" + "ALTER TABLE HEAP ADD lastupdate BIGINT;"
+ "ALTER TABLE HEAP2 DROP lastupdate;" + "ALTER TABLE HEAP2 ADD lastupdate BIGINT;"
+ "ALTER TABLE AUF ADD lastupdate BIGINT;"
+ "ALTER TABLE EIGENLEISTUNGEN ADD lastupdate BIGINT;"
+ "ALTER TABLE LOGS ADD lastupdate BIGINT;"
+ "ALTER TABLE USERCONFIG ADD lastupdate BIGINT;"
+ "ALTER TABLE XID ADD lastupdate BIGINT;"
+ "ALTER TABLE ETIKETTEN ADD lastupdate BIGINT;"
+ "ALTER TABLE ETIKETTEN_OBJECT_LINK ADD lastupdate BIGINT;"
+ "ALTER TABLE DBIMAGE ADD lastupdate BIGINT;" + "CREATE TABLE ARTIKEL_DETAILS("
+ "ARTICLE_ID VARCHAR(25)," + "notes TEXT," + "image BLOB"
+ ");",
// 1.8.1
"ALTER TABLE AUF MODIFY Grund VARCHAR(50);"
+ "ALTER TABLE LABORITEMS ADD billingcode VARCHAR(20);",
// 1.8.2
"ALTER TABLE PATIENT_ARTIKEL_JOINT ADD Artikel VARCHAR(80);",
// 1.8.3
"ALTER TABLE LOGS ADD deleted CHAR(1) default '0';",
// 1.8.4
"ALTER TABLE KONTAKT MODIFY EMail VARCHAR(80);",
// 1.8.5
"ALTER TABLE ARTIKEL ADD ValidFrom CHAR(8);"
+ "ALTER TABLE ARTIKEL ADD ValidTo CHAR(8);" + "CREATE TABLE OUTPUT_LOG("
+ "ID VARCHAR(25) primary key," + "lastupdate BIGINT,"
+ "deleted CHAR(1) default '0'," + "ObjectID VARCHAR(25),"
+ "ObjectType VARCHAR(80)," + "Datum CHAR(8)," + "Outputter VARCHAR(80),"
+ "ExtInfo BLOB);" + "create INDEX bal_i1 ON OUTPUT_LOG (ObjectID);"
+ "ALTER TABLE DBIMAGE ADD Prefix VARCHAR(80);",
// 1.8.6
"CREATE TABLE ETIKETTEN_OBJCLASS_LINK(" + "objclass VARCHAR(80),"
+ "sticker VARCHAR(25));"
+ "CREATE INDEX eol1 on ETIKETTEN_OBJCLASS_LINK(objclass);",
// 1.8.7
"ALTER TABLE LOGS MODIFY station VARCHAR(40);",
// 1.8.8
"ALTER TABLE KONTAKT_ADRESS_JOINT MODIFY Bezug VARCHAR(80);",
// 1.8.9
"ALTER TABLE LABORITEMS ADD EXPORT VARCHAR(100);",
// 1.8.10
// Gerry Weirich in einem Mail vom 26.06.2011
// In früheren Elexis-Versionen wurden Formeln direkt im Feld
// abgelegt,
// aktuell sind es Scripts (Also Objekte vom typ
// ch.elexis.data.Script)
// und das Feld muss nur noch den Namen des Scripts halten.
"DELETE FROM LABORITEMS where length(RefFrauOrTx) > 256;"
+ "ALTER TABLE LABORITEMS MODIFY RefFrauOrTx VARCHAR(256);"
+ "ALTER TABLE LABORITEMS MODIFY RefMann VARCHAR(256);",
// 1.8.11
// M. Descher (9.9.2011)
// Anmerkung: Der JPA Standard reserviert für jeden String-Typ ein
// Element vom Typ VARCHAR(255), da heutige DB Systeme keine großen
// Einschränkungen dadurch tragen. Es werden daher ab 9.9.2011 per
// Beschluss Release Meeting 14 sämtliche (String) Felder, falls
// größer
// benötigt, standardmässig auf 255 gesetzt.
"ALTER TABLE KONTAKT MODIFY Bezeichnung1 VARCHAR(255);"
+ "ALTER TABLE KONTAKT MODIFY Bezeichnung2 VARCHAR(255);"
+ "ALTER TABLE KONTAKT MODIFY Bezeichnung3 VARCHAR(255);"
+ "ALTER TABLE KONTAKT MODIFY Strasse VARCHAR(255);"
+ "ALTER TABLE KONTAKT MODIFY Ort VARCHAR(255);"
// (please try
// Llanfairpwllgwyngyllgogerychwyrndrobwllllantysiliogogogoch
// :-)
+ "ALTER TABLE KONTAKT MODIFY Email VARCHAR(255);"
+ "ALTER TABLE KONTAKT MODIFY Website VARCHAR(255);"
+ "ALTER TABLE KONTAKT MODIFY Titel VARCHAR(255);"
+ "ALTER TABLE KONTAKT ADD TitelSuffix VARCHAR(255);"
+ "ALTER TABLE PATIENT_ARTIKEL_JOINT MODIFY Dosis VARCHAR(255);"
+ "ALTER TABLE PATIENT_ARTIKEL_JOINT MODIFY Bemerkung VARCHAR(255);",
// 1.8.12
// M. Descher (23.3.2012)
// Due to Ticket #712 - Insufficient length of multiplicator
"ALTER TABLE VK_PREISE MODIFY MULTIPLIKATOR VARCHAR(8);"
+ "ALTER TABLE EK_PREISE MODIFY MULTIPLIKATOR VARCHAR(8);",
// 1.8.13
// M. Descher (30.3.2012)
// Due to Ticket #838 - Leistungen, "teurer" als 9999.99 Fr.
"ALTER TABLE LEISTUNGEN MODIFY VK_TP VARCHAR(8);"
+ "ALTER TABLE LEISTUNGEN MODIFY VK_SCALE VARCHAR(8);",
// 1.8.14
// M. Descher (16.4.2012)
// Due to Ticket #917 - Spalte OID in Tabelle Logs zu kurz
"ALTER TABLE LOGS MODIFY OID VARCHAR(255);"
+ "ALTER TABLE LOGS MODIFY station VARCHAR(255);",
// 1.8.15
// N. Giger 18.07.2012
// Anpassung für Import ODDB-YAML/CSV. Brauche ATC_code Feld
"ALTER TABLE ARTIKEL ADD ATC_code VARCHAR(255);",
// 1.8.16
// T. Huster 29.08.2012
// Add userID for needed statistics
"ALTER TABLE LEISTUNGEN ADD userID VARCHAR(25);",
// 1.9.0
// T. Huster 18.07.2013
// Changes for new Lab model and view
"ALTER TABLE LABORITEMS ADD loinccode VARCHAR(128);"
+ "ALTER TABLE LABORITEMS ADD visible VARCHAR(1);"
+ "ALTER TABLE LABORITEMS MODIFY billingcode VARCHAR(128);"
+ "ALTER TABLE LABORITEMS ADD digits VARCHAR(16);"
+ "ALTER TABLE LABORITEMS ADD formula VARCHAR(255);"
+ "ALTER TABLE LABORWERTE MODIFY resultat VARCHAR(255);"
+ "ALTER TABLE LABORWERTE ADD ExtInfo BLOB;"
+ "ALTER TABLE LABORWERTE ADD unit VARCHAR(255);"
+ "ALTER TABLE LABORWERTE ADD analysetime VARCHAR(24);"
+ "ALTER TABLE LABORWERTE ADD observationtime VARCHAR(24);"
+ "ALTER TABLE LABORWERTE ADD transmissiontime VARCHAR(24);"
+ "ALTER TABLE LABORWERTE ADD refmale VARCHAR(255);"
+ "ALTER TABLE LABORWERTE ADD reffemale VARCHAR(255);"
+ "ALTER TABLE LABORWERTE ADD OriginID VARCHAR(25);",
// 3.0.0
// M. Descher 19.12.2013
// Bump to 3.0.0 in Elexis 3.0.0
ALTER_TABLE+BezugsKontakt.TABLENAME+" ADD "+BezugsKontakt.FLD_MY_RTYPE+" CHAR(4);"+
ALTER_TABLE+BezugsKontakt.TABLENAME+" ADD "+BezugsKontakt.FLD_OTHER_RTYPE+" CHAR(4);"+
ALTER_TABLE+Prescription.TABLENAME+" MODIFY "+Prescription.FLD_ARTICLE+" VARCHAR(255);",
// 3.1.0
ALTER_TABLE+Prescription.TABLENAME+ADD+Prescription.FLD_PRESC_TYPE+" CHAR(2);"+
ALTER_TABLE+Prescription.TABLENAME+ADD+Prescription.FLD_SORT_ORDER+" CHAR(3);"+
ALTER_TABLE+Prescription.TABLENAME+ADD+Prescription.FLD_DATE_PRESC+" CHAR(8);"+
ALTER_TABLE+Prescription.TABLENAME+ADD+Prescription.FLD_PRESCRIPTOR+" VARCHAR(25);"+
ALTER_TABLE+Leistungsblock.TABLENAME+ADD+Leistungsblock.FLD_MACRO+" VARCHAR(30);"+
"CREATE INDEX block3 on "+Leistungsblock.TABLENAME+"("+Leistungsblock.FLD_MACRO+");",
// 3.2.0
ALTER_TABLE+Prescription.TABLENAME+" MODIFY "+Prescription.FLD_DATE_FROM+" CHAR(24);"+
ALTER_TABLE+Prescription.TABLENAME+" MODIFY "+Prescription.FLD_DATE_UNTIL+" CHAR(24);"+
ALTER_TABLE+Brief.TABLENAME+" MODIFY "+Brief.FLD_SUBJECT+" VARCHAR(255);"+
ALTER_TABLE+Brief.TABLENAME+" ADD "+Brief.FLD_NOTE+" VARCHAR(255);"+
ALTER_TABLE+Brief.TABLENAME+" MODIFY "+Brief.FLD_DATE+" CHAR(24);"+
ALTER_TABLE+Brief.TABLENAME+" MODIFY "+Brief.FLD_DATE_MODIFIED+" CHAR(24);",
// 3.2.1
ALTER_TABLE+Brief.TABLENAME+" MODIFY "+Brief.FLD_NOTE+" TEXT;",
// 3.2.2
ALTER_TABLE+Reminder.TABLENAME+ADD+Reminder.FLD_PRIORITY+" CHAR(1);"+
ALTER_TABLE+Reminder.TABLENAME+ADD+Reminder.FLD_ACTION_TYPE+" CHAR(2);"+
ALTER_TABLE+Reminder.TABLENAME+ADD+Reminder.FLD_SUBJECT+" VARCHAR(160);",
// 3.2.3
"ALTER TABLE KONTO ADD account CHAR(255);",
// 3.2.4
FILE_LOCATED,
// 3.2.5
FILE_LOCATED,
// 3.2.6
FILE_LOCATED,
// 3.2.7
FILE_LOCATED
};
//@formatter:on
protected static Logger log = LoggerFactory.getLogger(DBUpdate.class);
static VersionInfo vi;
/**
* Diese Methode erledigt Datenbankänderungen, die im Rahmen eines Updates nötig sind Versions
* enthält eine Versionsliste, cmds ein Kommando für jede dieser Versionen. Ein Kommando ist
* entweder
* <ul>
* <li>direkt ein SQL-Befehl,
* <li>eine ; getrennte Liste von SQL-Befehlen</li>
*
* @return
*/
public static boolean doUpdate(){
String dbv = CoreHub.globalCfg.get("dbversion", null);
if (dbv == null) {
log.error("Kann keine Version lesen");
ElexisStatus es = new ElexisStatus(ElexisStatus.LOG_ERRORS, CoreHub.PLUGIN_ID,
ElexisStatus.CODE_RESTART,
"Fataler Fehler bei Datenbank-Update: Kann keine Versionsinformation lesen. Abbruch",
ElexisStatus.LOG_FATALS);
ElexisEventDispatcher.fireElexisStatusEvent(es);
System.exit(0);
} else {
vi = new VersionInfo(dbv);
}
List<String> sqlStrings = new ArrayList<String>();
for (int i = 0; i < versions.length; i++) {
if (vi.isOlder(versions[i])) {
String[] cmd = cmds[i].split(";");
for (int cmdIdx = 0; cmdIdx < cmd.length; cmdIdx++)
if (FILE_LOCATED.equals(cmd[cmdIdx])) {
String dbscript = readDBScriptForVersionFromFile(versions[i],
PersistentObject.getConnection().DBFlavor);
if (dbscript == null) {
return false;
}
sqlStrings.add(dbscript);
} else {
sqlStrings.add(cmd[cmdIdx]);
}
}
}
// create log message
log.info(
"Start DBUpdate from Version " + dbv + " to Version " + versions[versions.length - 1]);
boolean success =
cod.performDatabaseUpdate(sqlStrings.toArray(new String[0]), CoreHub.PLUGIN_ID);
// update version if all updates are successful
if (success) {
CoreHub.globalCfg.set("dbversion", CoreHub.DBVersion);
CoreHub.globalCfg.set("ElexisVersion", CoreHub.Version);
CoreHub.globalCfg.flush();
// create log message
log.info("DBUpdate from Version " + dbv + " to Version " + versions[versions.length - 1]
+ " successful.");
} else {
log.error("DBUpdate from Version " + dbv + " to Version "
+ versions[versions.length - 1] + " failed.");
}
return success;
}
/**
*
* @param dBFlavor
* @since 3.1 considers flavor specific scripts
*/
public static String readDBScriptForVersionFromFile(String version, String dBFlavor){
String resourceName = "/rsc/dbScripts/" + version.replaceAll("\\.", "_");
URL resource = DBUpdate.class.getResource(resourceName + "_" + dBFlavor + ".sql");
if (resource != null) {
resourceName += "_" + dBFlavor + ".sql";
} else {
resourceName += ".sql";
}
try (InputStream inputStream = DBUpdate.class.getResourceAsStream(resourceName)) {
return new BufferedReader(new InputStreamReader(inputStream)).lines()
.filter(s -> !s.startsWith("#")).collect(Collectors.joining("\n"));
} catch (IOException e) {
log.error("Error reading input file [{}] for version [{}]." + resourceName, version);
return null;
}
}
}