public interface DirtyShareMultiplexer extends RemoteMultiplexer<java.lang.String>
RemoteDirtyShareManager
invokes the methods of this interface on a local proxy for a remote object,
in order to access the dirty share services of the remote P2J
server which is authoritative for a particular database.
Since the remote P2J server may manage multiple databases, but only a single instance of an implementor of this interface will be available at any given remote server, dirty share service requests must be multiplexed by database. For this reason, each of the methods defined by this interface accepts an integer ID, which uniquely identifies the target database at the remote server.
The database ID to use for a particular physical database is determined by
calling RemoteMultiplexer.getMultiplexID(Object)
. This is
the responsibility of the RemoteDirtyShareManager
and must be
done before any dirty share management service is requested.
This interface effectively mirrors that of the DirtyShareManager
API
, except for the additional database multiplex identifier which is the
first parameter to each method.
Modifier and Type | Method and Description |
---|---|
void |
cleanupChanges(int database,
java.util.Map<java.lang.String,java.util.Set<java.io.Serializable>> subChanges,
java.util.Set<RecordIdentifier> subInserts,
java.util.Set<java.lang.String> leakedEntities)
Stop tracking uncommitted changes to the the subset of records
represented by
subChanges , and remove from the master set
of uncommitted, inserted records the subset of records represented by
subInserts . |
void |
cleanupDeletes(int database,
java.util.Map<java.lang.String,java.util.Set<java.io.Serializable>> subDeletes)
Remove from the master set of uncommitted, deleted records the subset of
records represented by
subDeletes . |
void |
delete(int database,
java.lang.String entity,
java.io.Serializable id,
boolean rollback,
boolean lock)
Mark a record as having been deleted in an uncommitted transaction, or
unmark a record which previously was so marked.
|
void |
deregisterForGlobalEvents(int database,
long registerID)
Deregister with a global event clearinghouse an interest in insert,
delete, and update events which affect a particular DMO type.
|
Persistable |
getDirtyDMO(int database,
java.lang.String entity,
java.io.Serializable id)
Retrieve from the dirty database the record specified by the given
entity and primary key, if it exists.
|
DirtyInfo |
getDirtyInfo(int database,
java.lang.String entity,
java.io.Serializable candidateID,
java.lang.String index,
java.util.List<java.lang.String> statements,
java.lang.Object[] params,
org.hibernate.type.Type[] types,
boolean rowidLookup)
Given certain search criteria and possibly the primary key of a
potential DMO match in the primary database, report any significant
information currently being tracked for uncommitted transactions, which
might override data (or the lack thereof) found in the primary database.
|
int |
getEntityDirtyState(int database,
java.lang.String entity)
Indicate whether any uncommitted modification is being tracked for the
database table associated with the specified entity.
|
GlobalChangeEvent[] |
getGlobalEvents(int database,
long registerID,
long lastID)
Retrieve any new events that have been collected by a global event
clearinghouse, representing inserts, deletes, and updates made to
record types for which the caller previously has registered interest.
|
void |
insert(int database,
java.lang.String entity,
Persistable copy,
java.util.Collection<java.lang.String> uniqueIndexes,
boolean lock)
Begin tracking a newly inserted record in the dirty database.
|
boolean |
isDeleted(int database,
java.lang.String entity,
java.io.Serializable id)
Indicate whether the record specified by the given entity and primary
key has been deleted within an uncommitted transaction in any
context.
|
boolean |
isTracked(int database,
java.lang.String entity,
java.io.Serializable id)
Indicate whether the record specified by the given entity and primary
key is being tracked for changes within an uncommitted transaction.
|
boolean |
isUnvalidatedIndex(int database,
RecordIdentifier ident,
java.lang.String index)
Indicate whether the record identified by
ident represents a newly inserted
record, which has an unvalidated index, index . |
java.util.List |
list(int database,
java.lang.String hql,
java.lang.Object[] params,
org.hibernate.type.Type[] types,
int maxResults,
int startOffset,
boolean readOnly)
Execute an HQL query and return the results as a list.
|
void |
lockAllIndexes(int database,
java.lang.String entity,
int lockType)
Lock or unlock all indexes associated with the given DMO entity.
|
void |
notifyInsertValidated(int database,
RecordIdentifier ident,
Persistable copy)
Notify the dirty share manager that the record represented by the given key has been
validated, and should no longer be tracked as unvalidated.
|
long |
registerForGlobalEvents(int database,
java.lang.String entity)
Register with a global event clearinghouse an interest in insert,
delete, and update events which affect the given DMO entity.
|
void |
rollbackInsert(int database,
RecordIdentifier ident,
boolean lock)
Rollback the insert of a record previously introduced with the
insert(int, String, Persistable, Collection, boolean) method. |
void |
update(int database,
java.lang.String entity,
Persistable copy,
java.lang.String[] properties,
int[] extIndexes,
BaseDataType[] values,
java.util.Collection<java.lang.String> validatedIndexes,
boolean lock)
Begin tracking a DMO for changes, based on the updates indicated by the
properties , extIndexes and values arguments. |
void |
update(int database,
java.lang.String entity,
java.io.Serializable id,
java.lang.String[] properties,
int[] extIndexes,
BaseDataType[] values,
java.util.Collection<java.lang.String> validatedIndexes,
boolean lock)
Retrieve a DMO which is being tracked in the dirty database, and apply the specified updates
to it, as provided by the
properties , extIndexes and values
arguments. |
void |
updateSnapshots(int database,
java.lang.String entity,
Persistable[] dmos)
Overwrite the state of the records in the dirty database which match the
IDs of the given list of DMOs for the given entity, and store a snapshot
of each DMO in the map of newly inserted records.
|
getMultiplexID
long registerForGlobalEvents(int database, java.lang.String entity)
database
- Value that uniquely identifies the target database on the
remote server.entity
- DMO entity for which the caller is interested in tracking
change.getGlobalEvents(int, long, long)
,
deregisterForGlobalEvents(int, long)
void deregisterForGlobalEvents(int database, long registerID)
database
- Value that uniquely identifies the target database on the
remote server.registerID
- A unique identifier for the registrant being deregistered.getGlobalEvents(int, long, long)
,
registerForGlobalEvents(int, String)
GlobalChangeEvent[] getGlobalEvents(int database, long registerID, long lastID) throws EventRegistrationException
database
- Value that uniquely identifies the target database on the
remote server.registerID
- A unique identifier for an object which has registered interest
in DMO changing events.lastID
- A unique identifier representing the last event retrieved by
the caller. If less than 0, it is assumed no events have yet
been retrieved since the caller registered interest in these
events.null
if no
such events have been collected.EventRegistrationException
- if registerID
is invalid or has expired.void lockAllIndexes(int database, java.lang.String entity, int lockType) throws PersistenceException
database
- Value that uniquely identifies the target database on the
remote server.entity
- Name of an entity, which is the name of the DMO implementation
class associated with a table being tracked for uncommitted
changes.lockType
- Type of lock to acquire, or NONE
to release
existing locks. NO_WAIT
variants will be treated
as regular, blocking variants.PersistenceException
- if there is an error querying JDBC metadata while retrieving
index information.void insert(int database, java.lang.String entity, Persistable copy, java.util.Collection<java.lang.String> uniqueIndexes, boolean lock) throws PersistenceException
This record is removed when the current transaction is committed or rolled back.
database
- Value that uniquely identifies the target database on the remote server.entity
- Name of an entity, which is the name of the DMO implementation class associated
with a table being tracked for uncommitted changes.copy
- Record to be tracked.uniqueIndexes
- If the insertion is happening at record creation, and the record has not yet been
validated, this will represent the collection of unique indexes that will need to
be validated before the record can safely be persisted. If null
, this
indicates the record has been fully validated and should no longer be tracked as
unvalidated.lock
- true
to acquire write locks to insert the record; false
to assume write locks are acquired by calling code.PersistenceException
- if there is any database error.void notifyInsertValidated(int database, RecordIdentifier ident, Persistable copy) throws PersistenceException
copy
.database
- Value that uniquely identifies the target database on the remote server.ident
- Record identifier (using entity name and primary key).copy
- Updated copy of DMO for the dirty manager to share with other contexts.PersistenceException
- if there is any database error.boolean isUnvalidatedIndex(int database, RecordIdentifier ident, java.lang.String index)
ident
represents a newly inserted
record, which has an unvalidated index, index
. Assumes appropriate indexes
already are locked by the caller.database
- Value that uniquely identifies the target database on the remote server.ident
- Record identifier (using entity name and primary key).index
- Index to be checked for validation.true
if ident
represents a new record in a foreign
context with unvalidated index index
.void rollbackInsert(int database, RecordIdentifier ident, boolean lock) throws PersistenceException
insert(int, String, Persistable, Collection, boolean)
method.database
- Value that uniquely identifies the target database on the
remote server.ident
- Identifier for the target record, which encapsulates its entity
name and primary key.lock
- true
to acquire write locks;
false
to assume write locks are acquired by
calling code.PersistenceException
- if there is any database error.boolean isTracked(int database, java.lang.String entity, java.io.Serializable id)
database
- Value that uniquely identifies the target database on the
remote server.entity
- Name of an entity, which is the name of the DMO implementation
class associated with a table being tracked for uncommitted
changes.id
- Primary key of the record to be checked.true
to indicate the target record is being
tracked for changes, else false
.void update(int database, java.lang.String entity, Persistable copy, java.lang.String[] properties, int[] extIndexes, BaseDataType[] values, java.util.Collection<java.lang.String> validatedIndexes, boolean lock) throws PersistenceException
properties
, extIndexes
and values
arguments.
Make a copy of the given record, apply the specified updates to that copy, and store the copy in the dirty database.
This record is removed when the adding context's current transaction is committed or rolled back.
database
- Value that uniquely identifies the target database on the
remote server.entity
- Name of an entity, which is the name of the DMO implementation
class associated with a table being tracked for uncommitted
changes.copy
- Record to be tracked.properties
- Array of names of those DMO properties which were updated.
These should represent columns which participate in one or more indexes.extIndexes
- In case of EXTENT fields this array contains their index. Otherwise -1.values
- Updated DMO property values. Each value in the array
corresponds positionally with its matching property name in the
properties
array.validatedIndexes
- Collection of unique indexes which have been checked successfully for this update
to have passed validation.lock
- true
to acquire write locks to update the record;
false
to assume write locks are acquired by calling code.PersistenceException
- if there is any database error.void update(int database, java.lang.String entity, java.io.Serializable id, java.lang.String[] properties, int[] extIndexes, BaseDataType[] values, java.util.Collection<java.lang.String> validatedIndexes, boolean lock) throws PersistenceException
properties
, extIndexes
and values
arguments. It is assumed the DMO already exists in the database, from a previous call to
update(int, String, Persistable, String[], int[], BaseDataType[], Collection,
boolean)
.database
- Value that uniquely identifies the target database on the
remote server.entity
- Name of an entity, which is the name of the DMO implementation
class associated with a table being tracked for uncommitted
changes.id
- Primary key id of the record to be retrieved and updated.properties
- Array of names of those DMO properties which were updated.
These should represent columns which participate in one or more indexes.extIndexes
- In case of EXTENT fields this array contains their index. Otherwise -1.values
- Updated DMO property values. Each value in the array
corresponds positionally with its matching property name in the
properties
array.validatedIndexes
- Collection of unique indexes which have been checked successfully for this update
to have passed validation.lock
- true
to acquire write locks to update the record;
false
to assume write locks are acquired by calling code.PersistenceException
- if there is any database error.void updateSnapshots(int database, java.lang.String entity, Persistable[] dmos) throws PersistenceException
This is necessary to support a quirk/bug in Progress which compromises transaction isolation by leaking uncommitted changes (even non-indexed data) under certain conditions.
database
- Value that uniquely identifies the target database on the
remote server.entity
- Name of an entity, which is the name of the DMO implementation
class associated with a table being tracked for uncommitted
changes.dmos
- Array of DMOs which are to be merged into their counterpart
records in the dirty database and whose snapshots are to be
stored in the map of newly inserted records.PersistenceException
- if there is any database error.int getEntityDirtyState(int database, java.lang.String entity)
database
- Value that uniquely identifies the target database on the
remote server.entity
- Name of an entity, which is the name of the DMO implementation
class associated with a table being tracked for uncommitted
changes.DirtyInfo
. Zero return indicates entity is not
dirty. Only CHANGE
and DELETE
are
detected, not INSERT
.boolean isDeleted(int database, java.lang.String entity, java.io.Serializable id)
database
- Value that uniquely identifies the target database on the
remote server.entity
- Name of an entity, which is the name of the DMO implementation
class associated with a table being tracked for uncommitted
changes.id
- Primary key of the record to be checked.true
if the specified record has been deleted,
else false
.void delete(int database, java.lang.String entity, java.io.Serializable id, boolean rollback, boolean lock) throws PersistenceException
A record is unmarked when the adding context's current transaction is committed or rolled back.
database
- Value that uniquely identifies the target database on the
remote server.entity
- Name of an entity, which is the name of the DMO implementation
class associated with a table being tracked for uncommitted
changes.id
- Primary key of deleted record.rollback
- If false
, the target record is marked as deleted;
if true
, it is unmarked.lock
- true
to acquire write locks to delete the record;
false
to assume write locks are acquired by
calling code.PersistenceException
- if there was an error deleting the record from the database.Persistable getDirtyDMO(int database, java.lang.String entity, java.io.Serializable id) throws PersistenceException
database
- Value that uniquely identifies the target database on the
remote server.entity
- Name of an entity, which is the name of the DMO implementation
class associated with a table being tracked for uncommitted
changes.id
- Primary key of the record to be retrieved.null
.PersistenceException
- if there is any database error.java.util.List list(int database, java.lang.String hql, java.lang.Object[] params, org.hibernate.type.Type[] types, int maxResults, int startOffset, boolean readOnly) throws PersistenceException
Object
s.
No locking is attempted.
database
- Value that uniquely identifies the target database on the
remote server.hql
- HQL query statement passed to Hibernate. This method makes no
assumptions as to the types of object(s) returned.params
- Substitution values for the query. If none, this should be an
empty array.types
- Hibernate types for the values
array. If none,
this should be an empty array.maxResults
- The maximum number of elements to be returned in the list.
If this value is non-positive, no upper limit is applied.startOffset
- The 0-based offset of the first record to retrieve. If this
value is non-positive, an offset of 0 is used by default.readOnly
- true
to execute the query in read-only mode, else
false
.null
if no result was found.PersistenceException
- if there was an error executing the query.DirtyInfo getDirtyInfo(int database, java.lang.String entity, java.io.Serializable candidateID, java.lang.String index, java.util.List<java.lang.String> statements, java.lang.Object[] params, org.hibernate.type.Type[] types, boolean rowidLookup) throws PersistenceException
If a DirtyInfo
object is returned by this method, it will
contain overriding information, such as a dirty DMO which matched the
search criteria, whether that record was newly inserted, or the fact
that the candidate record found in the primary search has been deleted
or modified in an uncommitted transaction. A null
return
indicates no overriding information was available.
database
- Value that uniquely identifies the target database on the
remote server.entity
- Name of an entity, which is the name of the DMO implementation
class associated with a table being tracked for uncommitted
changes.candidateID
- Primary key ID of DMO, if any, found in the primary database,
which matches the current query criteria.index
- Name of index which governs the ordering of data in the current
query.statements
- One or more HQL statements to be executed against the dirty
database to find a record which matches the current query
criteria. The list is in order of most specific to least
specific search criteria.params
- Query substitution parameters which match placeholders in the
most specific HQL statement.types
- Hibernate data types of the query substitution parameters.rowidLookup
- The predicate of the query does a lookup for ROWID/RECID of the table. In case of
transient records they are accessible without the need of having a full matched
index.null
if no uncommitted change information was available for the
given arguments.PersistenceException
- if there was any database error.void cleanupChanges(int database, java.util.Map<java.lang.String,java.util.Set<java.io.Serializable>> subChanges, java.util.Set<RecordIdentifier> subInserts, java.util.Set<java.lang.String> leakedEntities) throws PersistenceException
subChanges
, and remove from the master set
of uncommitted, inserted records the subset of records represented by
subInserts
.database
- Value that uniquely identifies the target database on the
remote server.subChanges
- Sets of primary keys representing those records to be removed
from uncommitted change tracking, mapped by entity name.subInserts
- A set of identifiers of those records to be removed from the
master set of uncommitted inserts.leakedEntities
- Names of DMO types which have had their uncommitted updates
"leaked" to other sessions via updateSnapshots(int,
String, Persistable[])
.PersistenceException
- if there is any database error.void cleanupDeletes(int database, java.util.Map<java.lang.String,java.util.Set<java.io.Serializable>> subDeletes)
subDeletes
.database
- Value that uniquely identifies the target database on the
remote server.subDeletes
- Sets of primary keys representing those records to be removed
from uncommitted delete tracking, mapped by entity name.