From f036ff2c8ba2ff394305df0bcea76bb419f6db5d Mon Sep 17 00:00:00 2001 From: Winston Li Date: Tue, 23 Aug 2016 22:49:58 +0100 Subject: [PATCH] Add and test an SQL update for only setting a project's last_accessed if it's missing --- .../ac/ic/wlgitbridge/bridge/db/DBStore.java | 17 +++++++ .../bridge/db/sqlite/SqliteDBStore.java | 14 ++++++ .../SetProjectLastAccessedTimeIfMissing.java | 47 +++++++++++++++++++ .../bridge/db/sqlite/SqliteDBStoreTest.java | 36 ++++++++++++++ 4 files changed, 114 insertions(+) create mode 100644 services/git-bridge/src/main/java/uk/ac/ic/wlgitbridge/bridge/db/sqlite/update/insert/SetProjectLastAccessedTimeIfMissing.java 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 b9dccd1469..c59a8fc195 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 @@ -29,4 +29,21 @@ 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 f37eb0d1e2..d69c22b51e 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 @@ -9,6 +9,7 @@ import uk.ac.ic.wlgitbridge.bridge.db.sqlite.query.GetProjectNamesSQLQuery; import uk.ac.ic.wlgitbridge.bridge.db.sqlite.update.create.*; 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; @@ -91,6 +92,19 @@ 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()) { 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 new file mode 100644 index 0000000000..9d9595f8e0 --- /dev/null +++ b/services/git-bridge/src/main/java/uk/ac/ic/wlgitbridge/bridge/db/sqlite/update/insert/SetProjectLastAccessedTimeIfMissing.java @@ -0,0 +1,47 @@ +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/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 e85256f8cf..1432b10607 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 @@ -85,4 +85,40 @@ public class SqliteDBStoreTest { assertEquals("newer", dbStore.getOldestUnswappedProject()); } + @Test + public void missingProjectLastAccessedTimeCanBeSet() { + dbStore.setLatestVersionForProject("asdf", 1); + dbStore.setLastAccessedTime( + "asdf", + Timestamp.valueOf(LocalDateTime.now()) + ); + 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()); + } + } \ No newline at end of file