Class WriterBase
- Namespace
- The.SQL.Persistence
- Assembly
- Instagile.dll
public abstract class WriterBase : IVisitor, IDisposable
- Inheritance
-
WriterBase
- Implements
- Derived
- Inherited Members
Constructors
WriterBase(IDatabase, Dictionary<string, EntityTable>, Dictionary<string, AutonumColumn>, TimeSpan, int, ParameterMode, Identity)
public WriterBase(IDatabase db, Dictionary<string, EntityTable> tables, Dictionary<string, AutonumColumn> autonums, TimeSpan versionConflictLeeway, int maximumBatchedQueryCount, ParameterMode parameterMode, Identity writeIdentity)
Parameters
dbIDatabasetablesDictionary<string, EntityTable>autonumsDictionary<string, AutonumColumn>versionConflictLeewayTimeSpanmaximumBatchedQueryCountintparameterModeParameterModewriteIdentityIdentity
Fields
Autonums
protected readonly Dictionary<string, AutonumColumn> Autonums
Field Value
DB
protected readonly ITransaction DB
Field Value
UseParams
protected readonly bool UseParams
Field Value
WriteIdentity
protected readonly Identity WriteIdentity
Field Value
Properties
DML
protected IDMLDialect DML { get; }
Property Value
MaxParamsPerStatement
RDBMS-specific max placeholder count.
protected abstract int MaxParamsPerStatement { get; }
Property Value
MaxRowsPerInsert
RDBMS-specific max VALUES element count.
protected virtual int MaxRowsPerInsert { get; }
Property Value
Persisters
Entity persistence metadata keyed by type name, exposed read-only to derived writers.
protected IReadOnlyDictionary<string, EntityTable> Persisters { get; }
Property Value
Methods
Assert(InvalidatedAssertion)
protected void Assert(InvalidatedAssertion assertion)
Parameters
assertionInvalidatedAssertion
Buffer(BatchedCommand)
protected void Buffer(BatchedCommand query)
Parameters
queryBatchedCommand
BufferInsertCollections(string, string, IReadOnlyList<InsertRelationship>)
Buffers inserts for the supplied relationships as one or more multi-row statements.
protected void BufferInsertCollections(string typeName, string relationshipName, IReadOnlyList<InsertRelationship> rels)
Parameters
typeNamestringrelationshipNamestringrelsIReadOnlyList<InsertRelationship>
Remarks
Each chunk holds at most MaxRowsPerInsert rows and stays within MaxParamsPerStatement parameters.
BufferInsertEntities(string, IReadOnlyList<ColumnsByIndex>)
Buffers inserts for the supplied entities as one or more multi-row statements.
protected void BufferInsertEntities(string typeName, IReadOnlyList<ColumnsByIndex> rows)
Parameters
typeNamestringrowsIReadOnlyList<ColumnsByIndex>
Remarks
Each chunk holds at most MaxRowsPerInsert rows and stays within MaxParamsPerStatement parameters.
BufferInsertReferences(string, string, IReadOnlyList<InsertRelationship>)
Buffers inserts for the supplied reference (non-collection) relationships as chunked multi-row statements that respect the unique-per-source constraint and detect version conflicts.
protected void BufferInsertReferences(string typeName, string relationshipName, IReadOnlyList<InsertRelationship> rels)
Parameters
typeNamestringrelationshipNamestringrelsIReadOnlyList<InsertRelationship>
Remarks
Each chunk emits one conditional multi-row insert (only sources whose slot is still free are written) plus a pre-insert readback of each source's occupant. Because the readback observes state before this insert, a returned occupant means the slot was already taken and our insert was skipped. A skipped source is a version conflict unless it is a change (a DeleteRelationship preceded it) whose slot already holds exactly the target we wanted; re-setting an occupied slot to its current value on a fresh set is treated as a conflict.
BulkInsertEntitiesAsync(string, IReadOnlyList<ColumnsByIndex>, CancellationToken)
Inserts the supplied entities immediately by reusing a parameterised statement.
protected Task BulkInsertEntitiesAsync(string typeName, IReadOnlyList<ColumnsByIndex> fusedOperations, CancellationToken cancellationToken)
Parameters
typeNamestringfusedOperationsIReadOnlyList<ColumnsByIndex>cancellationTokenCancellationToken
Returns
CreateDML(IReadOnlyDictionary<string, EntityTable>, QueryConfig)
protected abstract IDMLDialect CreateDML(IReadOnlyDictionary<string, EntityTable> tables, QueryConfig config)
Parameters
tablesIReadOnlyDictionary<string, EntityTable>configQueryConfig
Returns
CreateParameter(int, Guid)
protected abstract DbParameter CreateParameter(int number, Guid value)
Parameters
Returns
CreateParameter(int, int, object)
protected abstract DbParameter CreateParameter(int number, int type, object value)
Parameters
Returns
CreateParameter(int, string)
protected abstract DbParameter CreateParameter(int number, string value)
Parameters
Returns
CreateParameter(int, ulong)
protected abstract DbParameter CreateParameter(int number, ulong value)
Parameters
Returns
DeferBulkInsertRelationships(string, string, IReadOnlyList<InsertRelationship>, CancellationToken)
Queues a statement-reuse bulk insert of the supplied relationship links, executed after the buffered batch during ExecuteAsync(). Like BulkInsertEntitiesAsync(string, IReadOnlyList<ColumnsByIndex>, CancellationToken) it reuses one parameterised single-row statement across every pair, rather than the multi-row VALUES form used by BufferInsertCollections(string, string, IReadOnlyList<InsertRelationship>) and BufferInsertReferences(string, string, IReadOnlyList<InsertRelationship>).
protected void DeferBulkInsertRelationships(string typeName, string relationshipName, IReadOnlyList<InsertRelationship> rels, CancellationToken cancellationToken)
Parameters
typeNamestringrelationshipNamestringrelsIReadOnlyList<InsertRelationship>cancellationTokenCancellationToken
Remarks
Execution is deferred (not eager like the entity bulk insert) because relationship inserts must occur after any matching DeleteRelationship, which is batched normally. Does not support reference conflict detection.
Dispose()
Performs application-defined tasks associated with freeing, releasing, or resetting unmanaged resources.
public void Dispose()
ExecuteAsync()
public Task<List<InvalidatedAssertion>> ExecuteAsync()
Returns
ExecuteAsync(List<List<BatchedCommand>>)
protected abstract Task ExecuteAsync(List<List<BatchedCommand>> batches)
Parameters
batchesList<List<BatchedCommand>>
Returns
GetParameterValue(AttributeColumn, object?)
protected abstract object GetParameterValue(AttributeColumn c, object? raw)
Parameters
cAttributeColumnrawobject
Returns
Param()
protected int Param()
Returns
ReadDateTime(IDataRecord, int)
protected virtual DateTime ReadDateTime(IDataRecord row, int index)
Parameters
rowIDataRecordindexint
Returns
Visit(AssertEntityVersion)
public void Visit(AssertEntityVersion operation)
Parameters
operationAssertEntityVersion
Visit(DeleteEntity)
public virtual void Visit(DeleteEntity operation)
Parameters
operationDeleteEntity
Visit(DeleteRelationship)
public virtual void Visit(DeleteRelationship operation)
Parameters
operationDeleteRelationship
Visit(InsertEntity)
public virtual void Visit(InsertEntity operation)
Parameters
operationInsertEntity
Visit(InsertRelationship)
public virtual void Visit(InsertRelationship operation)
Parameters
operationInsertRelationship
Visit(UpdateEntity)
public virtual void Visit(UpdateEntity operation)
Parameters
operationUpdateEntity