Class BasicDependencyManager
- All Implemented Interfaces:
DependencyManager
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 Summary
FieldsModifier and TypeFieldDescriptionprivate final DataDictionary
DataDictionary for this database.private final Map
<UUID, List<Dependency>> Map of in-memory dependencies for Dependents.private static final ProviderInfo[]
private final Map
<UUID, List<Dependency>> Map of in-memory dependencies for Providers.Fields inherited from interface org.apache.derby.iapi.sql.depend.DependencyManager
ALTER_TABLE, BULK_INSERT, CHANGED_CURSOR, COMPILE_FAILED, COMPRESS_TABLE, CREATE_CONSTRAINT, CREATE_INDEX, CREATE_TRIGGER, CREATE_VIEW, DROP_AGGREGATE, DROP_COLUMN, DROP_COLUMN_RESTRICT, DROP_CONSTRAINT, DROP_INDEX, DROP_JAR, DROP_METHOD_ALIAS, DROP_SCHEMA, DROP_SEQUENCE, DROP_SPS, DROP_STATISTICS, DROP_SYNONYM, DROP_TABLE, DROP_TRIGGER, DROP_UDT, DROP_VIEW, INTERNAL_RECOMPILE_REQUEST, MAX_ACTION_CODE, MODIFY_COLUMN_DEFAULT, PREPARED_STATEMENT_RELEASE, RECHECK_PRIVILEGES, RENAME, RENAME_INDEX, REPLACE_JAR, REVOKE_PRIVILEGE, REVOKE_PRIVILEGE_RESTRICT, REVOKE_ROLE, ROLLBACK, SET_CONSTRAINTS_DISABLE, SET_CONSTRAINTS_ENABLE, SET_TRIGGERS_DISABLE, SET_TRIGGERS_ENABLE, TRUNCATE_TABLE, UPDATE_STATISTICS, USER_RECOMPILE_REQUEST
-
Constructor Summary
Constructors -
Method Summary
Modifier and TypeMethodDescriptionvoid
addDependency
(Dependent d, Provider p, ContextManager cm) adds a dependency from the dependent on the provider.private void
addDependency
(Dependent d, Provider p, ContextManager cm, TransactionController tc) Adds the dependency to the data dictionary or the in-memory dependency map.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.private void
addInMemoryDependency
(Dependent d, Provider p, ContextManager cm) Adds the dependency as an in-memory dependency.private void
addStoredDependency
(Dependent d, Provider p, ContextManager cm, TransactionController tc) Adds the dependency as a stored dependency.void
Clear the in memory column bit map information in any table descriptor provider in a provider list.void
Erases all of the dependencies the dependent has, be they valid or invalid, of any dependency type.void
Erases all of the dependencies the dependent has, be they valid or invalid, of any dependency type.void
Clear the specified in memory dependency.private void
removes a dependency for a given provider. assumes that the dependent removal is being dealt with elsewhere.void
copyDependencies
(Dependent copy_From, Dependent copyTo, boolean persistentOnly, ContextManager cm) Copy dependencies from one dependent to another.void
copyDependencies
(Dependent copy_From, Dependent copyTo, boolean persistentOnly, ContextManager cm, TransactionController tc) Copy dependencies from one dependent to another.private void
coreInvalidateFor
(Provider p, int action, LanguageConnectionContext lcc) A version of invalidateFor that does not provide synchronization among invalidators.int
Count the number of active dependencies, both stored and in memory, in the system.private void
dropDependency
(LanguageConnectionContext lcc, Dependent d, Provider p) drops a single dependencygetActionString
(int action) Returns a string representation of the SQL action, hence no need to internationalize, which is causing the invokation of the Dependency Manager.private List
<Dependency> getDependencyDescriptorList
(List<DependencyDescriptor> storedList, Provider providerForList) Turn a list of DependencyDescriptors into a list of Dependencies.private List
<Dependency> Returns an enumeration of all dependencies that this provider is supporting for any dependent at all (even invalid ones).private LanguageConnectionContext
Returns the LanguageConnectionContext to use.getPersistentProviderInfos
(Dependent dependent) Get a new array of ProviderInfos representing all the persistent providers for the given dependent.Get a new array of ProviderInfos representing all the persistent providers from the given list of providers.Returns a list of all providers that this dependent has (even invalid ones).void
invalidateFor
(Provider p, int action, LanguageConnectionContext lcc) mark all dependencies on the named provider as invalid.
-
Field Details
-
dd
DataDictionary for this database. -
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
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
-
-
Constructor Details
-
BasicDependencyManager
-
-
Method Details
-
addDependency
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 interfaceDependencyManager
- Parameters:
d
- the dependentp
- the providercm
- 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 dependentp
- the providercm
- context managertc
- transaction controller, used to determine if any transactional operations should be attempted carried out in a nested transaction. Iftc
isnull
, 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 dependentp
- the providercm
- 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 dependentp
- the providercm
- context managertc
- transaction controller (may benull
)- 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 dependentp
- 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 interfaceDependencyManager
- Parameters:
p
- the provideraction
- The action causing the invalidatelcc
- 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 provideraction
- the action causing the invalidationlcc
- language connection context- Throws:
StandardException
- if something goes wrong
-
clearDependencies
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 interfaceDependencyManager
- Parameters:
lcc
- Compiler stated
- 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 interfaceDependencyManager
- Parameters:
lcc
- Compiler stated
- the dependenttc
- transaction controller- Throws:
StandardException
- Thrown on failure
-
clearInMemoryDependency
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 interfaceDependencyManager
-
getPersistentProviderInfos
Description copied from interface:DependencyManager
Get a new array of ProviderInfos representing all the persistent providers for the given dependent.- Specified by:
getPersistentProviderInfos
in interfaceDependencyManager
- Throws:
StandardException
- Thrown on error- See Also:
-
getPersistentProviderInfos
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 interfaceDependencyManager
- Throws:
StandardException
- Thrown on error- See Also:
-
clearColumnInfoInProviders
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 interfaceDependencyManager
- 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 interfaceDependencyManager
- Parameters:
copy_From
- the dependent to copy fromcopyTo
- the dependent to copy topersistentOnly
- only copy persistent dependenciescm
- 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 interfaceDependencyManager
- Parameters:
copy_From
- the dependent to copy fromcopyTo
- the dependent to copy topersistentOnly
- only copy persistent dependenciescm
- Current ContextManagertc
- Transaction Controller- Throws:
StandardException
- Thrown on error.
-
getActionString
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 interfaceDependencyManager
- Parameters:
action
- The action- Returns:
- String The String representation
-
countDependencies
Count the number of active dependencies, both stored and in memory, in the system.- Specified by:
countDependencies
in interfaceDependencyManager
- Returns:
- int The number of active dependencies in the system.
- Throws:
StandardException
- thrown if something goes wrong
-
addDependencyToTable
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
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
Returns the LanguageConnectionContext to use.- Parameters:
cm
- Current ContextManager- Returns:
- LanguageConnectionContext The LanguageConnectionContext to use.
-
getProviders
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
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
-