diff --git a/services/git-bridge/src/main/java/uk/ac/ic/wlgitbridge/bridge/db/DBStore.java b/services/git-bridge/src/main/java/uk/ac/ic/wlgitbridge/bridge/db/DBStore.java index a92e8bb746..0a13b26844 100644 --- a/services/git-bridge/src/main/java/uk/ac/ic/wlgitbridge/bridge/db/DBStore.java +++ b/services/git-bridge/src/main/java/uk/ac/ic/wlgitbridge/bridge/db/DBStore.java @@ -35,21 +35,4 @@ public interface DBStore { */ void setLastAccessedTime(String projectName, Timestamp time); - /** - * Sets the last accessed time for the given project name, - * ONLY if it is not already in the database. - * - * This is useful if the server crashed while uploading to S3, because - * the files will still be on disk. - * - * It's also useful for the initial upgrade, where none of the projects - * are in the DB. - * @param projectName - * @param lastAccessed - */ - void setProjectLastAccessedTimeIfMissing( - String projectName, - Timestamp lastAccessed - ); - } diff --git a/services/git-bridge/src/main/java/uk/ac/ic/wlgitbridge/bridge/db/sqlite/SqliteDBStore.java b/services/git-bridge/src/main/java/uk/ac/ic/wlgitbridge/bridge/db/sqlite/SqliteDBStore.java index 3d59bea3ff..2a62aeda78 100644 --- a/services/git-bridge/src/main/java/uk/ac/ic/wlgitbridge/bridge/db/sqlite/SqliteDBStore.java +++ b/services/git-bridge/src/main/java/uk/ac/ic/wlgitbridge/bridge/db/sqlite/SqliteDBStore.java @@ -4,12 +4,15 @@ import uk.ac.ic.wlgitbridge.bridge.db.DBInitException; import uk.ac.ic.wlgitbridge.bridge.db.DBStore; import uk.ac.ic.wlgitbridge.bridge.db.ProjectState; import uk.ac.ic.wlgitbridge.bridge.db.sqlite.query.*; -import uk.ac.ic.wlgitbridge.bridge.db.sqlite.update.create.*; +import uk.ac.ic.wlgitbridge.bridge.db.sqlite.update.alter.ProjectsAddLastAccessed; +import uk.ac.ic.wlgitbridge.bridge.db.sqlite.update.create.CreateIndexURLIndexStore; +import uk.ac.ic.wlgitbridge.bridge.db.sqlite.update.create.CreateProjectsIndexLastAccessed; +import uk.ac.ic.wlgitbridge.bridge.db.sqlite.update.create.CreateProjectsTableSQLUpdate; +import uk.ac.ic.wlgitbridge.bridge.db.sqlite.update.create.CreateURLIndexStoreSQLUpdate; import uk.ac.ic.wlgitbridge.bridge.db.sqlite.update.delete.DeleteFilesForProjectSQLUpdate; import uk.ac.ic.wlgitbridge.bridge.db.sqlite.update.insert.AddURLIndexSQLUpdate; -import uk.ac.ic.wlgitbridge.bridge.db.sqlite.update.insert.SetProjectLastAccessedTimeIfMissing; -import uk.ac.ic.wlgitbridge.bridge.db.sqlite.update.insert.SetProjectSQLUpdate; import uk.ac.ic.wlgitbridge.bridge.db.sqlite.update.insert.SetProjectLastAccessedTime; +import uk.ac.ic.wlgitbridge.bridge.db.sqlite.update.insert.SetProjectSQLUpdate; import java.io.File; import java.sql.*; @@ -105,19 +108,6 @@ public class SqliteDBStore implements DBStore { update(new SetProjectLastAccessedTime(projectName, lastAccessed)); } - @Override - public void setProjectLastAccessedTimeIfMissing( - String projectName, - Timestamp lastAccessed - ) { - update( - new SetProjectLastAccessedTimeIfMissing( - projectName, - lastAccessed - ) - ); - } - private Connection openConnectionTo(File dbFile) { File parentDir = dbFile.getParentFile(); if (!parentDir.exists() && !parentDir.mkdirs()) { @@ -141,12 +131,17 @@ public class SqliteDBStore implements DBStore { } private void createTables() { + try { + doUpdate(new ProjectsAddLastAccessed()); + } catch (SQLException ignore) { + /* We need to eat exceptions from here */ + } Stream.of( new CreateProjectsTableSQLUpdate(), + new CreateProjectsIndexLastAccessed(), new CreateURLIndexStoreSQLUpdate(), new CreateIndexURLIndexStore(), - new CreateSwapTable(), - new CreateSwapTableIndex() + new CreateProjectsIndexLastAccessed() ).forEach(this::update); } @@ -175,7 +170,11 @@ public class SqliteDBStore implements DBStore { } catch (SQLException e) { throw e; } finally { - statement.close(); + try { + statement.close(); + } catch (Throwable t) { + throw new SQLException(t); + } } } diff --git a/services/git-bridge/src/main/java/uk/ac/ic/wlgitbridge/bridge/db/sqlite/query/GetNumUnswappedProjects.java b/services/git-bridge/src/main/java/uk/ac/ic/wlgitbridge/bridge/db/sqlite/query/GetNumUnswappedProjects.java index ce1c609395..ec7a89b980 100644 --- a/services/git-bridge/src/main/java/uk/ac/ic/wlgitbridge/bridge/db/sqlite/query/GetNumUnswappedProjects.java +++ b/services/git-bridge/src/main/java/uk/ac/ic/wlgitbridge/bridge/db/sqlite/query/GetNumUnswappedProjects.java @@ -12,7 +12,7 @@ public class GetNumUnswappedProjects implements SQLQuery { private static final String GET_NUM_UNSWAPPED_PROJECTS = "SELECT COUNT(*)\n" + - " FROM `swap_table`\n" + + " FROM `projects`\n" + " WHERE `last_accessed` IS NOT NULL"; @Override diff --git a/services/git-bridge/src/main/java/uk/ac/ic/wlgitbridge/bridge/db/sqlite/query/GetOldestProjectName.java b/services/git-bridge/src/main/java/uk/ac/ic/wlgitbridge/bridge/db/sqlite/query/GetOldestProjectName.java index 4f0438df1a..73507f2d73 100644 --- a/services/git-bridge/src/main/java/uk/ac/ic/wlgitbridge/bridge/db/sqlite/query/GetOldestProjectName.java +++ b/services/git-bridge/src/main/java/uk/ac/ic/wlgitbridge/bridge/db/sqlite/query/GetOldestProjectName.java @@ -11,8 +11,8 @@ import java.sql.SQLException; public class GetOldestProjectName implements SQLQuery { private static final String GET_OLDEST_PROJECT_NAME = - "SELECT `project_name`, MIN(`last_accessed`)\n" + - " FROM `swap_table`"; + "SELECT `name`, MIN(`last_accessed`)\n" + + " FROM `projects`"; @Override public String getSQL() { @@ -22,7 +22,7 @@ public class GetOldestProjectName implements SQLQuery { @Override public String processResultSet(ResultSet resultSet) throws SQLException { while (resultSet.next()) { - return resultSet.getString("project_name"); + return resultSet.getString("name"); } return null; } diff --git a/services/git-bridge/src/main/java/uk/ac/ic/wlgitbridge/bridge/db/sqlite/query/GetProjectState.java b/services/git-bridge/src/main/java/uk/ac/ic/wlgitbridge/bridge/db/sqlite/query/GetProjectState.java index 8079ac286c..d253f2fad0 100644 --- a/services/git-bridge/src/main/java/uk/ac/ic/wlgitbridge/bridge/db/sqlite/query/GetProjectState.java +++ b/services/git-bridge/src/main/java/uk/ac/ic/wlgitbridge/bridge/db/sqlite/query/GetProjectState.java @@ -14,8 +14,8 @@ public class GetProjectState implements SQLQuery { private static final String GET_PROJECT_STATE = "SELECT `last_accessed`\n" + - " FROM `swap_table`\n" + - " WHERE `project_name` = ?"; + " FROM `projects`\n" + + " WHERE `name` = ?"; private final String projectName; diff --git a/services/git-bridge/src/main/java/uk/ac/ic/wlgitbridge/bridge/db/sqlite/update/alter/ProjectsAddLastAccessed.java b/services/git-bridge/src/main/java/uk/ac/ic/wlgitbridge/bridge/db/sqlite/update/alter/ProjectsAddLastAccessed.java new file mode 100644 index 0000000000..549d4403b2 --- /dev/null +++ b/services/git-bridge/src/main/java/uk/ac/ic/wlgitbridge/bridge/db/sqlite/update/alter/ProjectsAddLastAccessed.java @@ -0,0 +1,19 @@ +package uk.ac.ic.wlgitbridge.bridge.db.sqlite.update.alter; + +import uk.ac.ic.wlgitbridge.bridge.db.sqlite.SQLUpdate; + +/** + * Created by winston on 03/09/2016. + */ +public class ProjectsAddLastAccessed implements SQLUpdate { + + private static final String PROJECTS_ADD_LAST_ACCESSED = + "ALTER TABLE `projects`\n" + + "ADD COLUMN `last_accessed` DATETIME NULL DEFAULT 0"; + + @Override + public String getSQL() { + return PROJECTS_ADD_LAST_ACCESSED; + } + +} diff --git a/services/git-bridge/src/main/java/uk/ac/ic/wlgitbridge/bridge/db/sqlite/update/create/CreateIndexURLIndexStore.java b/services/git-bridge/src/main/java/uk/ac/ic/wlgitbridge/bridge/db/sqlite/update/create/CreateIndexURLIndexStore.java index 26cf1884bf..9b89199b65 100644 --- a/services/git-bridge/src/main/java/uk/ac/ic/wlgitbridge/bridge/db/sqlite/update/create/CreateIndexURLIndexStore.java +++ b/services/git-bridge/src/main/java/uk/ac/ic/wlgitbridge/bridge/db/sqlite/update/create/CreateIndexURLIndexStore.java @@ -9,7 +9,7 @@ public class CreateIndexURLIndexStore implements SQLUpdate { public static final String CREATE_INDEX_URL_INDEX_STORE = "CREATE UNIQUE INDEX IF NOT EXISTS `project_path_index` " + - "ON `url_index_store`(`project_name`, `path`);\n"; + "ON `url_index_store`(`project_name`, `path`);\n"; @Override public String getSQL() { diff --git a/services/git-bridge/src/main/java/uk/ac/ic/wlgitbridge/bridge/db/sqlite/update/create/CreateProjectsIndexLastAccessed.java b/services/git-bridge/src/main/java/uk/ac/ic/wlgitbridge/bridge/db/sqlite/update/create/CreateProjectsIndexLastAccessed.java new file mode 100644 index 0000000000..6e129d8fee --- /dev/null +++ b/services/git-bridge/src/main/java/uk/ac/ic/wlgitbridge/bridge/db/sqlite/update/create/CreateProjectsIndexLastAccessed.java @@ -0,0 +1,19 @@ +package uk.ac.ic.wlgitbridge.bridge.db.sqlite.update.create; + +import uk.ac.ic.wlgitbridge.bridge.db.sqlite.SQLUpdate; + +/** + * Created by winston on 23/08/2016. + */ +public class CreateProjectsIndexLastAccessed implements SQLUpdate { + + private static final String CREATE_PROJECTS_INDEX_LAST_ACCESSED = + "CREATE INDEX IF NOT EXISTS `projects_index_last_accessed`\n" + + " ON `projects`(`last_accessed`)"; + + @Override + public String getSQL() { + return CREATE_PROJECTS_INDEX_LAST_ACCESSED; + } + +} diff --git a/services/git-bridge/src/main/java/uk/ac/ic/wlgitbridge/bridge/db/sqlite/update/create/CreateProjectsTableSQLUpdate.java b/services/git-bridge/src/main/java/uk/ac/ic/wlgitbridge/bridge/db/sqlite/update/create/CreateProjectsTableSQLUpdate.java index ab5b432346..c5f8d3f6e7 100644 --- a/services/git-bridge/src/main/java/uk/ac/ic/wlgitbridge/bridge/db/sqlite/update/create/CreateProjectsTableSQLUpdate.java +++ b/services/git-bridge/src/main/java/uk/ac/ic/wlgitbridge/bridge/db/sqlite/update/create/CreateProjectsTableSQLUpdate.java @@ -9,10 +9,12 @@ public class CreateProjectsTableSQLUpdate implements SQLUpdate { private static final String CREATE_PROJECTS_TABLE = "CREATE TABLE IF NOT EXISTS `projects` (\n" + - " `name` VARCHAR NOT NULL DEFAULT '',\n" + - " `version_id` INT NOT NULL DEFAULT 0,\n" + - " PRIMARY KEY (`name`)\n" + + " `name` VARCHAR NOT NULL DEFAULT '',\n" + + " `version_id` INT NOT NULL DEFAULT 0,\n" + + " `last_accessed` DATETIME NULL DEFAULT 0,\n" + + " PRIMARY KEY (`name`)\n" + ")"; + @Override public String getSQL() { return CREATE_PROJECTS_TABLE; diff --git a/services/git-bridge/src/main/java/uk/ac/ic/wlgitbridge/bridge/db/sqlite/update/create/CreateSwapTable.java b/services/git-bridge/src/main/java/uk/ac/ic/wlgitbridge/bridge/db/sqlite/update/create/CreateSwapTable.java deleted file mode 100644 index 4d3c583ea9..0000000000 --- a/services/git-bridge/src/main/java/uk/ac/ic/wlgitbridge/bridge/db/sqlite/update/create/CreateSwapTable.java +++ /dev/null @@ -1,27 +0,0 @@ -package uk.ac.ic.wlgitbridge.bridge.db.sqlite.update.create; - -import uk.ac.ic.wlgitbridge.bridge.db.sqlite.SQLUpdate; - -/** - * Created by winston on 23/08/2016. - */ -public class CreateSwapTable implements SQLUpdate { - - private static final String CREATE_SWAP_TABLE = - "CREATE TABLE IF NOT EXISTS `swap_table` (\n" + - " `project_name` VARCHAR NOT NULL DEFAULT '',\n" + - " `last_accessed` DATETIME NULL DEFAULT 0,\n" + - " PRIMARY KEY (`project_name`),\n" + - " CONSTRAINT `swap_table_fk_1`\n" + - " FOREIGN KEY (`project_name`)\n" + - " REFERENCES `projects`(`name`)\n" + - " ON DELETE CASCADE\n" + - " ON UPDATE CASCADE\n" + - ")"; - - @Override - public String getSQL() { - return CREATE_SWAP_TABLE; - } - -} diff --git a/services/git-bridge/src/main/java/uk/ac/ic/wlgitbridge/bridge/db/sqlite/update/create/CreateSwapTableIndex.java b/services/git-bridge/src/main/java/uk/ac/ic/wlgitbridge/bridge/db/sqlite/update/create/CreateSwapTableIndex.java deleted file mode 100644 index 05d7d5f1e5..0000000000 --- a/services/git-bridge/src/main/java/uk/ac/ic/wlgitbridge/bridge/db/sqlite/update/create/CreateSwapTableIndex.java +++ /dev/null @@ -1,19 +0,0 @@ -package uk.ac.ic.wlgitbridge.bridge.db.sqlite.update.create; - -import uk.ac.ic.wlgitbridge.bridge.db.sqlite.SQLUpdate; - -/** - * Created by winston on 23/08/2016. - */ -public class CreateSwapTableIndex implements SQLUpdate { - - private static final String CREATE_SWAP_TABLE_INDEX = - "CREATE INDEX IF NOT EXISTS `swap_table_index`\n" + - " ON `swap_table`(`last_accessed`)"; - - @Override - public String getSQL() { - return CREATE_SWAP_TABLE_INDEX; - } - -} diff --git a/services/git-bridge/src/main/java/uk/ac/ic/wlgitbridge/bridge/db/sqlite/update/insert/SetProjectLastAccessedTime.java b/services/git-bridge/src/main/java/uk/ac/ic/wlgitbridge/bridge/db/sqlite/update/insert/SetProjectLastAccessedTime.java index 71151d0abb..7870822a50 100644 --- a/services/git-bridge/src/main/java/uk/ac/ic/wlgitbridge/bridge/db/sqlite/update/insert/SetProjectLastAccessedTime.java +++ b/services/git-bridge/src/main/java/uk/ac/ic/wlgitbridge/bridge/db/sqlite/update/insert/SetProjectLastAccessedTime.java @@ -12,13 +12,9 @@ import java.sql.Timestamp; public class SetProjectLastAccessedTime implements SQLUpdate { private static final String SET_PROJECT_LAST_ACCESSED_TIME = - "INSERT OR REPLACE INTO `swap_table`(\n" + - " `project_name`,\n" + - " `last_accessed`\n" + - ") VALUES (\n" + - " ?,\n" + - " ?\n" + - ")"; + "UPDATE `projects`\n" + + "SET `last_accessed` = ?\n" + + "WHERE `name` = ?"; private final String projectName; private final Timestamp lastAccessed; @@ -40,8 +36,8 @@ public class SetProjectLastAccessedTime implements SQLUpdate { public void addParametersToStatement( PreparedStatement statement ) throws SQLException { - statement.setString(1, projectName); - statement.setTimestamp(2, lastAccessed); + statement.setTimestamp(1, lastAccessed); + statement.setString(2, projectName); } } diff --git a/services/git-bridge/src/main/java/uk/ac/ic/wlgitbridge/bridge/db/sqlite/update/insert/SetProjectLastAccessedTimeIfMissing.java b/services/git-bridge/src/main/java/uk/ac/ic/wlgitbridge/bridge/db/sqlite/update/insert/SetProjectLastAccessedTimeIfMissing.java deleted file mode 100644 index 9d9595f8e0..0000000000 --- a/services/git-bridge/src/main/java/uk/ac/ic/wlgitbridge/bridge/db/sqlite/update/insert/SetProjectLastAccessedTimeIfMissing.java +++ /dev/null @@ -1,47 +0,0 @@ -package uk.ac.ic.wlgitbridge.bridge.db.sqlite.update.insert; - -import uk.ac.ic.wlgitbridge.bridge.db.sqlite.SQLUpdate; - -import java.sql.PreparedStatement; -import java.sql.SQLException; -import java.sql.Timestamp; - -/** - * Created by winston on 23/08/2016. - */ -public class SetProjectLastAccessedTimeIfMissing implements SQLUpdate { - - private static final String SET_IF_MISSING_PROJECT_LAST_ACCESSED_TIME = - "INSERT OR IGNORE INTO `swap_table`(\n" + - " `project_name`,\n" + - " `last_accessed`\n" + - ") VALUES (\n" + - " ?,\n" + - " ?\n" + - ")"; - - private final String projectName; - private final Timestamp lastAccessed; - - public SetProjectLastAccessedTimeIfMissing( - String projectName, - Timestamp lastAccessed - ) { - this.projectName = projectName; - this.lastAccessed = lastAccessed; - } - - @Override - public String getSQL() { - return SET_IF_MISSING_PROJECT_LAST_ACCESSED_TIME; - } - - @Override - public void addParametersToStatement( - PreparedStatement statement - ) throws SQLException { - statement.setString(1, projectName); - statement.setTimestamp(2, lastAccessed); - } - -} diff --git a/services/git-bridge/src/main/java/uk/ac/ic/wlgitbridge/bridge/db/sqlite/update/insert/SetProjectSQLUpdate.java b/services/git-bridge/src/main/java/uk/ac/ic/wlgitbridge/bridge/db/sqlite/update/insert/SetProjectSQLUpdate.java index cada0fb089..f3b11e0bfd 100644 --- a/services/git-bridge/src/main/java/uk/ac/ic/wlgitbridge/bridge/db/sqlite/update/insert/SetProjectSQLUpdate.java +++ b/services/git-bridge/src/main/java/uk/ac/ic/wlgitbridge/bridge/db/sqlite/update/insert/SetProjectSQLUpdate.java @@ -11,8 +11,8 @@ import java.sql.SQLException; public class SetProjectSQLUpdate implements SQLUpdate { private static final String SET_PROJECT = - "INSERT OR REPLACE INTO `projects`(`name`, `version_id`) " + - "VALUES (?, ?);\n"; + "INSERT OR REPLACE INTO `projects`(`name`, `version_id`, `last_accessed`) " + + "VALUES (?, ?, DATETIME('now'));\n"; private final String projectName; private final int versionID; diff --git a/services/git-bridge/src/test/java/uk/ac/ic/wlgitbridge/bridge/db/sqlite/SqliteDBStoreTest.java b/services/git-bridge/src/test/java/uk/ac/ic/wlgitbridge/bridge/db/sqlite/SqliteDBStoreTest.java index 2c192a8c20..7e8e79a6dc 100644 --- a/services/git-bridge/src/test/java/uk/ac/ic/wlgitbridge/bridge/db/sqlite/SqliteDBStoreTest.java +++ b/services/git-bridge/src/test/java/uk/ac/ic/wlgitbridge/bridge/db/sqlite/SqliteDBStoreTest.java @@ -107,32 +107,6 @@ public class SqliteDBStoreTest { assertEquals("asdf", dbStore.getOldestUnswappedProject()); } - @Test - public void ifMissingDoesNotSetIfProjectIsNotMissing() { - dbStore.setLatestVersionForProject("older", 1); - dbStore.setProjectLastAccessedTimeIfMissing( - "older", - Timestamp.valueOf( - LocalDateTime.now().minus(2, ChronoUnit.SECONDS) - ) - ); - dbStore.setLatestVersionForProject("asdf", 2); - dbStore.setProjectLastAccessedTimeIfMissing( - "asdf", - Timestamp.valueOf( - LocalDateTime.now().minus(1, ChronoUnit.SECONDS) - ) - ); - assertEquals("older", dbStore.getOldestUnswappedProject()); - dbStore.setProjectLastAccessedTimeIfMissing( - "older", - Timestamp.valueOf( - LocalDateTime.now() - ) - ); - assertEquals("older", dbStore.getOldestUnswappedProject()); - } - @Test public void testGetNumUnswappedProjects() { dbStore.setLatestVersionForProject("asdf", 1);