diff options
-rw-r--r-- | MANIFEST | 1 | ||||
-rwxr-xr-x | tools/h5repack/h5repack.sh.in | 7 | ||||
-rw-r--r-- | tools/h5repack/h5repacktst.c | 449 | ||||
-rw-r--r-- | tools/h5repack/testfiles/h5repack_attr_refs.h5 | bin | 0 -> 10112 bytes |
4 files changed, 456 insertions, 1 deletions
@@ -1610,6 +1610,7 @@ ./tools/h5repack/testfiles/ublock.bin ./tools/h5repack/testfiles/h5repack_named_dtypes.h5 ./tools/h5repack/testfiles/h5repack_refs.h5 +./tools/h5repack/testfiles/h5repack_attr_refs.h5 # jam utility and tests ./tools/h5jam/h5jam.c diff --git a/tools/h5repack/h5repack.sh.in b/tools/h5repack/h5repack.sh.in index 6a4f63e..2b63fc0 100755 --- a/tools/h5repack/h5repack.sh.in +++ b/tools/h5repack/h5repack.sh.in @@ -60,6 +60,7 @@ FILE14=h5repack_layouto.h5 # A file with an older version of the layout mes FILE15=h5repack_named_dtypes.h5 FILE16=tfamily%05d.h5 # located in common testfiles folder FILE_REF=h5repack_refs.h5 +FILE_ATTR_REF=h5repack_attr_refs.h5 nerrors=0 @@ -535,6 +536,12 @@ TOOLTEST1 $FILE16 # test various references (bug 1814 and 1726) TOOLTEST $FILE_REF +# test attribute with various references (bug 1797) +# the references in attribute of compund or vlen datatype +# TODO: include this test when code portion is completed. +SKIP $FILE_ATTR_REF +#TOOLTEST $FILE_ATTR_REF + if test $nerrors -eq 0 ; then echo "All $TESTNAME tests passed." exit $EXIT_SUCCESS diff --git a/tools/h5repack/h5repacktst.c b/tools/h5repack/h5repacktst.c index 9b17144..f4abff5 100644 --- a/tools/h5repack/h5repacktst.c +++ b/tools/h5repack/h5repacktst.c @@ -81,6 +81,9 @@ /* obj and region references */ #define FNAME_REF "h5repack_refs.h5" +/* obj and region references in attr of compound and vlen type */ +#define FNAME_ATTR_REF "h5repack_attr_refs.h5" + const char *H5REPACK_FILENAMES[] = { "h5repack_big_out", NULL @@ -142,6 +145,7 @@ static int verify_userblock( const char* filename); static int make_userblock_file(void); static int make_named_dtype(hid_t loc_id); static int make_references(hid_t loc_id); +static int make_complex_attr_references(hid_t loc_id); /*------------------------------------------------------------------------- @@ -1786,6 +1790,17 @@ int make_testfiles(void) if(H5Fclose(fid) < 0) return -1; + /*------------------------------------------------------------------------- + * create a file with obj and region references in attribute of compound and + * vlen datatype + *-------------------------------------------------------------------------*/ + if((fid = H5Fcreate(FNAME_ATTR_REF,H5F_ACC_TRUNC,H5P_DEFAULT,H5P_DEFAULT)) < 0) + return -1; + if (make_complex_attr_references(fid) < 0) + goto out; + if(H5Fclose(fid) < 0) + return -1; + return 0; out: @@ -5623,7 +5638,6 @@ static herr_t add_attr_with_objref(hid_t file_id, hid_t obj_id) { int ret = SUCCEED; int status; - int data_attr_int[2] = {10,20}; /* attr obj ref */ hsize_t dim_attr_objref[1]={3}; hobj_ref_t data_attr_objref[3]; @@ -6167,3 +6181,436 @@ static herr_t make_references(hid_t loc_id) return ret; } +/*------------------------------------------------------------------------- +* Function: make_complex_attr_references +* +* Purpose: +* create a file with : +* 1. obj ref in attribute of compound type +* 2. region ref in attribute of compound type +* 3. obj ref in attribute of vlen type +* 4. region ref in attribute of vlen type +* +* Programmer: Jonathan (March 25, 2010) +*------------------------------------------------------------------------- +*/ +/* obj dset */ +#define RANK_OBJ 2 +#define DIM0_OBJ 6 +#define DIM1_OBJ 10 +/* container dset */ +#define RANK_DSET 1 +#define DIM_DSET 4 +/* 1. obj references in compound attr */ +#define RANK_COMP_OBJREF 1 +#define DIM_COMP_OBJREF 3 /* for dataset, group, datatype */ +/* 2. region references in compound attr */ +#define RANK_COMP_REGREF 1 +#define DIM_COMP_REGREF 1 /* for element region */ +/* 3. obj references in vlen attr */ +#define RANK_VLEN_OBJREF 1 +#define DIM_VLEN_OBJREF 3 /* for dataset, group, datatype */ +#define LEN0_VLEN_OBJREF 1 /* dataset */ +#define LEN1_VLEN_OBJREF 1 /* group */ +#define LEN2_VLEN_OBJREF 1 /* datatype */ +/* 4. region references in vlen attr */ +#define RANK_VLEN_REGREF 1 +#define DIM_VLEN_REGREF 1 /* for element region */ +#define LEN0_VLEN_REGREF 1 /* element region */ + +static herr_t make_complex_attr_references(hid_t loc_id) +{ + herr_t ret = SUCCEED; + herr_t status; + /* + * for objects + */ + hid_t objgid=0, objdid=0, objtid=0, objsid=0; + hsize_t obj_dims[RANK_OBJ] = {DIM0_OBJ, DIM1_OBJ}; + int obj_data[DIM0_OBJ][DIM1_OBJ]= + {{ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9}, + {10,11,12,13,14,15,16,17,18,19}, + {20,21,22,23,24,25,26,27,28,29}, + {30,31,32,33,34,35,36,37,38,39}, + {40,41,42,43,44,45,46,47,48,49}, + {50,51,52,53,54,55,56,57,58,59}}; + + /* + * group main + */ + hid_t main_gid=0; + /* + * dataset which the attribute will be attached to + */ + hsize_t main_dset_dims[RANK_DSET] = {DIM_DSET}; + hid_t main_sid=0, main_did=0; + /* + * 1. obj references in compound attr + */ + hid_t comp_objref_tid=0, comp_objref_aid=0; + typedef struct comp_objref_t { + hobj_ref_t val_objref; + int val_int; + } comp_objref_t; + comp_objref_t comp_objref_data[DIM_COMP_OBJREF]; + hid_t comp_objref_attr_sid=0; + hsize_t comp_objref_dim[RANK_COMP_OBJREF] = {DIM_COMP_OBJREF}; + + /* + * 2. region references in compound attr + */ + hid_t comp_regref_tid=0, comp_regref_aid=0; + typedef struct comp_regref_t { + hdset_reg_ref_t val_regref; + int val_int; + } comp_regref_t; + comp_regref_t comp_regref_data[DIM_COMP_REGREF]; + hid_t comp_regref_attr_sid=0; + hsize_t comp_regref_dim[RANK_COMP_REGREF] = {DIM_COMP_REGREF}; + hsize_t coords[4][2] = { {0,1}, {2,3}, {3,4}, {4,5} }; + + /* + * 3. obj references in vlen attr + */ + hid_t vlen_objref_attr_tid=0, vlen_objref_attr_sid=0; + hid_t vlen_objref_attr_id=0; + hvl_t vlen_objref_data[DIM_VLEN_OBJREF]; + hsize_t vlen_objref_dims[RANK_VLEN_OBJREF] = {DIM_VLEN_OBJREF}; + + /* + * 4. region references in vlen attr + */ + hid_t vlen_regref_attr_tid=0, vlen_regref_attr_sid=0; + hid_t vlen_regref_attr_id=0; + hvl_t vlen_regref_data[DIM_VLEN_REGREF]; + hsize_t vlen_regref_dim[RANK_VLEN_REGREF] = {DIM_VLEN_REGREF}; + + + /* --------------------------------------- + * create objects which to be referenced + */ + /* object1 group */ + objgid = H5Gcreate2(loc_id, NAME_OBJ_GRP, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT); + + /* object2 dataset */ + objsid = H5Screate_simple(RANK_OBJ, obj_dims, NULL); + objdid = H5Dcreate2(loc_id, NAME_OBJ_DS1, H5T_NATIVE_INT, objsid, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT); + status = H5Dwrite(objdid, H5T_NATIVE_INT, H5S_ALL, H5S_ALL, H5P_DEFAULT, obj_data[0]); + if (status < 0) + { + fprintf(stderr, "Error: %s %d> H5Dwrite failed.\n", FUNC, __LINE__); + ret = FAIL; + goto out; + } + + /* object3 named datatype */ + objtid = H5Tcopy(H5T_NATIVE_INT); + status = H5Tcommit2(loc_id, NAME_OBJ_NDTYPE, objtid, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT); + if (status < 0) + { + fprintf(stderr, "Error: %s %d> H5Tcommit2 failed.\n", FUNC, __LINE__); + ret = FAIL; + goto out; + } + + + /* --------------------------------------------- + * Put testing objs in this group + * create group contain dataset with attribute and the attribute has + * compound type which contain obj and region reference */ + main_gid = H5Gcreate2(loc_id, "group_main", H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT); + if (main_gid < 0) + { + fprintf(stderr, "Error: %s %d> H5Gcreate2 failed.\n", FUNC, __LINE__); + ret = FAIL; + goto out; + } + + /*---------------------------------------------------------- + * create dataset which the attribute will be attached to + */ + main_sid = H5Screate_simple(RANK_DSET, main_dset_dims, NULL); + + main_did = H5Dcreate2(main_gid, "dset_main", H5T_NATIVE_INT, main_sid, H5P_DEFAULT,H5P_DEFAULT, H5P_DEFAULT); + + status = H5Dwrite(main_did, H5T_NATIVE_INT, H5S_ALL, H5S_ALL, H5P_DEFAULT, obj_data[0]); + if (status < 0) + { + fprintf(stderr, "Error: %s %d> H5Dwrite failed.\n", FUNC, __LINE__); + ret = FAIL; + goto out; + } + + /*------------------------------------------------------------------- + * 1. create obj references in a attribute of compound type + */ + + /* + * create compound type for attribute + */ + comp_objref_tid = H5Tcreate (H5T_COMPOUND, sizeof(comp_objref_t)); + + H5Tinsert(comp_objref_tid, "value_objref", HOFFSET(comp_objref_t, val_objref), H5T_STD_REF_OBJ); + H5Tinsert(comp_objref_tid, "value_int", HOFFSET(comp_objref_t, val_int), H5T_NATIVE_INT); + + /* + * Create the object references into compound type + */ + /* references to dataset */ + status = H5Rcreate (&(comp_objref_data[0].val_objref), loc_id, NAME_OBJ_DS1, H5R_OBJECT,-1); + if (status < 0) + { + fprintf(stderr, "Error: %s %d> H5Rcreate failed.\n", FUNC, __LINE__); + ret = FAIL; + goto out; + } + comp_objref_data[0].val_int = 0; + + /* references to group */ + status = H5Rcreate (&(comp_objref_data[1].val_objref), loc_id, NAME_OBJ_GRP, H5R_OBJECT,-1); + if (status < 0) + { + fprintf(stderr, "Error: %s %d> H5Rcreate failed.\n", FUNC, __LINE__); + ret = FAIL; + goto out; + } + comp_objref_data[1].val_int = 10; + + /* references to datatype */ + status = H5Rcreate (&(comp_objref_data[2].val_objref), loc_id, NAME_OBJ_NDTYPE, H5R_OBJECT,-1); + if (status < 0) + { + fprintf(stderr, "Error: %s %d> H5Rcreate failed.\n", FUNC, __LINE__); + ret = FAIL; + goto out; + } + comp_objref_data[2].val_int = 20; + + /* + * create attribute and write the object ref + */ + comp_objref_attr_sid = H5Screate_simple (RANK_COMP_OBJREF, comp_objref_dim, NULL); + comp_objref_aid = H5Acreate2 (main_did, "Comp_OBJREF", comp_objref_tid, comp_objref_attr_sid, H5P_DEFAULT, H5P_DEFAULT); + status = H5Awrite (comp_objref_aid, comp_objref_tid, comp_objref_data); + if (status < 0) + { + fprintf(stderr, "Error: %s %d> H5Awrite failed.\n", FUNC, __LINE__); + ret = FAIL; + goto out; + } + + /*------------------------------------------------------------------- + * 2. create region references in attribute of compound type + */ + /* + * create compound type for attribute + */ + comp_regref_tid = H5Tcreate (H5T_COMPOUND, sizeof(comp_regref_t)); + + H5Tinsert(comp_regref_tid, "value_regref", HOFFSET(comp_regref_t, val_regref), H5T_STD_REF_DSETREG); + H5Tinsert(comp_regref_tid, "value_int", HOFFSET(comp_regref_t, val_int), H5T_NATIVE_INT); + + /* + * create the region reference + */ + status = H5Sselect_elements (objsid, H5S_SELECT_SET, 4, coords[0]); + if (status < 0) + { + fprintf(stderr, "Error: %s %d> H5Sselect_elements failed.\n", FUNC, __LINE__); + ret = FAIL; + goto out; + } + status = H5Rcreate (&(comp_regref_data[0].val_regref), loc_id, NAME_OBJ_DS1, H5R_DATASET_REGION, objsid); + if (status < 0) + { + fprintf(stderr, "Error: %s %d> H5Rcreate failed.\n", FUNC, __LINE__); + ret = FAIL; + goto out; + } + comp_regref_data[0].val_int = 10; + + /* + * create attribute and write the region ref + */ + comp_regref_attr_sid = H5Screate_simple (RANK_COMP_REGREF, comp_regref_dim, NULL); + comp_regref_aid = H5Acreate2 (main_did, "Comp_REGREF", comp_regref_tid, comp_regref_attr_sid, H5P_DEFAULT, H5P_DEFAULT); + status = H5Awrite (comp_regref_aid, comp_regref_tid, comp_regref_data); + if (status < 0) + { + fprintf(stderr, "Error: %s %d> H5Awrite failed.\n", FUNC, __LINE__); + ret = FAIL; + goto out; + } + + + /*------------------------------------------------------------------- + * 3. create obj references in attribute of vlen type + */ + /* + * prepare vlen data + */ + vlen_objref_data[0].len = LEN0_VLEN_OBJREF; + vlen_objref_data[0].p = malloc (vlen_objref_data[0].len * sizeof(hobj_ref_t)); + vlen_objref_data[1].len = LEN1_VLEN_OBJREF; + vlen_objref_data[1].p = malloc (vlen_objref_data[1].len * sizeof(hobj_ref_t)); + vlen_objref_data[2].len = LEN2_VLEN_OBJREF; + vlen_objref_data[2].p = malloc (vlen_objref_data[2].len * sizeof(hobj_ref_t)); + + /* + * create obj references + */ + /* reference to dataset */ + status = H5Rcreate (&((hobj_ref_t*)vlen_objref_data[0].p)[0], loc_id, NAME_OBJ_DS1, H5R_OBJECT, -1); + if (status < 0) + { + fprintf(stderr, "Error: %s %d> H5Rcreate failed.\n", FUNC, __LINE__); + ret = FAIL; + goto out; + } + /* reference to group */ + status = H5Rcreate (&((hobj_ref_t*)vlen_objref_data[1].p)[0], loc_id, NAME_OBJ_GRP, H5R_OBJECT, -1); + if (status < 0) + { + fprintf(stderr, "Error: %s %d> H5Rcreate failed.\n", FUNC, __LINE__); + ret = FAIL; + goto out; + } + /* reference to datatype */ + status = H5Rcreate (&((hobj_ref_t*)vlen_objref_data[2].p)[0], loc_id, NAME_OBJ_NDTYPE, H5R_OBJECT, -1); + if (status < 0) + { + fprintf(stderr, "Error: %s %d> H5Rcreate failed.\n", FUNC, __LINE__); + ret = FAIL; + goto out; + } + + /* + * create vlen type with obj reference + */ + vlen_objref_attr_tid = H5Tvlen_create (H5T_STD_REF_OBJ); + vlen_objref_attr_sid = H5Screate_simple (RANK_VLEN_OBJREF, vlen_objref_dims, NULL); + + /* + * create attribute and write the object reference + */ + vlen_objref_attr_id = H5Acreate2(main_did, "Vlen_OBJREF", vlen_objref_attr_tid, vlen_objref_attr_sid, H5P_DEFAULT, H5P_DEFAULT); + status = H5Awrite (vlen_objref_attr_id, vlen_objref_attr_tid, vlen_objref_data); + if (status < 0) + { + fprintf(stderr, "Error: %s %d> H5Awrite failed.\n", FUNC, __LINE__); + ret = FAIL; + goto out; + } + + /* close resource for vlen data */ + status = H5Dvlen_reclaim (vlen_objref_attr_tid, vlen_objref_attr_sid, H5P_DEFAULT, vlen_objref_data); + if (status < 0) + { + fprintf(stderr, "Error: %s %d> H5Dvlen_reclaim failed.\n", FUNC, __LINE__); + ret = FAIL; + goto out; + } + + /*------------------------------------------------------------------- + * 4. create region references in a attribute of vlen type + */ + + /* + * prepare vlen data + */ + vlen_regref_data[0].len = LEN0_VLEN_REGREF; + vlen_regref_data[0].p = malloc (vlen_regref_data[0].len * sizeof(hdset_reg_ref_t)); + + /* + * create region reference + */ + status = H5Sselect_elements(objsid, H5S_SELECT_SET, 4, coords[0]); + if (status < 0) + { + fprintf(stderr, "Error: %s %d> H5Sselect_elements failed.\n", FUNC, __LINE__); + ret = FAIL; + goto out; + } + status = H5Rcreate (&((hdset_reg_ref_t*)vlen_regref_data[0].p)[0], loc_id, NAME_OBJ_DS1, H5R_DATASET_REGION, objsid); + if (status < 0) + { + fprintf(stderr, "Error: %s %d> H5Rcreate failed.\n", FUNC, __LINE__); + ret = FAIL; + goto out; + } + + /* + * create vlen type with region reference + */ + vlen_regref_attr_tid = H5Tvlen_create(H5T_STD_REF_DSETREG); + vlen_regref_attr_sid = H5Screate_simple(RANK_VLEN_REGREF, vlen_regref_dim, NULL); + + /* + * create attribute and write the region reference + */ + vlen_regref_attr_id = H5Acreate2(main_did, "Vlen_REGREF", vlen_regref_attr_tid, vlen_regref_attr_sid, H5P_DEFAULT, H5P_DEFAULT); + status = H5Awrite(vlen_regref_attr_id, vlen_regref_attr_tid, vlen_regref_data); + if (status < 0) + { + fprintf(stderr, "Error: %s %d> H5Awrite failed.\n", FUNC, __LINE__); + ret = FAIL; + goto out; + } + + /* close resource for vlen data */ + status = H5Dvlen_reclaim (vlen_regref_attr_tid, vlen_regref_attr_sid, H5P_DEFAULT, vlen_regref_data); + if (status < 0) + { + fprintf(stderr, "Error: %s %d> H5Dvlen_reclaim failed.\n", FUNC, __LINE__); + ret = FAIL; + goto out; + } + +out: + /* release resources */ + if (objgid < 0) + H5Gclose(objgid); + if (objsid < 0) + H5Sclose(objsid); + if (objdid < 0) + H5Dclose(objdid); + if (objtid < 0) + H5Tclose(objtid); + + if (main_gid < 0) + H5Gclose(main_gid); + if (main_sid < 0) + H5Sclose(main_sid); + if (main_did < 0) + H5Dclose(main_did); + /* comp obj ref */ + if (comp_objref_tid < 0) + H5Tclose(comp_objref_tid); + if (comp_objref_aid < 0) + H5Aclose(comp_objref_aid); + if (comp_objref_attr_sid < 0) + H5Sclose(comp_objref_attr_sid); + /* comp region ref */ + if (comp_regref_tid < 0) + H5Tclose(comp_regref_tid); + if (comp_regref_aid < 0) + H5Aclose(comp_regref_aid); + if (comp_regref_attr_sid < 0) + H5Sclose(comp_regref_attr_sid); + /* vlen obj ref */ + if (vlen_objref_attr_id < 0); + H5Aclose (vlen_objref_attr_id); + if (vlen_objref_attr_sid < 0); + H5Sclose (vlen_objref_attr_sid); + if (vlen_objref_attr_tid < 0); + H5Tclose (vlen_objref_attr_tid); + /* vlen region ref */ + if (vlen_regref_attr_id < 0); + H5Aclose (vlen_regref_attr_id); + if (vlen_regref_attr_sid < 0); + H5Sclose (vlen_regref_attr_sid); + if (vlen_regref_attr_tid < 0); + H5Tclose (vlen_regref_attr_tid); + + return ret; +} diff --git a/tools/h5repack/testfiles/h5repack_attr_refs.h5 b/tools/h5repack/testfiles/h5repack_attr_refs.h5 Binary files differnew file mode 100644 index 0000000..56974a3 --- /dev/null +++ b/tools/h5repack/testfiles/h5repack_attr_refs.h5 |