diff --git a/src/main/java/uk/ac/ed/pguaglia/real/db/Database.java b/src/main/java/uk/ac/ed/pguaglia/real/db/Database.java index 17f3655deef87acbe0200574c5ce12b7ebd14ee5..a46c6cee57e51cbbe5cd51ef9cc9dabc6633759d 100644 --- a/src/main/java/uk/ac/ed/pguaglia/real/db/Database.java +++ b/src/main/java/uk/ac/ed/pguaglia/real/db/Database.java @@ -27,6 +27,9 @@ public class Database { private final static String PREFIX = "_"; private final static String SCHEMA_TABLE = "realschema"; + private final static String SCHEMA_TABLE_REL = "rel"; + private final static String SCHEMA_TABLE_ATT = "attr"; + private final static String SCHEMA_TABLE_DEF = "def"; private File dataFile; private Schema schema; @@ -37,7 +40,8 @@ public class Database { dataFile.deleteOnExit(); conn = DriverManager.getConnection("jdbc:sqlite:" + dataFile.getAbsolutePath()); var stmt = conn.createStatement(); - stmt.execute("CREATE TABLE " + SCHEMA_TABLE + " (rel primary key, attr, def)"); + stmt.execute(String.format("CREATE TABLE %s (%s PRIMARY KEY, %s, %s)", + SCHEMA_TABLE, SCHEMA_TABLE_REL, SCHEMA_TABLE_ATT, SCHEMA_TABLE_DEF)); conn.setAutoCommit(false); schema = new Schema(); } @@ -48,7 +52,7 @@ public class Database { conn.setAutoCommit(false); schema = new Schema(); var stmt = conn.createStatement(); - var rs = stmt.executeQuery("SELECT rel, attr, def FROM " + SCHEMA_TABLE); + var rs = stmt.executeQuery("SELECT * FROM " + SCHEMA_TABLE); while (rs.next()) { String name = rs.getString(1); String json = rs.getString(2); @@ -133,7 +137,24 @@ public class Database { try { var stmt = conn.createStatement(); stmt.execute(String.format(schemaEntry, - stmt.enquoteIdentifier(name, true), "null", stmt.enquoteLiteral(def))); + stmt.enquoteIdentifier(name, false), "null", stmt.enquoteLiteral(def))); + } catch (SQLException e) { + conn.rollback(); + throw e; + } + conn.commit(); + } + + public void drop(String name) throws Exception { + boolean isBaseTable = schema.hasTable(name); + schema.drop(name); + try { + var stmt = conn.createStatement(); + stmt.execute(String.format("DELETE FROM %s WHERE %s = %s", + SCHEMA_TABLE, SCHEMA_TABLE_REL, stmt.enquoteLiteral(name))); + if (isBaseTable) { + stmt.execute("DROP TABLE " + stmt.enquoteIdentifier(Database.encode(name), false)); + } } catch (SQLException e) { conn.rollback(); throw e; diff --git a/src/main/java/uk/ac/ed/pguaglia/real/runtime/CommandLineApp.java b/src/main/java/uk/ac/ed/pguaglia/real/runtime/CommandLineApp.java index 90e37e3425ae767fc03ef2cd5716eacb4d730d0e..a55b399a09b60b41bf952b7296a8d76027be2359 100644 --- a/src/main/java/uk/ac/ed/pguaglia/real/runtime/CommandLineApp.java +++ b/src/main/java/uk/ac/ed/pguaglia/real/runtime/CommandLineApp.java @@ -358,7 +358,7 @@ public final class CommandLineApp { case DROP: String name = line.strip(); try { - db.schema().drop(name); + db.drop(name); System.out.println(String.format("INFO: deleted %s", name)); } catch (Exception e) { System.err.println(String.format("ERROR: %s", e.getMessage()));