org.apache.derby.impl.io
Class VFMemoryStorageFactory

java.lang.Object
  extended by org.apache.derby.impl.io.VFMemoryStorageFactory
All Implemented Interfaces:
StorageFactory, WritableStorageFactory

public class VFMemoryStorageFactory
extends java.lang.Object
implements StorageFactory, WritableStorageFactory

A storage factory for virtual files, where the contents of the files are stored in main memory.

Note that data store deletion may happen inside one of two different methods; either in shutdown or in init. This is due to the current implementation and the fact that dropping a database is done through the file IO interface by deleting the service root. As the deletion then becomes a two step process, someone else may boot the database again before the reference to the store has been removed. To avoid this, the init-method will never initialize with a store scheduled for deletion. I have only seen this issue in heavily loaded multithreaded environments (2 CPUs/cores should be enough to reproduce).


Field Summary
private  java.lang.String canonicalName
          The canonical (unique) name of the database (absolute path).
private static java.util.Map DATABASES
          References to the databases created / existing.
private  StorageFile dataDirectory
          The data directory of the database.
private  DataStore dbData
          The data store used for the database.
private static DataStore DUMMY_STORE
          Dummy store used to carry out frequent operations that don't require a "proper store", for instance getting the canonical name of the data store.
private  StorageFile tempDir
          The temporary directory for the database (absolute path).
 
Fields inherited from interface org.apache.derby.io.StorageFactory
VERSION_NUMBER
 
Constructor Summary
VFMemoryStorageFactory()
          Creates a new, uninitialized instance of the storage factory.
 
Method Summary
 StorageFile createTemporaryFile(java.lang.String prefix, java.lang.String suffix)
          Creates a handle to a temporary file.
private  void dbDropCleanupInDummy(java.lang.String dbPath)
          Cleans up the internal dummy data store after a database has been dropped.
 java.lang.String getCanonicalName()
          Get the canonical name of the database.
 char getSeparator()
          Returns the path separator used by this storage factory.
 int getStorageFactoryVersion()
           
 StorageFile getTempDir()
          Returns the temporary directory for this storage factory instance.
 void init(java.lang.String home, java.lang.String databaseName, java.lang.String tempDirNameIgnored, java.lang.String uniqueName)
          Initializes the storage factory instance by setting up a temporary directory, the database directory and checking if the database being named already exists.
 boolean isFast()
          The service is fast and supports random access.
 boolean isReadOnlyDatabase()
          The service supports writes.
 StorageFile newStorageFile(StorageFile directoryName, java.lang.String fileName)
          Returns a handle to the specified storage file.
 StorageFile newStorageFile(java.lang.String path)
          Returns a handle to the specific storage file.
 StorageFile newStorageFile(java.lang.String directoryName, java.lang.String fileName)
          Returns a handle to the specified storage file.
private  java.lang.String normalizePath(java.lang.String path)
          Returns a normalized absolute path.
private  java.lang.String normalizePath(java.lang.String dir, java.lang.String file)
          Returns a normalized absolute path.
static boolean purgeDatabase(java.lang.String dbName)
          TODO: Remove this method once the new mechanism has been added.
 void shutdown()
          Normally does nothing, but if the database is in a state such that it should be deleted this will happen here.
 boolean supportsRandomAccess()
          The service supports random access.
 boolean supportsWriteSync()
          This method tests whether the StorageRandomAccessFile "rws" and "rwd" modes are implemented.
 void sync(java.io.OutputStream stream, boolean metaData)
          The sync method is a no-op for this storage factory.
 
Methods inherited from class java.lang.Object
clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait
 

Field Detail

DATABASES

private static final java.util.Map DATABASES
References to the databases created / existing.


DUMMY_STORE

private static final DataStore DUMMY_STORE
Dummy store used to carry out frequent operations that don't require a "proper store", for instance getting the canonical name of the data store.


canonicalName

private java.lang.String canonicalName
The canonical (unique) name of the database (absolute path).


dataDirectory

private StorageFile dataDirectory
The data directory of the database.


tempDir

private StorageFile tempDir
The temporary directory for the database (absolute path).


dbData

private DataStore dbData
The data store used for the database.

Constructor Detail

VFMemoryStorageFactory

public VFMemoryStorageFactory()
Creates a new, uninitialized instance of the storage factory.

To initialize the instance, init must be called.

See Also:
init(java.lang.String, java.lang.String, java.lang.String, java.lang.String)
Method Detail

purgeDatabase

public static boolean purgeDatabase(java.lang.String dbName)
TODO: Remove this method once the new mechanism has been added. Deletes the database if it exists.

Parameters:
dbName - the database name
Returns:
true if the database was deleted, false otherwise

init

public void init(java.lang.String home,
                 java.lang.String databaseName,
                 java.lang.String tempDirNameIgnored,
                 java.lang.String uniqueName)
          throws java.io.IOException
