summaryrefslogtreecommitdiffstats
path: root/dozentenmodulserver/src/main/java/org/openslx/bwlp/sat/database/mappers/DbImage.java
diff options
context:
space:
mode:
authorSimon Rettberg2015-08-12 19:09:58 +0200
committerSimon Rettberg2015-08-12 19:09:58 +0200
commitc5cca325907d5471c10a4888eef84d970d538a3d (patch)
tree195fd4213cb37cdb1a5ec4181eaf1cf1395daccf /dozentenmodulserver/src/main/java/org/openslx/bwlp/sat/database/mappers/DbImage.java
parent[client] Extended description text for main menu (diff)
downloadtutor-module-c5cca325907d5471c10a4888eef84d970d538a3d.tar.gz
tutor-module-c5cca325907d5471c10a4888eef84d970d538a3d.tar.xz
tutor-module-c5cca325907d5471c10a4888eef84d970d538a3d.zip
[server] Update lecture/latestversionid links when image versions are created/deleted
Diffstat (limited to 'dozentenmodulserver/src/main/java/org/openslx/bwlp/sat/database/mappers/DbImage.java')
-rw-r--r--dozentenmodulserver/src/main/java/org/openslx/bwlp/sat/database/mappers/DbImage.java82
1 files changed, 58 insertions, 24 deletions
diff --git a/dozentenmodulserver/src/main/java/org/openslx/bwlp/sat/database/mappers/DbImage.java b/dozentenmodulserver/src/main/java/org/openslx/bwlp/sat/database/mappers/DbImage.java
index 74a3eb96..2fa830cf 100644
--- a/dozentenmodulserver/src/main/java/org/openslx/bwlp/sat/database/mappers/DbImage.java
+++ b/dozentenmodulserver/src/main/java/org/openslx/bwlp/sat/database/mappers/DbImage.java
@@ -50,7 +50,7 @@ public class DbImage {
+ " i.sharemode, i.istemplate, i.canlinkdefault, i.candownloaddefault,"
+ " i.caneditdefault, i.canadmindefault,"
+ " lat.expiretime, lat.filesize, lat.isrestricted, lat.isvalid,"
- + " lat.uploaderid, lat.isprocessed,"
+ + " lat.uploaderid, lat.isprocessed, lat.createtime AS uploadtime,"
+ " perm.canlink, perm.candownload, perm.canedit, perm.canadmin"
+ " FROM imagebase i"
+ " LEFT JOIN imageversion lat ON (lat.imageversionid = i.latestversionid)"
@@ -133,8 +133,8 @@ public class DbImage {
ImageSummaryRead entry = new ImageSummaryRead(rs.getString("imagebaseid"),
rs.getString("latestversionid"), rs.getString("displayname"), rs.getInt("osid"),
rs.getString("virtid"), rs.getLong("createtime"), rs.getLong("updatetime"),
- rs.getLong("expiretime"), rs.getString("ownerid"), rs.getString("uploaderid"),
- toShareMode(rs.getString("sharemode")), rs.getLong("filesize"),
+ rs.getLong("uploadtime"), rs.getLong("expiretime"), rs.getString("ownerid"),
+ rs.getString("uploaderid"), toShareMode(rs.getString("sharemode")), rs.getLong("filesize"),
rs.getByte("isrestricted") != 0, rs.getByte("isvalid") != 0, rs.getByte("isprocessed") != 0,
rs.getByte("istemplate") != 0, defaultPermissions);
entry.userPermissions = DbImagePermissions.fromResultSetUser(rs);
@@ -169,7 +169,7 @@ public class DbImage {
+ " i.sharemode, i.istemplate, i.canlinkdefault, i.candownloaddefault,"
+ " i.caneditdefault, i.canadmindefault,"
+ " lat.expiretime, lat.filesize, lat.isrestricted, lat.isvalid,"
- + " lat.uploaderid, lat.isprocessed,"
+ + " lat.uploaderid, lat.isprocessed, lat.createtime AS uploadtime,"
+ " perm.canlink, perm.candownload, perm.canedit, perm.canadmin"
+ " FROM imagebase i"
+ " LEFT JOIN imageversion lat ON (lat.imageversionid = i.latestversionid)"
@@ -184,7 +184,7 @@ public class DbImage {
return resultSetToSummary(user, rs);
}
- private static List<ImageVersionDetails> getImageVersions(MysqlConnection connection, String imageBaseId)
+ protected static List<ImageVersionDetails> getImageVersions(MysqlConnection connection, String imageBaseId)
throws SQLException {
List<ImageVersionDetails> versionList = new ArrayList<>();
MysqlStatement stmt = connection.prepareStatement("SELECT"
@@ -366,14 +366,41 @@ public class DbImage {
*
* @param imageVersionId UUID of image version to delete
* @throws SQLException
+ * @throws TNotFoundException
*/
- public static void markForDeletion(String imageVersionId) throws SQLException {
+ public static void markForDeletion(String imageVersionId) throws SQLException, TNotFoundException {
try (MysqlConnection connection = Database.getConnection()) {
- MysqlStatement stmt = connection.prepareStatement("UPDATE imageversion SET"
- + " expiretime = UNIX_TIMESTAMP() - 1, isvalid = 0"
+ // Determine new latest version, as we might have to update the imagebase and lecture tables
+ List<ImageVersionDetails> versions = DbImage.getImageVersions(connection,
+ DbImage.getBaseIdForVersionId(connection, imageVersionId));
+ ImageVersionDetails newVersion = null;
+ ImageVersionDetails oldVersion = null;
+ for (ImageVersionDetails version : versions) {
+ if (version.versionId.equals(imageVersionId)) {
+ oldVersion = version;
+ } else if (version.isValid
+ && (newVersion == null || version.createTime > newVersion.createTime)) {
+ newVersion = version;
+ }
+ }
+ if (oldVersion == null) {
+ LOGGER.warn("BUG: old version ninja'd away on markForDeletion (" + imageVersionId + ")");
+ throw new TNotFoundException();
+ }
+ // Disable version in question
+ MysqlStatement disableStmt = connection.prepareStatement("UPDATE imageversion SET"
+ + " expiretime = UNIX_TIMESTAMP() - 86400 * 5, isvalid = 0"
+ " WHERE imageversionid = :versionid");
- stmt.setString("versionid", imageVersionId);
- stmt.executeUpdate();
+ disableStmt.setString("versionid", imageVersionId);
+ disableStmt.executeUpdate();
+ // Switch any lectures linking to this version
+ DbLecture.autoSwitchUsedImage(connection, oldVersion, newVersion);
+ // Now update the latestversionid of the baseimage if applicable
+ MysqlStatement latestStmt = connection.prepareStatement("UPDATE imagebase SET latestversionid = :newversionid"
+ + " WHERE latestversionid = :oldversionid");
+ latestStmt.setString("newversionid", newVersion == null ? null : newVersion.versionId);
+ latestStmt.setString("oldversionid", oldVersion.versionId);
+ latestStmt.executeUpdate();
connection.commit();
} catch (SQLException e) {
LOGGER.error("Query failed in DbImage.markForDeletion()", e);
@@ -400,26 +427,33 @@ public class DbImage {
byte[] machineDescription) throws SQLException {
try (MysqlConnection connection = Database.getConnection()) {
final long nowSecs = System.currentTimeMillis() / 1000;
- MysqlStatement stmt = connection.prepareStatement("INSERT INTO imageversion"
+ MysqlStatement verStmt = connection.prepareStatement("INSERT INTO imageversion"
+ " (imageversionid, imagebaseid, createtime, expiretime, filesize, filepath, uploaderid,"
+ " isrestricted, isvalid, isprocessed, mastersha1, virtualizerconfig)"
+ " VALUES "
+ " (:imageversionid, :imagebaseid, :createtime, :expiretime, :filesize, :filepath,"
+ " :uploaderid, :isrestricted, :isvalid, :isprocessed, :mastersha1, :virtualizerconfig)");
- stmt.setString("imageversionid", imageVersionId);
- stmt.setString("imagebaseid", imageBaseId);
- stmt.setLong("createtime", nowSecs);
- stmt.setLong("expiretime", nowSecs + 86400 * 365); // TODO: Config!
- stmt.setLong("filesize", fileSize);
- stmt.setString("filepath", filePath);
- stmt.setString("uploaderid", owner.userId);
- stmt.setBoolean("isrestricted", versionSettings == null ? false : versionSettings.isRestricted);
- stmt.setBoolean("isvalid", true); // TODO
- stmt.setBoolean("isprocessed", false);
- stmt.setBinary("mastersha1", null); // TODO
- stmt.setBinary("virtualizerconfig", machineDescription);
- stmt.executeUpdate();
+ verStmt.setString("imageversionid", imageVersionId);
+ verStmt.setString("imagebaseid", imageBaseId);
+ verStmt.setLong("createtime", nowSecs);
+ verStmt.setLong("expiretime", nowSecs + 86400 * 365); // TODO: Config!
+ verStmt.setLong("filesize", fileSize);
+ verStmt.setString("filepath", filePath);
+ verStmt.setString("uploaderid", owner.userId);
+ verStmt.setBoolean("isrestricted", versionSettings == null ? false : versionSettings.isRestricted);
+ verStmt.setBoolean("isvalid", true); // TODO
+ verStmt.setBoolean("isprocessed", false);
+ verStmt.setBinary("mastersha1", null); // TODO
+ verStmt.setBinary("virtualizerconfig", machineDescription);
+ verStmt.executeUpdate();
// TODO: Write chunk hashes to DB
+ // Make this version the latest version
+ MysqlStatement baseStmt = connection.prepareStatement("UPDATE imagebase SET"
+ + " latestversionid = :imageversionid WHERE imagebaseid = :imagebaseid LIMIT 1");
+ baseStmt.setString("imageversionid", imageVersionId);
+ baseStmt.setString("imagebaseid", imageBaseId);
+ baseStmt.executeUpdate();
+ DbLecture.autoUpdateUsedImage(connection, imageBaseId, imageVersionId);
connection.commit();
} catch (SQLException e) {
LOGGER.error("Query failed in DbImage.createImageVersion()", e);