summaryrefslogtreecommitdiffstats
path: root/hl/src/H5DO.c
diff options
context:
space:
mode:
Diffstat (limited to 'hl/src/H5DO.c')
-rw-r--r--hl/src/H5DO.c81
1 files changed, 77 insertions, 4 deletions
diff --git a/hl/src/H5DO.c b/hl/src/H5DO.c
index 8db6768..22d40fc 100644
--- a/hl/src/H5DO.c
+++ b/hl/src/H5DO.c
@@ -32,7 +32,7 @@
* Return: Non-negative on success/Negative on failure
*
* Programmer: Raymond Lu
- * 30 July 2012
+ * 30 July 2012
*
*-------------------------------------------------------------------------
*/
@@ -60,7 +60,7 @@ H5DOwrite_chunk(hid_t dset_id, hid_t dxpl_id, uint32_t filters, const hsize_t *o
/* If the user passed in a default DXPL, create one to pass to H5Dwrite() */
if(H5P_DEFAULT == dxpl_id) {
- if((dxpl_id = H5Pcreate(H5P_DATASET_XFER)) < 0)
+ if((dxpl_id = H5Pcreate(H5P_DATASET_XFER)) < 0)
goto done;
created_dxpl = TRUE;
} /* end if */
@@ -87,16 +87,87 @@ done:
if(H5Pclose(dxpl_id) < 0)
ret_value = FAIL;
} /* end if */
- else
+ else {
/* Reset the direct write flag on user DXPL */
+ do_direct_write = FALSE;
if(H5Pset(dxpl_id, H5D_XFER_DIRECT_CHUNK_WRITE_FLAG_NAME, &do_direct_write) < 0)
ret_value = FAIL;
+ }
return(ret_value);
} /* end H5DOwrite_chunk() */
-/*
+/*-------------------------------------------------------------------------
+ * Function: H5DOread_chunk
+ *
+ * Purpose: Reads an entire chunk from the file directly.
+ *
+ * Return: Non-negative on success/Negative on failure
+ *
+ * Programmer: Matthew Strong (GE Healthcare)
+ * 14 February 2016
+ *
+ *---------------------------------------------------------------------------
+ */
+herr_t
+H5DOread_chunk(hid_t dset_id, hid_t dxpl_id, const hsize_t *offset, uint32_t *filters,
+ void *buf)
+{
+ hbool_t created_dxpl = FALSE; /* Whether we created a DXPL */
+ hbool_t do_direct_read = TRUE; /* Flag for direct writes */
+ herr_t ret_value = FAIL; /* Return value */
+
+ /* Check arguments */
+ if(dset_id < 0)
+ goto done;
+ if(!buf)
+ goto done;
+ if(!offset)
+ goto done;
+ if(!filters)
+ goto done;
+
+ /* If the user passed in a default DXPL, create one to pass to H5Dwrite() */
+ if(H5P_DEFAULT == dxpl_id) {
+ if((dxpl_id = H5Pcreate(H5P_DATASET_XFER)) < 0)
+ goto done;
+ created_dxpl = TRUE;
+ } /* end if */
+
+ /* Set direct write parameters */
+ if(H5Pset(dxpl_id, H5D_XFER_DIRECT_CHUNK_READ_FLAG_NAME, &do_direct_read) < 0)
+ goto done;
+ if(H5Pset(dxpl_id, H5D_XFER_DIRECT_CHUNK_READ_OFFSET_NAME, &offset) < 0)
+ goto done;
+
+ /* Read chunk */
+ if(H5Dread(dset_id, 0, H5S_ALL, H5S_ALL, dxpl_id, buf) < 0)
+ goto done;
+ /* Get the filter mask */
+ if(H5Pget(dxpl_id, H5D_XFER_DIRECT_CHUNK_READ_FILTERS_NAME, filters) < 0)
+ goto done;
+
+ /* Indicate success */
+ ret_value = SUCCEED;
+
+done:
+ if(created_dxpl) {
+ if(H5Pclose(dxpl_id) < 0)
+ ret_value = FAIL;
+ } /* end if */
+ else {
+ /* Reset the direct read flag on user DXPL */
+ do_direct_read = FALSE;
+ if(H5Pset(dxpl_id, H5D_XFER_DIRECT_CHUNK_READ_FLAG_NAME, &do_direct_read) < 0)
+ ret_value = FAIL;
+ }
+
+ return(ret_value);
+} /* end H5DOread_chunk() */
+
+
+/*-------------------------------------------------------------------------
* Function: H5DOappend()
*
* Purpose: To append elements to a dataset.
@@ -122,6 +193,8 @@ done:
* ret_value = FAIL;
* goto done;
* }
+ *
+ *-------------------------------------------------------------------------
*/
herr_t
H5DOappend(hid_t dset_id, hid_t dxpl_id, unsigned axis, size_t extension,