Initializes the storage factory instance by setting up a temporary directory, the database directory and checking if the database being named already exists.

Specified by:
init in interface StorageFactory
Parameters:
home - the value of system.home for this storage factory
databaseName - the name of the database, all relative pathnames are relative to this name
tempDirNameIgnored - ignored
uniqueName - used to determine when the temporary directory can be created, but not to name the temporary directory itself
Throws:
java.io.IOException - on an error (unexpected).

shutdown

public void shutdown()
Normally does nothing, but if the database is in a state such that it should be deleted this will happen here.

Specified by:
shutdown in interface StorageFactory

getCanonicalName

public java.lang.String getCanonicalName()
Description copied from interface: StorageFactory
Get the canonical name of the database. This is a name that uniquely identifies it. It is system dependent. The normal, disk based implementation uses method java.io.File.getCanonicalPath on the directory holding the database to construct the canonical name.

Specified by:
getCanonicalName in interface StorageFactory
Returns:
the canonical name

newStorageFile

public StorageFile newStorageFile(java.lang.String path)
Returns a handle to the specific storage file.

Specified by:
newStorageFile in interface StorageFactory
Parameters:
path - the path of the file or directory
Returns:
A path handle.

newStorageFile

public StorageFile newStorageFile(java.lang.String directoryName,
                                  java.lang.String fileName)
Returns a handle to the specified storage file.

Specified by:
newStorageFile in interface StorageFactory
Parameters:
directoryName - the name of the parent directory
fileName - the name of the file
Returns:
A path handle.

newStorageFile

public StorageFile newStorageFile(StorageFile directoryName,
                                  java.lang.String fileName)
Returns a handle to the specified storage file.

Specified by:
newStorageFile in interface StorageFactory
Parameters:
directoryName - the name of the parent directory
fileName - the name of the file
Returns:
A path handle.

getTempDir

public StorageFile getTempDir()
Returns the temporary directory for this storage factory instance.

Specified by:
getTempDir in interface StorageFactory
Returns:
A StorageFile-object representing the temp directory.

isFast

public boolean isFast()
The service is fast and supports random access.

Specified by:
isFast in interface StorageFactory
Returns:
true

isReadOnlyDatabase

public boolean isReadOnlyDatabase()
The service supports writes.

Specified by:
isReadOnlyDatabase in interface StorageFactory
Returns:
false

supportsRandomAccess

public boolean supportsRandomAccess()
The service supports random access.

Specified by:
supportsRandomAccess in interface StorageFactory
Returns:
true

getStorageFactoryVersion

public int getStorageFactoryVersion()
Specified by:
getStorageFactoryVersion in interface StorageFactory
Returns:
the StorageFactory version supported by this implementation

createTemporaryFile

public StorageFile createTemporaryFile(java.lang.String prefix,
                                       java.lang.String suffix)
Creates a handle to a temporary file.

Specified by:
createTemporaryFile in interface StorageFactory
Parameters:
prefix - requested prefix for the file name
suffix - requested suffix for the file name, if null then .tmp will be used
Returns:
A handle to the temporary file.

getSeparator

public char getSeparator()
Returns the path separator used by this storage factory.

Specified by:
getSeparator in interface StorageFactory
Returns:
PathUtil.SEP

sync

public void sync(java.io.OutputStream stream,
                 boolean metaData)
The sync method is a no-op for this storage factory.

Specified by:
sync in interface WritableStorageFactory
Parameters:
stream - ignored
metaData - ignored

supportsWriteSync

public boolean supportsWriteSync()
Description copied from interface: WritableStorageFactory
This method tests whether the StorageRandomAccessFile "rws" and "rwd" modes are implemented. If the "rws" and "rwd" modes are supported then the database engine will conclude that the write methods of "rws"/"rwd" mode StorageRandomAccessFiles are slow but the sync method is fast and optimize accordingly.

Specified by:
supportsWriteSync in interface WritableStorageFactory
Returns:
true if an StIRandomAccess file opened with "rws" or "rwd" modes immediately writes data to the underlying storage, false if not.

normalizePath

private java.lang.String normalizePath(java.lang.String dir,
                                       java.lang.String file)
Returns a normalized absolute path.

Parameters:
dir - parent directory, if null the dataDirectory will be used
file - the file name (null not allowed)
Returns:
A path.
Throws:
java.lang.NullPointerException - if file is null

normalizePath

private java.lang.String normalizePath(java.lang.String path)
Returns a normalized absolute path.

Parameters:
path - path, if null the dataDirectory will be used
Returns:
A path.

dbDropCleanupInDummy

private void dbDropCleanupInDummy(java.lang.String dbPath)
Cleans up the internal dummy data store after a database has been dropped.

Parameters:
dbPath - absolute path of the dropped database

Built on Thu 2012-03-29 21:53:33+0000, from revision ???

Apache Derby V10.6 Internals - Copyright © 2004,2007 The Apache Software Foundation. All Rights Reserved.