Class 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/relational AbstractDatabaseAdapter implementation 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 interface  TxDatabaseAdapter.LoopOp  
      protected static class  TxDatabaseAdapter.NessieSqlDataType
      Defines the types of Nessie data types used to map to SQL datatypes via databaseSqlFormatParameters().
      • 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
    • 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.
      void assertCleanStateForTests()  
      void assign​(org.projectnessie.versioned.NamedRef assignee, java.util.Optional<org.projectnessie.versioned.Hash> expectedHead, org.projectnessie.versioned.Hash assignTo)  
      protected boolean batchDDL()
      Whether this implementation shall use bates for DDL operations to create tables.
      ConnectionWrapper borrowConnection()  
      protected boolean checkNamedRefExistence​(ConnectionWrapper c, java.lang.String refName)
      Similar to fetchNamedRefHead(ConnectionWrapper, NamedRef), but just checks for existence.
      protected boolean checkNamedRefExistence​(ConnectionWrapper c, org.projectnessie.versioned.NamedRef ref)
      Similar to fetchNamedRefHead(ConnectionWrapper, NamedRef), but just checks for existence.
      org.projectnessie.versioned.Hash commit​(org.projectnessie.versioned.persist.adapter.CommitParams commitParams)  
      java.util.stream.Stream<org.projectnessie.versioned.persist.adapter.CommitLogEntry> commitLog​(org.projectnessie.versioned.Hash offset)  
      boolean consistentPutAttachment​(org.projectnessie.versioned.ContentAttachment attachment, java.util.Optional<java.lang.String> expectedVersion)  
      org.projectnessie.versioned.Hash create​(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.
      void delete​(org.projectnessie.versioned.NamedRef reference, java.util.Optional<org.projectnessie.versioned.Hash> expectedHead)  
      void deleteAttachments​(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.CommitLogEntry doFetchFromCommitLog​(ConnectionWrapper c, org.projectnessie.versioned.Hash hash)  
      protected org.projectnessie.versioned.persist.adapter.RefLog doFetchFromRefLog​(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 void doUpdateMultipleCommits​(ConnectionWrapper c, java.util.List<org.projectnessie.versioned.persist.adapter.CommitLogEntry> entries)  
      protected void doWriteIndividualCommit​(ConnectionWrapper c, org.projectnessie.versioned.persist.adapter.CommitLogEntry entry)  
      protected void doWriteKeyListEntities​(ConnectionWrapper c, java.util.List<org.projectnessie.versioned.persist.adapter.KeyListEntity> newKeyListEntities)  
      protected void doWriteMultipleCommits​(ConnectionWrapper c, java.util.List<org.projectnessie.versioned.persist.adapter.CommitLogEntry> entries)  
      protected int entitySize​(org.projectnessie.versioned.persist.adapter.CommitLogEntry entry)  
      protected int entitySize​(org.projectnessie.versioned.persist.adapter.KeyListEntry entry)  
      void eraseRepo()  
      protected org.projectnessie.versioned.ReferenceInfo<com.google.protobuf.ByteString> fetchNamedRef​(ConnectionWrapper c, java.lang.String ref)  
      protected org.projectnessie.versioned.Hash fetchNamedRefHead​(ConnectionWrapper c, org.projectnessie.versioned.NamedRef ref)
      Retrieves the current HEAD for a reference, throws a ReferenceNotFoundException, 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.RepoDescription fetchRepositoryDescription()  
      java.util.stream.Stream<org.projectnessie.versioned.ContentAttachmentKey> getAttachmentKeys​(java.lang.String contentId)  
      protected org.projectnessie.versioned.persist.tx.RefLogHead getRefLogHead​(ConnectionWrapper conn)  
      java.util.Optional<org.projectnessie.versioned.persist.adapter.ContentIdAndBytes> globalContent​(org.projectnessie.versioned.persist.adapter.ContentId contentId)  
      protected org.projectnessie.versioned.Hash hashOnRef​(ConnectionWrapper conn, org.projectnessie.versioned.NamedRef reference, java.util.Optional<org.projectnessie.versioned.Hash> hashOnRef)
      Convenience for hashOnRef(conn, ref, fetchNamedRefHead(conn, ref.getReference())).
      org.projectnessie.versioned.Hash hashOnReference​(org.projectnessie.versioned.NamedRef namedReference, java.util.Optional<org.projectnessie.versioned.Hash> hashOnReference)  
      void initializeRepo​(java.lang.String defaultBranchName)  
      protected void insertNewReference​(ConnectionWrapper conn, org.projectnessie.versioned.NamedRef ref, org.projectnessie.versioned.Hash hash)  
      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.
      protected void insertRefLogHead​(org.projectnessie.versioned.persist.serialize.AdapterTypes.RefLogEntry newRefLog, ConnectionWrapper conn)  
      protected boolean isIntegrityConstraintViolation​(java.lang.Throwable e)
      Check whether the given Throwable represents an exception that indicates an integrity-constraint-violation.
      protected boolean isRetryTransaction​(java.sql.SQLException e)
      Check whether the SQLException indicates 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 boolean metadataUpperCase()
      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.NamedRef namedRefFromRow​(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.Connection newConnection()  
      protected java.sql.SQLException newIntegrityConstraintViolationException()
      Returns an exception that indicates an integrity-constraint-violation.
      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)
      This is the actual CAS-ish-loop, which applies an operation onto a named-ref.
      protected void persistAttachments​(ConnectionWrapper connection, java.util.stream.Stream<org.projectnessie.versioned.ContentAttachment> attachments)  
      void putAttachments​(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.String referenceTypeDiscriminator​(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.String sqlForManyPlaceholders​(java.lang.String sql, int num)  
      protected void throwIfReferenceConflictException​(java.sql.SQLException e, java.util.function.Supplier<java.lang.String> message)
      If e represents an integrity-constraint-violation, throw a ReferenceConflictException using the message produced by message.
      org.projectnessie.versioned.MergeResult<org.projectnessie.versioned.persist.adapter.CommitLogEntry> transplant​(org.projectnessie.versioned.persist.adapter.TransplantParams transplantParams)  
      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 given ref from expectedHead to newHead.
      void updateMultipleCommits​(java.util.List<org.projectnessie.versioned.persist.adapter.CommitLogEntry> commitLogEntries)  
      protected void updateRefLogHead​(org.projectnessie.versioned.persist.serialize.AdapterTypes.RefLogEntry newRefLog, ConnectionWrapper conn)  
      void updateRepositoryDescription​(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> 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)  
      void writeMultipleCommits​(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
      • Methods inherited from class java.lang.Object

        clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait
    • 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.ReferenceNotFoundException
        org.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.ReferenceNotFoundException
        org.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.ReferenceConflictException
        org.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.ReferenceAlreadyExistsException
        org.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.ReferenceNotFoundException
        org.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.ReferenceNotFoundException
        org.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 for hashOnRef(conn, ref, fetchNamedRefHead(conn, ref.getReference())).
        Throws:
        org.projectnessie.versioned.ReferenceNotFoundException
      • entitySize

        protected int entitySize​(org.projectnessie.versioned.persist.adapter.CommitLogEntry entry)
        Specified by:
        entitySize in class org.projectnessie.versioned.persist.adapter.spi.AbstractDatabaseAdapter<ConnectionWrapper,​TxDatabaseAdapterConfig>
      • entitySize

        protected int entitySize​(org.projectnessie.versioned.persist.adapter.KeyListEntry entry)
        Specified by:
        entitySize in class org.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.VersionStoreException
        This 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). If apply() throws a RetryTransactionException (see isRetryTransaction(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 a ReferenceRetryFailureException with the message from retryErrorMessage is thrown. If the thrown exception is a isIntegrityConstraintViolation(Throwable), the exception is re-thrown as a ReferenceConflictException with an appropriate message from the conflictErrorMessage supplier.

        If TxDatabaseAdapter.LoopOp.apply(ConnectionWrapper, Hash) completes normally and returns a non- null hash, the JDBC transaction is committed and the hash returned from this function. If apply() returns null, the operation is retried, unless the retry-policy allows no more retries, in which * case a ReferenceRetryFailureException with the message from retryErrorMessage * is thrown.

        Uses TryLoopState for retry handling.

        Parameters:
        namedReference - the named reference on which the Nessie operation works
        createRef - flag, whether this ia a "create-named-reference" operation, which skips the retrieval of the current HEAD
        loopOp - the implementation of the Nessie operation
        conflictErrorMessage - message producer to represent an unresolvable conflict in the data
        retryErrorMessage - 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)
      • 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 a ReferenceNotFoundException, 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.ReferenceAlreadyExistsException
        java.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:
        doFetchGlobalStates in class org.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:
        doScanAllCommitLogEntries in class org.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:
        doFetchFromCommitLog in class org.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:
        doFetchMultipleFromCommitLog in class org.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:
        doWriteIndividualCommit in class org.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:
        doWriteMultipleCommits in class org.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:
        doUpdateMultipleCommits in class org.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:
        doWriteKeyListEntities in class org.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.ReferenceConflictException
        org.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:
        doFetchKeyLists in class org.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.ReferenceConflictException
        If e represents an integrity-constraint-violation, throw a ReferenceConflictException using the message produced by message.
        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 given Throwable represents an exception that indicates an integrity-constraint-violation.
      • isRetryTransaction

        protected boolean isRetryTransaction​(java.sql.SQLException e)
        Check whether the SQLException indicates 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 given ref from expectedHead to newHead. Returns newHead, if successful, and null if 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
      • 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:
        readRefLog in class org.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:
        doFetchFromRefLog in class org.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:
        doFetchPageFromRefLog in class org.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:
        persistAttachments in class org.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)