From cd7be5eac8f15b0ac03206322ee588f39c05a93e Mon Sep 17 00:00:00 2001 From: Jim Martens Date: Wed, 24 May 2017 15:32:00 +0200 Subject: [PATCH] Added recovery method Signed-off-by: Jim Martens --- 04/src/PersistenceManager.java | 50 ++++++++++++++++++++++++++++++++-- 1 file changed, 48 insertions(+), 2 deletions(-) diff --git a/04/src/PersistenceManager.java b/04/src/PersistenceManager.java index 8d8122c..920acb4 100644 --- a/04/src/PersistenceManager.java +++ b/04/src/PersistenceManager.java @@ -1,7 +1,6 @@ import org.jetbrains.annotations.Contract; -import java.io.FileWriter; -import java.io.IOException; +import java.io.*; import java.util.*; /** @@ -103,6 +102,53 @@ public class PersistenceManager { persist(); } + /** + * Performs the recovery actions. + */ + public void recovery() { + try { + BufferedReader reader = new BufferedReader(new FileReader("../data/log.txt")); + String line; + List winner_tas = new ArrayList<>(); + while ((line = reader.readLine()) != null) { + String[] cols = line.split(","); + if (cols[2].equals("COMMIT")) { + winner_tas.add(Integer.valueOf(cols[1])); + } + } + reader.close(); + + reader = new BufferedReader(new FileReader("../data/log.txt")); + while ((line = reader.readLine()) != null) { + String[] cols = line.split(","); + if (!cols[2].equals("WRITE") || !winner_tas.contains(Integer.valueOf(cols[1]))) { + continue; + } + + int lsn = Integer.valueOf(cols[0]); + int pageID = Integer.valueOf(cols[3]); + String data = cols[4]; + + BufferedReader readPage = new BufferedReader(new FileReader("../data/" + pageID + ".txt")); + String pageLine = readPage.readLine(); + readPage.close(); + String[] pageCols = pageLine.split(","); + int pageLSN = Integer.parseInt(pageCols[1]); + if (pageLSN >= lsn) { + continue; + } + + FileWriter writer = new FileWriter("../data/" + pageID + ".txt"); + writer.write("" + pageID + "," + lsn + "," + data + "\n"); + writer.close(); + } + reader.close(); + + } catch (IOException e) { + e.printStackTrace(); + } + } + /** * Logs a write to the log file. *