From 29f804b9f0617ac1b626754cfcb6c8a9c3c29977 Mon Sep 17 00:00:00 2001 From: sk89q Date: Sat, 2 Aug 2014 21:22:32 -0700 Subject: [PATCH] Save YAML regions database to a temporary file before renaming. --- .../protection/databases/YAMLDatabase.java | 14 ++++++++++---- 1 file changed, 10 insertions(+), 4 deletions(-) diff --git a/src/main/java/com/sk89q/worldguard/protection/databases/YAMLDatabase.java b/src/main/java/com/sk89q/worldguard/protection/databases/YAMLDatabase.java index 52bc7ffb..a1e26b4a 100644 --- a/src/main/java/com/sk89q/worldguard/protection/databases/YAMLDatabase.java +++ b/src/main/java/com/sk89q/worldguard/protection/databases/YAMLDatabase.java @@ -87,13 +87,13 @@ public YAMLDatabase(File file, Logger logger) throws ProtectionDatabaseException } } - private YAMLProcessor createYamlProcessor() { + private YAMLProcessor createYamlProcessor(File file) { return new YAMLProcessor(file, false, YAMLFormat.COMPACT); } @Override public void performLoad() throws ProtectionDatabaseException { - YAMLProcessor config = createYamlProcessor(); + YAMLProcessor config = createYamlProcessor(file); try { config.load(); @@ -260,8 +260,9 @@ private DefaultDomain parseDomain(YAMLNode node) { } @Override - protected void performSave() { - YAMLProcessor config = createYamlProcessor(); + protected void performSave() throws ProtectionDatabaseException { + File tempFile = new File(file.getParentFile(), file.getName() + ".tmp"); + YAMLProcessor config = createYamlProcessor(tempFile); config.clear(); @@ -317,6 +318,11 @@ protected void performSave() { "# REMEMBER TO KEEP PERIODICAL BACKUPS.\r\n" + "#"); config.save(); + + file.delete(); + if (!tempFile.renameTo(file)) { + throw new ProtectionDatabaseException("Failed to rename temporary regions file to " + file.getAbsolutePath()); + } } private Map getFlagData(ProtectedRegion region) {