Class BaseObjectDetailsDatabase

    • Constructor Detail

      • BaseObjectDetailsDatabase

        public BaseObjectDetailsDatabase​(String tableName,
                                         DataSource dataSource,
                                         boolean storeInventory,
                                         long waitTime,
                                         TimeUnit timeUnit,
                                         String lockFailCode)
    • Method Detail

      • setLockWaitTimeout

        protected abstract void setLockWaitTimeout​(Connection connection,
                                                   long waitMillis)
                                            throws SQLException
        Sets the amount of time to wait for a row lock before timing out. Keep in mind that MariaDB actually uses seconds for timeout, make sure that you use at least 1000ms as input to the method and go up in 1 second increments.
        Parameters:
        connection - db connection
        waitMillis - time to wait for the lock in millis
        Throws:
        SQLException - on sql error
      • isConcurrentWriteException

        protected abstract boolean isConcurrentWriteException​(SQLException exception)
        Checks if given exception was thrown because of concurrent write issue or something else. Check is performed by getting the SQL State Code from exception, but since each driver and vendor uses their own codes, or even several codes this check needs to be driver specific. H2 for example throws a "duplicate key" state code, while MariaDB can throw either "deadlock" or "duplicate key" state codes.
        Parameters:
        exception - instance of an SQLException class to check
        Returns:
        true if exception occurred because of concurrent write, false for any other exception
      • selectDetailsQuery

        protected String selectDetailsQuery​(String tableName)
        Constructs the query for selecting object details entries
        Parameters:
        tableName - the name of the object details table
        Returns:
        the query string
      • deleteDetailsQuery

        protected String deleteDetailsQuery​(String tableName)
        Constructs the query for deleting object details entries
        Parameters:
        tableName - the name of the object details table
        Returns:
        the query string
      • rowLockQuery

        protected String rowLockQuery​(String tableName)
        Constructs the query for locking object details entries
        Parameters:
        tableName - the name of the object details table
        Returns:
        the query string
      • updateDetailsQuery

        protected String updateDetailsQuery​(String tableName)
        Constructs the query for updating object details entries
        Parameters:
        tableName - the name of the object details table
        Returns:
        the query string
      • insertDetailsQuery

        protected String insertDetailsQuery​(String tableName)
        Constructs the query for inserting object details entries
        Parameters:
        tableName - the name of the object details table
        Returns:
        the query string
      • selectDigestQuery

        protected String selectDigestQuery​(String tableName)
        Constructs the query for selecting inventory digests
        Parameters:
        tableName - the name of the object details table
        Returns:
        the query string
      • deleteAllQuery

        protected String deleteAllQuery​(String tableName)
        Constructs the query for deleting all object details entries
        Parameters:
        tableName - the name of the object details table
        Returns:
        the query string
      • retrieveObjectDetails

        public OcflObjectDetails retrieveObjectDetails​(String objectId)
        Retrieves ObjectDetails from the database. If no details can be found, null is returned.
        Specified by:
        retrieveObjectDetails in interface ObjectDetailsDatabase
        Parameters:
        objectId - the OCFL object id
        Returns:
        ObjectDetails or null
      • addObjectDetails

        public void addObjectDetails​(Inventory inventory,
                                     String inventoryDigest,
                                     byte[] inventoryBytes)
        Adds ObjectDetails to the database. In the case of a concurrent update, this operation will only fail if the inventory digests are different.
        Specified by:
        addObjectDetails in interface ObjectDetailsDatabase
        Parameters:
        inventory - the object's inventory
        inventoryDigest - the digest of the inventory
        inventoryBytes - the serialized inventory bytes
      • updateObjectDetails

        public void updateObjectDetails​(Inventory inventory,
                                        String inventoryDigest,
                                        Path inventoryFile,
                                        Runnable runnable)
        Updates existing ObjectDetails in the database. The update is executed within a transaction. Before the transaction is committed, the supplied runnable is executed. The transaction is only committed if the runnable completes without exception.
        Specified by:
        updateObjectDetails in interface ObjectDetailsDatabase
        Parameters:
        inventory - the object's inventory
        inventoryDigest - the digest of the inventory
        inventoryFile - the path to the inventory on disk
        runnable - the code to execute within the update transaction
      • deleteObjectDetails

        public void deleteObjectDetails​(String objectId)
        Removes ObjectDetails from the database.
        Specified by:
        deleteObjectDetails in interface ObjectDetailsDatabase
        Parameters:
        objectId - the OCFL object id