Class DerbyResourceDAO

  • All Implemented Interfaces:
    FHIRDbDAO, ResourceDAO

    public class DerbyResourceDAO
    extends ResourceDAOImpl
    Data access object for writing FHIR resources to an Apache Derby database.
    • Constructor Detail

      • DerbyResourceDAO

        public DerbyResourceDAO​(java.sql.Connection connection,
                                java.lang.String schemaName,
                                FHIRDbFlavor flavor,
                                FHIRPersistenceJDBCCache cache)
        Public constructor
        Parameters:
        connection -
        schemaName -
        flavor -
        cache -
      • DerbyResourceDAO

        public DerbyResourceDAO​(java.sql.Connection connection,
                                java.lang.String schemaName,
                                FHIRDbFlavor flavor,
                                javax.transaction.TransactionSynchronizationRegistry trxSynchRegistry,
                                FHIRPersistenceJDBCCache cache,
                                ParameterTransactionDataImpl ptdi)
        Derby is not only used for unit tests, but can also be used to provide persistence for a stand-alone full FHIR server.
        Parameters:
        strat - the connection strategy
        trxSynchRegistry -
        cache -
        ptdi -
    • Method Detail

      • storeResource

        public long storeResource​(java.lang.String tablePrefix,
                                  java.util.List<ExtractedParameterValue> parameters,
                                  java.lang.String p_logical_id,
                                  java.io.InputStream p_payload,
                                  java.sql.Timestamp p_last_updated,
                                  boolean p_is_deleted,
                                  java.lang.String p_source_key,
                                  java.lang.Integer p_version,
                                  java.lang.String p_parameterHashB64,
                                  java.sql.Connection conn,
                                  ParameterDAO parameterDao,
                                  java.lang.Integer ifNoneMatch,
                                  java.lang.String resourcePayloadKey,
                                  java.util.concurrent.atomic.AtomicInteger outInteractionStatus,
                                  java.util.concurrent.atomic.AtomicInteger outIfNoneMatchVersion,
                                  java.lang.String[] outCurrentParameterHash)
                           throws java.lang.Exception
        Store the resource in the database, creating a new logical_resource entry if this is the first version of this resource, or creating a new resource entry if this a new version of an existing logical resource. The logic tracks closely the DB2 stored procedure implementation, including locking of the logical_resource and handling concurrency issues using the standard insert-or-update pattern:
           SELECT FOR UPDATE                 -- try and get a write lock
           IF NOT FOUND THEN                 -- doesn't exist, so we don't have a lock
             INSERT new logical resource     -- create the record - if OK, we own the lock
             IF DUPLICATE THEN               -- someone else beat us to the create
               SELECT FOR UPDATE             -- so we need to try again for a write lock
             ...
           ...
         
        This works because we never delete a logical_resource record, and so don't have to deal with concurrency issues caused when deletes are mingled with inserts/updates Note the execution flow aligns very closely with the PostgreSQL stored procedure implementation (fhir-persistence-schema/src/main/resources/postgres/add_any_resource.sql)
        Parameters:
        tablePrefix -
        parameters -
        p_logical_id -
        p_payload -
        p_last_updated -
        p_is_deleted -
        p_source_key -
        p_version -
        p_parameterHashB64 -
        conn -
        parameterDao -
        ifNoneMatch - 0 for conditional create-on-update behavior; otherwise null
        resourcePayloadKey -
        outInteractionStatus -
        outIfNoneMatchVersion -
        Returns:
        the logical_resource_id for the entry we created
        Throws:
        java.lang.Exception
      • getResourceTypeId

        protected java.lang.Integer getResourceTypeId​(java.lang.String resourceTypeName,
                                                      java.sql.Connection conn)
                                               throws java.sql.SQLException
        Read the id for the named type
        Parameters:
        resourceTypeName -
        Returns:
        the database id, or null if the named record is not found
        Throws:
        java.sql.SQLException
      • getOrCreateResourceType

        public int getOrCreateResourceType​(java.lang.String resourceTypeName,
                                           java.sql.Connection conn)
                                    throws java.sql.SQLException
        stored-procedure-less implementation for managing the resource_types table
        Parameters:
        resourceTypeName -
        Throws:
        java.sql.SQLException