Class BasicDependencyManager

java.lang.Object
org.apache.derby.impl.sql.depend.BasicDependencyManager
All Implemented Interfaces:
DependencyManager

public class BasicDependencyManager extends Object implements DependencyManager
The dependency manager tracks needs that dependents have of providers.

A dependency can be either persistent or non-persistent. Persistent dependencies are stored in the data dictionary, and non-persistent dependencies are stored within the dependency manager itself (in memory).

Synchronization: The need for synchronization is different depending on whether the dependency is an in-memory dependency or a stored dependency. When accessing and modifying in-memory dependencies, Java synchronization must be used (specifically, we synchronize on this). When accessing and modifying stored dependencies, which are stored in the data dictionary, we expect that the locking protocols will provide the synchronization needed. Note that stored dependencies should not be accessed while holding the monitor of this, as this may result in deadlocks. So far the need for synchronization across both in-memory and stored dependencies hasn't occurred.

  • Field Details

    • dd

      private final DataDictionary dd
      DataDictionary for this database.
    • dependents

      private final Map<UUID, List<Dependency>> dependents
      Map of in-memory dependencies for Dependents. In-memory means that one or both of the Dependent or Provider are non-persistent (isPersistent() returns false). Key is the UUID of the Dependent (from getObjectID()). Value is a List containing Dependency objects, each of whihc links the same Dependent to a Provider. Dependency objects in the List are unique.
    • providers

      private final Map<UUID, List<Dependency>> providers
      Map of in-memory dependencies for Providers. In-memory means that one or both of the Dependent or Provider are non-persistent (isPersistent() returns false). Key is the UUID of the Provider (from getObjectID()). Value is a List containing Dependency objects, each of which links the same Provider to a Dependent. Dependency objects in the List are unique.
    • EMPTY_PROVIDER_INFO

      private static final ProviderInfo[] EMPTY_PROVIDER_INFO
  • Constructor Details

    • BasicDependencyManager

      public BasicDependencyManager(DataDictionary dd)
  • Method Details

    • addDependency

      public void addDependency(Dependent d, Provider p, ContextManager cm) throws StandardException
      adds a dependency from the dependent on the provider. This will be considered to be the default type of dependency, when dependency types show up.

      Implementations of addDependency should be fast -- performing alot of extra actions to add a dependency would be a detriment.

      Specified by:
      addDependency in interface DependencyManager
      Parameters:
      d - the dependent
      p - the provider
      cm - Current ContextManager
      Throws:
      StandardException - thrown if something goes wrong
    • addDependency

      private void addDependency(Dependent d, Provider p, ContextManager cm, TransactionController tc) throws StandardException
      Adds the dependency to the data dictionary or the in-memory dependency map.

      The action taken is detmermined by whether the dependent and/or the provider are persistent.

      Parameters:
      d - the dependent
      p - the provider
      cm - context manager
      tc - transaction controller, used to determine if any transactional operations should be attempted carried out in a nested transaction. If tc is null, the user transaction is used.
      Throws:
      StandardException - if adding the dependency fails
    • addInMemoryDependency

      private void addInMemoryDependency(Dependent d, Provider p, ContextManager cm) throws StandardException
      Adds the dependency as an in-memory dependency.
      Parameters:
      d - the dependent
      p - the provider
      cm - context manager
      Throws:
      StandardException - if adding the dependency fails
      See Also:
    • addStoredDependency

      private void addStoredDependency(Dependent d, Provider p, ContextManager cm, TransactionController tc) throws StandardException
      Adds the dependency as a stored dependency.

      We expect that transactional locking (in the data dictionary) is enough to protect us from concurrent changes when adding stored dependencies. Adding synchronization here and accessing the data dictionary (which is transactional) may cause deadlocks.

      Parameters:
      d - the dependent
      p - the provider
      cm - context manager
      tc - transaction controller (may be null)
      Throws:
      StandardException - if adding the dependency fails
      See Also:
    • dropDependency

      private void dropDependency(LanguageConnectionContext lcc, Dependent d, Provider p) throws StandardException
      drops a single dependency
      Parameters:
      d - the dependent
      p - the provider
      Throws:
      StandardException - thrown if something goes wrong
    • invalidateFor

      public void invalidateFor(Provider p, int action, LanguageConnectionContext lcc) throws StandardException
      mark all dependencies on the named provider as invalid. When invalidation types show up, this will use the default invalidation type. The dependencies will still exist once they are marked invalid; clearDependencies should be used to remove dependencies that a dependent has or provider gives.

      Implementations of this can take a little time, but are not really expected to recompile things against any changes made to the provider that caused the invalidation. The dependency system makes no guarantees about the state of the provider -- implementations can call this before or after actually changing the provider to its new state.

      Implementations should throw StandardException if the invalidation should be disallowed.

      Specified by:
      invalidateFor in interface DependencyManager
      Parameters:
      p - the provider
      action - The action causing the invalidate
      lcc - The LanguageConnectionContext
      Throws:
      StandardException - thrown if unable to make it invalid
    • coreInvalidateFor

      private void coreInvalidateFor(Provider p, int action, LanguageConnectionContext lcc) throws StandardException
      A version of invalidateFor that does not provide synchronization among invalidators.
      Parameters:
      p - the provider
      action - the action causing the invalidation
      lcc - language connection context
      Throws:
      StandardException - if something goes wrong
    • clearDependencies

      public void clearDependencies(LanguageConnectionContext lcc, Dependent d) throws StandardException
      Erases all of the dependencies the dependent has, be they valid or invalid, of any dependency type. This action is usually performed as the first step in revalidating a dependent; it first erases all the old dependencies, then revalidates itself generating a list of new dependencies, and then marks itself valid if all its new dependencies are valid.

      There might be a future want to clear all dependencies for a particular provider, e.g. when destroying the provider. However, at present, they are assumed to stick around and it is the responsibility of the dependent to erase them when revalidating against the new version of the provider.

      clearDependencies will delete dependencies if they are stored; the delete is finalized at the next commit.

      Specified by:
      clearDependencies in interface DependencyManager
      Parameters:
      lcc - Compiler state
      d - the dependent
      Throws:
      StandardException - Thrown on failure
    • clearDependencies

      public void clearDependencies(LanguageConnectionContext lcc, Dependent d, TransactionController tc) throws StandardException
      Description copied from interface: DependencyManager
      Erases all of the dependencies the dependent has, be they valid or invalid, of any dependency type. This action is usually performed as the first step in revalidating a dependent; it first erases all the old dependencies, then revalidates itself generating a list of new dependencies, and then marks itself valid if all its new dependencies are valid.

      There might be a future want to clear all dependencies for a particular provider, e.g. when destroying the provider. However, at present, they are assumed to stick around and it is the responsibility of the dependent to erase them when revalidating against the new version of the provider.

      clearDependencies will delete dependencies if they are stored; the delete is finalized at the next commit.

      Specified by:
      clearDependencies in interface DependencyManager
      Parameters:
      lcc - Compiler state
      d - the dependent
      tc - transaction controller
      Throws:
      StandardException - Thrown on failure
    • clearInMemoryDependency

      public void clearInMemoryDependency(Dependency dy)
      Clear the specified in memory dependency. This is useful for clean-up when an exception occurs. (We clear all in-memory dependencies added in the current StatementContext.)
      Specified by:
      clearInMemoryDependency in interface DependencyManager
    • getPersistentProviderInfos

      public ProviderInfo[] getPersistentProviderInfos(Dependent dependent) throws StandardException
      Description copied from interface: DependencyManager
      Get a new array of ProviderInfos representing all the persistent providers for the given dependent.
      Specified by:
      getPersistentProviderInfos in interface DependencyManager
      Throws:
      StandardException - Thrown on error
      See Also:
    • getPersistentProviderInfos

      public ProviderInfo[] getPersistentProviderInfos(ProviderList pl) throws StandardException
      Description copied from interface: DependencyManager
      Get a new array of ProviderInfos representing all the persistent providers from the given list of providers.
      Specified by:
      getPersistentProviderInfos in interface DependencyManager
      Throws:
      StandardException - Thrown on error
      See Also:
    • clearColumnInfoInProviders

      public void clearColumnInfoInProviders(ProviderList pl) throws StandardException
      Description copied from interface: DependencyManager
      Clear the in memory column bit map information in any table descriptor provider in a provider list. This function needs to be called before the table descriptor is reused as provider in column dependency. For example, this happens in "create publication" statement with target-only DDL where more than one views are defined and they all reference one table.
      Specified by:
      clearColumnInfoInProviders in interface DependencyManager
      Parameters:
      pl - provider list
      Throws:
      StandardException - Thrown on error
      See Also:
    • copyDependencies

      public void copyDependencies(Dependent copy_From, Dependent copyTo, boolean persistentOnly, ContextManager cm) throws StandardException
      Copy dependencies from one dependent to another.
      Specified by:
      copyDependencies in interface DependencyManager
      Parameters:
      copy_From - the dependent to copy from
      copyTo - the dependent to copy to
      persistentOnly - only copy persistent dependencies
      cm - Current ContextManager
      Throws:
      StandardException - Thrown on error.
    • copyDependencies

      public void copyDependencies(Dependent copy_From, Dependent copyTo, boolean persistentOnly, ContextManager cm, TransactionController tc) throws StandardException
      Description copied from interface: DependencyManager
      Copy dependencies from one dependent to another.
      Specified by:
      copyDependencies in interface DependencyManager
      Parameters:
      copy_From - the dependent to copy from
      copyTo - the dependent to copy to
      persistentOnly - only copy persistent dependencies
      cm - Current ContextManager
      tc - Transaction Controller
      Throws:
      StandardException - Thrown on error.
    • getActionString

      public String getActionString(int action)
      Returns a string representation of the SQL action, hence no need to internationalize, which is causing the invokation of the Dependency Manager.
      Specified by:
      getActionString in interface DependencyManager
      Parameters:
      action - The action
      Returns:
      String The String representation
    • countDependencies

      public int countDependencies() throws StandardException
      Count the number of active dependencies, both stored and in memory, in the system.
      Specified by:
      countDependencies in interface DependencyManager
      Returns:
      int The number of active dependencies in the system.
      Throws:
      StandardException - thrown if something goes wrong
    • addDependencyToTable

      private boolean addDependencyToTable(Map<UUID, List<Dependency>> table, UUID key, Dependency dy)
      Add a new dependency to the specified table if it does not already exist in that table.
      Returns:
      boolean Whether or not the dependency get added.
    • clearProviderDependency

      private void clearProviderDependency(UUID p, Dependency d)
      removes a dependency for a given provider. assumes that the dependent removal is being dealt with elsewhere. Won't assume that the dependent only appears once in the list.
    • getDependencyDescriptorList

      private List<Dependency> getDependencyDescriptorList(List<DependencyDescriptor> storedList, Provider providerForList) throws StandardException
      Turn a list of DependencyDescriptors into a list of Dependencies.
      Parameters:
      storedList - The List of DependencyDescriptors representing stored dependencies.
      providerForList - The provider if this list is being created for a list of dependents. Null otherwise.
      Returns:
      List The converted List
      Throws:
      StandardException - thrown if something goes wrong
    • getLanguageConnectionContext

      private LanguageConnectionContext getLanguageConnectionContext(ContextManager cm)
      Returns the LanguageConnectionContext to use.
      Parameters:
      cm - Current ContextManager
      Returns:
      LanguageConnectionContext The LanguageConnectionContext to use.
    • getProviders

      private List<Provider> getProviders(Dependent d) throws StandardException
      Returns a list of all providers that this dependent has (even invalid ones). Includes all dependency types.
      Parameters:
      d - the dependent
      Returns:
      A list of providers (possibly empty).
      Throws:
      StandardException - thrown if something goes wrong
    • getDependents

      private List<Dependency> getDependents(Provider p) throws StandardException
      Returns an enumeration of all dependencies that this provider is supporting for any dependent at all (even invalid ones). Includes all dependency types.
      Parameters:
      p - the provider
      Returns:
      A list of dependents (possibly empty).
      Throws:
      StandardException - if something goes wrong