diff --git a/src/main/java/de/telefonbuch/model/Datenbank.java b/src/main/java/de/telefonbuch/model/Datenbank.java index 20eee6521a92bb2fd37866a6118310a2e6f81ed5..f7520b19bff19869cacc3966620950b48ee7e8de 100644 --- a/src/main/java/de/telefonbuch/model/Datenbank.java +++ b/src/main/java/de/telefonbuch/model/Datenbank.java @@ -23,17 +23,7 @@ public class Datenbank { new Fehler().debug(this.getClass().getName() + "." + new Throwable().getStackTrace()[0].getMethodName(), true, 1); Statement stmt = this.con.createStatement(); - String createTable = "CREATE TABLE IF NOT EXISTS \"kontakte\" (" + - "id INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, " + - "vorname VARCHAR(50) NULL, " + - "nachname VARCHAR(50) NULL, " + - "strasse VARCHAR(50) NULL, " + - "hnr VARCHAR(10) NULL, " + - "plz VARCHAR(5) NULL, " + - "ort VARCHAR(50) NULL, " + - "telefon VARCHAR(30) UNIQUE NULL" + - ");"; - //stmt.execute(createTable); + String createTable, createTrigger, createView; createTable = "CREATE TABLE IF NOT EXISTS \"table_vorname\" (" + "id INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, " + @@ -70,7 +60,8 @@ public class Datenbank { "telefon VARCHAR(30) NOT NULL " + ");"; stmt.execute(createTable); - createTable = "CREATE TABLE IF NOT EXISTS \"kontakte\" (\n" + + + createTable = "CREATE TABLE IF NOT EXISTS \"table_kontakte\" (\n" + " vorname VARCHAR,\n" + " nachname VARCHAR,\n" + " strasse VARCHAR,\n" + @@ -87,6 +78,103 @@ public class Datenbank { " FOREIGN KEY(telefon) REFERENCES table_telefon(telefon)\n" + ");"; stmt.execute(createTable); + + createView = "CREATE VIEW IF NOT EXISTS \"view_kontakte\" AS " + + " SELECT" + + " table_vorname.vorname, " + + " table_nachname.nachname, " + + " table_strasse.strasse, " + + " table_hnr.hnr, " + + " table_plz.plz, " + + " table_ort.ort, " + + " table_telefon.telefon " + + " FROM table_kontakte " + + " INNER JOIN table_vorname ON table_kontakte.vorname = table_vorname.id" + + " INNER JOIN table_nachname ON table_kontakte.nachname = table_nachname.id" + + " INNER JOIN table_strasse ON table_kontakte.strasse = table_strasse.id" + + " INNER JOIN table_hnr ON table_kontakte.hnr = table_hnr.id" + + " INNER JOIN table_plz ON table_kontakte.plz = table_plz.id" + + " INNER JOIN table_ort ON table_kontakte.ort = table_ort.id" + + " INNER JOIN table_telefon ON table_kontakte.telefon = table_telefon.id;"; + stmt.execute(createView); + + createTrigger = "CREATE TRIGGER IF NOT EXISTS view_kontakte_INS\n" + + "INSTEAD OF INSERT ON view_kontakte FOR EACH ROW\n" + + "BEGIN\n" + + " INSERT INTO table_vorname (vorname) SELECT NEW.vorname WHERE NOT EXISTS (SELECT 1 FROM table_vorname WHERE vorname = NEW.vorname);\n" + + " INSERT INTO table_nachname (nachname) SELECT NEW.nachname WHERE NOT EXISTS (SELECT 1 FROM table_nachname WHERE nachname = NEW.nachname);\n" + + " INSERT INTO table_strasse (strasse) SELECT NEW.strasse WHERE NOT EXISTS (SELECT 1 FROM table_strasse WHERE strasse = NEW.strasse);\n" + + " INSERT INTO table_hnr (hnr) SELECT NEW.hnr WHERE NOT EXISTS (SELECT 1 FROM table_hnr WHERE hnr = NEW.hnr);\n" + + " INSERT INTO table_plz (plz) SELECT NEW.plz WHERE NOT EXISTS (SELECT 1 FROM table_plz WHERE plz = NEW.plz);\n" + + " INSERT INTO table_ort (ort) SELECT NEW.ort WHERE NOT EXISTS (SELECT 1 FROM table_ort WHERE ort = NEW.ort);\n" + + " INSERT INTO table_telefon (telefon) SELECT NEW.telefon WHERE NOT EXISTS (SELECT 1 FROM table_telefon WHERE telefon = NEW.telefon);\n" + + " INSERT INTO table_kontakte (vorname, nachname, strasse, hnr, plz, ort, telefon)\n" + + " SELECT\n" + + " (SELECT id FROM table_vorname WHERE vorname = NEW.vorname),\n" + + " (SELECT id FROM table_nachname WHERE nachname = NEW.nachname),\n" + + " (SELECT id FROM table_strasse WHERE strasse = NEW.strasse),\n" + + " (SELECT id FROM table_hnr WHERE hnr = NEW.hnr),\n" + + " (SELECT id FROM table_plz WHERE plz = NEW.plz),\n" + + " (SELECT id FROM table_ort WHERE ort = NEW.ort),\n" + + " (SELECT id FROM table_telefon WHERE telefon = NEW.telefon);\n" + + "END;"; + stmt.execute(createTrigger); + + createTrigger = "CREATE TRIGGER IF NOT EXISTS view_kontakte_DEL " + + " INSTEAD OF DELETE ON view_kontakte FOR EACH ROW " + + " BEGIN " + + " DELETE FROM table_kontakte" + + " WHERE vorname.id = (SELECT id FROM table_vorname WHERE vorname = OLD.vorname)" + + " AND nachname.id = (SELECT id FROM table_nachname WHERE nachname = OLD.nachname)" + + " AND strasse.id = (SELECT id FROM table_strasse WHERE strasse = OLD.strasse)" + + " AND hnr.id = (SELECT id FROM table_hnr WHERE hnr = OLD.hnr)" + + " AND plz.id = (SELECT id FROM table_plz WHERE plz = OLD.plz)" + + " AND ort.id = (SELECT id FROM table_ort WHERE ort = OLD.ort)" + + " AND telefon.id = (SELECT id FROM table_telefon WHERE telefon = OLD.telefon); " + + " DELETE FROM table_vorname WHERE id NOT IN (SELECT vorname.id FROM table_kontakte);" + + " DELETE FROM table_nachname WHERE id NOT IN (SELECT nachname.id FROM table_kontakte);" + + " DELETE FROM table_strasse WHERE id NOT IN (SELECT strasse.id FROM table_kontakte);" + + " DELETE FROM table_hnr WHERE id NOT IN (SELECT hnr.id FROM table_kontakte);" + + " DELETE FROM table_plz WHERE id NOT IN (SELECT plz.id FROM table_kontakte);" + + " DELETE FROM table_ort WHERE id NOT IN (SELECT ort.id FROM table_kontakte);" + + " DELETE FROM table_telefon WHERE id NOT IN (SELECT telefon.id FROM table_kontakte);" + + " END;"; + stmt.execute(createTrigger); + + createTrigger = "CREATE TRIGGER IF NOT EXISTS view_kontakte_UPD " + + " INSTEAD OF UPDATE ON view_kontakte FOR EACH ROW " + + " BEGIN " + + " INSERT INTO table_vorname (vorname) SELECT NEW.vorname WHERE NOT EXISTS (SELECT 1 FROM table_vorname WHERE vorname = NEW.vorname);" + + " INSERT INTO table_nachname (nachname) SELECT NEW.nachname WHERE NOT EXISTS (SELECT 1 FROM table_nachname WHERE nachname = NEW.nachname);" + + " INSERT INTO table_strasse (strasse) SELECT NEW.strasse WHERE NOT EXISTS (SELECT 1 FROM table_strasse WHERE strasse = NEW.strasse);" + + " INSERT INTO table_hnr (hnr) SELECT NEW.hnr WHERE NOT EXISTS (SELECT 1 FROM table_hnr WHERE hnr = NEW.hnr);" + + " INSERT INTO table_plz (plz) SELECT NEW.plz WHERE NOT EXISTS (SELECT 1 FROM table_plz WHERE plz = NEW.plz);" + + " INSERT INTO table_ort (ort) SELECT NEW.ort WHERE NOT EXISTS (SELECT 1 FROM table_ort WHERE ort = NEW.ort);" + + " INSERT INTO table_telefon (telefon) SELECT NEW.telefon WHERE NOT EXISTS (SELECT 1 FROM table_telefon WHERE telefon = NEW.telefon);" + + " UPDATE table_kontakte SET" + + " vorname = (SELECT id FROM table_vorname WHERE vorname = NEW.vorname), " + + " nachname = (SELECT id FROM table_nachname WHERE nachname = NEW.nachname), " + + " strasse = (SELECT id FROM table_strasse WHERE strasse = NEW.strasse), " + + " hnr = (SELECT id FROM table_hnr WHERE hnr = NEW.hnr), " + + " plz = (SELECT id FROM table_plz WHERE plz = NEW.plz), " + + " ort = (SELECT id FROM table_ort WHERE ort = NEW.ort), " + + " telefon = (SELECT id FROM table_telefon WHERE telefon = NEW.telefon) " + + " WHERE vorname = (SELECT id FROM table_vorname WHERE vorname = OLD.vorname) " + + " AND nachname = (SELECT id FROM table_nachname WHERE nachname = OLD.nachname)" + + " AND strasse = (SELECT id FROM table_strasse WHERE strasse = OLD.strasse)" + + " AND hnr = (SELECT id FROM table_hnr WHERE hnr = OLD.hnr)" + + " AND plz = (SELECT id FROM table_plz WHERE plz = OLD.plz)" + + " AND ort = (SELECT id FROM table_ort WHERE ort = OLD.ort)" + + " AND telefon = (SELECT id FROM table_telefon WHERE telefon = OLD.telefon);" + + " DELETE FROM table_vorname WHERE vorname NOT IN (SELECT id FROM table_kontakte);" + + " DELETE FROM table_nachname WHERE nachname NOT IN (SELECT id FROM table_kontakte);" + + " DELETE FROM table_strasse WHERE strasse NOT IN (SELECT id FROM table_kontakte);" + + " DELETE FROM table_hnr WHERE hnr NOT IN (SELECT id FROM table_kontakte);" + + " DELETE FROM table_plz WHERE plz NOT IN (SELECT id FROM table_kontakte);" + + " DELETE FROM table_ort WHERE ort NOT IN (SELECT id FROM table_kontakte);" + + " DELETE FROM table_telefon WHERE telefon NOT IN (SELECT id FROM table_kontakte);" + + "END;"; + stmt.execute(createTrigger); } /** @@ -107,7 +195,7 @@ public class Datenbank { try { Statement stmt = this.con.createStatement(); - String checkKontakt = "SELECT id FROM kontakte WHERE telefon=\"" + kontakt.getId() + "\";"; + String checkKontakt = "SELECT telefon FROM view_kontakte WHERE telefon=\"" + kontakt.getId() + "\";"; ResultSet checkResult = stmt.executeQuery(checkKontakt); int rows = 0; @@ -120,7 +208,7 @@ public class Datenbank { if (rows == 1) { new Fehler().debug("Updating contact", false); - insertKontakt = "UPDATE kontakte SET " + + insertKontakt = "UPDATE view_kontakte SET " + "vorname=\"" + kontakt.getVorname() + "\", " + "nachname=\"" + kontakt.getNachname() + "\", " + "strasse=\"" + kontakt.getStrasse() + "\", " + @@ -132,7 +220,7 @@ public class Datenbank { } else { new Fehler().debug("Insert new contact", false); - insertKontakt = "INSERT INTO kontakte (vorname, nachname, strasse, hnr, plz, ort, telefon) VALUES (" + + insertKontakt = "INSERT INTO view_kontakte (vorname, nachname, strasse, hnr, plz, ort, telefon) VALUES (" + "\"" + kontakt.getVorname() + "\", " + "\"" + kontakt.getNachname() + "\", " + "\"" + kontakt.getStrasse() + "\", " + @@ -156,7 +244,7 @@ public class Datenbank { try { Statement stmt = this.con.createStatement(); - String sql = " DELETE FROM kontakte" + + String sql = " DELETE FROM view_kontakte" + " WHERE telefon=\"" + telefon + "\";"; stmt.execute(sql); @@ -176,11 +264,11 @@ public class Datenbank { if (telefon.equals("first")) { sql = "SELECT * " + - "FROM kontakte " + + "FROM view_kontakte " + "LIMIT 1;"; } else { sql = "SELECT * " + - "FROM kontakte " + + "FROM view_kontakte " + "WHERE telefon=\"" + telefon + "\";"; } ResultSet rs = stmt.executeQuery(sql); @@ -215,27 +303,27 @@ public class Datenbank { try { Statement stmt = this.con.createStatement(); - String sql = "SELECT\n" + - " CASE\n" + - " WHEN LAG(telefon) OVER (ORDER BY nachname) IS NULL THEN (\n" + - " SELECT telefon\n" + - " FROM kontakte\n" + - " ORDER BY nachname DESC\n" + - " LIMIT 1\n" + - " )\n" + - " ELSE LAG(telefon) OVER (ORDER BY nachname)\n" + - " END last,\n" + - " telefon AS current,\n" + - " CASE\n" + - " WHEN LEAD(telefon) OVER (ORDER BY nachname) IS NULL THEN (\n" + - " SELECT telefon\n" + - " FROM kontakte\n" + - " ORDER BY nachname ASC\n" + - " LIMIT 1\n" + - " )\n" + - " ELSE LEAD(telefon) OVER (ORDER BY nachname)\n" + - " END next\n" + - "FROM kontakte\n" + + String sql = "SELECT " + + " CASE " + + " WHEN LAG(telefon) OVER (ORDER BY nachname) IS NULL THEN ( " + + " SELECT telefon " + + " FROM view_kontakte " + + " ORDER BY nachname DESC " + + " LIMIT 1 " + + " ) " + + " ELSE LAG(telefon) OVER (ORDER BY nachname) " + + " END last, " + + " telefon AS current, " + + " CASE " + + " WHEN LEAD(telefon) OVER (ORDER BY nachname) IS NULL THEN ( " + + " SELECT telefon " + + " FROM view_kontakte " + + " ORDER BY nachname ASC " + + " LIMIT 1 " + + " ) " + + " ELSE LEAD(telefon) OVER (ORDER BY nachname) " + + " END next " + + "FROM view_kontakte " + "ORDER BY nachname ASC;"; ResultSet rs = stmt.executeQuery(sql); @@ -263,7 +351,7 @@ public class Datenbank { Statement stmt = this.con.createStatement(); String sql = " SELECT COUNT(*) AS count" + - " FROM kontakte;"; + " FROM view_kontakte;"; ResultSet rs = stmt.executeQuery(sql); intResult = rs.getInt("count");