Просмотр исходного кода

Remove swap table and put last_accessed column in projects

Winston Li 10 лет назад
Родитель
Сommit
ea803b53d8
15 измененных файлов с 75 добавлено и 176 удалено
  1. 0 17
      services/git-bridge/src/main/java/uk/ac/ic/wlgitbridge/bridge/db/DBStore.java
  2. 18 19
      services/git-bridge/src/main/java/uk/ac/ic/wlgitbridge/bridge/db/sqlite/SqliteDBStore.java
  3. 1 1
      services/git-bridge/src/main/java/uk/ac/ic/wlgitbridge/bridge/db/sqlite/query/GetNumUnswappedProjects.java
  4. 3 3
      services/git-bridge/src/main/java/uk/ac/ic/wlgitbridge/bridge/db/sqlite/query/GetOldestProjectName.java
  5. 2 2
      services/git-bridge/src/main/java/uk/ac/ic/wlgitbridge/bridge/db/sqlite/query/GetProjectState.java
  6. 19 0
      services/git-bridge/src/main/java/uk/ac/ic/wlgitbridge/bridge/db/sqlite/update/alter/ProjectsAddLastAccessed.java
  7. 1 1
      services/git-bridge/src/main/java/uk/ac/ic/wlgitbridge/bridge/db/sqlite/update/create/CreateIndexURLIndexStore.java
  8. 19 0
      services/git-bridge/src/main/java/uk/ac/ic/wlgitbridge/bridge/db/sqlite/update/create/CreateProjectsIndexLastAccessed.java
  9. 5 3
      services/git-bridge/src/main/java/uk/ac/ic/wlgitbridge/bridge/db/sqlite/update/create/CreateProjectsTableSQLUpdate.java
  10. 0 27
      services/git-bridge/src/main/java/uk/ac/ic/wlgitbridge/bridge/db/sqlite/update/create/CreateSwapTable.java
  11. 0 19
      services/git-bridge/src/main/java/uk/ac/ic/wlgitbridge/bridge/db/sqlite/update/create/CreateSwapTableIndex.java
  12. 5 9
      services/git-bridge/src/main/java/uk/ac/ic/wlgitbridge/bridge/db/sqlite/update/insert/SetProjectLastAccessedTime.java
  13. 0 47
      services/git-bridge/src/main/java/uk/ac/ic/wlgitbridge/bridge/db/sqlite/update/insert/SetProjectLastAccessedTimeIfMissing.java
  14. 2 2
      services/git-bridge/src/main/java/uk/ac/ic/wlgitbridge/bridge/db/sqlite/update/insert/SetProjectSQLUpdate.java
  15. 0 26
      services/git-bridge/src/test/java/uk/ac/ic/wlgitbridge/bridge/db/sqlite/SqliteDBStoreTest.java

+ 0 - 17
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
-    );
-
 }

+ 18 - 19
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);
+            }
         }
     }
 

+ 1 - 1
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<Integer> {
 
     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

+ 3 - 3
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<String> {
 
     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<String> {
     @Override
     public String processResultSet(ResultSet resultSet) throws SQLException {
         while (resultSet.next()) {
-            return resultSet.getString("project_name");
+            return resultSet.getString("name");
         }
         return null;
     }

+ 2 - 2
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<ProjectState> {
 
     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;
 

+ 19 - 0
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;
+    }
+
+}

+ 1 - 1
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() {

+ 19 - 0
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;
+    }
+
+}

+ 5 - 3
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;

+ 0 - 27
services/git-bridge/src/main/java/uk/ac/ic/wlgitbridge/bridge/db/sqlite/update/create/CreateSwapTable.java

@@ -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;
-    }
-
-}

+ 0 - 19
services/git-bridge/src/main/java/uk/ac/ic/wlgitbridge/bridge/db/sqlite/update/create/CreateSwapTableIndex.java

@@ -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;
-    }
-
-}

+ 5 - 9
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);
     }
 
 }

+ 0 - 47
services/git-bridge/src/main/java/uk/ac/ic/wlgitbridge/bridge/db/sqlite/update/insert/SetProjectLastAccessedTimeIfMissing.java

@@ -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);
-    }
-
-}

+ 2 - 2
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;

+ 0 - 26
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);