mirror of
https://github.com/overleaf/overleaf.git
synced 2025-03-15 09:42:30 +00:00
Remove swap table and put last_accessed column in projects
This commit is contained in:
parent
2cdf254830
commit
ea803b53d8
15 changed files with 75 additions and 176 deletions
|
@ -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
|
||||
);
|
||||
|
||||
}
|
||||
|
|
|
@ -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);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
|
|
|
@ -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;
|
||||
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
|
||||
}
|
|
@ -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;
|
||||
}
|
||||
|
||||
}
|
|
@ -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;
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
|
||||
}
|
|
@ -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;
|
||||
}
|
||||
|
||||
}
|
|
@ -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);
|
||||
}
|
||||
|
||||
}
|
||||
|
|
|
@ -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);
|
||||
}
|
||||
|
||||
}
|
|
@ -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;
|
||||
|
|
|
@ -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);
|
||||
|
|
Loading…
Reference in a new issue