Class DerbyResourceDAO

  • All Implemented Interfaces:
    FHIRDbDAO, ResourceDAO

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

      • insert

        public Resource insert​(Resource resource,
                               List<ExtractedParameterValue> parameters,
                               String parameterHashB64,
                               ParameterDAO parameterDao,
                               Integer ifNoneMatch)
                        throws com.ibm.fhir.persistence.exception.FHIRPersistenceException
        Description copied from interface: ResourceDAO
        Inserts the passed Resource DTO and its associated search parameters to the appropriate FHIR resource tables. After insert, the generated primary key is acquired and set in the Resource object.
        Specified by:
        insert in interface ResourceDAO
        Overrides:
        insert in class ResourceDAOImpl
        Parameters:
        resource - A Resource Data Transfer Object
        parameters - A collection of search parameters to be persisted along with the passed Resource
        parameterHashB64 - Base64 encoded SHA-256 hash of parameters
        parameterDao - The Parameter DAO
        ifNoneMatch - 0 for conditional create-on-update behavior; otherwise null
        Returns:
        Resource The Resource DTO
        Throws:
        FHIRPersistenceDataAccessException
        FHIRPersistenceDBConnectException
        com.ibm.fhir.persistence.exception.FHIRPersistenceVersionIdMismatchException
        com.ibm.fhir.persistence.exception.FHIRPersistenceException
      • storeResource

        public long storeResource​(String tablePrefix,
                                  List<ExtractedParameterValue> parameters,
                                  String p_logical_id,
                                  InputStream p_payload,
                                  Timestamp p_last_updated,
                                  boolean p_is_deleted,
                                  String p_source_key,
                                  Integer p_version,
                                  String p_parameterHashB64,
                                  Connection conn,
                                  ParameterDAO parameterDao,
                                  Integer ifNoneMatch,
                                  AtomicInteger outInteractionStatus,
                                  AtomicInteger outIfNoneMatchVersion)
                           throws 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 DB2 stored procedure implementation (fhir-persistence-schema/src/main/resources/db2/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
        Returns:
        the resource_id for the entry we created
        Throws:
        Exception
      • getResourceTypeId

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

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