Remove swap table and put last_accessed column in projects

This commit is contained in:
Winston Li 2016-09-03 14:23:02 +01:00 committed by Michael Mazour
parent 2cdf254830
commit ea803b53d8
15 changed files with 75 additions and 176 deletions

View file

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

View file

@ -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 {
try {
statement.close();
} catch (Throwable t) {
throw new SQLException(t);
}
}
}

View file

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

View file

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

View file

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

View file

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

View file

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

View file

@ -11,8 +11,10 @@ public class CreateProjectsTableSQLUpdate implements SQLUpdate {
"CREATE TABLE IF NOT EXISTS `projects` (\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;

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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