package org.reldb.rel.v0.storage;
import java.io.File;
import org.reldb.rel.v0.external.DirClassLoader;
import org.reldb.rel.v0.storage.relvars.RelvarMetadata;
import org.reldb.rel.v0.values.ValueTuple;
import com.sleepycat.bind.EntryBinding;
import com.sleepycat.bind.serial.SerialBinding;
import com.sleepycat.bind.serial.StoredClassCatalog;
import com.sleepycat.je.Database;
import com.sleepycat.je.DatabaseConfig;
import com.sleepycat.je.DatabaseException;
import com.sleepycat.je.Environment;
import com.sleepycat.je.EnvironmentConfig;
public class ClassCatalog {
private StoredClassCatalog classCatalog;
private Database classCatalogDb;
private Environment environment;
private EntryBinding<RelvarMetadata> relvarMetadataBinding;
private SerialBinding<ValueTuple> tupleBinding;
// class loader for external Java-based operators and types
private DirClassLoader dirClassLoader;
ClassCatalog(String directory, EnvironmentConfig environmentConfig, DatabaseConfig dbConfig) {
// This should be main database directory
dirClassLoader = new DirClassLoader(directory);
// Open the environment in subdirectory of the above
String classesDir = directory + java.io.File.separator + "classes";
RelDatabase.mkdir(classesDir);
environment = new Environment(new File(classesDir), environmentConfig);
// Open the class catalog db. This is used to optimize class serialization.
classCatalogDb = environment.openDatabase(null, "_ClassCatalog", dbConfig);
// Create our class catalog
classCatalog = new StoredClassCatalog(classCatalogDb);
// Need a serial binding for metadata
relvarMetadataBinding = new SerialBinding<RelvarMetadata>(classCatalog, RelvarMetadata.class);
// Need serial binding for data
tupleBinding = new SerialBinding<ValueTuple>(classCatalog, ValueTuple.class) {
public ClassLoader getClassLoader() {
return dirClassLoader;
}
};
}
public void close() throws DatabaseException {
classCatalogDb.close();
environment.close();
}
EntryBinding<RelvarMetadata> getRelvarMetadataBinding() {
return relvarMetadataBinding;
}
SerialBinding<ValueTuple> getTupleBinding() {
return tupleBinding;
}
public StoredClassCatalog getStoredClassCatalog() {
return classCatalog;
}
}