summaryrefslogtreecommitdiffstats
path: root/src/H5Z.c
diff options
context:
space:
mode:
authorBinh-Minh Ribler <bmribler@hdfgroup.org>2020-08-14 21:17:08 (GMT)
committerBinh-Minh Ribler <bmribler@hdfgroup.org>2020-08-14 21:17:08 (GMT)
commitd7772d6c6998c362420ef62b01c2c37e52f142e6 (patch)
treea8b9eef96fa5d510fd11bda8c852d78e7910018f /src/H5Z.c
parent99875ecff433930d4bb5d63024b9f190e91065d4 (diff)
downloadhdf5-d7772d6c6998c362420ef62b01c2c37e52f142e6.zip
hdf5-d7772d6c6998c362420ef62b01c2c37e52f142e6.tar.gz
hdf5-d7772d6c6998c362420ef62b01c2c37e52f142e6.tar.bz2
Fixed HDFFV-10933
Description: Fixed to allow the creation of a dataset when the combination of type, space, etc doesn't work for filter and the filter is optional. Currently, it was supposed to be skipped as indicated in the documentation, but it was not skipped and the creation failed. The function H5Z_ignore_filters was added and used in H5D__create. Platforms tested: Linux/64 (jelly)
Diffstat (limited to 'src/H5Z.c')
-rw-r--r--src/H5Z.c67
1 files changed, 67 insertions, 0 deletions
diff --git a/src/H5Z.c b/src/H5Z.c
index 93d7df9..4c90138 100644
--- a/src/H5Z.c
+++ b/src/H5Z.c
@@ -1003,6 +1003,73 @@ done:
/*-------------------------------------------------------------------------
+ * Function: H5Z_ignore_filters
+ *
+ * Purpose: Determine whether filters can be ignored.
+ *
+ * Description:
+ * When the filters are optional (i.e., H5Z_FLAG_OPTIONAL is provided,)
+ * if any of the following conditions is met, the filters will be ignored:
+ * - dataspace is either H5S_NULL or H5S_SCALAR
+ * - datatype is variable-length (string or non-string)
+ * However, if any of these conditions exists and a filter is not
+ * optional, the function will produce an error.
+ *
+ * Return: Non-negative(TRUE/FALSE) on success
+ * Negative on failure
+ *
+ *-------------------------------------------------------------------------
+ */
+htri_t
+H5Z_ignore_filters(hid_t dcpl_id, const H5T_t *type, const H5S_t *space)
+{
+ H5P_genplist_t *dc_plist; /* Dataset creation property list object */
+ H5O_pline_t pline; /* Object's I/O pipeline information */
+ H5S_class_t space_class; /* To check class of space */
+ H5T_class_t type_class; /* To check if type is VL */
+ bool bad_for_filters = FALSE;/* Suitable to have filters */
+ htri_t ret_value = FALSE; /* TRUE for ignoring filters */
+
+ FUNC_ENTER_NOAPI(FAIL)
+
+ if (NULL == (dc_plist = (H5P_genplist_t *)H5I_object(dcpl_id)))
+ HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "can't get dataset creation property list")
+
+ /* Get pipeline information */
+ if (H5P_peek(dc_plist, H5O_CRT_PIPELINE_NAME, &pline) < 0)
+ HGOTO_ERROR(H5E_PLINE, H5E_CANTGET, FAIL, "can't retrieve pipeline filter")
+
+ /* Get datatype and dataspace classes for quick access */
+ space_class = H5S_GET_EXTENT_TYPE(space);
+ type_class = H5T_get_class(type, FALSE);
+
+ /* These conditions are not suitable for filters */
+ bad_for_filters = (H5S_NULL == space_class || H5S_SCALAR == space_class
+ || H5T_VLEN == type_class
+ || (H5T_STRING == type_class && TRUE == H5T_is_variable_str(type)));
+
+ /* When these conditions occur, if there are required filters in pline,
+ then report a failure, otherwise, set flag that they can be ignored */
+ if (bad_for_filters) {
+ size_t ii;
+ if (pline.nused > 0) {
+ for (ii = 0; ii < pline.nused; ii++)
+ {
+ if (!(pline.filter[ii].flags & H5Z_FLAG_OPTIONAL))
+ HGOTO_ERROR(H5E_PLINE, H5E_CANTFILTER, FAIL, "not suitable for filters")
+ }
+
+ /* All filters are optional, we can ignore them */
+ ret_value = TRUE;
+ }
+ } /* bad for filters */
+
+done:
+ FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5Z_ignore_filters() */
+
+
+/*-------------------------------------------------------------------------
* Function: H5Z_modify
*
* Purpose: Modify filter parameters for specified pipeline.