mirror of
https://github.com/overleaf/overleaf.git
synced 2025-03-15 13:04:06 +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);
|
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.DBStore;
|
||||||
import uk.ac.ic.wlgitbridge.bridge.db.ProjectState;
|
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.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.delete.DeleteFilesForProjectSQLUpdate;
|
||||||
import uk.ac.ic.wlgitbridge.bridge.db.sqlite.update.insert.AddURLIndexSQLUpdate;
|
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.SetProjectLastAccessedTime;
|
||||||
|
import uk.ac.ic.wlgitbridge.bridge.db.sqlite.update.insert.SetProjectSQLUpdate;
|
||||||
|
|
||||||
import java.io.File;
|
import java.io.File;
|
||||||
import java.sql.*;
|
import java.sql.*;
|
||||||
|
@ -105,19 +108,6 @@ public class SqliteDBStore implements DBStore {
|
||||||
update(new SetProjectLastAccessedTime(projectName, lastAccessed));
|
update(new SetProjectLastAccessedTime(projectName, lastAccessed));
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
|
||||||
public void setProjectLastAccessedTimeIfMissing(
|
|
||||||
String projectName,
|
|
||||||
Timestamp lastAccessed
|
|
||||||
) {
|
|
||||||
update(
|
|
||||||
new SetProjectLastAccessedTimeIfMissing(
|
|
||||||
projectName,
|
|
||||||
lastAccessed
|
|
||||||
)
|
|
||||||
);
|
|
||||||
}
|
|
||||||
|
|
||||||
private Connection openConnectionTo(File dbFile) {
|
private Connection openConnectionTo(File dbFile) {
|
||||||
File parentDir = dbFile.getParentFile();
|
File parentDir = dbFile.getParentFile();
|
||||||
if (!parentDir.exists() && !parentDir.mkdirs()) {
|
if (!parentDir.exists() && !parentDir.mkdirs()) {
|
||||||
|
@ -141,12 +131,17 @@ public class SqliteDBStore implements DBStore {
|
||||||
}
|
}
|
||||||
|
|
||||||
private void createTables() {
|
private void createTables() {
|
||||||
|
try {
|
||||||
|
doUpdate(new ProjectsAddLastAccessed());
|
||||||
|
} catch (SQLException ignore) {
|
||||||
|
/* We need to eat exceptions from here */
|
||||||
|
}
|
||||||
Stream.of(
|
Stream.of(
|
||||||
new CreateProjectsTableSQLUpdate(),
|
new CreateProjectsTableSQLUpdate(),
|
||||||
|
new CreateProjectsIndexLastAccessed(),
|
||||||
new CreateURLIndexStoreSQLUpdate(),
|
new CreateURLIndexStoreSQLUpdate(),
|
||||||
new CreateIndexURLIndexStore(),
|
new CreateIndexURLIndexStore(),
|
||||||
new CreateSwapTable(),
|
new CreateProjectsIndexLastAccessed()
|
||||||
new CreateSwapTableIndex()
|
|
||||||
).forEach(this::update);
|
).forEach(this::update);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -175,7 +170,11 @@ public class SqliteDBStore implements DBStore {
|
||||||
} catch (SQLException e) {
|
} catch (SQLException e) {
|
||||||
throw e;
|
throw e;
|
||||||
} finally {
|
} finally {
|
||||||
|
try {
|
||||||
statement.close();
|
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 =
|
private static final String GET_NUM_UNSWAPPED_PROJECTS =
|
||||||
"SELECT COUNT(*)\n" +
|
"SELECT COUNT(*)\n" +
|
||||||
" FROM `swap_table`\n" +
|
" FROM `projects`\n" +
|
||||||
" WHERE `last_accessed` IS NOT NULL";
|
" WHERE `last_accessed` IS NOT NULL";
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
|
|
@ -11,8 +11,8 @@ import java.sql.SQLException;
|
||||||
public class GetOldestProjectName implements SQLQuery<String> {
|
public class GetOldestProjectName implements SQLQuery<String> {
|
||||||
|
|
||||||
private static final String GET_OLDEST_PROJECT_NAME =
|
private static final String GET_OLDEST_PROJECT_NAME =
|
||||||
"SELECT `project_name`, MIN(`last_accessed`)\n" +
|
"SELECT `name`, MIN(`last_accessed`)\n" +
|
||||||
" FROM `swap_table`";
|
" FROM `projects`";
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public String getSQL() {
|
public String getSQL() {
|
||||||
|
@ -22,7 +22,7 @@ public class GetOldestProjectName implements SQLQuery<String> {
|
||||||
@Override
|
@Override
|
||||||
public String processResultSet(ResultSet resultSet) throws SQLException {
|
public String processResultSet(ResultSet resultSet) throws SQLException {
|
||||||
while (resultSet.next()) {
|
while (resultSet.next()) {
|
||||||
return resultSet.getString("project_name");
|
return resultSet.getString("name");
|
||||||
}
|
}
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
|
|
|
@ -14,8 +14,8 @@ public class GetProjectState implements SQLQuery<ProjectState> {
|
||||||
|
|
||||||
private static final String GET_PROJECT_STATE =
|
private static final String GET_PROJECT_STATE =
|
||||||
"SELECT `last_accessed`\n" +
|
"SELECT `last_accessed`\n" +
|
||||||
" FROM `swap_table`\n" +
|
" FROM `projects`\n" +
|
||||||
" WHERE `project_name` = ?";
|
" WHERE `name` = ?";
|
||||||
|
|
||||||
private final String projectName;
|
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" +
|
"CREATE TABLE IF NOT EXISTS `projects` (\n" +
|
||||||
" `name` VARCHAR NOT NULL DEFAULT '',\n" +
|
" `name` VARCHAR NOT NULL DEFAULT '',\n" +
|
||||||
" `version_id` INT NOT NULL DEFAULT 0,\n" +
|
" `version_id` INT NOT NULL DEFAULT 0,\n" +
|
||||||
|
" `last_accessed` DATETIME NULL DEFAULT 0,\n" +
|
||||||
" PRIMARY KEY (`name`)\n" +
|
" PRIMARY KEY (`name`)\n" +
|
||||||
")";
|
")";
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public String getSQL() {
|
public String getSQL() {
|
||||||
return CREATE_PROJECTS_TABLE;
|
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 {
|
public class SetProjectLastAccessedTime implements SQLUpdate {
|
||||||
|
|
||||||
private static final String SET_PROJECT_LAST_ACCESSED_TIME =
|
private static final String SET_PROJECT_LAST_ACCESSED_TIME =
|
||||||
"INSERT OR REPLACE INTO `swap_table`(\n" +
|
"UPDATE `projects`\n" +
|
||||||
" `project_name`,\n" +
|
"SET `last_accessed` = ?\n" +
|
||||||
" `last_accessed`\n" +
|
"WHERE `name` = ?";
|
||||||
") VALUES (\n" +
|
|
||||||
" ?,\n" +
|
|
||||||
" ?\n" +
|
|
||||||
")";
|
|
||||||
|
|
||||||
private final String projectName;
|
private final String projectName;
|
||||||
private final Timestamp lastAccessed;
|
private final Timestamp lastAccessed;
|
||||||
|
@ -40,8 +36,8 @@ public class SetProjectLastAccessedTime implements SQLUpdate {
|
||||||
public void addParametersToStatement(
|
public void addParametersToStatement(
|
||||||
PreparedStatement statement
|
PreparedStatement statement
|
||||||
) throws SQLException {
|
) throws SQLException {
|
||||||
statement.setString(1, projectName);
|
statement.setTimestamp(1, lastAccessed);
|
||||||
statement.setTimestamp(2, 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 {
|
public class SetProjectSQLUpdate implements SQLUpdate {
|
||||||
|
|
||||||
private static final String SET_PROJECT =
|
private static final String SET_PROJECT =
|
||||||
"INSERT OR REPLACE INTO `projects`(`name`, `version_id`) " +
|
"INSERT OR REPLACE INTO `projects`(`name`, `version_id`, `last_accessed`) " +
|
||||||
"VALUES (?, ?);\n";
|
"VALUES (?, ?, DATETIME('now'));\n";
|
||||||
|
|
||||||
private final String projectName;
|
private final String projectName;
|
||||||
private final int versionID;
|
private final int versionID;
|
||||||
|
|
|
@ -107,32 +107,6 @@ public class SqliteDBStoreTest {
|
||||||
assertEquals("asdf", dbStore.getOldestUnswappedProject());
|
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
|
@Test
|
||||||
public void testGetNumUnswappedProjects() {
|
public void testGetNumUnswappedProjects() {
|
||||||
dbStore.setLatestVersionForProject("asdf", 1);
|
dbStore.setLatestVersionForProject("asdf", 1);
|
||||||
|
|
Loading…
Reference in a new issue