Mercurial > hg > blitz_stable
diff src/org/dancres/blitz/meta/RegistryImpl.java @ 0:3dc0c5604566
Initial checkin of blitz 2.0 fcs - no installer yet.
author | Dan Creswell <dan.creswell@gmail.com> |
---|---|
date | Sat, 21 Mar 2009 11:00:06 +0000 |
parents | |
children |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/org/dancres/blitz/meta/RegistryImpl.java Sat Mar 21 11:00:06 2009 +0000 @@ -0,0 +1,188 @@ +package org.dancres.blitz.meta; + +import java.io.Serializable; +import java.io.IOException; +import java.io.FileNotFoundException; +import java.io.File; + +import java.util.logging.*; + +import com.sleepycat.je.DatabaseException; +import com.sleepycat.je.Database; +import com.sleepycat.je.DatabaseEntry; +import com.sleepycat.je.OperationStatus; +import com.sleepycat.je.DatabaseConfig; + +import org.dancres.blitz.disk.Disk; +import org.dancres.blitz.disk.DiskTxn; +import org.dancres.blitz.disk.Syncable; + +import org.dancres.blitz.Logging; + +import org.dancres.util.ObjectTransformer; + +class RegistryImpl implements Registry { + private Database theDb; + private String theName; + + static Logger theLogger = + Logging.newLogger("org.dancres.blitz.meta.Registry"); + + RegistryImpl(String aName, Initializer anInitializer) throws IOException { + theName = aName; + + try { + // theDb.set_flags(Db.DB_REVSPLITOFF); + + DiskTxn myTxn = DiskTxn.newStandalone(); + + DatabaseConfig myConfig = new DatabaseConfig(); + + try { + if (exists(aName)) { + theDb = Disk.newDb(myTxn.getDbTxn(), getDbNameFor(aName), + myConfig); + } else { + myConfig.setAllowCreate(true); + theDb = Disk.newDb(myTxn.getDbTxn(), getDbNameFor(aName), + myConfig); + + if (anInitializer != null) + anInitializer.execute(getAccessor(myTxn)); + } + } finally { + myTxn.commit(true); + } + + } catch (FileNotFoundException aFNFE) { + theLogger.log(Level.SEVERE, "File not found", aFNFE); + try { + theDb.close(); + } catch (DatabaseException aDbe) { + // Don't care anymore + } + + throw new IOException("File not found"); + } catch (DatabaseException aDBE) { + theLogger.log(Level.SEVERE, "DatabaseException", aDBE); + try { + theDb.close(); + } catch (DatabaseException aDbe) { + // Don't care anymore + } + throw new IOException("DatabaseException"); + } + } + + public RegistryAccessor getAccessor() throws IOException { + return new RegistryAccessorImpl(this); + } + + public RegistryAccessor getAccessor(DiskTxn aTxn) throws IOException { + return new RegistryAccessorImpl(this, aTxn); + } + + Serializable load(DiskTxn aTxn, byte[] aKey) throws IOException { + DatabaseEntry myKey = new DatabaseEntry(aKey); + DatabaseEntry myData = new DatabaseEntry(); + + try { + OperationStatus myResult = + theDb.get(aTxn.getDbTxn(), myKey, myData, null); + + if (myResult.equals(OperationStatus.NOTFOUND)) + return null; + else { + try { + return ObjectTransformer.toObject(myData.getData()); + } catch (Exception anE) { + theLogger.log(Level.SEVERE, "Failed to unpack metadata", + anE); + throw new IOException("Failed to unpack metadata"); + } + } + } catch (Exception anE) { + theLogger.log(Level.SEVERE, "Failed to load metadata", + anE); + throw new IOException("Failed to load metadata"); + } + } + + byte[] loadRaw(DiskTxn aTxn, byte[] aKey) throws IOException { + DatabaseEntry myKey = new DatabaseEntry(aKey); + DatabaseEntry myData = new DatabaseEntry(); + + try { + OperationStatus myResult = + theDb.get(aTxn.getDbTxn(), myKey, myData, null); + + if (myResult.equals(OperationStatus.NOTFOUND)) + return null; + else + return myData.getData(); + } catch (DatabaseException aDbe) { + theLogger.log(Level.SEVERE, "Got DatabaseException", aDbe); + throw new IOException("Got Dbe"); + } + } + + void save(DiskTxn aTxn, byte[] aKey, Serializable anObject) + throws IOException { + + DatabaseEntry myKey = new DatabaseEntry(aKey); + + byte[] myFlatObject = null; + + try { + myFlatObject = ObjectTransformer.toByte(anObject); + } catch (Exception anE) { + theLogger.log(Level.SEVERE, "Failed to pack metadata", + anE); + throw new IOException("Failed to pack metadata"); + } + + DatabaseEntry myData = new DatabaseEntry(myFlatObject); + + try { + theDb.put(aTxn.getDbTxn(), myKey, myData); + } catch (DatabaseException aDbe) { + theLogger.log(Level.SEVERE, "Got DatabaseException", aDbe); + throw new IOException("Got Dbe"); + } + } + + MetaIterator readAll(DiskTxn aTxn) throws IOException { + return new MetaIteratorImpl(theDb, aTxn); + } + + void delete(DiskTxn aTxn, byte[] aKey) throws IOException { + + try { + theDb.delete(aTxn.getDbTxn(), new DatabaseEntry(aKey)); + } catch (DatabaseException aDbe) { + theLogger.log(Level.SEVERE, "Got DatabaseException", aDbe); + throw new IOException("Got Dbe"); + } + } + + public void close() throws IOException { + try { + theDb.close(); + } catch (DatabaseException aDbe) { + theLogger.log(Level.SEVERE, "Got DatabaseException", aDbe); + throw new IOException("Got Dbe"); + } + } + + void delete() throws IOException { + Disk.deleteDb(getDbNameFor(theName)); + } + + static boolean exists(String aName) { + return Disk.dbExists(getDbNameFor(aName)); + } + + private static String getDbNameFor(String aRegName) { + return aRegName + "-meta"; + } +}