/** * Выполняет откат изменений с момента последней фиксации. * * @return Число откаченных изменений. */ @Override public int rollback() { int numberOfRolledChanges = uncommittedChanges(); tableIndexedData.clear(); tableIndexedData.putAll(tableOnDisk); for (int nDir = 0; nDir < 16; ++nDir) { for (int nFile = 0; nFile < 16; ++nFile) { tableFileModified[nDir][nFile] = false; } } return numberOfRolledChanges; }
/** * Выполняет фиксацию изменений. * * @return Число записанных изменений. * @throws java.io.IOException если произошла ошибка ввода/вывода. Целостность таблицы не * гарантируется. */ @Override public int commit() throws IOException { int numberOfCommittedChanges = uncommittedChanges(); Set<Map.Entry<String, Storeable>> dbSet = tableIndexedData.entrySet(); for (int nDir = 0; nDir < 16; ++nDir) { for (int nFile = 0; nFile < 16; ++nFile) { if (tableFileModified[nDir][nFile]) { if (tableFiles[nDir][nFile] == null) { File subDir = new File(tableRootDir, Integer.toString(nDir) + ".dir"); File subFile = new File(subDir, Integer.toString(nFile) + ".dat"); if (!subDir.exists()) { if (!subDir.mkdir()) { throw new IllegalStateException("Sub dir was not created"); } } tableFiles[nDir][nFile] = new TableFile(subFile); } List<TableFile.Entry> fileData = new ArrayList<>(); Iterator<Map.Entry<String, Storeable>> iter = dbSet.iterator(); while (iter.hasNext()) { Map.Entry<String, Storeable> tempMapEntry = iter.next(); HashcodeDestination dest = new HashcodeDestination(tempMapEntry.getKey()); if (dest.getDir() == nDir && dest.getFile() == nFile) { fileData.add( new TableFile.Entry( tempMapEntry.getKey(), tableProvider.serialize(this, tempMapEntry.getValue()))); } } tableFiles[nDir][nFile].writeEntries(fileData); tableFileModified[nDir][nFile] = false; } } } tableOnDisk.clear(); tableOnDisk.putAll(tableIndexedData); return numberOfCommittedChanges; }