summaryrefslogtreecommitdiffstats
path: root/tools/h5repack/h5repack_copy.c
diff options
context:
space:
mode:
Diffstat (limited to 'tools/h5repack/h5repack_copy.c')
-rw-r--r--tools/h5repack/h5repack_copy.c55
1 files changed, 34 insertions, 21 deletions
diff --git a/tools/h5repack/h5repack_copy.c b/tools/h5repack/h5repack_copy.c
index c015f0a..9a73919 100644
--- a/tools/h5repack/h5repack_copy.c
+++ b/tools/h5repack/h5repack_copy.c
@@ -228,6 +228,8 @@ out:
* Programmer: Pedro Vicente, pvn@ncsa.uiuc.edu
*
* Date: October, 23, 2003
+ * Modified: December, 03, 2004 - added a check for H5Dcreate; if the dataset
+ * cannot be created with the requested filter, use the input one
*
*-------------------------------------------------------------------------
*/
@@ -244,6 +246,7 @@ int do_copy_objects(hid_t fidin,
hid_t type_in; /* named type ID */
hid_t type_out; /* named type ID */
hid_t dcpl_id; /* dataset creation property list ID */
+ hid_t dcpl_out; /* dataset creation property list ID */
hid_t space_id; /* space ID */
hid_t ftype_id; /* file data type ID */
hid_t mtype_id; /* memory data type ID */
@@ -254,9 +257,6 @@ int do_copy_objects(hid_t fidin,
hsize_t dims[H5S_MAX_RANK];/* dimensions of dataset */
hsize_t dsize_in; /* input dataset size before filter */
int next; /* external files */
-#ifdef LATER
- hsize_t dsize_out; /* output dataset size after filter */
-#endif /* LATER */
int i, j;
int wrote=0;
@@ -305,6 +305,7 @@ int do_copy_objects(hid_t fidin,
*-------------------------------------------------------------------------
*/
case H5G_DATASET:
+
if ((dset_in=H5Dopen(fidin,travt->objs[i].name))<0)
goto error;
if ((space_id=H5Dget_space(dset_in))<0)
@@ -313,6 +314,8 @@ int do_copy_objects(hid_t fidin,
goto error;
if ((dcpl_id=H5Dget_create_plist(dset_in))<0)
goto error;
+ if ((dcpl_out = H5Pcopy (dcpl_id))<0)
+ goto error;
if ( (rank=H5Sget_simple_extent_ndims(space_id))<0)
goto error;
HDmemset(dims, 0, sizeof dims);
@@ -321,6 +324,9 @@ int do_copy_objects(hid_t fidin,
nelmts=1;
for (j=0; j<rank; j++)
nelmts*=dims[j];
+
+ if (options->verbose)
+ print_obj(dcpl_id,travt->objs[i].name );
if ((mtype_id=h5tools_get_native_type(ftype_id))<0)
goto error;
@@ -379,17 +385,36 @@ int do_copy_objects(hid_t fidin,
* apply the filter
*-------------------------------------------------------------------------
*/
- if (apply_filters(travt->objs[i].name,rank,dims,dcpl_id,mtype_id,options)<0)
+ if (apply_filters(travt->objs[i].name,rank,dims,dcpl_out,mtype_id,options)<0)
goto error;
}/*nelmts*/
/*-------------------------------------------------------------------------
- * create/write dataset/close
+ * create;
+ * disable error checking in case the dataset cannot be created with the
+ * modified dcpl; in that case use the original instead
*-------------------------------------------------------------------------
*/
- if ((dset_out=H5Dcreate(fidout,travt->objs[i].name,mtype_id,space_id,dcpl_id))<0)
- goto error;
+
+ H5E_BEGIN_TRY {
+ dset_out=H5Dcreate(fidout,travt->objs[i].name,mtype_id,space_id,dcpl_out);
+ } H5E_END_TRY;
+
+ if (dset_out==FAIL)
+ {
+ if ((dset_out=H5Dcreate(fidout,travt->objs[i].name,mtype_id,space_id,dcpl_id))<0)
+ goto error;
+
+ if (options->verbose)
+ printf("Warning: Could not apply the filter to <%s>\n", travt->objs[i].name);
+ }
+
+ /*-------------------------------------------------------------------------
+ * write dataset
+ *-------------------------------------------------------------------------
+ */
+
if (dsize_in && nelmts) {
if (H5Dwrite(dset_out,mtype_id,H5S_ALL,H5S_ALL,H5P_DEFAULT,buf)<0)
goto error;
@@ -402,26 +427,12 @@ int do_copy_objects(hid_t fidin,
if (copy_attr(dset_in,dset_out,options)<0)
goto error;
-#ifdef LATER
- /*-------------------------------------------------------------------------
- * store the storage sizes
- *-------------------------------------------------------------------------
- */
-
- dsize_out=H5Dget_storage_size(dset_out);
-#endif /* LATER */
-
/*close */
if (H5Dclose(dset_out)<0)
goto error;
if (buf)
free(buf);
-
- if (options->verbose && wrote)
- print_obj(dcpl_id,travt->objs[i].name );
-
-
}/*H5T_STD_REF_OBJ*/
}/*can_read*/
@@ -437,6 +448,8 @@ int do_copy_objects(hid_t fidin,
goto error;
if (H5Pclose(dcpl_id)<0)
goto error;
+ if (H5Pclose(dcpl_out)<0)
+ goto error;
if (H5Sclose(space_id)<0)
goto error;
if (H5Dclose(dset_in)<0)