diff options
author | Simon Rettberg | 2015-08-12 19:09:58 +0200 |
---|---|---|
committer | Simon Rettberg | 2015-08-12 19:09:58 +0200 |
commit | c5cca325907d5471c10a4888eef84d970d538a3d (patch) | |
tree | 195fd4213cb37cdb1a5ec4181eaf1cf1395daccf /dozentenmodulserver/src/main/java/org/openslx/bwlp/sat/database/mappers/DbImage.java | |
parent | [client] Extended description text for main menu (diff) | |
download | tutor-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.java | 82 |
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); |