Table of Contents

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

db IDatabase
tables Dictionary<string, EntityTable>
autonums Dictionary<string, AutonumColumn>
versionConflictLeeway TimeSpan
maximumBatchedQueryCount int
parameterMode ParameterMode
writeIdentity Identity

Fields

Autonums

protected readonly Dictionary<string, AutonumColumn> Autonums

Field Value

Dictionary<string, AutonumColumn>

DB

protected readonly ITransaction DB

Field Value

ITransaction

UseParams

protected readonly bool UseParams

Field Value

bool

WriteIdentity

protected readonly Identity WriteIdentity

Field Value

Identity

Properties

DML

protected IDMLDialect DML { get; }

Property Value

IDMLDialect

MaxParamsPerStatement

RDBMS-specific max placeholder count.

protected abstract int MaxParamsPerStatement { get; }

Property Value

int

MaxRowsPerInsert

RDBMS-specific max VALUES element count.

protected virtual int MaxRowsPerInsert { get; }

Property Value

int

Persisters

Entity persistence metadata keyed by type name, exposed read-only to derived writers.

protected IReadOnlyDictionary<string, EntityTable> Persisters { get; }

Property Value

IReadOnlyDictionary<string, EntityTable>

Methods

Assert(InvalidatedAssertion)

protected void Assert(InvalidatedAssertion assertion)

Parameters

assertion InvalidatedAssertion

Buffer(BatchedCommand)

protected void Buffer(BatchedCommand query)

Parameters

query BatchedCommand

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

typeName string
relationshipName string
rels IReadOnlyList<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

typeName string
rows IReadOnlyList<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

typeName string
relationshipName string
rels IReadOnlyList<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

typeName string
fusedOperations IReadOnlyList<ColumnsByIndex>
cancellationToken CancellationToken

Returns

Task

CreateDML(IReadOnlyDictionary<string, EntityTable>, QueryConfig)

protected abstract IDMLDialect CreateDML(IReadOnlyDictionary<string, EntityTable> tables, QueryConfig config)

Parameters

tables IReadOnlyDictionary<string, EntityTable>
config QueryConfig

Returns

IDMLDialect

CreateParameter(int, Guid)

protected abstract DbParameter CreateParameter(int number, Guid value)

Parameters

number int
value Guid

Returns

DbParameter

CreateParameter(int, int, object)

protected abstract DbParameter CreateParameter(int number, int type, object value)

Parameters

number int
type int
value object

Returns

DbParameter

CreateParameter(int, string)

protected abstract DbParameter CreateParameter(int number, string value)

Parameters

number int
value string

Returns

DbParameter

CreateParameter(int, ulong)

protected abstract DbParameter CreateParameter(int number, ulong value)

Parameters

number int
value ulong

Returns

DbParameter

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

typeName string
relationshipName string
rels IReadOnlyList<InsertRelationship>
cancellationToken CancellationToken

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

Task<List<InvalidatedAssertion>>

ExecuteAsync(List<List<BatchedCommand>>)

protected abstract Task ExecuteAsync(List<List<BatchedCommand>> batches)

Parameters

batches List<List<BatchedCommand>>

Returns

Task

GetParameterValue(AttributeColumn, object?)

protected abstract object GetParameterValue(AttributeColumn c, object? raw)

Parameters

c AttributeColumn
raw object

Returns

object

Param()

protected int Param()

Returns

int

ReadDateTime(IDataRecord, int)

protected virtual DateTime ReadDateTime(IDataRecord row, int index)

Parameters

row IDataRecord
index int

Returns

DateTime

Visit(AssertEntityVersion)

public void Visit(AssertEntityVersion operation)

Parameters

operation AssertEntityVersion

Visit(DeleteEntity)

public virtual void Visit(DeleteEntity operation)

Parameters

operation DeleteEntity

Visit(DeleteRelationship)

public virtual void Visit(DeleteRelationship operation)

Parameters

operation DeleteRelationship

Visit(InsertEntity)

public virtual void Visit(InsertEntity operation)

Parameters

operation InsertEntity

Visit(InsertRelationship)

public virtual void Visit(InsertRelationship operation)

Parameters

operation InsertRelationship

Visit(UpdateEntity)

public virtual void Visit(UpdateEntity operation)

Parameters

operation UpdateEntity