package org.reldb.rel.v0.storage.catalog; import org.reldb.rel.v0.generator.Generator; import org.reldb.rel.v0.generator.References; import org.reldb.rel.v0.storage.*; import org.reldb.rel.v0.storage.relvars.RelvarDefinition; import org.reldb.rel.v0.storage.relvars.RelvarMetadata; import com.sleepycat.je.*; public class Catalog { // System relvar names public final static String relvarCatalog = "sys.Catalog"; public final static String relvarVersion = "sys.Version"; public final static String relvarConstraints = "sys.Constraints"; public final static String relvarOperators = "sys.Operators"; public final static String relvarOperatorsBuiltin = "sys.OperatorsBuiltin"; public final static String relvarTypes = "sys.Types"; public final static String relvarDefinitionHistory = "sys.DefinitionHistory"; public final static String relvarDependenciesRelvarOperator = "sys.DependenciesRelvarOperator"; public final static String relvarDependenciesRelvarRelvar = "sys.DependenciesRelvarRelvar"; public final static String relvarDependenciesRelvarType = "sys.DependenciesRelvarType"; public final static String relvarDependenciesTypeOperator = "sys.DependenciesTypeOperator"; public final static String relvarDependenciesTypeType = "sys.DependenciesTypeType"; public final static String relvarDependenciesTypeRelvar = "sys.DependenciesTypeRelvar"; public final static String relvarDependenciesConstraintOperator = "sys.DependenciesConstraintOperator"; public final static String relvarDependenciesConstraintRelvar = "sys.DependenciesConstraintRelvar"; public final static String relvarDependenciesConstraintType = "sys.DependenciesConstraintType"; public final static String relvarDependenciesOperatorOperator = "sys.DependenciesOperatorOperator"; public final static String relvarDependenciesOperatorRelvar = "sys.DependenciesOperatorRelvar"; public final static String relvarDependenciesOperatorType = "sys.DependenciesOperatorType"; public final static String relvarExternalRelvarTypes = "sys.ExternalRelvarTypes"; public final static String relvarKeywords = "sys.Keywords"; // Generate and initialise the catalog relvars - phase 0 public void generatePhase0(Generator generator) throws DatabaseException { (new RegisterSpecialRelvar(relvarVersion) { RelvarMetadata getMetadata() { return new RelvarVersionMetadata(database); } }).go(); (new CreateSystemRelvar(generator, relvarConstraints)).go(); (new CreateSystemRelvar(generator, relvarOperators) { RelvarMetadata getMetadata() { return new RelvarOperatorsMetadata(database, name); } }).go(); (new RegisterSpecialRelvar(relvarOperatorsBuiltin) { RelvarMetadata getMetadata() { return new RelvarOperatorsBuiltinMetadata(database); } }).go(); (new CreateSystemRelvar(generator, relvarTypes) { RelvarMetadata getMetadata() { return new RelvarTypesMetadata(database, name); } }).go(); (new CreateSystemDependenciesRelvar(generator, relvarDependenciesRelvarOperator)).go(); (new CreateSystemDependenciesRelvar(generator, relvarDependenciesRelvarRelvar)).go(); (new CreateSystemDependenciesRelvar(generator, relvarDependenciesRelvarType)).go(); (new CreateSystemDependenciesRelvar(generator, relvarDependenciesTypeOperator)).go(); (new CreateSystemDependenciesRelvar(generator, relvarDependenciesTypeRelvar)).go(); (new CreateSystemDependenciesRelvar(generator, relvarDependenciesTypeType)).go(); (new CreateSystemDependenciesRelvar(generator, relvarDependenciesConstraintOperator)).go(); (new CreateSystemDependenciesRelvar(generator, relvarDependenciesConstraintRelvar)).go(); (new CreateSystemDependenciesRelvar(generator, relvarDependenciesConstraintType)).go(); (new CreateSystemDependenciesRelvar(generator, relvarDependenciesOperatorOperator)).go(); (new CreateSystemDependenciesRelvar(generator, relvarDependenciesOperatorRelvar)).go(); (new CreateSystemDependenciesRelvar(generator, relvarDependenciesOperatorType)).go(); (new RegisterSpecialRelvar(relvarExternalRelvarTypes) { RelvarMetadata getMetadata() { return new RelvarExternalRelvarTypesMetadata(database); } }).go(); (new RegisterSpecialRelvar(relvarKeywords) { RelvarMetadata getMetadata() { return new RelvarKeywordsMetadata(database); } }).go(); } // Generate and initialise the catalog relvars - phase 1 public void generatePhase1(Generator generator) throws DatabaseException { (new RegisterSpecialRelvar(relvarCatalog) { RelvarMetadata getMetadata() { return new RelvarCatalogMetadata(database, generator); } }).go(); } private RelDatabase database; public Catalog(RelDatabase database) { this.database = database; } private void registerSpecialRelvar(String name, RelvarMetadata metadata) throws DatabaseException { database.putRelvarMetadata(null, name, metadata); } private void createSystemRelvar(Generator generator, RelvarSystemMetadata metadata) { String name = metadata.getName(); database.createRealRelvar(generator, new RelvarDefinition(name, metadata, new References())); } private abstract class HandleRelvar { protected String name; HandleRelvar(String name) { this.name = name; } abstract RelvarMetadata getMetadata(); abstract void process() throws DatabaseException; public void go() throws DatabaseException { if (!database.isRelvarExists(name)) { System.out.println("Creating " + name + " relvar."); process(); } // Make sure it's open database.openGlobalRelvar(name); } } private abstract class RegisterSpecialRelvar extends HandleRelvar { RegisterSpecialRelvar(String name) { super(name); } public void process() throws DatabaseException { registerSpecialRelvar(name, getMetadata()); } } private class CreateSystemRelvar extends HandleRelvar { private Generator generator; CreateSystemRelvar(Generator generator, String name) { super(name); this.generator = generator; } RelvarMetadata getMetadata() { return new RelvarSystemMetadata(database, name); } public void process() throws DatabaseException { createSystemRelvar(generator, (RelvarSystemMetadata)getMetadata()); } } private class CreateSystemDependenciesRelvar extends CreateSystemRelvar { CreateSystemDependenciesRelvar(Generator generator, String name) { super(generator, name); } RelvarMetadata getMetadata() { return new RelvarSystemDependenciesMetadata(database, name); } } }