Class TxDatabaseAdapter
- java.lang.Object
-
- org.projectnessie.versioned.persist.adapter.spi.AbstractDatabaseAdapter<ConnectionWrapper,TxDatabaseAdapterConfig>
-
- org.projectnessie.versioned.persist.tx.TxDatabaseAdapter
-
- All Implemented Interfaces:
org.projectnessie.versioned.persist.adapter.DatabaseAdapter
- Direct Known Subclasses:
H2DatabaseAdapter,PostgresDatabaseAdapter
public abstract class TxDatabaseAdapter extends org.projectnessie.versioned.persist.adapter.spi.AbstractDatabaseAdapter<ConnectionWrapper,TxDatabaseAdapterConfig>
Transactional/relationalAbstractDatabaseAdapterimplementation using JDBC primitives.Concrete implementations must at least provide the concrete column types and, if necessary, provide the implementation to check for constraint-violations.
-
-
Nested Class Summary
Nested Classes Modifier and Type Class Description static interfaceTxDatabaseAdapter.LoopOpprotected static classTxDatabaseAdapter.NessieSqlDataTypeDefines the types of Nessie data types used to map to SQL datatypes viadatabaseSqlFormatParameters().-
Nested classes/interfaces inherited from class org.projectnessie.versioned.persist.adapter.spi.AbstractDatabaseAdapter
org.projectnessie.versioned.persist.adapter.spi.AbstractDatabaseAdapter.CommonAncestorState, org.projectnessie.versioned.persist.adapter.spi.AbstractDatabaseAdapter.ConflictingKeyCheckResult
-
-
Field Summary
Fields Modifier and Type Field Description protected static intCONSTRAINT_VIOLATION_SQL_CODEH2 integrity constraint violation.protected static java.lang.StringCONSTRAINT_VIOLATION_SQL_STATEPostgres & Cockroach integrity constraint violation.protected static java.lang.StringDEADLOCK_SQL_STATE_POSTGRESDeadlock error, returned by Postgres.protected static java.lang.StringREF_TYPE_BRANCHValue forSqlStatements.TABLE_NAMED_REFERENCES.ref_typefor a branch.protected static java.lang.StringREF_TYPE_TAGValue forSqlStatements.TABLE_NAMED_REFERENCES.ref_typefor a tag.protected static java.lang.StringRETRY_SQL_STATE_COCKROACHCockroach "retry, write too old" * error, see Cockroach's Transaction Retry Error Reference, and Postgres may return a "deadlock" error.
-
Constructor Summary
Constructors Constructor Description TxDatabaseAdapter(TxDatabaseAdapterConfig config, TxConnectionProvider<?> db, org.projectnessie.versioned.persist.adapter.events.AdapterEventConsumer eventConsumer)
-
Method Summary
All Methods Static Methods Instance Methods Abstract Methods Concrete Methods Modifier and Type Method Description protected java.util.Map<java.lang.String,java.util.List<java.lang.String>>allCreateTableDDL()Provides a map of table name to create-table-DDL.voidassertCleanStateForTests()voidassign(org.projectnessie.versioned.NamedRef assignee, java.util.Optional<org.projectnessie.versioned.Hash> expectedHead, org.projectnessie.versioned.Hash assignTo)protected booleanbatchDDL()Whether this implementation shall use bates for DDL operations to create tables.ConnectionWrapperborrowConnection()protected booleancheckNamedRefExistence(ConnectionWrapper c, java.lang.String refName)Similar tofetchNamedRefHead(ConnectionWrapper, NamedRef), but just checks for existence.protected booleancheckNamedRefExistence(ConnectionWrapper c, org.projectnessie.versioned.NamedRef ref)Similar tofetchNamedRefHead(ConnectionWrapper, NamedRef), but just checks for existence.org.projectnessie.versioned.Hashcommit(org.projectnessie.versioned.persist.adapter.CommitParams commitParams)java.util.stream.Stream<org.projectnessie.versioned.persist.adapter.CommitLogEntry>commitLog(org.projectnessie.versioned.Hash offset)booleanconsistentPutAttachment(org.projectnessie.versioned.ContentAttachment attachment, java.util.Optional<java.lang.String> expectedVersion)org.projectnessie.versioned.Hashcreate(org.projectnessie.versioned.NamedRef ref, org.projectnessie.versioned.Hash target)protected abstract java.util.Map<TxDatabaseAdapter.NessieSqlDataType,java.lang.String>databaseSqlFormatParameters()Get database-specific 'strings' like column definitions for 'BLOB' column types.voiddelete(org.projectnessie.versioned.NamedRef reference, java.util.Optional<org.projectnessie.versioned.Hash> expectedHead)voiddeleteAttachments(java.util.stream.Stream<org.projectnessie.versioned.ContentAttachmentKey> keys)java.util.stream.Stream<org.projectnessie.versioned.persist.adapter.Difference>diff(org.projectnessie.versioned.Hash from, org.projectnessie.versioned.Hash to, org.projectnessie.versioned.persist.adapter.KeyFilterPredicate keyFilter)protected org.projectnessie.versioned.persist.adapter.CommitLogEntrydoFetchFromCommitLog(ConnectionWrapper c, org.projectnessie.versioned.Hash hash)protected org.projectnessie.versioned.persist.adapter.RefLogdoFetchFromRefLog(ConnectionWrapper connection, org.projectnessie.versioned.Hash refLogId)protected java.util.Map<org.projectnessie.versioned.persist.adapter.ContentId,com.google.protobuf.ByteString>doFetchGlobalStates(ConnectionWrapper conn, java.util.Set<org.projectnessie.versioned.persist.adapter.ContentId> contentIds)protected java.util.stream.Stream<org.projectnessie.versioned.persist.adapter.KeyListEntity>doFetchKeyLists(ConnectionWrapper c, java.util.List<org.projectnessie.versioned.Hash> keyListsIds)protected java.util.List<org.projectnessie.versioned.persist.adapter.CommitLogEntry>doFetchMultipleFromCommitLog(ConnectionWrapper c, java.util.List<org.projectnessie.versioned.Hash> hashes)protected java.util.List<org.projectnessie.versioned.persist.adapter.RefLog>doFetchPageFromRefLog(ConnectionWrapper connection, java.util.List<org.projectnessie.versioned.Hash> hashes)protected java.util.stream.Stream<org.projectnessie.versioned.persist.adapter.CommitLogEntry>doScanAllCommitLogEntries(ConnectionWrapper c)protected voiddoUpdateMultipleCommits(ConnectionWrapper c, java.util.List<org.projectnessie.versioned.persist.adapter.CommitLogEntry> entries)protected voiddoWriteIndividualCommit(ConnectionWrapper c, org.projectnessie.versioned.persist.adapter.CommitLogEntry entry)protected voiddoWriteKeyListEntities(ConnectionWrapper c, java.util.List<org.projectnessie.versioned.persist.adapter.KeyListEntity> newKeyListEntities)protected voiddoWriteMultipleCommits(ConnectionWrapper c, java.util.List<org.projectnessie.versioned.persist.adapter.CommitLogEntry> entries)protected intentitySize(org.projectnessie.versioned.persist.adapter.CommitLogEntry entry)protected intentitySize(org.projectnessie.versioned.persist.adapter.KeyListEntry entry)voideraseRepo()protected org.projectnessie.versioned.ReferenceInfo<com.google.protobuf.ByteString>fetchNamedRef(ConnectionWrapper c, java.lang.String ref)protected org.projectnessie.versioned.HashfetchNamedRefHead(ConnectionWrapper c, org.projectnessie.versioned.NamedRef ref)Retrieves the current HEAD for a reference, throws aReferenceNotFoundException, it the reference does not exist.protected java.util.stream.Stream<org.projectnessie.versioned.ReferenceInfo<com.google.protobuf.ByteString>>fetchNamedRefs(ConnectionWrapper conn)org.projectnessie.versioned.persist.adapter.RepoDescriptionfetchRepositoryDescription()java.util.stream.Stream<org.projectnessie.versioned.ContentAttachmentKey>getAttachmentKeys(java.lang.String contentId)protected org.projectnessie.versioned.persist.tx.RefLogHeadgetRefLogHead(ConnectionWrapper conn)java.util.Optional<org.projectnessie.versioned.persist.adapter.ContentIdAndBytes>globalContent(org.projectnessie.versioned.persist.adapter.ContentId contentId)protected org.projectnessie.versioned.HashhashOnRef(ConnectionWrapper conn, org.projectnessie.versioned.NamedRef reference, java.util.Optional<org.projectnessie.versioned.Hash> hashOnRef)Convenience forhashOnRef(conn, ref, fetchNamedRefHead(conn, ref.getReference())).org.projectnessie.versioned.HashhashOnReference(org.projectnessie.versioned.NamedRef namedReference, java.util.Optional<org.projectnessie.versioned.Hash> hashOnReference)voidinitializeRepo(java.lang.String defaultBranchName)protected voidinsertNewReference(ConnectionWrapper conn, org.projectnessie.versioned.NamedRef ref, org.projectnessie.versioned.Hash hash)protected java.lang.StringinsertOnConflictDoNothing(java.lang.String insertSql)Some RDBMS' just return an error when an INSERT/UPDATE/DELETE violates a constraint, like a primary key, but other RDBMS' like PostgreSQL do return an error and mark the whole transaction as failed.protected voidinsertRefLogHead(org.projectnessie.versioned.persist.serialize.AdapterTypes.RefLogEntry newRefLog, ConnectionWrapper conn)protected booleanisIntegrityConstraintViolation(java.lang.Throwable e)Check whether the givenThrowablerepresents an exception that indicates an integrity-constraint-violation.protected booleanisRetryTransaction(java.sql.SQLException e)Check whether theSQLExceptionindicates a "retry hint".java.util.stream.Stream<org.projectnessie.versioned.persist.adapter.KeyListEntry>keys(org.projectnessie.versioned.Hash commit, org.projectnessie.versioned.persist.adapter.KeyFilterPredicate keyFilter)java.util.stream.Stream<org.projectnessie.versioned.ContentAttachment>mapToAttachment(java.util.stream.Stream<org.projectnessie.versioned.ContentAttachmentKey> keys)org.projectnessie.versioned.MergeResult<org.projectnessie.versioned.persist.adapter.CommitLogEntry>merge(org.projectnessie.versioned.persist.adapter.MergeParams mergeParams)protected booleanmetadataUpperCase()Whether the database/JDBC-driver require schema-metadata-queries require upper-case names.org.projectnessie.versioned.ReferenceInfo<com.google.protobuf.ByteString>namedRef(java.lang.String ref, org.projectnessie.versioned.GetNamedRefsParams params)protected static org.projectnessie.versioned.NamedRefnamedRefFromRow(java.lang.String type, java.lang.String ref)java.util.stream.Stream<org.projectnessie.versioned.ReferenceInfo<com.google.protobuf.ByteString>>namedRefs(org.projectnessie.versioned.GetNamedRefsParams params)protected java.sql.ConnectionnewConnection()protected java.sql.SQLExceptionnewIntegrityConstraintViolationException()Returns an exception that indicates an integrity-constraint-violation.protected org.projectnessie.versioned.HashopLoop(java.lang.String opName, org.projectnessie.versioned.NamedRef namedReference, boolean createRef, TxDatabaseAdapter.LoopOp loopOp, java.util.function.Supplier<java.lang.String> conflictErrorMessage, java.util.function.Supplier<java.lang.String> retryErrorMessage)This is the actual CAS-ish-loop, which applies an operation onto a named-ref.protected voidpersistAttachments(ConnectionWrapper connection, java.util.stream.Stream<org.projectnessie.versioned.ContentAttachment> attachments)voidputAttachments(java.util.stream.Stream<org.projectnessie.versioned.ContentAttachment> attachments)protected java.util.Spliterator<org.projectnessie.versioned.persist.adapter.RefLog>readRefLog(ConnectionWrapper ctx, org.projectnessie.versioned.Hash initialHash)protected static java.lang.StringreferenceTypeDiscriminator(org.projectnessie.versioned.NamedRef ref)java.util.stream.Stream<org.projectnessie.versioned.persist.adapter.RefLog>refLog(org.projectnessie.versioned.Hash offset)java.util.Map<java.lang.String,java.util.Map<java.lang.String,java.lang.String>>repoMaintenance(org.projectnessie.versioned.persist.adapter.RepoMaintenanceParams repoMaintenanceParams)protected java.lang.StringsqlForManyPlaceholders(java.lang.String sql, int num)protected voidthrowIfReferenceConflictException(java.sql.SQLException e, java.util.function.Supplier<java.lang.String> message)Iferepresents anintegrity-constraint-violation, throw aReferenceConflictExceptionusing the message produced bymessage.org.projectnessie.versioned.MergeResult<org.projectnessie.versioned.persist.adapter.CommitLogEntry>transplant(org.projectnessie.versioned.persist.adapter.TransplantParams transplantParams)protected org.projectnessie.versioned.HashtryMoveNamedReference(ConnectionWrapper conn, org.projectnessie.versioned.NamedRef ref, org.projectnessie.versioned.Hash expectedHead, org.projectnessie.versioned.Hash newHead)Updates the HEAD of the givenreffromexpectedHeadtonewHead.voidupdateMultipleCommits(java.util.List<org.projectnessie.versioned.persist.adapter.CommitLogEntry> commitLogEntries)protected voidupdateRefLogHead(org.projectnessie.versioned.persist.serialize.AdapterTypes.RefLogEntry newRefLog, ConnectionWrapper conn)voidupdateRepositoryDescription(java.util.function.Function<org.projectnessie.versioned.persist.adapter.RepoDescription,org.projectnessie.versioned.persist.adapter.RepoDescription> updater)java.util.Map<org.projectnessie.versioned.Key,org.projectnessie.versioned.persist.adapter.ContentAndState>values(org.projectnessie.versioned.Hash commit, java.util.Collection<org.projectnessie.versioned.Key> keys, org.projectnessie.versioned.persist.adapter.KeyFilterPredicate keyFilter)protected <T> voidwriteMany(ConnectionWrapper c, java.lang.String sqlInsert, java.util.List<T> entries, java.util.function.Function<T,java.lang.String> idRetriever, java.util.function.Function<T,byte[]> serializer, boolean update)voidwriteMultipleCommits(java.util.List<org.projectnessie.versioned.persist.adapter.CommitLogEntry> commitLogEntries)-
Methods inherited from class org.projectnessie.versioned.persist.adapter.spi.AbstractDatabaseAdapter
buildDiff, buildIndividualCommit, buildKeyList, checkConflictingKeysForCommit, checkExpectedGlobalStates, checkForModifiedKeysBetweenExpectedAndCurrentCommit, commitAttempt, copyCommits, fetchCommitLogEntries, fetchFromCommitLog, fetchFromRefLog, fetchGlobalStates, fetchKeyLists, fetchPageFromRefLog, fetchValues, findCommonAncestor, findCommonAncestor, getConfig, getEventConsumer, hashOnRef, hashOnRef, hasKeyCollisions, individualCommitHash, keysForCommitEntry, keysForCommitEntry, logFetcher, logFetcherWithPage, maxEntitySize, mergeAttempt, mergeTransplantCommon, namedReferenceWithCommitMeta, namedRefsAnyRetrieves, namedRefsFilterAndEnhance, namedRefsMaybeFilter, namedRefsRequiresBaseReference, namedRefsRequiresBaseReference, namedRefsRetrieveOptionsForReference, namedRefsRetrieveOptionsForReference, namedRefsWithDefaultBranchRelatedInfo, noAncestorHash, readCommitLog, readCommitLogHashes, readCommitLogHashesStream, readCommitLogStream, readCommitLogStream, readRefLogStream, rebuildKeyList, repositoryEvent, scanAllCommitLogEntries, squashCommits, transplantAttempt, tryLoopStateCompletion, validateHashExists, writeIndividualCommit, writeKeyListEntities, writeMultipleCommits
-
-
-
-
Field Detail
-
REF_TYPE_BRANCH
protected static final java.lang.String REF_TYPE_BRANCH
Value forSqlStatements.TABLE_NAMED_REFERENCES.ref_typefor a branch.- See Also:
- Constant Field Values
-
REF_TYPE_TAG
protected static final java.lang.String REF_TYPE_TAG
Value forSqlStatements.TABLE_NAMED_REFERENCES.ref_typefor a tag.- See Also:
- Constant Field Values
-
DEADLOCK_SQL_STATE_POSTGRES
protected static final java.lang.String DEADLOCK_SQL_STATE_POSTGRES
Deadlock error, returned by Postgres.- See Also:
- Constant Field Values
-
RETRY_SQL_STATE_COCKROACH
protected static final java.lang.String RETRY_SQL_STATE_COCKROACH
Cockroach "retry, write too old" * error, see Cockroach's Transaction Retry Error Reference, and Postgres may return a "deadlock" error.- See Also:
- Constant Field Values
-
CONSTRAINT_VIOLATION_SQL_STATE
protected static final java.lang.String CONSTRAINT_VIOLATION_SQL_STATE
Postgres & Cockroach integrity constraint violation.- See Also:
- Constant Field Values
-
CONSTRAINT_VIOLATION_SQL_CODE
protected static final int CONSTRAINT_VIOLATION_SQL_CODE
H2 integrity constraint violation.- See Also:
- Constant Field Values
-
-
Constructor Detail
-
TxDatabaseAdapter
public TxDatabaseAdapter(TxDatabaseAdapterConfig config, TxConnectionProvider<?> db, org.projectnessie.versioned.persist.adapter.events.AdapterEventConsumer eventConsumer)
-
-
Method Detail
-
hashOnReference
public org.projectnessie.versioned.Hash hashOnReference(org.projectnessie.versioned.NamedRef namedReference, java.util.Optional<org.projectnessie.versioned.Hash> hashOnReference) throws org.projectnessie.versioned.ReferenceNotFoundException- Throws:
org.projectnessie.versioned.ReferenceNotFoundException
-
values
public java.util.Map<org.projectnessie.versioned.Key,org.projectnessie.versioned.persist.adapter.ContentAndState> values(org.projectnessie.versioned.Hash commit, java.util.Collection<org.projectnessie.versioned.Key> keys, org.projectnessie.versioned.persist.adapter.KeyFilterPredicate keyFilter) throws org.projectnessie.versioned.ReferenceNotFoundException- Throws:
org.projectnessie.versioned.ReferenceNotFoundException
-
commitLog
@MustBeClosed public java.util.stream.Stream<org.projectnessie.versioned.persist.adapter.CommitLogEntry> commitLog(org.projectnessie.versioned.Hash offset) throws org.projectnessie.versioned.ReferenceNotFoundException- Throws:
org.projectnessie.versioned.ReferenceNotFoundException
-
namedRef
public org.projectnessie.versioned.ReferenceInfo<com.google.protobuf.ByteString> namedRef(java.lang.String ref, org.projectnessie.versioned.GetNamedRefsParams params) throws org.projectnessie.versioned.ReferenceNotFoundException- Throws:
org.projectnessie.versioned.ReferenceNotFoundException
-
namedRefs
@MustBeClosed public java.util.stream.Stream<org.projectnessie.versioned.ReferenceInfo<com.google.protobuf.ByteString>> namedRefs(org.projectnessie.versioned.GetNamedRefsParams params) throws org.projectnessie.versioned.ReferenceNotFoundException- Throws:
org.projectnessie.versioned.ReferenceNotFoundException
-
keys
@MustBeClosed public java.util.stream.Stream<org.projectnessie.versioned.persist.adapter.KeyListEntry> keys(org.projectnessie.versioned.Hash commit, org.projectnessie.versioned.persist.adapter.KeyFilterPredicate keyFilter) throws org.projectnessie.versioned.ReferenceNotFoundException- Throws:
org.projectnessie.versioned.ReferenceNotFoundException
-
merge
public org.projectnessie.versioned.MergeResult<org.projectnessie.versioned.persist.adapter.CommitLogEntry> merge(org.projectnessie.versioned.persist.adapter.MergeParams mergeParams) throws org.projectnessie.versioned.ReferenceNotFoundException, org.projectnessie.versioned.ReferenceConflictException- Throws:
org.projectnessie.versioned.ReferenceNotFoundExceptionorg.projectnessie.versioned.ReferenceConflictException
-
transplant
public org.projectnessie.versioned.MergeResult<org.projectnessie.versioned.persist.adapter.CommitLogEntry> transplant(org.projectnessie.versioned.persist.adapter.TransplantParams transplantParams) throws org.projectnessie.versioned.ReferenceNotFoundException, org.projectnessie.versioned.ReferenceConflictException- Throws:
org.projectnessie.versioned.ReferenceNotFoundExceptionorg.projectnessie.versioned.ReferenceConflictException
-
commit
public org.projectnessie.versioned.Hash commit(org.projectnessie.versioned.persist.adapter.CommitParams commitParams) throws org.projectnessie.versioned.ReferenceConflictException, org.projectnessie.versioned.ReferenceNotFoundException- Throws:
org.projectnessie.versioned.ReferenceConflictExceptionorg.projectnessie.versioned.ReferenceNotFoundException
-
create
public org.projectnessie.versioned.Hash create(org.projectnessie.versioned.NamedRef ref, org.projectnessie.versioned.Hash target) throws org.projectnessie.versioned.ReferenceAlreadyExistsException, org.projectnessie.versioned.ReferenceNotFoundException- Throws:
org.projectnessie.versioned.ReferenceAlreadyExistsExceptionorg.projectnessie.versioned.ReferenceNotFoundException
-
delete
public void delete(org.projectnessie.versioned.NamedRef reference, java.util.Optional<org.projectnessie.versioned.Hash> expectedHead) throws org.projectnessie.versioned.ReferenceNotFoundException, org.projectnessie.versioned.ReferenceConflictException- Throws:
org.projectnessie.versioned.ReferenceNotFoundExceptionorg.projectnessie.versioned.ReferenceConflictException
-
assign
public void assign(org.projectnessie.versioned.NamedRef assignee, java.util.Optional<org.projectnessie.versioned.Hash> expectedHead, org.projectnessie.versioned.Hash assignTo) throws org.projectnessie.versioned.ReferenceNotFoundException, org.projectnessie.versioned.ReferenceConflictException- Throws:
org.projectnessie.versioned.ReferenceNotFoundExceptionorg.projectnessie.versioned.ReferenceConflictException
-
diff
@MustBeClosed public java.util.stream.Stream<org.projectnessie.versioned.persist.adapter.Difference> diff(org.projectnessie.versioned.Hash from, org.projectnessie.versioned.Hash to, org.projectnessie.versioned.persist.adapter.KeyFilterPredicate keyFilter) throws org.projectnessie.versioned.ReferenceNotFoundException- Throws:
org.projectnessie.versioned.ReferenceNotFoundException
-
initializeRepo
public void initializeRepo(java.lang.String defaultBranchName)
-
eraseRepo
public void eraseRepo()
-
globalContent
public java.util.Optional<org.projectnessie.versioned.persist.adapter.ContentIdAndBytes> globalContent(org.projectnessie.versioned.persist.adapter.ContentId contentId)
-
refLog
@MustBeClosed public java.util.stream.Stream<org.projectnessie.versioned.persist.adapter.RefLog> refLog(org.projectnessie.versioned.Hash offset) throws org.projectnessie.versioned.RefLogNotFoundException- Throws:
org.projectnessie.versioned.RefLogNotFoundException
-
repoMaintenance
public java.util.Map<java.lang.String,java.util.Map<java.lang.String,java.lang.String>> repoMaintenance(org.projectnessie.versioned.persist.adapter.RepoMaintenanceParams repoMaintenanceParams)
-
assertCleanStateForTests
public void assertCleanStateForTests()
-
writeMultipleCommits
public void writeMultipleCommits(java.util.List<org.projectnessie.versioned.persist.adapter.CommitLogEntry> commitLogEntries) throws org.projectnessie.versioned.ReferenceConflictException- Throws:
org.projectnessie.versioned.ReferenceConflictException
-
updateMultipleCommits
public void updateMultipleCommits(java.util.List<org.projectnessie.versioned.persist.adapter.CommitLogEntry> commitLogEntries) throws org.projectnessie.versioned.ReferenceNotFoundException- Throws:
org.projectnessie.versioned.ReferenceNotFoundException
-
hashOnRef
protected org.projectnessie.versioned.Hash hashOnRef(ConnectionWrapper conn, org.projectnessie.versioned.NamedRef reference, java.util.Optional<org.projectnessie.versioned.Hash> hashOnRef) throws org.projectnessie.versioned.ReferenceNotFoundException
Convenience forhashOnRef(conn, ref, fetchNamedRefHead(conn, ref.getReference())).- Throws:
org.projectnessie.versioned.ReferenceNotFoundException
-
entitySize
protected int entitySize(org.projectnessie.versioned.persist.adapter.CommitLogEntry entry)
- Specified by:
entitySizein classorg.projectnessie.versioned.persist.adapter.spi.AbstractDatabaseAdapter<ConnectionWrapper,TxDatabaseAdapterConfig>
-
entitySize
protected int entitySize(org.projectnessie.versioned.persist.adapter.KeyListEntry entry)
- Specified by:
entitySizein classorg.projectnessie.versioned.persist.adapter.spi.AbstractDatabaseAdapter<ConnectionWrapper,TxDatabaseAdapterConfig>
-
borrowConnection
public ConnectionWrapper borrowConnection()
- Specified by:
borrowConnectionin classorg.projectnessie.versioned.persist.adapter.spi.AbstractDatabaseAdapter<ConnectionWrapper,TxDatabaseAdapterConfig>
-
newConnection
protected java.sql.Connection newConnection()
-
opLoop
protected org.projectnessie.versioned.Hash opLoop(java.lang.String opName, org.projectnessie.versioned.NamedRef namedReference, boolean createRef, TxDatabaseAdapter.LoopOp loopOp, java.util.function.Supplier<java.lang.String> conflictErrorMessage, java.util.function.Supplier<java.lang.String> retryErrorMessage) throws org.projectnessie.versioned.VersionStoreExceptionThis is the actual CAS-ish-loop, which applies an operation onto a named-ref.Each CAS-loop-iteration fetches the current HEAD of the named reference and calls
TxDatabaseAdapter.LoopOp.apply(ConnectionWrapper, Hash). Ifapply()throws aRetryTransactionException(seeisRetryTransaction(SQLException)), the current JDBC transaction is rolled back and the next loop-iteration starts, unless the retry-policy allows no more retries, in which case aReferenceRetryFailureExceptionwith the message fromretryErrorMessageis thrown. If the thrown exception is aisIntegrityConstraintViolation(Throwable), the exception is re-thrown as aReferenceConflictExceptionwith an appropriate message from theconflictErrorMessagesupplier.If
TxDatabaseAdapter.LoopOp.apply(ConnectionWrapper, Hash)completes normally and returns a non-nullhash, the JDBC transaction is committed and the hash returned from this function. Ifapply()returnsnull, the operation is retried, unless the retry-policy allows no more retries, in which * case aReferenceRetryFailureExceptionwith the message fromretryErrorMessage* is thrown.Uses
TryLoopStatefor retry handling.- Parameters:
namedReference- the named reference on which the Nessie operation workscreateRef- flag, whether this ia a "create-named-reference" operation, which skips the retrieval of the current HEADloopOp- the implementation of the Nessie operationconflictErrorMessage- message producer to represent an unresolvable conflict in the dataretryErrorMessage- message producer to represent that no more retries will happen- Throws:
org.projectnessie.versioned.VersionStoreException- See Also:
TxDatabaseAdapter.LoopOp.apply(ConnectionWrapper, Hash)
-
fetchNamedRefs
@MustBeClosed protected java.util.stream.Stream<org.projectnessie.versioned.ReferenceInfo<com.google.protobuf.ByteString>> fetchNamedRefs(ConnectionWrapper conn)
-
checkNamedRefExistence
protected boolean checkNamedRefExistence(ConnectionWrapper c, org.projectnessie.versioned.NamedRef ref)
Similar tofetchNamedRefHead(ConnectionWrapper, NamedRef), but just checks for existence.
-
checkNamedRefExistence
protected boolean checkNamedRefExistence(ConnectionWrapper c, java.lang.String refName)
Similar tofetchNamedRefHead(ConnectionWrapper, NamedRef), but just checks for existence.
-
fetchNamedRefHead
protected org.projectnessie.versioned.Hash fetchNamedRefHead(ConnectionWrapper c, org.projectnessie.versioned.NamedRef ref) throws org.projectnessie.versioned.ReferenceNotFoundException
Retrieves the current HEAD for a reference, throws aReferenceNotFoundException, it the reference does not exist.- Throws:
org.projectnessie.versioned.ReferenceNotFoundException
-
fetchNamedRef
protected org.projectnessie.versioned.ReferenceInfo<com.google.protobuf.ByteString> fetchNamedRef(ConnectionWrapper c, java.lang.String ref) throws org.projectnessie.versioned.ReferenceNotFoundException
- Throws:
org.projectnessie.versioned.ReferenceNotFoundException
-
namedRefFromRow
protected static org.projectnessie.versioned.NamedRef namedRefFromRow(java.lang.String type, java.lang.String ref)
-
insertNewReference
protected void insertNewReference(ConnectionWrapper conn, org.projectnessie.versioned.NamedRef ref, org.projectnessie.versioned.Hash hash) throws org.projectnessie.versioned.ReferenceAlreadyExistsException, java.sql.SQLException
- Throws:
org.projectnessie.versioned.ReferenceAlreadyExistsExceptionjava.sql.SQLException
-
referenceTypeDiscriminator
protected static java.lang.String referenceTypeDiscriminator(org.projectnessie.versioned.NamedRef ref)
-
sqlForManyPlaceholders
protected java.lang.String sqlForManyPlaceholders(java.lang.String sql, int num)
-
doFetchGlobalStates
protected java.util.Map<org.projectnessie.versioned.persist.adapter.ContentId,com.google.protobuf.ByteString> doFetchGlobalStates(ConnectionWrapper conn, java.util.Set<org.projectnessie.versioned.persist.adapter.ContentId> contentIds)
- Specified by:
doFetchGlobalStatesin classorg.projectnessie.versioned.persist.adapter.spi.AbstractDatabaseAdapter<ConnectionWrapper,TxDatabaseAdapterConfig>
-
doScanAllCommitLogEntries
protected java.util.stream.Stream<org.projectnessie.versioned.persist.adapter.CommitLogEntry> doScanAllCommitLogEntries(ConnectionWrapper c)
- Specified by:
doScanAllCommitLogEntriesin classorg.projectnessie.versioned.persist.adapter.spi.AbstractDatabaseAdapter<ConnectionWrapper,TxDatabaseAdapterConfig>
-
doFetchFromCommitLog
protected org.projectnessie.versioned.persist.adapter.CommitLogEntry doFetchFromCommitLog(ConnectionWrapper c, org.projectnessie.versioned.Hash hash)
- Specified by:
doFetchFromCommitLogin classorg.projectnessie.versioned.persist.adapter.spi.AbstractDatabaseAdapter<ConnectionWrapper,TxDatabaseAdapterConfig>
-
doFetchMultipleFromCommitLog
protected java.util.List<org.projectnessie.versioned.persist.adapter.CommitLogEntry> doFetchMultipleFromCommitLog(ConnectionWrapper c, java.util.List<org.projectnessie.versioned.Hash> hashes)
- Specified by:
doFetchMultipleFromCommitLogin classorg.projectnessie.versioned.persist.adapter.spi.AbstractDatabaseAdapter<ConnectionWrapper,TxDatabaseAdapterConfig>
-
doWriteIndividualCommit
protected void doWriteIndividualCommit(ConnectionWrapper c, org.projectnessie.versioned.persist.adapter.CommitLogEntry entry) throws org.projectnessie.versioned.ReferenceConflictException
- Specified by:
doWriteIndividualCommitin classorg.projectnessie.versioned.persist.adapter.spi.AbstractDatabaseAdapter<ConnectionWrapper,TxDatabaseAdapterConfig>- Throws:
org.projectnessie.versioned.ReferenceConflictException
-
doWriteMultipleCommits
protected void doWriteMultipleCommits(ConnectionWrapper c, java.util.List<org.projectnessie.versioned.persist.adapter.CommitLogEntry> entries) throws org.projectnessie.versioned.ReferenceConflictException
- Specified by:
doWriteMultipleCommitsin classorg.projectnessie.versioned.persist.adapter.spi.AbstractDatabaseAdapter<ConnectionWrapper,TxDatabaseAdapterConfig>- Throws:
org.projectnessie.versioned.ReferenceConflictException
-
doUpdateMultipleCommits
protected void doUpdateMultipleCommits(ConnectionWrapper c, java.util.List<org.projectnessie.versioned.persist.adapter.CommitLogEntry> entries) throws org.projectnessie.versioned.ReferenceNotFoundException
- Specified by:
doUpdateMultipleCommitsin classorg.projectnessie.versioned.persist.adapter.spi.AbstractDatabaseAdapter<ConnectionWrapper,TxDatabaseAdapterConfig>- Throws:
org.projectnessie.versioned.ReferenceNotFoundException
-
doWriteKeyListEntities
protected void doWriteKeyListEntities(ConnectionWrapper c, java.util.List<org.projectnessie.versioned.persist.adapter.KeyListEntity> newKeyListEntities)
- Specified by:
doWriteKeyListEntitiesin classorg.projectnessie.versioned.persist.adapter.spi.AbstractDatabaseAdapter<ConnectionWrapper,TxDatabaseAdapterConfig>
-
writeMany
protected <T> void writeMany(ConnectionWrapper c, java.lang.String sqlInsert, java.util.List<T> entries, java.util.function.Function<T,java.lang.String> idRetriever, java.util.function.Function<T,byte[]> serializer, boolean update) throws org.projectnessie.versioned.ReferenceConflictException, org.projectnessie.versioned.ReferenceNotFoundException
- Throws:
org.projectnessie.versioned.ReferenceConflictExceptionorg.projectnessie.versioned.ReferenceNotFoundException
-
doFetchKeyLists
protected java.util.stream.Stream<org.projectnessie.versioned.persist.adapter.KeyListEntity> doFetchKeyLists(ConnectionWrapper c, java.util.List<org.projectnessie.versioned.Hash> keyListsIds)
- Specified by:
doFetchKeyListsin classorg.projectnessie.versioned.persist.adapter.spi.AbstractDatabaseAdapter<ConnectionWrapper,TxDatabaseAdapterConfig>
-
throwIfReferenceConflictException
protected void throwIfReferenceConflictException(java.sql.SQLException e, java.util.function.Supplier<java.lang.String> message) throws org.projectnessie.versioned.ReferenceConflictExceptionIferepresents anintegrity-constraint-violation, throw aReferenceConflictExceptionusing the message produced bymessage.- Throws:
org.projectnessie.versioned.ReferenceConflictException
-
newIntegrityConstraintViolationException
protected java.sql.SQLException newIntegrityConstraintViolationException()
Returns an exception that indicates an integrity-constraint-violation.
-
isIntegrityConstraintViolation
protected boolean isIntegrityConstraintViolation(java.lang.Throwable e)
Check whether the givenThrowablerepresents an exception that indicates an integrity-constraint-violation.
-
isRetryTransaction
protected boolean isRetryTransaction(java.sql.SQLException e)
Check whether theSQLExceptionindicates a "retry hint". This can happen when there is too much contention on the database rows. Cockroach may throw return a "retry, write too old" error, see Cockroach's Transaction Retry Error Reference, and Postgres may return a "deadlock" error.
-
tryMoveNamedReference
protected org.projectnessie.versioned.Hash tryMoveNamedReference(ConnectionWrapper conn, org.projectnessie.versioned.NamedRef ref, org.projectnessie.versioned.Hash expectedHead, org.projectnessie.versioned.Hash newHead)
Updates the HEAD of the givenreffromexpectedHeadtonewHead. ReturnsnewHead, if successful, andnullif not.
-
fetchRepositoryDescription
public org.projectnessie.versioned.persist.adapter.RepoDescription fetchRepositoryDescription()
-
updateRepositoryDescription
public void updateRepositoryDescription(java.util.function.Function<org.projectnessie.versioned.persist.adapter.RepoDescription,org.projectnessie.versioned.persist.adapter.RepoDescription> updater) throws org.projectnessie.versioned.ReferenceConflictException- Throws:
org.projectnessie.versioned.ReferenceConflictException
-
allCreateTableDDL
protected java.util.Map<java.lang.String,java.util.List<java.lang.String>> allCreateTableDDL()
Provides a map of table name to create-table-DDL. The DDL statements are processed byMessageFormatto inject the parameters returned bydatabaseSqlFormatParameters(), which is for example used to have the "proper", database specific column types.Names of the tables are defined by the constants defined in this class that start with
TABLE_, for exampleSqlStatements.TABLE_COMMIT_LOG.The DDL statements in the returned map's value are formatted using
MessageFormatusing the enum map fromdatabaseSqlFormatParameters(), where the ordinal of theTxDatabaseAdapter.NessieSqlDataTypeenum is used as the index.- See Also:
TxDatabaseAdapter.NessieSqlDataType,()
-
databaseSqlFormatParameters
protected abstract java.util.Map<TxDatabaseAdapter.NessieSqlDataType,java.lang.String> databaseSqlFormatParameters()
Get database-specific 'strings' like column definitions for 'BLOB' column types. Used as placeholders to format the DDL statements fromallCreateTableDDL().
-
insertOnConflictDoNothing
protected java.lang.String insertOnConflictDoNothing(java.lang.String insertSql)
Some RDBMS' just return an error when an INSERT/UPDATE/DELETE violates a constraint, like a primary key, but other RDBMS' like PostgreSQL do return an error and mark the whole transaction as failed. This function allows is meant to be implemented for RDBMS' that do mark the transaction as failed to modify an INSERT SQL statement to neither yield an error nor mark the transaction as failed.
-
metadataUpperCase
protected boolean metadataUpperCase()
Whether the database/JDBC-driver require schema-metadata-queries require upper-case names.
-
batchDDL
protected boolean batchDDL()
Whether this implementation shall use bates for DDL operations to create tables.
-
updateRefLogHead
protected void updateRefLogHead(org.projectnessie.versioned.persist.serialize.AdapterTypes.RefLogEntry newRefLog, ConnectionWrapper conn) throws java.sql.SQLException- Throws:
java.sql.SQLException
-
insertRefLogHead
protected void insertRefLogHead(org.projectnessie.versioned.persist.serialize.AdapterTypes.RefLogEntry newRefLog, ConnectionWrapper conn) throws java.sql.SQLException- Throws:
java.sql.SQLException
-
readRefLog
protected java.util.Spliterator<org.projectnessie.versioned.persist.adapter.RefLog> readRefLog(ConnectionWrapper ctx, org.projectnessie.versioned.Hash initialHash) throws org.projectnessie.versioned.RefLogNotFoundException
- Specified by:
readRefLogin classorg.projectnessie.versioned.persist.adapter.spi.AbstractDatabaseAdapter<ConnectionWrapper,TxDatabaseAdapterConfig>- Throws:
org.projectnessie.versioned.RefLogNotFoundException
-
getRefLogHead
protected org.projectnessie.versioned.persist.tx.RefLogHead getRefLogHead(ConnectionWrapper conn) throws java.sql.SQLException
- Throws:
java.sql.SQLException
-
doFetchFromRefLog
protected org.projectnessie.versioned.persist.adapter.RefLog doFetchFromRefLog(ConnectionWrapper connection, org.projectnessie.versioned.Hash refLogId)
- Specified by:
doFetchFromRefLogin classorg.projectnessie.versioned.persist.adapter.spi.AbstractDatabaseAdapter<ConnectionWrapper,TxDatabaseAdapterConfig>
-
doFetchPageFromRefLog
protected java.util.List<org.projectnessie.versioned.persist.adapter.RefLog> doFetchPageFromRefLog(ConnectionWrapper connection, java.util.List<org.projectnessie.versioned.Hash> hashes)
- Specified by:
doFetchPageFromRefLogin classorg.projectnessie.versioned.persist.adapter.spi.AbstractDatabaseAdapter<ConnectionWrapper,TxDatabaseAdapterConfig>
-
getAttachmentKeys
public java.util.stream.Stream<org.projectnessie.versioned.ContentAttachmentKey> getAttachmentKeys(java.lang.String contentId)
-
mapToAttachment
@MustBeClosed public java.util.stream.Stream<org.projectnessie.versioned.ContentAttachment> mapToAttachment(java.util.stream.Stream<org.projectnessie.versioned.ContentAttachmentKey> keys)
-
putAttachments
public void putAttachments(java.util.stream.Stream<org.projectnessie.versioned.ContentAttachment> attachments)
-
persistAttachments
protected void persistAttachments(ConnectionWrapper connection, java.util.stream.Stream<org.projectnessie.versioned.ContentAttachment> attachments)
- Specified by:
persistAttachmentsin classorg.projectnessie.versioned.persist.adapter.spi.AbstractDatabaseAdapter<ConnectionWrapper,TxDatabaseAdapterConfig>
-
consistentPutAttachment
public boolean consistentPutAttachment(org.projectnessie.versioned.ContentAttachment attachment, java.util.Optional<java.lang.String> expectedVersion)
-
deleteAttachments
public void deleteAttachments(java.util.stream.Stream<org.projectnessie.versioned.ContentAttachmentKey> keys)
-
-