strangedb/src/main/java/org/warp/cowdb/Database.java

81 lines
2.4 KiB
Java
Raw Normal View History

package org.warp.cowdb;
2019-03-02 17:47:24 +01:00
import org.warp.cowdb.database.*;
import java.io.IOException;
import java.nio.file.Files;
import java.nio.file.Path;
2019-03-02 17:47:24 +01:00
public class Database implements IDatabase, IDatabaseTools {
2019-03-02 17:47:24 +01:00
private final IDatabaseTools databaseTools;
private final DatabaseFileIO fileIO;
private final DatabaseBlocksIO blocksIO;
private final DatabaseBlocksMetadata blocksMetadata;
private final DatabaseReferencesIO referencesIO;
private final DatabaseReferencesMetadata referencesMetadata;
private final DatabaseObjectsIO objectsIO;
private EnhancedObject loadedRootObject;
public Database(Path dataFile, Path blocksMetaFile, Path referencesMetaFile) throws IOException {
if (Files.notExists(dataFile)) {
Files.createFile(dataFile);
}
if (Files.notExists(blocksMetaFile)) {
Files.createFile(blocksMetaFile);
}
if (Files.notExists(referencesMetaFile)) {
Files.createFile(referencesMetaFile);
}
2019-03-02 17:47:24 +01:00
this.databaseTools = this;
this.fileIO = new DatabaseFileIO(dataFile);
this.blocksMetadata = new DatabaseBlocksMetadata(blocksMetaFile);
this.blocksIO = new DatabaseBlocksIO(fileIO, blocksMetadata);
this.referencesMetadata = new DatabaseReferencesMetadata(referencesMetaFile);
this.referencesIO = new DatabaseReferencesIO(blocksIO, referencesMetadata);
2019-03-02 17:47:24 +01:00
this.objectsIO = new DatabaseObjectsIO(databaseTools, referencesIO);
}
@Override
public void close() throws IOException {
this.objectsIO.setEnhancedObject(0, loadedRootObject);
this.referencesMetadata.close();
this.blocksMetadata.close();
this.fileIO.close();
}
2019-03-02 17:47:24 +01:00
public <T extends EnhancedObject> T loadRoot(Class<T> type, FunctionWithIO<IDatabaseTools, T> ifAbsent) throws IOException {
if (loadedRootObject != null) {
throw new RuntimeException("Root already set!");
}
T root;
2019-03-02 17:47:24 +01:00
if (referencesMetadata.getFirstFreeReference() > 0) {
root = objectsIO.loadEnhancedObject(0, type);
} else {
if (objectsIO.newNullObject() != 0) {
throw new IOException("Can't allocate root!");
} else {
2019-03-02 17:47:24 +01:00
root = ifAbsent.apply(Database.this);
objectsIO.setEnhancedObject(0, root);
}
}
loadedRootObject = root;
return root;
}
2019-02-01 00:04:51 +01:00
protected void registerClass(Class<?> type, int id) {
this.objectsIO.registerClass(type, id);
}
2019-03-02 17:47:24 +01:00
@Override
public void initializeEnhancedObject(EnhancedObject enhancedObject) throws IOException {
this.objectsIO.getDataInitializer().initializeDBObject(enhancedObject);
}
2019-03-02 17:47:24 +01:00
@Override
public IObjectsIO getObjectsIO() {
return objectsIO;
}
}