diff options
Diffstat (limited to 'test/API/tattr.c')
-rw-r--r-- | test/API/tattr.c | 11923 |
1 files changed, 0 insertions, 11923 deletions
diff --git a/test/API/tattr.c b/test/API/tattr.c deleted file mode 100644 index c4ae9f9..0000000 --- a/test/API/tattr.c +++ /dev/null @@ -1,11923 +0,0 @@ -/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * - * Copyright by The HDF Group. * - * All rights reserved. * - * * - * This file is part of HDF5. The full HDF5 copyright notice, including * - * terms governing use, modification, and redistribution, is contained in * - * the COPYING file, which can be found at the root of the source code * - * distribution tree, or in https://www.hdfgroup.org/licenses. * - * If you do not have access to either file, you may request a copy from * - * help@hdfgroup.org. * - * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ - -/*********************************************************** - * - * Test program: tattr - * - * Test the attribute functionality - * - *************************************************************/ - -#include "testhdf5.h" - -#if 0 -#include "H5VLnative_private.h" - -/* - * This file needs to access private information from the H5O package. - * This file also needs to access the object header testing code. - */ -#define H5O_FRIEND /*suppress error about including H5Opkg */ -#define H5O_TESTING -#include "H5Opkg.h" /* Object headers */ - -/* - * This file needs to access private information from the H5A package. - * This file also needs to access the attribute testing code. - */ -#define H5A_FRIEND /*suppress error about including H5Apkg */ -#define H5A_TESTING -#include "H5Apkg.h" /* Attributes */ - -/* - * This file needs to access private information from the H5F package. - * This file also needs to access the file testing code. - */ -#define H5F_FRIEND /*suppress error about including H5Fpkg */ -#define H5F_TESTING -#include "H5Fpkg.h" /* File access */ -#endif - -#define FILENAME "tattr.h5" -#define NAME_BUF_SIZE 1024 -#define ATTR_NAME_LEN 16 -#define ATTR_MAX_DIMS 7 -#define ATTR_TMP_NAME "a really long temp_name" -#define CORDER_ITER_STOP 3 - -/* 3-D dataset with fixed dimensions */ -#define SPACE1_RANK 3 -#define SPACE1_DIM1 3 -#define SPACE1_DIM2 15 -#define SPACE1_DIM3 13 - -/* Dataset Information */ -#define DSET1_NAME "Dataset1" -#define DSET2_NAME "Dataset2" -#define DSET3_NAME "Dataset3" -#define NUM_DSETS 3 - -/* Group Information */ -#define GROUP1_NAME "/Group1" -#define GROUP2_NAME "/Group2" -#define GROUP3_NAME "/Group3" - -/* Named Datatype Information */ -#define TYPE1_NAME "/Type" - -/* Attribute Rank & Dimensions */ -#define ATTR1_NAME "Attr1" -#define ATTR1_RANK 1 -#define ATTR1_DIM1 3 -int attr_data1[ATTR1_DIM1] = {512, -234, 98123}; /* Test data for 1st attribute */ - -/* rank & dimensions for another attribute */ -#define ATTR1A_NAME "Attr1_a" -int attr_data1a[ATTR1_DIM1] = {256, 11945, -22107}; - -#define ATTR2_NAME "Attr2" -#define ATTR2_RANK 2 -#define ATTR2_DIM1 2 -#define ATTR2_DIM2 2 -int attr_data2[ATTR2_DIM1][ATTR2_DIM2] = {{7614, -416}, {197814, -3}}; /* Test data for 2nd attribute */ - -#define ATTR3_NAME "Attr3" -#define ATTR3_RANK 3 -#define ATTR3_DIM1 2 -#define ATTR3_DIM2 2 -#define ATTR3_DIM3 2 -double attr_data3[ATTR3_DIM1][ATTR3_DIM2][ATTR3_DIM3] = { - {{2.3, -26.1}, {0.123, -10.0}}, {{973.23, -0.91827}, {2.0, 23.0}}}; /* Test data for 3rd attribute */ - -#define ATTR4_NAME "Attr4" -#define ATTR4_RANK 2 -#define ATTR4_DIM1 2 -#define ATTR4_DIM2 2 -#define ATTR4_FIELDNAME1 "i" -#define ATTR4_FIELDNAME2 "d" -#define ATTR4_FIELDNAME3 "c" -size_t attr4_field1_off = 0; -size_t attr4_field2_off = 0; -size_t attr4_field3_off = 0; -struct attr4_struct { - int i; - double d; - char c; -} attr_data4[ATTR4_DIM1][ATTR4_DIM2] = { - {{3, -26.1, 'd'}, {-100000, 0.123, '3'}}, - {{-23, 981724.2, 'Q'}, {0, 2.0, '\n'}}}; /* Test data for 4th attribute */ - -#define ATTR5_NAME "Attr5" -#define ATTR5_RANK 0 -float attr_data5 = -5.123F; /* Test data for 5th attribute */ - -#define ATTR6_RANK 3 -#define ATTR6_DIM1 100 -#define ATTR6_DIM2 100 -#define ATTR6_DIM3 100 - -#define ATTR7_NAME "attr 1 - 000000" -#define ATTR8_NAME "attr 2" - -#define LINK1_NAME "Link1" - -#define NATTR_MANY_OLD 350 -#define NATTR_MANY_NEW 3500 - -#define BUG2_NATTR 100 -#define BUG2_NATTR2 16 - -#define BUG3_DSET_NAME "dset" -#define BUG3_DT_NAME "dt" -#define BUG3_ATTR_NAME "attr" - -/* Used by test_attr_delete_last_dense() */ -#define GRPNAME "grp" -#define ATTRNAME "attr" -#define DIM0 100 -#define DIM1 100 -#define RANK 2 - -/* Used by test_attr_info_null_info_pointer() */ -#define GET_INFO_NULL_POINTER_ATTR_NAME "NullInfoPointerAttr" - -/* Used by test_attr_rename_invalid_name() */ -#define INVALID_RENAME_TEST_ATTR_NAME "InvalidRenameTestAttr" -#define INVALID_RENAME_TEST_NEW_ATTR_NAME "InvalidRenameTestNewAttr" - -/* Used by test_attr_get_name_invalid_buf() */ -#define GET_NAME_INVALID_BUF_TEST_ATTR_NAME "InvalidNameBufferTestAttr" - -/* Attribute iteration struct */ -typedef struct { - H5_iter_order_t order; /* Direction of iteration */ - unsigned ncalled; /* # of times callback is entered */ - unsigned nskipped; /* # of attributes skipped */ - int stop; /* # of iterations to stop after */ - hsize_t curr; /* Current creation order value */ - size_t max_visit; /* Size of "visited attribute" flag array */ - bool *visited; /* Pointer to array of "visited attribute" flags */ -} attr_iter_info_t; - -static herr_t attr_op1(hid_t loc_id, const char *name, const H5A_info_t *ainfo, void *op_data); - -/* Global dcpl ID, can be re-set as a generated dcpl for various operations - * across multiple tests. - * e.g., minimized dataset object headers - */ -static hid_t dcpl_g = H5P_DEFAULT; - -/**************************************************************** -** -** test_attr_basic_write(): Test basic H5A (attribute) code. -** Tests integer attributes on both datasets and groups -** -****************************************************************/ -static void -test_attr_basic_write(hid_t fapl) -{ - hid_t fid1; /* HDF5 File IDs */ - hid_t dataset; /* Dataset ID */ - hid_t group; /* Group ID */ - hid_t sid1, sid2; /* Dataspace ID */ - hid_t attr, attr2; /* Attribute ID */ -#if 0 - hsize_t attr_size; /* storage size for attribute */ -#endif - ssize_t attr_name_size; /* size of attribute name */ - char *attr_name = NULL; /* name of attribute */ - hsize_t dims1[] = {SPACE1_DIM1, SPACE1_DIM2, SPACE1_DIM3}; - hsize_t dims2[] = {ATTR1_DIM1}; - hsize_t dims3[] = {ATTR2_DIM1, ATTR2_DIM2}; - int read_data1[ATTR1_DIM1] = {0}; /* Buffer for reading 1st attribute */ - int i; - hid_t ret_id; /* Generic hid_t return value */ - herr_t ret; /* Generic return value */ - - /* Output message about test being performed */ - MESSAGE(5, ("Testing Basic Scalar Attribute Writing Functions\n")); - - /* Create file */ - fid1 = H5Fcreate(FILENAME, H5F_ACC_TRUNC, H5P_DEFAULT, fapl); - CHECK(fid1, FAIL, "H5Fcreate"); - - /* Create dataspace for dataset */ - sid1 = H5Screate_simple(SPACE1_RANK, dims1, NULL); - CHECK(sid1, FAIL, "H5Screate_simple"); - - /* Create a dataset */ - dataset = H5Dcreate2(fid1, DSET1_NAME, H5T_NATIVE_UCHAR, sid1, H5P_DEFAULT, dcpl_g, H5P_DEFAULT); - CHECK(dataset, FAIL, "H5Dcreate2"); - - /* Create dataspace for attribute */ - sid2 = H5Screate_simple(ATTR1_RANK, dims2, NULL); - CHECK(sid2, FAIL, "H5Screate_simple"); - - /* Try to create an attribute on the file (should create an attribute on root group) */ - attr = H5Acreate2(fid1, ATTR1_NAME, H5T_NATIVE_INT, sid2, H5P_DEFAULT, H5P_DEFAULT); - CHECK(attr, FAIL, "H5Acreate2"); - - /* Close attribute */ - ret = H5Aclose(attr); - CHECK(ret, FAIL, "H5Aclose"); - - /* Open the root group */ - group = H5Gopen2(fid1, "/", H5P_DEFAULT); - CHECK(group, FAIL, "H5Gopen2"); - - /* Open attribute again */ - attr = H5Aopen(group, ATTR1_NAME, H5P_DEFAULT); - CHECK(attr, FAIL, "H5Aopen"); - - /* Close attribute */ - ret = H5Aclose(attr); - CHECK(ret, FAIL, "H5Aclose"); - - /* Close root group */ - ret = H5Gclose(group); - CHECK(ret, FAIL, "H5Gclose"); - - /* Create an attribute for the dataset */ - attr = H5Acreate2(dataset, ATTR1_NAME, H5T_NATIVE_INT, sid2, H5P_DEFAULT, H5P_DEFAULT); - CHECK(attr, FAIL, "H5Acreate2"); - - if (vol_cap_flags_g & H5VL_CAP_FLAG_ATTR_BASIC) { - /* Try to create the same attribute again (should fail) */ - H5E_BEGIN_TRY - { - ret_id = H5Acreate2(dataset, ATTR1_NAME, H5T_NATIVE_INT, sid2, H5P_DEFAULT, H5P_DEFAULT); - } - H5E_END_TRY - VERIFY(ret_id, FAIL, "H5Acreate2"); - } - - /* Write attribute information */ - ret = H5Awrite(attr, H5T_NATIVE_INT, attr_data1); - CHECK(ret, FAIL, "H5Awrite"); - - /* Create an another attribute for the dataset */ - attr2 = H5Acreate2(dataset, ATTR1A_NAME, H5T_NATIVE_INT, sid2, H5P_DEFAULT, H5P_DEFAULT); - CHECK(attr, FAIL, "H5Acreate2"); - - /* Write attribute information */ - ret = H5Awrite(attr2, H5T_NATIVE_INT, attr_data1a); - CHECK(ret, FAIL, "H5Awrite"); -#if 0 - /* Check storage size for attribute */ - attr_size = H5Aget_storage_size(attr); - VERIFY(attr_size, (ATTR1_DIM1 * sizeof(int)), "H5A_get_storage_size"); -#endif - /* Read attribute information immediately, without closing attribute */ - ret = H5Aread(attr, H5T_NATIVE_INT, read_data1); - CHECK(ret, FAIL, "H5Aread"); - - /* Verify values read in */ - for (i = 0; i < ATTR1_DIM1; i++) - if (attr_data1[i] != read_data1[i]) - TestErrPrintf("%d: attribute data different: attr_data1[%d]=%d, read_data1[%d]=%d\n", __LINE__, i, - attr_data1[i], i, read_data1[i]); - - /* Close attribute */ - ret = H5Aclose(attr); - CHECK(ret, FAIL, "H5Aclose"); - - /* Close attribute */ - ret = H5Aclose(attr2); - CHECK(ret, FAIL, "H5Aclose"); - - /* change attribute name */ - ret = H5Arename(dataset, ATTR1_NAME, ATTR_TMP_NAME); - CHECK(ret, FAIL, "H5Arename"); - - /* Open attribute again */ - attr = H5Aopen(dataset, ATTR_TMP_NAME, H5P_DEFAULT); - CHECK(attr, FAIL, "H5Aopen"); - - /* Verify new attribute name */ - attr_name_size = H5Aget_name(attr, (size_t)0, NULL); - CHECK(attr_name_size, FAIL, "H5Aget_name"); - - if (attr_name_size > 0) { - attr_name = (char *)calloc((size_t)(attr_name_size + 1), sizeof(char)); - CHECK_PTR(attr_name, "calloc"); - - if (attr_name) { - ret = (herr_t)H5Aget_name(attr, (size_t)(attr_name_size + 1), attr_name); - CHECK(ret, FAIL, "H5Aget_name"); - ret = strcmp(attr_name, ATTR_TMP_NAME); - VERIFY(ret, 0, "strcmp"); - - free(attr_name); - attr_name = NULL; - } /* end if */ - } /* end if */ - - /* Read attribute information immediately, without closing attribute */ - ret = H5Aread(attr, H5T_NATIVE_INT, read_data1); - CHECK(ret, FAIL, "H5Aread"); - - /* Verify values read in */ - for (i = 0; i < ATTR1_DIM1; i++) - if (attr_data1[i] != read_data1[i]) - TestErrPrintf("%d: attribute data different: attr_data1[%d]=%d, read_data1[%d]=%d\n", __LINE__, i, - attr_data1[i], i, read_data1[i]); - - /* Close attribute */ - ret = H5Aclose(attr); - CHECK(ret, FAIL, "H5Aclose"); - - /* Open the second attribute again */ - attr2 = H5Aopen(dataset, ATTR1A_NAME, H5P_DEFAULT); - CHECK(attr, FAIL, "H5Aopen"); - - /* Verify new attribute name */ - attr_name_size = H5Aget_name(attr2, (size_t)0, NULL); - CHECK(attr_name_size, FAIL, "H5Aget_name"); - - if (attr_name_size > 0) { - attr_name = (char *)calloc((size_t)(attr_name_size + 1), sizeof(char)); - CHECK_PTR(attr_name, "calloc"); - - if (attr_name) { - ret = (herr_t)H5Aget_name(attr2, (size_t)(attr_name_size + 1), attr_name); - CHECK(ret, FAIL, "H5Aget_name"); - ret = strcmp(attr_name, ATTR1A_NAME); - VERIFY(ret, 0, "strcmp"); - - free(attr_name); - attr_name = NULL; - } /* end if */ - } /* end if */ - - /* Read attribute information immediately, without closing attribute */ - ret = H5Aread(attr2, H5T_NATIVE_INT, read_data1); - CHECK(ret, FAIL, "H5Aread"); - - /* Verify values read in */ - for (i = 0; i < ATTR1_DIM1; i++) - if (attr_data1a[i] != read_data1[i]) - TestErrPrintf("%d: attribute data different: attr_data1a[%d]=%d, read_data1[%d]=%d\n", __LINE__, - i, attr_data1a[i], i, read_data1[i]); - - /* Close attribute */ - ret = H5Aclose(attr2); - CHECK(ret, FAIL, "H5Aclose"); - - ret = H5Sclose(sid1); - CHECK(ret, FAIL, "H5Sclose"); - ret = H5Sclose(sid2); - CHECK(ret, FAIL, "H5Sclose"); - - /* Close Dataset */ - ret = H5Dclose(dataset); - CHECK(ret, FAIL, "H5Dclose"); - - /* Create group */ - group = H5Gcreate2(fid1, GROUP1_NAME, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT); - CHECK(group, FAIL, "H5Gcreate2"); - - /* Create dataspace for attribute */ - sid2 = H5Screate_simple(ATTR2_RANK, dims3, NULL); - CHECK(sid2, FAIL, "H5Screate_simple"); - - /* Create an attribute for the group */ - attr = H5Acreate2(group, ATTR2_NAME, H5T_NATIVE_INT, sid2, H5P_DEFAULT, H5P_DEFAULT); - CHECK(attr, FAIL, "H5Acreate2"); -#if 0 - /* Check storage size for attribute */ - attr_size = H5Aget_storage_size(attr); - VERIFY(attr_size, (ATTR2_DIM1 * ATTR2_DIM2 * sizeof(int)), "H5Aget_storage_size"); -#endif - - if (vol_cap_flags_g & H5VL_CAP_FLAG_ATTR_BASIC) { - /* Try to create the same attribute again (should fail) */ - H5E_BEGIN_TRY - { - ret_id = H5Acreate2(group, ATTR2_NAME, H5T_NATIVE_INT, sid2, H5P_DEFAULT, H5P_DEFAULT); - } - H5E_END_TRY - VERIFY(ret_id, FAIL, "H5Acreate2"); - } - - /* Write attribute information */ - ret = H5Awrite(attr, H5T_NATIVE_INT, attr_data2); - CHECK(ret, FAIL, "H5Awrite"); -#if 0 - /* Check storage size for attribute */ - attr_size = H5Aget_storage_size(attr); - VERIFY(attr_size, (ATTR2_DIM1 * ATTR2_DIM2 * sizeof(int)), "H5A_get_storage_size"); -#endif - /* Close attribute */ - ret = H5Aclose(attr); - CHECK(ret, FAIL, "H5Aclose"); - - /* Close Attribute dataspace */ - ret = H5Sclose(sid2); - CHECK(ret, FAIL, "H5Sclose"); - - /* Close Group */ - ret = H5Gclose(group); - CHECK(ret, FAIL, "H5Gclose"); - - /* Close file */ - ret = H5Fclose(fid1); - CHECK(ret, FAIL, "H5Fclose"); -} /* test_attr_basic_write() */ - -/**************************************************************** -** -** test_attr_basic_read(): Test basic H5A (attribute) code. -** -****************************************************************/ -static void -test_attr_basic_read(hid_t fapl) -{ - hid_t fid1; /* HDF5 File IDs */ - hid_t dataset; /* Dataset ID */ - hid_t group; /* Group ID */ - hid_t attr; /* Attribute ID */ - H5O_info2_t oinfo; /* Object info */ - int read_data1[ATTR1_DIM1] = {0}; /* Buffer for reading 1st attribute */ - int read_data2[ATTR2_DIM1][ATTR2_DIM2] = {{0}}; /* Buffer for reading 2nd attribute */ - int i, j; /* Local index variables */ - herr_t ret; /* Generic return value */ - - /* Output message about test being performed */ - MESSAGE(5, ("Testing Basic Attribute Functions\n")); - - /* Create file */ - fid1 = H5Fopen(FILENAME, H5F_ACC_RDWR, fapl); - CHECK(fid1, FAIL, "H5Fopen"); - - /* Open the dataset */ - dataset = H5Dopen2(fid1, DSET1_NAME, H5P_DEFAULT); - CHECK(dataset, FAIL, "H5Dopen2"); - - /* Verify the correct number of attributes */ - ret = H5Oget_info3(dataset, &oinfo, H5O_INFO_NUM_ATTRS); - CHECK(ret, FAIL, "H5Oget_info3"); - VERIFY(oinfo.num_attrs, 2, "H5Oget_info3"); - - /* Open first attribute for the dataset */ - attr = H5Aopen(dataset, ATTR_TMP_NAME, H5P_DEFAULT); - CHECK(attr, FAIL, "H5Aopen"); - - /* Read attribute information */ - ret = H5Aread(attr, H5T_NATIVE_INT, read_data1); - CHECK(ret, FAIL, "H5Aread"); - - /* Verify values read in */ - for (i = 0; i < ATTR1_DIM1; i++) - if (attr_data1[i] != read_data1[i]) - TestErrPrintf("%d: attribute data different: attr_data1[%d]=%d, read_data1[%d]=%d\n", __LINE__, i, - attr_data1[i], i, read_data1[i]); - - /* Close attribute */ - ret = H5Aclose(attr); - CHECK(ret, FAIL, "H5Aclose"); - - ret = H5Dclose(dataset); - CHECK(ret, FAIL, "H5Dclose"); - - /* Open the group */ - group = H5Gopen2(fid1, GROUP1_NAME, H5P_DEFAULT); - CHECK(group, FAIL, "H5Gopen2"); - - /* Verify the correct number of attributes */ - ret = H5Oget_info3(group, &oinfo, H5O_INFO_NUM_ATTRS); - CHECK(ret, FAIL, "H5Oget_info3"); - VERIFY(oinfo.num_attrs, 1, "H5Oget_info3"); - - /* Open the attribute for the group */ - attr = H5Aopen(group, ATTR2_NAME, H5P_DEFAULT); - CHECK(attr, FAIL, "H5Aopen"); - - /* Read attribute information */ - ret = H5Aread(attr, H5T_NATIVE_INT, read_data2); - CHECK(ret, FAIL, "H5Aread"); - - /* Verify values read in */ - for (i = 0; i < ATTR2_DIM1; i++) - for (j = 0; j < ATTR2_DIM2; j++) - if (attr_data2[i][j] != read_data2[i][j]) - TestErrPrintf("%d: attribute data different: attr_data2[%d][%d]=%d, read_data2[%d][%d]=%d\n", - __LINE__, i, j, attr_data2[i][j], i, j, read_data1[i]); - - /* Close attribute */ - ret = H5Aclose(attr); - CHECK(ret, FAIL, "H5Aclose"); - - /* Close group */ - ret = H5Gclose(group); - CHECK(ret, FAIL, "H5Gclose"); - - /* Close file */ - ret = H5Fclose(fid1); - CHECK(ret, FAIL, "H5Fclose"); -} /* test_attr_basic_read() */ - -/**************************************************************** -** -** test_attr_flush(): Test H5A (attribute) code for performing -** I/O when H5Fflush is used. -** -****************************************************************/ -static void -test_attr_flush(hid_t fapl) -{ - hid_t fil, /* File ID */ - att, /* Attribute ID */ - spc, /* Dataspace ID */ - set; /* Dataset ID */ - double wdata = 3.14159; /* Data to write */ - double rdata; /* Data read in */ - herr_t ret; /* Generic return value */ - - /* Output message about test being performed */ - MESSAGE(5, ("Testing Attribute Flushing\n")); - - fil = H5Fcreate(FILENAME, H5F_ACC_TRUNC, H5P_DEFAULT, fapl); - CHECK(fil, FAIL, "H5Fcreate"); - - spc = H5Screate(H5S_SCALAR); - CHECK(spc, FAIL, "H5Screate"); - - set = H5Dcreate2(fil, DSET1_NAME, H5T_NATIVE_DOUBLE, spc, H5P_DEFAULT, dcpl_g, H5P_DEFAULT); - CHECK(set, FAIL, "H5Dcreate2"); - - att = H5Acreate2(set, ATTR1_NAME, H5T_NATIVE_DOUBLE, spc, H5P_DEFAULT, H5P_DEFAULT); - CHECK(att, FAIL, "H5Acreate2"); - - if ((vol_cap_flags_g & H5VL_CAP_FLAG_ATTR_BASIC) && (vol_cap_flags_g & H5VL_CAP_FLAG_FILL_VALUES) && - (vol_cap_flags_g & H5VL_CAP_FLAG_FILE_MORE)) { - ret = H5Aread(att, H5T_NATIVE_DOUBLE, &rdata); - CHECK(ret, FAIL, "H5Aread"); - - if (!H5_DBL_ABS_EQUAL(rdata, 0.0)) - TestErrPrintf("attribute value wrong: rdata=%f, should be %f\n", rdata, 0.0); - - ret = H5Fflush(fil, H5F_SCOPE_GLOBAL); - CHECK(ret, FAIL, "H5Fflush"); - - ret = H5Aread(att, H5T_NATIVE_DOUBLE, &rdata); - CHECK(ret, FAIL, "H5Awrite"); - - if (!H5_DBL_ABS_EQUAL(rdata, 0.0)) - TestErrPrintf("attribute value wrong: rdata=%f, should be %f\n", rdata, 0.0); - } - else { - printf("** SKIPPED attribute pre-read due to fill values not being supported **\n"); - } - - ret = H5Awrite(att, H5T_NATIVE_DOUBLE, &wdata); - CHECK(ret, FAIL, "H5Awrite"); - - ret = H5Aread(att, H5T_NATIVE_DOUBLE, &rdata); - CHECK(ret, FAIL, "H5Awrite"); - - if (!H5_DBL_ABS_EQUAL(rdata, wdata)) - TestErrPrintf("attribute value wrong: rdata=%f, should be %f\n", rdata, wdata); - - ret = H5Sclose(spc); - CHECK(ret, FAIL, "H5Sclose"); - ret = H5Aclose(att); - CHECK(ret, FAIL, "H5Aclose"); - ret = H5Dclose(set); - CHECK(ret, FAIL, "H5Dclose"); - ret = H5Fclose(fil); - CHECK(ret, FAIL, "H5Fclose"); -} /* test_attr_flush() */ - -/**************************************************************** -** -** test_attr_plist(): Test Attribute Creation Property Lists -** -****************************************************************/ -static void -test_attr_plist(hid_t fapl) -{ - hid_t fid = H5I_INVALID_HID; /* File ID */ - hid_t did = H5I_INVALID_HID; /* Dataset ID */ - hid_t dsid = H5I_INVALID_HID; /* Dataspace ID (for dataset) */ - hid_t asid = H5I_INVALID_HID; /* Dataspace ID (for attribute) */ - hid_t aid = H5I_INVALID_HID; /* Attribute ID */ - hid_t acpl_id = H5I_INVALID_HID; /* Attribute creation property list ID */ - hid_t aapl_id = H5I_INVALID_HID; /* Attribute access property list ID */ - hsize_t dims1[] = {SPACE1_DIM1, SPACE1_DIM2, SPACE1_DIM3}; - hsize_t dims2[] = {ATTR1_DIM1}; - H5T_cset_t cset; /* Character set for attributes */ - herr_t ret; /* Generic return value */ - - /* Output message about test being performed */ - MESSAGE(5, ("Testing Attribute Property Lists\n")); - - /* Create file */ - fid = H5Fcreate(FILENAME, H5F_ACC_TRUNC, H5P_DEFAULT, fapl); - CHECK(fid, H5I_INVALID_HID, "H5Fcreate"); - - /* Create dataspace for dataset */ - dsid = H5Screate_simple(SPACE1_RANK, dims1, NULL); - CHECK(dsid, H5I_INVALID_HID, "H5Screate_simple"); - - /* Create a dataset */ - did = H5Dcreate2(fid, DSET1_NAME, H5T_NATIVE_UCHAR, dsid, H5P_DEFAULT, dcpl_g, H5P_DEFAULT); - CHECK(did, H5I_INVALID_HID, "H5Dcreate2"); - - /* Create dataspace for attribute */ - asid = H5Screate_simple(ATTR1_RANK, dims2, NULL); - CHECK(asid, H5I_INVALID_HID, "H5Screate_simple"); - - /* Create default creation property list for attribute */ - acpl_id = H5Pcreate(H5P_ATTRIBUTE_CREATE); - CHECK(acpl_id, H5I_INVALID_HID, "H5Pcreate"); - - /* Create default access property list for attribute - * This currently has no properties, but we need to test its creation - * and use. - */ - aapl_id = H5Pcreate(H5P_ATTRIBUTE_ACCESS); - CHECK(aapl_id, H5I_INVALID_HID, "H5Pcreate"); - - /* Get the character encoding and ensure that it is the default (ASCII) */ - ret = H5Pget_char_encoding(acpl_id, &cset); - CHECK(ret, FAIL, "H5Pget_char_encoding"); - VERIFY(cset, H5T_CSET_ASCII, "H5Pget_char_encoding"); - - /* Create an attribute for the dataset using the property list */ - aid = H5Acreate2(did, ATTR1_NAME, H5T_NATIVE_INT, asid, acpl_id, aapl_id); - CHECK(aid, H5I_INVALID_HID, "H5Acreate2"); - - /* Close the property list, and get the attribute's creation property list */ - ret = H5Pclose(acpl_id); - CHECK(ret, FAIL, "H5Pclose"); - acpl_id = H5Aget_create_plist(aid); - CHECK(acpl_id, H5I_INVALID_HID, "H5Aget_create_plist"); - - /* Get the character encoding and ensure that it is the default (ASCII) */ - ret = H5Pget_char_encoding(acpl_id, &cset); - CHECK(ret, FAIL, "H5Pget_char_encoding"); - VERIFY(cset, H5T_CSET_ASCII, "H5Pget_char_encoding"); - - /* Close the property list and attribute */ - ret = H5Pclose(acpl_id); - CHECK(ret, FAIL, "H5Pclose"); - ret = H5Aclose(aid); - CHECK(ret, FAIL, "H5Aclose"); - - /* Create a new property list and modify it to use a different encoding */ - acpl_id = H5Pcreate(H5P_ATTRIBUTE_CREATE); - CHECK(acpl_id, H5I_INVALID_HID, "H5Pcreate"); - ret = H5Pset_char_encoding(acpl_id, H5T_CSET_UTF8); - CHECK(ret, FAIL, "H5Pset_char_encoding"); - - /* Get the character encoding and ensure that it has been changed */ - ret = H5Pget_char_encoding(acpl_id, &cset); - CHECK(ret, FAIL, "H5Pget_char_encoding"); - VERIFY(cset, H5T_CSET_UTF8, "H5Pget_char_encoding"); - - /* Create an attribute for the dataset using the modified property list */ - aid = H5Acreate2(did, ATTR2_NAME, H5T_NATIVE_INT, asid, acpl_id, aapl_id); - CHECK(aid, H5I_INVALID_HID, "H5Acreate2"); - - /* Close the property list and attribute */ - ret = H5Pclose(acpl_id); - CHECK(ret, FAIL, "H5Pclose"); - ret = H5Aclose(aid); - CHECK(ret, FAIL, "H5Aclose"); - - /* Re-open the second attribute and ensure that its character encoding is correct */ - aid = H5Aopen(did, ATTR2_NAME, H5P_DEFAULT); - CHECK(aid, H5I_INVALID_HID, "H5Aopen"); - acpl_id = H5Aget_create_plist(aid); - CHECK(acpl_id, H5I_INVALID_HID, "H5Aget_create_plist"); - ret = H5Pget_char_encoding(acpl_id, &cset); - CHECK(ret, FAIL, "H5Pget_char_encoding"); - VERIFY(cset, H5T_CSET_UTF8, "H5Pget_char_encoding"); - - /* Close everything */ - ret = H5Sclose(dsid); - CHECK(ret, FAIL, "H5Sclose"); - ret = H5Sclose(asid); - CHECK(ret, FAIL, "H5Sclose"); - ret = H5Pclose(aapl_id); - CHECK(ret, FAIL, "H5Pclose"); - ret = H5Pclose(acpl_id); - CHECK(ret, FAIL, "H5Pclose"); - ret = H5Aclose(aid); - CHECK(ret, FAIL, "H5Aclose"); - ret = H5Dclose(did); - CHECK(ret, FAIL, "H5Dclose"); - ret = H5Fclose(fid); - CHECK(ret, FAIL, "H5Fclose"); -} /* test_attr_plist() */ - -/**************************************************************** -** -** test_attr_compound_write(): Test H5A (attribute) code. -** Tests compound datatype attributes -** -****************************************************************/ -static void -test_attr_compound_write(hid_t fapl) -{ - hid_t fid1; /* HDF5 File IDs */ - hid_t dataset; /* Dataset ID */ - hid_t tid1; /* Attribute datatype ID */ - hid_t sid1, sid2; /* Dataspace ID */ - hid_t attr; /* Attribute ID */ - hsize_t dims1[] = {SPACE1_DIM1, SPACE1_DIM2, SPACE1_DIM3}; - hsize_t dims2[] = {ATTR4_DIM1, ATTR4_DIM2}; - hid_t ret_id; /* Generic hid_t return value */ - herr_t ret; /* Generic return value */ - - /* Output message about test being performed */ - MESSAGE(5, ("Testing Multiple Attribute Functions\n")); - - /* Create file */ - fid1 = H5Fcreate(FILENAME, H5F_ACC_TRUNC, H5P_DEFAULT, fapl); - CHECK(fid1, FAIL, "H5Fcreate"); - - /* Create dataspace for dataset */ - sid1 = H5Screate_simple(SPACE1_RANK, dims1, NULL); - CHECK(sid1, FAIL, "H5Screate_simple"); - - /* Create a dataset */ - dataset = H5Dcreate2(fid1, DSET1_NAME, H5T_NATIVE_UCHAR, sid1, H5P_DEFAULT, dcpl_g, H5P_DEFAULT); - CHECK(dataset, FAIL, "H5Dcreate2"); - - /* Close dataset's dataspace */ - ret = H5Sclose(sid1); - CHECK(ret, FAIL, "H5Sclose"); - - /* Create the attribute datatype. */ - tid1 = H5Tcreate(H5T_COMPOUND, sizeof(struct attr4_struct)); - CHECK(tid1, FAIL, "H5Tcreate"); - attr4_field1_off = HOFFSET(struct attr4_struct, i); - ret = H5Tinsert(tid1, ATTR4_FIELDNAME1, attr4_field1_off, H5T_NATIVE_INT); - CHECK(ret, FAIL, "H5Tinsert"); - attr4_field2_off = HOFFSET(struct attr4_struct, d); - ret = H5Tinsert(tid1, ATTR4_FIELDNAME2, attr4_field2_off, H5T_NATIVE_DOUBLE); - CHECK(ret, FAIL, "H5Tinsert"); - attr4_field3_off = HOFFSET(struct attr4_struct, c); - ret = H5Tinsert(tid1, ATTR4_FIELDNAME3, attr4_field3_off, H5T_NATIVE_SCHAR); - CHECK(ret, FAIL, "H5Tinsert"); - - /* Create dataspace for 1st attribute */ - sid2 = H5Screate_simple(ATTR4_RANK, dims2, NULL); - CHECK(sid2, FAIL, "H5Screate_simple"); - - /* Create complex attribute for the dataset */ - attr = H5Acreate2(dataset, ATTR4_NAME, tid1, sid2, H5P_DEFAULT, H5P_DEFAULT); - CHECK(attr, FAIL, "H5Acreate2"); - - if (vol_cap_flags_g & H5VL_CAP_FLAG_ATTR_BASIC) { - /* Try to create the same attribute again (should fail) */ - H5E_BEGIN_TRY - { - ret_id = H5Acreate2(dataset, ATTR4_NAME, tid1, sid2, H5P_DEFAULT, H5P_DEFAULT); - } - H5E_END_TRY - VERIFY(ret_id, FAIL, "H5Acreate2"); - } - - /* Write complex attribute data */ - ret = H5Awrite(attr, tid1, attr_data4); - CHECK(ret, FAIL, "H5Awrite"); - - /* Close attribute */ - ret = H5Aclose(attr); - CHECK(ret, FAIL, "H5Aclose"); - - /* Close attribute's dataspace */ - ret = H5Sclose(sid2); - CHECK(ret, FAIL, "H5Sclose"); - - /* Close attribute's datatype */ - ret = H5Tclose(tid1); - CHECK(ret, FAIL, "H5Tclose"); - - /* Close Dataset */ - ret = H5Dclose(dataset); - CHECK(ret, FAIL, "H5Dclose"); - - /* Close file */ - ret = H5Fclose(fid1); - CHECK(ret, FAIL, "H5Fclose"); -} /* test_attr_compound_write() */ - -/**************************************************************** -** -** test_attr_compound_read(): Test basic H5A (attribute) code. -** -****************************************************************/ -static void -test_attr_compound_read(hid_t fapl) -{ - hid_t fid1; /* HDF5 File ID */ - hid_t dataset; /* Dataset ID */ - hid_t space; /* Attribute dataspace */ - hid_t type; /* Attribute datatype */ - hid_t attr; /* Attribute ID */ - char attr_name[ATTR_NAME_LEN]; /* Buffer for attribute names */ - int rank; /* Attribute rank */ - hsize_t dims[ATTR_MAX_DIMS]; /* Attribute dimensions */ - H5T_class_t t_class; /* Attribute datatype class */ - H5T_order_t order; /* Attribute datatype order */ - size_t size; /* Attribute datatype size as stored in file */ - int fields; /* # of Attribute datatype fields */ - char *fieldname; /* Name of a field */ - size_t offset; /* Attribute datatype field offset */ - hid_t field; /* Attribute field datatype */ - struct attr4_struct read_data4[ATTR4_DIM1][ATTR4_DIM2]; /* Buffer for reading 4th attribute */ - ssize_t name_len; /* Length of attribute name */ - H5O_info2_t oinfo; /* Object info */ - int i, j; /* Local index variables */ - herr_t ret; /* Generic return value */ - - /* Output message about test being performed */ - MESSAGE(5, ("Testing Basic Attribute Functions\n")); - - /* Open file */ - fid1 = H5Fopen(FILENAME, H5F_ACC_RDWR, fapl); - CHECK(fid1, FAIL, "H5Fopen"); - - /* Open the dataset */ - dataset = H5Dopen2(fid1, DSET1_NAME, H5P_DEFAULT); - CHECK(dataset, FAIL, "H5Dopen2"); - - /* Verify the correct number of attributes */ - ret = H5Oget_info3(dataset, &oinfo, H5O_INFO_NUM_ATTRS); - CHECK(ret, FAIL, "H5Oget_info3"); - VERIFY(oinfo.num_attrs, 1, "H5Oget_info3"); - - /* Open 1st attribute for the dataset */ - attr = - H5Aopen_by_idx(dataset, ".", H5_INDEX_CRT_ORDER, H5_ITER_INC, (hsize_t)0, H5P_DEFAULT, H5P_DEFAULT); - CHECK(attr, FAIL, "H5Aopen_by_idx"); - - /* Verify Dataspace */ - space = H5Aget_space(attr); - CHECK(space, FAIL, "H5Aget_space"); - rank = H5Sget_simple_extent_ndims(space); - VERIFY(rank, ATTR4_RANK, "H5Sget_simple_extent_ndims"); - ret = H5Sget_simple_extent_dims(space, dims, NULL); - CHECK(ret, FAIL, "H5Sget_simple_extent_dims"); - if (dims[0] != ATTR4_DIM1) - TestErrPrintf("attribute dimensions different: dims[0]=%d, should be %d\n", (int)dims[0], ATTR4_DIM1); - if (dims[1] != ATTR4_DIM2) - TestErrPrintf("attribute dimensions different: dims[1]=%d, should be %d\n", (int)dims[1], ATTR4_DIM2); - H5Sclose(space); - - /* Verify Datatype */ - type = H5Aget_type(attr); - CHECK(type, FAIL, "H5Aget_type"); - t_class = H5Tget_class(type); - VERIFY(t_class, H5T_COMPOUND, "H5Tget_class"); - fields = H5Tget_nmembers(type); - VERIFY(fields, 3, "H5Tget_nmembers"); - for (i = 0; i < fields; i++) { - fieldname = H5Tget_member_name(type, (unsigned)i); - if (!(strcmp(fieldname, ATTR4_FIELDNAME1) != 0 || strcmp(fieldname, ATTR4_FIELDNAME2) != 0 || - strcmp(fieldname, ATTR4_FIELDNAME3) != 0)) - TestErrPrintf("invalid field name for field #%d: %s\n", i, fieldname); - H5free_memory(fieldname); - } /* end for */ - offset = H5Tget_member_offset(type, 0); - VERIFY(offset, attr4_field1_off, "H5Tget_member_offset"); - offset = H5Tget_member_offset(type, 1); - VERIFY(offset, attr4_field2_off, "H5Tget_member_offset"); - offset = H5Tget_member_offset(type, 2); - VERIFY(offset, attr4_field3_off, "H5Tget_member_offset"); - - /* Verify each field's type, class & size */ - field = H5Tget_member_type(type, 0); - CHECK(field, FAIL, "H5Tget_member_type"); - t_class = H5Tget_class(field); - VERIFY(t_class, H5T_INTEGER, "H5Tget_class"); - order = H5Tget_order(field); - VERIFY_TYPE(order, H5Tget_order(H5T_NATIVE_INT), H5T_order_t, "%d", "H5Tget_order"); - size = H5Tget_size(field); - VERIFY(size, H5Tget_size(H5T_NATIVE_INT), "H5Tget_size"); - H5Tclose(field); - field = H5Tget_member_type(type, 1); - CHECK(field, FAIL, "H5Tget_member_type"); - t_class = H5Tget_class(field); - VERIFY(t_class, H5T_FLOAT, "H5Tget_class"); - order = H5Tget_order(field); - VERIFY_TYPE(order, H5Tget_order(H5T_NATIVE_DOUBLE), H5T_order_t, "%d", "H5Tget_order"); - size = H5Tget_size(field); - VERIFY(size, H5Tget_size(H5T_NATIVE_DOUBLE), "H5Tget_size"); - H5Tclose(field); - field = H5Tget_member_type(type, 2); - CHECK(field, FAIL, "H5Tget_member_type"); - t_class = H5Tget_class(field); - VERIFY(t_class, H5T_INTEGER, "H5Tget_class"); - order = H5Tget_order(field); - VERIFY_TYPE(order, H5Tget_order(H5T_NATIVE_SCHAR), H5T_order_t, "%d", "H5Tget_order"); - size = H5Tget_size(field); - VERIFY(size, H5Tget_size(H5T_NATIVE_SCHAR), "H5Tget_size"); - H5Tclose(field); - - /* Read attribute information */ - ret = H5Aread(attr, type, read_data4); - CHECK(ret, FAIL, "H5Aread"); - - /* Verify values read in */ - for (i = 0; i < ATTR4_DIM1; i++) - for (j = 0; j < ATTR4_DIM2; j++) - if (memcmp(&attr_data4[i][j], &read_data4[i][j], sizeof(struct attr4_struct)) != 0) { - printf("%d: attribute data different: attr_data4[%d][%d].i=%d, read_data4[%d][%d].i=%d\n", - __LINE__, i, j, attr_data4[i][j].i, i, j, read_data4[i][j].i); - printf("%d: attribute data different: attr_data4[%d][%d].d=%f, read_data4[%d][%d].d=%f\n", - __LINE__, i, j, attr_data4[i][j].d, i, j, read_data4[i][j].d); - TestErrPrintf( - "%d: attribute data different: attr_data4[%d][%d].c=%c, read_data4[%d][%d].c=%c\n", - __LINE__, i, j, attr_data4[i][j].c, i, j, read_data4[i][j].c); - } /* end if */ - - /* Verify Name */ - name_len = H5Aget_name(attr, (size_t)ATTR_NAME_LEN, attr_name); - VERIFY(name_len, strlen(ATTR4_NAME), "H5Aget_name"); - if (strcmp(attr_name, ATTR4_NAME) != 0) - TestErrPrintf("attribute name different: attr_name=%s, should be %s\n", attr_name, ATTR4_NAME); - - /* Close attribute datatype */ - ret = H5Tclose(type); - CHECK(ret, FAIL, "H5Tclose"); - - /* Close attribute */ - ret = H5Aclose(attr); - CHECK(ret, FAIL, "H5Aclose"); - - /* Close dataset */ - ret = H5Dclose(dataset); - CHECK(ret, FAIL, "H5Dclose"); - - /* Close file */ - ret = H5Fclose(fid1); - CHECK(ret, FAIL, "H5Fclose"); -} /* test_attr_compound_read() */ - -/**************************************************************** -** -** test_attr_scalar_write(): Test scalar H5A (attribute) writing code. -** -****************************************************************/ -static void -test_attr_scalar_write(hid_t fapl) -{ - hid_t fid1; /* HDF5 File IDs */ - hid_t dataset; /* Dataset ID */ - hid_t sid1, sid2; /* Dataspace ID */ - hid_t attr; /* Attribute ID */ - hsize_t dims1[] = {SPACE1_DIM1, SPACE1_DIM2, SPACE1_DIM3}; - hid_t ret_id; /* Generic hid_t return value */ - herr_t ret; /* Generic return value */ - - /* Output message about test being performed */ - MESSAGE(5, ("Testing Basic Attribute Functions\n")); - - /* Create file */ - fid1 = H5Fcreate(FILENAME, H5F_ACC_TRUNC, H5P_DEFAULT, fapl); - CHECK(fid1, FAIL, "H5Fcreate"); - - /* Create dataspace for dataset */ - sid1 = H5Screate_simple(SPACE1_RANK, dims1, NULL); - CHECK(sid1, FAIL, "H5Screate_simple"); - - /* Create a dataset */ - dataset = H5Dcreate2(fid1, DSET1_NAME, H5T_NATIVE_UCHAR, sid1, H5P_DEFAULT, dcpl_g, H5P_DEFAULT); - CHECK(dataset, FAIL, "H5Dcreate2"); - - /* Create dataspace for attribute */ - sid2 = H5Screate_simple(ATTR5_RANK, NULL, NULL); - CHECK(sid2, FAIL, "H5Screate_simple"); - - /* Create an attribute for the dataset */ - attr = H5Acreate2(dataset, ATTR5_NAME, H5T_NATIVE_FLOAT, sid2, H5P_DEFAULT, H5P_DEFAULT); - CHECK(attr, FAIL, "H5Acreate2"); - - if (vol_cap_flags_g & H5VL_CAP_FLAG_ATTR_BASIC) { - /* Try to create the same attribute again (should fail) */ - H5E_BEGIN_TRY - { - ret_id = H5Acreate2(dataset, ATTR5_NAME, H5T_NATIVE_FLOAT, sid2, H5P_DEFAULT, H5P_DEFAULT); - } - H5E_END_TRY - VERIFY(ret_id, FAIL, "H5Acreate2"); - } - - /* Write attribute information */ - ret = H5Awrite(attr, H5T_NATIVE_FLOAT, &attr_data5); - CHECK(ret, FAIL, "H5Awrite"); - - /* Close attribute */ - ret = H5Aclose(attr); - CHECK(ret, FAIL, "H5Aclose"); - - ret = H5Sclose(sid1); - CHECK(ret, FAIL, "H5Sclose"); - ret = H5Sclose(sid2); - CHECK(ret, FAIL, "H5Sclose"); - - /* Close Dataset */ - ret = H5Dclose(dataset); - CHECK(ret, FAIL, "H5Dclose"); - - /* Close file */ - ret = H5Fclose(fid1); - CHECK(ret, FAIL, "H5Fclose"); -} /* test_attr_scalar_write() */ - -/**************************************************************** -** -** test_attr_scalar_read(): Test scalar H5A (attribute) reading code. -** -****************************************************************/ -static void -test_attr_scalar_read(hid_t fapl) -{ - hid_t fid1; /* HDF5 File IDs */ - hid_t dataset; /* Dataset ID */ - hid_t sid; /* Dataspace ID */ - hid_t attr; /* Attribute ID */ - H5S_class_t stype; /* Dataspace class */ - float rdata = 0.0F; /* Buffer for reading 1st attribute */ - H5O_info2_t oinfo; /* Object info */ - herr_t ret; /* Generic return value */ - - /* Output message about test being performed */ - MESSAGE(5, ("Testing Basic Scalar Attribute Reading Functions\n")); - - /* Create file */ - fid1 = H5Fopen(FILENAME, H5F_ACC_RDWR, fapl); - CHECK(fid1, FAIL, "H5Fopen"); - - /* Open the dataset */ - dataset = H5Dopen2(fid1, DSET1_NAME, H5P_DEFAULT); - CHECK(dataset, FAIL, "H5Dopen2"); - - /* Verify the correct number of attributes */ - ret = H5Oget_info3(dataset, &oinfo, H5O_INFO_NUM_ATTRS); - CHECK(ret, FAIL, "H5Oget_info3"); - VERIFY(oinfo.num_attrs, 1, "H5Oget_info3"); - - /* Open an attribute for the dataset */ - attr = H5Aopen(dataset, ATTR5_NAME, H5P_DEFAULT); - CHECK(attr, FAIL, "H5Aopen"); - - /* Read attribute information */ - ret = H5Aread(attr, H5T_NATIVE_FLOAT, &rdata); - CHECK(ret, FAIL, "H5Aread"); - - /* Verify the floating-poing value in this way to avoid compiler warning. */ - if (!H5_FLT_ABS_EQUAL(rdata, attr_data5)) - printf("*** UNEXPECTED VALUE from %s should be %f, but is %f at line %4d in %s\n", "H5Aread", - (double)attr_data5, (double)rdata, (int)__LINE__, __FILE__); - - /* Get the attribute's dataspace */ - sid = H5Aget_space(attr); - CHECK(sid, FAIL, "H5Aget_space"); - - /* Make certain the dataspace is scalar */ - stype = H5Sget_simple_extent_type(sid); - VERIFY(stype, H5S_SCALAR, "H5Sget_simple_extent_type"); - - /* Close dataspace */ - ret = H5Sclose(sid); - CHECK(ret, FAIL, "H5Sclose"); - - /* Close attribute */ - ret = H5Aclose(attr); - CHECK(ret, FAIL, "H5Aclose"); - - ret = H5Dclose(dataset); - CHECK(ret, FAIL, "H5Dclose"); - - /* Close file */ - ret = H5Fclose(fid1); - CHECK(ret, FAIL, "H5Fclose"); -} /* test_attr_scalar_read() */ - -/**************************************************************** -** -** test_attr_mult_write(): Test basic H5A (attribute) code. -** Tests integer attributes on both datasets and groups -** -****************************************************************/ -static void -test_attr_mult_write(hid_t fapl) -{ - hid_t fid1; /* HDF5 File IDs */ - hid_t dataset; /* Dataset ID */ - hid_t sid1, sid2; /* Dataspace ID */ - hid_t attr; /* Attribute ID */ - hsize_t dims1[] = {SPACE1_DIM1, SPACE1_DIM2, SPACE1_DIM3}; - hsize_t dims2[] = {ATTR1_DIM1}; - hsize_t dims3[] = {ATTR2_DIM1, ATTR2_DIM2}; - hsize_t dims4[] = {ATTR3_DIM1, ATTR3_DIM2, ATTR3_DIM3}; - hid_t ret_id; /* Generic hid_t return value */ - herr_t ret; /* Generic return value */ - - /* Output message about test being performed */ - MESSAGE(5, ("Testing Multiple Attribute Functions\n")); - - /* Create file */ - fid1 = H5Fcreate(FILENAME, H5F_ACC_TRUNC, H5P_DEFAULT, fapl); - CHECK(fid1, FAIL, "H5Fcreate"); - - /* Create dataspace for dataset */ - sid1 = H5Screate_simple(SPACE1_RANK, dims1, NULL); - CHECK(sid1, FAIL, "H5Screate_simple"); - - /* Create a dataset */ - dataset = H5Dcreate2(fid1, DSET1_NAME, H5T_NATIVE_UCHAR, sid1, H5P_DEFAULT, dcpl_g, H5P_DEFAULT); - CHECK(dataset, FAIL, "H5Dcreate2"); - - /* Close dataset's dataspace */ - ret = H5Sclose(sid1); - CHECK(ret, FAIL, "H5Sclose"); - - /* Create dataspace for 1st attribute */ - sid2 = H5Screate_simple(ATTR1_RANK, dims2, NULL); - CHECK(sid2, FAIL, "H5Screate_simple"); - - /* Create 1st attribute for the dataset */ - attr = H5Acreate2(dataset, ATTR1_NAME, H5T_NATIVE_INT, sid2, H5P_DEFAULT, H5P_DEFAULT); - CHECK(attr, FAIL, "H5Acreate2"); - - if (vol_cap_flags_g & H5VL_CAP_FLAG_ATTR_BASIC) { - /* Try to create the same attribute again (should fail) */ - H5E_BEGIN_TRY - { - ret_id = H5Acreate2(dataset, ATTR1_NAME, H5T_NATIVE_INT, sid2, H5P_DEFAULT, H5P_DEFAULT); - } - H5E_END_TRY - VERIFY(ret_id, FAIL, "H5Acreate2"); - } - - /* Write 1st attribute data */ - ret = H5Awrite(attr, H5T_NATIVE_INT, attr_data1); - CHECK(ret, FAIL, "H5Awrite"); - - /* Close 1st attribute */ - ret = H5Aclose(attr); - CHECK(ret, FAIL, "H5Aclose"); - - /* Close attribute's dataspace */ - ret = H5Sclose(sid2); - CHECK(ret, FAIL, "H5Sclose"); - - /* Create dataspace for 2nd attribute */ - sid2 = H5Screate_simple(ATTR2_RANK, dims3, NULL); - CHECK(sid2, FAIL, "H5Screate_simple"); - - /* Create 2nd attribute for the dataset */ - attr = H5Acreate2(dataset, ATTR2_NAME, H5T_NATIVE_INT, sid2, H5P_DEFAULT, H5P_DEFAULT); - CHECK(attr, FAIL, "H5Acreate2"); - - if (vol_cap_flags_g & H5VL_CAP_FLAG_ATTR_BASIC) { - /* Try to create the same attribute again (should fail) */ - H5E_BEGIN_TRY - { - ret_id = H5Acreate2(dataset, ATTR2_NAME, H5T_NATIVE_INT, sid2, H5P_DEFAULT, H5P_DEFAULT); - } - H5E_END_TRY - VERIFY(ret_id, FAIL, "H5Acreate2"); - } - - /* Write 2nd attribute information */ - ret = H5Awrite(attr, H5T_NATIVE_INT, attr_data2); - CHECK(ret, FAIL, "H5Awrite"); - - /* Close 2nd attribute */ - ret = H5Aclose(attr); - CHECK(ret, FAIL, "H5Aclose"); - - /* Close 2nd attribute's dataspace */ - ret = H5Sclose(sid2); - CHECK(ret, FAIL, "H5Sclose"); - - /* Create dataspace for 3rd attribute */ - sid2 = H5Screate_simple(ATTR3_RANK, dims4, NULL); - CHECK(sid2, FAIL, "H5Screate_simple"); - - /* Create 3rd attribute for the dataset */ - attr = H5Acreate2(dataset, ATTR3_NAME, H5T_NATIVE_DOUBLE, sid2, H5P_DEFAULT, H5P_DEFAULT); - CHECK(attr, FAIL, "H5Acreate2"); - - if (vol_cap_flags_g & H5VL_CAP_FLAG_ATTR_BASIC) { - /* Try to create the same attribute again (should fail) */ - H5E_BEGIN_TRY - { - ret_id = H5Acreate2(dataset, ATTR3_NAME, H5T_NATIVE_DOUBLE, sid2, H5P_DEFAULT, H5P_DEFAULT); - } - H5E_END_TRY - VERIFY(ret_id, FAIL, "H5Acreate2"); - } - - /* Write 3rd attribute information */ - ret = H5Awrite(attr, H5T_NATIVE_DOUBLE, attr_data3); - CHECK(ret, FAIL, "H5Awrite"); - - /* Close 3rd attribute */ - ret = H5Aclose(attr); - CHECK(ret, FAIL, "H5Aclose"); - - /* Close 3rd attribute's dataspace */ - ret = H5Sclose(sid2); - CHECK(ret, FAIL, "H5Sclose"); - - /* Close Dataset */ - ret = H5Dclose(dataset); - CHECK(ret, FAIL, "H5Dclose"); - - /* Close file */ - ret = H5Fclose(fid1); - CHECK(ret, FAIL, "H5Fclose"); -} /* test_attr_mult_write() */ - -/**************************************************************** -** -** test_attr_mult_read(): Test basic H5A (attribute) code. -** -****************************************************************/ -static void -test_attr_mult_read(hid_t fapl) -{ - hid_t fid1; /* HDF5 File ID */ - hid_t dataset; /* Dataset ID */ - hid_t space; /* Attribute dataspace */ - hid_t type; /* Attribute datatype */ - hid_t attr; /* Attribute ID */ - char attr_name[ATTR_NAME_LEN]; /* Buffer for attribute names */ - char temp_name[ATTR_NAME_LEN]; /* Buffer for mangling attribute names */ - int rank; /* Attribute rank */ - hsize_t dims[ATTR_MAX_DIMS]; /* Attribute dimensions */ - H5T_class_t t_class; /* Attribute datatype class */ - H5T_order_t order; /* Attribute datatype order */ - size_t size; /* Attribute datatype size as stored in file */ - int read_data1[ATTR1_DIM1] = {0}; /* Buffer for reading 1st attribute */ - int read_data2[ATTR2_DIM1][ATTR2_DIM2] = {{0}}; /* Buffer for reading 2nd attribute */ - double read_data3[ATTR3_DIM1][ATTR3_DIM2][ATTR3_DIM3] = {{{0}}}; /* Buffer for reading 3rd attribute */ - ssize_t name_len; /* Length of attribute name */ - H5O_info2_t oinfo; /* Object info */ - int i, j, k; /* Local index values */ - herr_t ret; /* Generic return value */ - - /* Output message about test being performed */ - MESSAGE(5, ("Testing Basic Attribute Functions\n")); - - /* Open file */ - fid1 = H5Fopen(FILENAME, H5F_ACC_RDWR, fapl); - CHECK(fid1, FAIL, "H5Fopen"); - - /* Open the dataset */ - dataset = H5Dopen2(fid1, DSET1_NAME, H5P_DEFAULT); - CHECK(dataset, FAIL, "H5Dopen2"); - - /* Verify the correct number of attributes */ - ret = H5Oget_info3(dataset, &oinfo, H5O_INFO_NUM_ATTRS); - CHECK(ret, FAIL, "H5Oget_info3"); - VERIFY(oinfo.num_attrs, 3, "H5Oget_info3"); - - /* Open 1st attribute for the dataset */ - attr = - H5Aopen_by_idx(dataset, ".", H5_INDEX_CRT_ORDER, H5_ITER_INC, (hsize_t)0, H5P_DEFAULT, H5P_DEFAULT); - CHECK(attr, FAIL, "H5Aopen_by_idx"); - - /* Verify Dataspace */ - space = H5Aget_space(attr); - CHECK(space, FAIL, "H5Aget_space"); - rank = H5Sget_simple_extent_ndims(space); - VERIFY(rank, ATTR1_RANK, "H5Sget_simple_extent_ndims"); - ret = H5Sget_simple_extent_dims(space, dims, NULL); - CHECK(ret, FAIL, "H5Sget_simple_extent_dims"); - if (dims[0] != ATTR1_DIM1) - TestErrPrintf("attribute dimensions different: dims[0]=%d, should be %d\n", (int)dims[0], ATTR1_DIM1); - H5Sclose(space); - - /* Verify Datatype */ - type = H5Aget_type(attr); - CHECK(type, FAIL, "H5Aget_type"); - t_class = H5Tget_class(type); - VERIFY(t_class, H5T_INTEGER, "H5Tget_class"); - order = H5Tget_order(type); - VERIFY_TYPE(order, H5Tget_order(H5T_NATIVE_INT), H5T_order_t, "%d", "H5Tget_order"); - size = H5Tget_size(type); - VERIFY(size, H5Tget_size(H5T_NATIVE_INT), "H5Tget_size"); - H5Tclose(type); - - /* Read attribute information */ - ret = H5Aread(attr, H5T_NATIVE_INT, read_data1); - CHECK(ret, FAIL, "H5Aread"); - - /* Verify values read in */ - for (i = 0; i < ATTR1_DIM1; i++) - if (attr_data1[i] != read_data1[i]) - TestErrPrintf("%d: attribute data different: attr_data1[%d]=%d, read_data1[%d]=%d\n", __LINE__, i, - attr_data1[i], i, read_data1[i]); - - /* Verify Name */ - name_len = H5Aget_name(attr, (size_t)ATTR_NAME_LEN, attr_name); - VERIFY(name_len, strlen(ATTR1_NAME), "H5Aget_name"); - if (strcmp(attr_name, ATTR1_NAME) != 0) - TestErrPrintf("attribute name different: attr_name=%s, should be %s\n", attr_name, ATTR1_NAME); - - /* Verify Name with too small of a buffer */ - name_len = H5Aget_name(attr, strlen(ATTR1_NAME), attr_name); - VERIFY(name_len, strlen(ATTR1_NAME), "H5Aget_name"); - strcpy(temp_name, ATTR1_NAME); /* make a copy of the name */ - temp_name[strlen(ATTR1_NAME) - 1] = '\0'; /* truncate it to match the one retrieved */ - if (strcmp(attr_name, temp_name) != 0) - TestErrPrintf("attribute name different: attr_name=%s, should be %s\n", attr_name, temp_name); - - /* Close attribute */ - ret = H5Aclose(attr); - CHECK(ret, FAIL, "H5Aclose"); - - /* Open 2nd attribute for the dataset */ - attr = - H5Aopen_by_idx(dataset, ".", H5_INDEX_CRT_ORDER, H5_ITER_INC, (hsize_t)1, H5P_DEFAULT, H5P_DEFAULT); - CHECK(attr, FAIL, "H5Aopen_by_idx"); - - /* Verify Dataspace */ - space = H5Aget_space(attr); - CHECK(space, FAIL, "H5Aget_space"); - rank = H5Sget_simple_extent_ndims(space); - VERIFY(rank, ATTR2_RANK, "H5Sget_simple_extent_ndims"); - ret = H5Sget_simple_extent_dims(space, dims, NULL); - CHECK(ret, FAIL, "H5Sget_simple_extent_dims"); - if (dims[0] != ATTR2_DIM1) - TestErrPrintf("attribute dimensions different: dims[0]=%d, should be %d\n", (int)dims[0], ATTR2_DIM1); - if (dims[1] != ATTR2_DIM2) - TestErrPrintf("attribute dimensions different: dims[1]=%d, should be %d\n", (int)dims[1], ATTR2_DIM2); - H5Sclose(space); - - /* Verify Datatype */ - type = H5Aget_type(attr); - CHECK(type, FAIL, "H5Aget_type"); - t_class = H5Tget_class(type); - VERIFY(t_class, H5T_INTEGER, "H5Tget_class"); - order = H5Tget_order(type); - VERIFY_TYPE(order, H5Tget_order(H5T_NATIVE_INT), H5T_order_t, "%d", "H5Tget_order"); - size = H5Tget_size(type); - VERIFY(size, H5Tget_size(H5T_NATIVE_INT), "H5Tget_size"); - H5Tclose(type); - - /* Read attribute information */ - ret = H5Aread(attr, H5T_NATIVE_INT, read_data2); - CHECK(ret, FAIL, "H5Aread"); - - /* Verify values read in */ - for (i = 0; i < ATTR2_DIM1; i++) - for (j = 0; j < ATTR2_DIM2; j++) - if (attr_data2[i][j] != read_data2[i][j]) - TestErrPrintf("%d: attribute data different: attr_data2[%d][%d]=%d, read_data2[%d][%d]=%d\n", - __LINE__, i, j, attr_data2[i][j], i, j, read_data2[i][j]); - - /* Verify Name */ - name_len = H5Aget_name(attr, (size_t)ATTR_NAME_LEN, attr_name); - VERIFY(name_len, strlen(ATTR2_NAME), "H5Aget_name"); - if (strcmp(attr_name, ATTR2_NAME) != 0) - TestErrPrintf("attribute name different: attr_name=%s, should be %s\n", attr_name, ATTR2_NAME); - - /* Verify Name with too small of a buffer */ - name_len = H5Aget_name(attr, strlen(ATTR2_NAME), attr_name); - VERIFY(name_len, strlen(ATTR2_NAME), "H5Aget_name"); - strcpy(temp_name, ATTR2_NAME); /* make a copy of the name */ - temp_name[strlen(ATTR2_NAME) - 1] = '\0'; /* truncate it to match the one retrieved */ - if (strcmp(attr_name, temp_name) != 0) - TestErrPrintf("attribute name different: attr_name=%s, should be %s\n", attr_name, temp_name); - - /* Close attribute */ - ret = H5Aclose(attr); - CHECK(ret, FAIL, "H5Aclose"); - - /* Open 2nd attribute for the dataset */ - attr = - H5Aopen_by_idx(dataset, ".", H5_INDEX_CRT_ORDER, H5_ITER_INC, (hsize_t)2, H5P_DEFAULT, H5P_DEFAULT); - CHECK(attr, FAIL, "H5Aopen_by_idx"); - - /* Verify Dataspace */ - space = H5Aget_space(attr); - CHECK(space, FAIL, "H5Aget_space"); - rank = H5Sget_simple_extent_ndims(space); - VERIFY(rank, ATTR3_RANK, "H5Sget_simple_extent_ndims"); - ret = H5Sget_simple_extent_dims(space, dims, NULL); - CHECK(ret, FAIL, "H5Sget_simple_extent_dims"); - if (dims[0] != ATTR3_DIM1) - TestErrPrintf("attribute dimensions different: dims[0]=%d, should be %d\n", (int)dims[0], ATTR3_DIM1); - if (dims[1] != ATTR3_DIM2) - TestErrPrintf("attribute dimensions different: dims[1]=%d, should be %d\n", (int)dims[1], ATTR3_DIM2); - if (dims[2] != ATTR3_DIM3) - TestErrPrintf("attribute dimensions different: dims[2]=%d, should be %d\n", (int)dims[2], ATTR3_DIM3); - H5Sclose(space); - - /* Verify Datatype */ - type = H5Aget_type(attr); - CHECK(type, FAIL, "H5Aget_type"); - t_class = H5Tget_class(type); - VERIFY(t_class, H5T_FLOAT, "H5Tget_class"); - order = H5Tget_order(type); - VERIFY_TYPE(order, H5Tget_order(H5T_NATIVE_DOUBLE), H5T_order_t, "%d", "H5Tget_order"); - size = H5Tget_size(type); - VERIFY(size, H5Tget_size(H5T_NATIVE_DOUBLE), "H5Tget_size"); - H5Tclose(type); - - /* Read attribute information */ - ret = H5Aread(attr, H5T_NATIVE_DOUBLE, read_data3); - CHECK(ret, FAIL, "H5Aread"); - - /* Verify values read in */ - for (i = 0; i < ATTR3_DIM1; i++) - for (j = 0; j < ATTR3_DIM2; j++) - for (k = 0; k < ATTR3_DIM3; k++) - if (!H5_DBL_ABS_EQUAL(attr_data3[i][j][k], read_data3[i][j][k])) - TestErrPrintf("%d: attribute data different: attr_data3[%d][%d][%d]=%f, " - "read_data3[%d][%d][%d]=%f\n", - __LINE__, i, j, k, attr_data3[i][j][k], i, j, k, read_data3[i][j][k]); - - /* Verify Name */ - name_len = H5Aget_name(attr, (size_t)ATTR_NAME_LEN, attr_name); - VERIFY(name_len, strlen(ATTR3_NAME), "H5Aget_name"); - if (strcmp(attr_name, ATTR3_NAME) != 0) - TestErrPrintf("attribute name different: attr_name=%s, should be %s\n", attr_name, ATTR3_NAME); - - /* Verify Name with too small of a buffer */ - name_len = H5Aget_name(attr, strlen(ATTR3_NAME), attr_name); - VERIFY(name_len, strlen(ATTR3_NAME), "H5Aget_name"); - strcpy(temp_name, ATTR3_NAME); /* make a copy of the name */ - temp_name[strlen(ATTR3_NAME) - 1] = '\0'; /* truncate it to match the one retrieved */ - if (strcmp(attr_name, temp_name) != 0) - TestErrPrintf("attribute name different: attr_name=%s, should be %s\n", attr_name, temp_name); - - /* Close attribute */ - ret = H5Aclose(attr); - CHECK(ret, FAIL, "H5Aclose"); - - /* Close dataset */ - ret = H5Dclose(dataset); - CHECK(ret, FAIL, "H5Dclose"); - - /* Close file */ - ret = H5Fclose(fid1); - CHECK(ret, FAIL, "H5Fclose"); -} /* test_attr_mult_read() */ - -/**************************************************************** -** -** attr_op1(): Attribute operator -** -****************************************************************/ -static herr_t -attr_op1(hid_t H5_ATTR_UNUSED loc_id, const char *name, const H5A_info_t H5_ATTR_UNUSED *ainfo, void *op_data) -{ - int *count = (int *)op_data; - herr_t ret = 0; - - switch (*count) { - case 0: - if (strcmp(name, ATTR1_NAME) != 0) - TestErrPrintf("attribute name different: name=%s, should be %s\n", name, ATTR1_NAME); - (*count)++; - break; - - case 1: - if (strcmp(name, ATTR2_NAME) != 0) - TestErrPrintf("attribute name different: name=%s, should be %s\n", name, ATTR2_NAME); - (*count)++; - break; - - case 2: - if (strcmp(name, ATTR3_NAME) != 0) - TestErrPrintf("attribute name different: name=%s, should be %s\n", name, ATTR3_NAME); - (*count)++; - break; - - default: - ret = -1; - break; - } /* end switch() */ - - return (ret); -} /* end attr_op1() */ - -/**************************************************************** -** -** test_attr_iterate(): Test H5A (attribute) iterator code. -** -****************************************************************/ -static void -test_attr_iterate(hid_t fapl) -{ - hid_t file; /* HDF5 File ID */ - hid_t dataset; /* Dataset ID */ - hid_t sid; /* Dataspace ID */ - int count; /* operator data for the iterator */ - H5O_info2_t oinfo; /* Object info */ - herr_t ret; /* Generic return value */ - - /* Output message about test being performed */ - MESSAGE(5, ("Testing Basic Attribute Functions\n")); - - /* Open file */ - file = H5Fopen(FILENAME, H5F_ACC_RDWR, fapl); - CHECK(file, FAIL, "H5Fopen"); - - /* Create a dataspace */ - sid = H5Screate(H5S_SCALAR); - CHECK(sid, FAIL, "H5Screate"); - - /* Create a new dataset */ - dataset = H5Dcreate2(file, DSET2_NAME, H5T_NATIVE_INT, sid, H5P_DEFAULT, dcpl_g, H5P_DEFAULT); - CHECK(dataset, FAIL, "H5Dcreate2"); - - /* Close dataspace */ - ret = H5Sclose(sid); - CHECK(ret, FAIL, "H5Sclose"); - - /* Verify the correct number of attributes */ - ret = H5Oget_info3(dataset, &oinfo, H5O_INFO_NUM_ATTRS); - CHECK(ret, FAIL, "H5Oget_info3"); - VERIFY(oinfo.num_attrs, 0, "H5Oget_info3"); - - /* Iterate over attributes on dataset */ - count = 0; - ret = H5Aiterate2(dataset, H5_INDEX_NAME, H5_ITER_INC, NULL, attr_op1, &count); - VERIFY(ret, 0, "H5Aiterate2"); - - /* Close dataset */ - ret = H5Dclose(dataset); - CHECK(ret, FAIL, "H5Dclose"); - - /* Open existing dataset w/attributes */ - dataset = H5Dopen2(file, DSET1_NAME, H5P_DEFAULT); - CHECK(dataset, FAIL, "H5Dopen2"); - - /* Verify the correct number of attributes */ - ret = H5Oget_info3(dataset, &oinfo, H5O_INFO_NUM_ATTRS); - CHECK(ret, FAIL, "H5Oget_info3"); - VERIFY(oinfo.num_attrs, 3, "H5Oget_info3"); - - /* Iterate over attributes on dataset */ - count = 0; - ret = H5Aiterate2(dataset, H5_INDEX_NAME, H5_ITER_INC, NULL, attr_op1, &count); - VERIFY(ret, 0, "H5Aiterate2"); - - /* Close dataset */ - ret = H5Dclose(dataset); - CHECK(ret, FAIL, "H5Dclose"); - - /* Close file */ - ret = H5Fclose(file); - CHECK(ret, FAIL, "H5Fclose"); -} /* test_attr_iterate() */ - -/**************************************************************** -** -** test_attr_delete(): Test H5A (attribute) code for deleting objects. -** -****************************************************************/ -static void -test_attr_delete(hid_t fapl) -{ - hid_t fid1; /* HDF5 File ID */ - hid_t dataset; /* Dataset ID */ - hid_t attr; /* Attribute ID */ - char attr_name[ATTR_NAME_LEN]; /* Buffer for attribute names */ - ssize_t name_len; /* Length of attribute name */ - H5O_info2_t oinfo; /* Object info */ - herr_t ret; /* Generic return value */ - - /* Output message about test being performed */ - MESSAGE(5, ("Testing Basic Attribute Deletion Functions\n")); - - /* Open file */ - fid1 = H5Fopen(FILENAME, H5F_ACC_RDWR, fapl); - CHECK(fid1, FAIL, "H5Fopen"); - - /* Open the dataset */ - dataset = H5Dopen2(fid1, DSET1_NAME, H5P_DEFAULT); - CHECK(dataset, FAIL, "H5Dopen2"); - - /* Verify the correct number of attributes */ - ret = H5Oget_info3(dataset, &oinfo, H5O_INFO_NUM_ATTRS); - CHECK(ret, FAIL, "H5Oget_info3"); - VERIFY(oinfo.num_attrs, 3, "H5Oget_info3"); - - if (vol_cap_flags_g & H5VL_CAP_FLAG_ATTR_BASIC) { - /* Try to delete bogus attribute */ - H5E_BEGIN_TRY - { - ret = H5Adelete(dataset, "Bogus"); - } - H5E_END_TRY - VERIFY(ret, FAIL, "H5Adelete"); - } - - /* Verify the correct number of attributes */ - ret = H5Oget_info3(dataset, &oinfo, H5O_INFO_NUM_ATTRS); - CHECK(ret, FAIL, "H5Oget_info3"); - VERIFY(oinfo.num_attrs, 3, "H5Oget_info3"); - - /* Delete middle (2nd) attribute */ - ret = H5Adelete(dataset, ATTR2_NAME); - CHECK(ret, FAIL, "H5Adelete"); - - /* Verify the correct number of attributes */ - ret = H5Oget_info3(dataset, &oinfo, H5O_INFO_NUM_ATTRS); - CHECK(ret, FAIL, "H5Oget_info3"); - VERIFY(oinfo.num_attrs, 2, "H5Oget_info3"); - - /* Open 1st attribute for the dataset */ - attr = - H5Aopen_by_idx(dataset, ".", H5_INDEX_CRT_ORDER, H5_ITER_INC, (hsize_t)0, H5P_DEFAULT, H5P_DEFAULT); - CHECK(attr, FAIL, "H5Aopen_by_idx"); - - /* Verify Name */ - name_len = H5Aget_name(attr, (size_t)ATTR_NAME_LEN, attr_name); - VERIFY(name_len, strlen(ATTR1_NAME), "H5Aget_name"); - if (strcmp(attr_name, ATTR1_NAME) != 0) - TestErrPrintf("attribute name different: attr_name=%s, should be %s\n", attr_name, ATTR1_NAME); - - /* Close attribute */ - ret = H5Aclose(attr); - CHECK(ret, FAIL, "H5Aclose"); - - /* Open last (formally 3rd) attribute for the dataset */ - attr = - H5Aopen_by_idx(dataset, ".", H5_INDEX_CRT_ORDER, H5_ITER_INC, (hsize_t)1, H5P_DEFAULT, H5P_DEFAULT); - CHECK(attr, FAIL, "H5Aopen_by_idx"); - - /* Verify Name */ - name_len = H5Aget_name(attr, (size_t)ATTR_NAME_LEN, attr_name); - VERIFY(name_len, strlen(ATTR3_NAME), "H5Aget_name"); - if (strcmp(attr_name, ATTR3_NAME) != 0) - TestErrPrintf("attribute name different: attr_name=%s, should be %s\n", attr_name, ATTR3_NAME); - - /* Close attribute */ - ret = H5Aclose(attr); - CHECK(ret, FAIL, "H5Aclose"); - - /* Delete first attribute */ - ret = H5Adelete(dataset, ATTR1_NAME); - CHECK(ret, FAIL, "H5Adelete"); - - /* Verify the correct number of attributes */ - ret = H5Oget_info3(dataset, &oinfo, H5O_INFO_NUM_ATTRS); - CHECK(ret, FAIL, "H5Oget_info3"); - VERIFY(oinfo.num_attrs, 1, "H5Oget_info3"); - - /* Open last (formally 3rd) attribute for the dataset */ - attr = - H5Aopen_by_idx(dataset, ".", H5_INDEX_CRT_ORDER, H5_ITER_INC, (hsize_t)0, H5P_DEFAULT, H5P_DEFAULT); - CHECK(attr, FAIL, "H5Aopen_by_idx"); - - /* Verify Name */ - name_len = H5Aget_name(attr, (size_t)ATTR_NAME_LEN, attr_name); - VERIFY(name_len, strlen(ATTR3_NAME), "H5Aget_name"); - if (strcmp(attr_name, ATTR3_NAME) != 0) - TestErrPrintf("attribute name different: attr_name=%s, should be %s\n", attr_name, ATTR3_NAME); - - /* Close attribute */ - ret = H5Aclose(attr); - CHECK(ret, FAIL, "H5Aclose"); - - /* Delete first attribute */ - ret = H5Adelete(dataset, ATTR3_NAME); - CHECK(ret, FAIL, "H5Adelete"); - - /* Verify the correct number of attributes */ - ret = H5Oget_info3(dataset, &oinfo, H5O_INFO_NUM_ATTRS); - CHECK(ret, FAIL, "H5Oget_info3"); - VERIFY(oinfo.num_attrs, 0, "H5Oget_info3"); - - /* Close dataset */ - ret = H5Dclose(dataset); - CHECK(ret, FAIL, "H5Dclose"); - - /* Close file */ - ret = H5Fclose(fid1); - CHECK(ret, FAIL, "H5Fclose"); -} /* test_attr_delete() */ - -/**************************************************************** -** -** test_attr_dtype_shared(): Test H5A (attribute) code for using -** shared datatypes in attributes. -** -****************************************************************/ -static void -test_attr_dtype_shared(hid_t fapl) -{ - hid_t file_id; /* File ID */ - hid_t dset_id; /* Dataset ID */ - hid_t space_id; /* Dataspace ID for dataset & attribute */ - hid_t type_id; /* Datatype ID for named datatype */ - hid_t attr_id; /* Attribute ID */ - int data = 8; /* Data to write */ - int rdata = 0; /* Read read in */ - H5O_info2_t oinfo; /* Object's information */ -#if 0 - h5_stat_size_t empty_filesize; /* Size of empty file */ - h5_stat_size_t filesize; /* Size of file after modifications */ -#endif - herr_t ret; /* Generic return value */ - - /* Output message about test being performed */ - MESSAGE(5, ("Testing Shared Datatypes with Attributes\n")); - - if ((vol_cap_flags_g & H5VL_CAP_FLAG_STORED_DATATYPES) && (vol_cap_flags_g & H5VL_CAP_FLAG_FILE_BASIC)) { - /* Create a file */ - file_id = H5Fcreate(FILENAME, H5F_ACC_TRUNC, H5P_DEFAULT, fapl); - CHECK(file_id, FAIL, "H5Fopen"); - - /* Close file */ - ret = H5Fclose(file_id); - CHECK(ret, FAIL, "H5Fclose"); -#if 0 - /* Get size of file */ - empty_filesize = h5_get_file_size(FILENAME, fapl); - if (empty_filesize < 0) - TestErrPrintf("Line %d: file size wrong!\n", __LINE__); -#endif - - /* Re-open file */ - file_id = H5Fopen(FILENAME, H5F_ACC_RDWR, fapl); - CHECK(file_id, FAIL, "H5Fopen"); - - /* Create a datatype to commit and use */ - type_id = H5Tcopy(H5T_NATIVE_INT); - CHECK(type_id, FAIL, "H5Tcopy"); - - /* Commit datatype to file */ - ret = H5Tcommit2(file_id, TYPE1_NAME, type_id, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT); - CHECK(ret, FAIL, "H5Tcommit2"); - - /* Check reference count on named datatype */ - ret = H5Oget_info_by_name3(file_id, TYPE1_NAME, &oinfo, H5O_INFO_BASIC, H5P_DEFAULT); - CHECK(ret, FAIL, "H5Oget_info_by_name3"); - VERIFY(oinfo.rc, 1, "H5Oget_info_by_name3"); - - /* Create dataspace for dataset */ - space_id = H5Screate(H5S_SCALAR); - CHECK(space_id, FAIL, "H5Screate"); - - /* Create dataset */ - dset_id = H5Dcreate2(file_id, DSET1_NAME, type_id, space_id, H5P_DEFAULT, dcpl_g, H5P_DEFAULT); - CHECK(dset_id, FAIL, "H5Dcreate2"); - - /* Check reference count on named datatype */ - ret = H5Oget_info_by_name3(file_id, TYPE1_NAME, &oinfo, H5O_INFO_BASIC, H5P_DEFAULT); - CHECK(ret, FAIL, "H5Oget_info_by_name3"); - VERIFY(oinfo.rc, 2, "H5Oget_info_by_name3"); - - /* Create attribute on dataset */ - attr_id = H5Acreate2(dset_id, ATTR1_NAME, type_id, space_id, H5P_DEFAULT, H5P_DEFAULT); - CHECK(attr_id, FAIL, "H5Acreate2"); - - /* Check reference count on named datatype */ - ret = H5Oget_info_by_name3(file_id, TYPE1_NAME, &oinfo, H5O_INFO_BASIC, H5P_DEFAULT); - CHECK(ret, FAIL, "H5Oget_info_by_name3"); - VERIFY(oinfo.rc, 3, "H5Oget_info_by_name3"); - - /* Close attribute */ - ret = H5Aclose(attr_id); - CHECK(ret, FAIL, "H5Aclose"); - - /* Delete attribute */ - ret = H5Adelete(dset_id, ATTR1_NAME); - CHECK(ret, FAIL, "H5Adelete"); - - /* Check reference count on named datatype */ - ret = H5Oget_info_by_name3(file_id, TYPE1_NAME, &oinfo, H5O_INFO_BASIC, H5P_DEFAULT); - CHECK(ret, FAIL, "H5Oget_info_by_name3"); - VERIFY(oinfo.rc, 2, "H5Oget_info_by_name3"); - - /* Create attribute on dataset */ - attr_id = H5Acreate2(dset_id, ATTR1_NAME, type_id, space_id, H5P_DEFAULT, H5P_DEFAULT); - CHECK(attr_id, FAIL, "H5Acreate2"); - - /* Check reference count on named datatype */ - ret = H5Oget_info_by_name3(file_id, TYPE1_NAME, &oinfo, H5O_INFO_BASIC, H5P_DEFAULT); - CHECK(ret, FAIL, "H5Oget_info_by_name3"); - VERIFY(oinfo.rc, 3, "H5Oget_info_by_name3"); - - /* Write data into the attribute */ - ret = H5Awrite(attr_id, H5T_NATIVE_INT, &data); - CHECK(ret, FAIL, "H5Awrite"); - - /* Close attribute */ - ret = H5Aclose(attr_id); - CHECK(ret, FAIL, "H5Aclose"); - - /* Close dataset */ - ret = H5Dclose(dset_id); - CHECK(ret, FAIL, "H5Dclose"); - - /* Close dataspace */ - ret = H5Sclose(space_id); - CHECK(ret, FAIL, "H5Sclose"); - - /* Close datatype */ - ret = H5Tclose(type_id); - CHECK(ret, FAIL, "H5Tclose"); - - /* Close file */ - ret = H5Fclose(file_id); - CHECK(ret, FAIL, "H5Fclose"); - - /* Re-open file */ - file_id = H5Fopen(FILENAME, H5F_ACC_RDWR, fapl); - CHECK(file_id, FAIL, "H5Fopen"); - - /* Open dataset */ - dset_id = H5Dopen2(file_id, DSET1_NAME, H5P_DEFAULT); - CHECK(dset_id, FAIL, "H5Dopen2"); - - /* Open attribute */ - attr_id = H5Aopen(dset_id, ATTR1_NAME, H5P_DEFAULT); - CHECK(attr_id, FAIL, "H5Aopen"); - - /* Read data from the attribute */ - ret = H5Aread(attr_id, H5T_NATIVE_INT, &rdata); - CHECK(ret, FAIL, "H5Aread"); - VERIFY(data, rdata, "H5Aread"); - - /* Close attribute */ - ret = H5Aclose(attr_id); - CHECK(ret, FAIL, "H5Aclose"); - - /* Close dataset */ - ret = H5Dclose(dset_id); - CHECK(ret, FAIL, "H5Dclose"); - - /* Check reference count on named datatype */ - ret = H5Oget_info_by_name3(file_id, TYPE1_NAME, &oinfo, H5O_INFO_BASIC, H5P_DEFAULT); - CHECK(ret, FAIL, "H5Oget_info_by_name3"); - VERIFY(oinfo.rc, 3, "H5Oget_info_by_name3"); - - /* Unlink the dataset */ - ret = H5Ldelete(file_id, DSET1_NAME, H5P_DEFAULT); - CHECK(ret, FAIL, "H5Ldelete"); - - /* Check reference count on named datatype */ - ret = H5Oget_info_by_name3(file_id, TYPE1_NAME, &oinfo, H5O_INFO_BASIC, H5P_DEFAULT); - CHECK(ret, FAIL, "H5Oget_info_by_name3"); - VERIFY(oinfo.rc, 1, "H5Oget_info_by_name3"); - - /* Unlink the named datatype */ - ret = H5Ldelete(file_id, TYPE1_NAME, H5P_DEFAULT); - CHECK(ret, FAIL, "H5Ldelete"); - - /* Close file */ - ret = H5Fclose(file_id); - CHECK(ret, FAIL, "H5Fclose"); -#if 0 - /* Check size of file */ - filesize = h5_get_file_size(FILENAME, fapl); - VERIFY(filesize, empty_filesize, "h5_get_file_size"); -#endif - } -} /* test_attr_dtype_shared() */ - -/**************************************************************** -** -** test_attr_duplicate_ids(): Test operations with more than -** one ID handles. -** -****************************************************************/ -static void -test_attr_duplicate_ids(hid_t fapl) -{ - hid_t fid1; /* HDF5 File IDs */ - hid_t dataset; /* Dataset ID */ - hid_t gid1, gid2; /* Group ID */ - hid_t sid1, sid2; /* Dataspace ID */ - hid_t attr, attr2; /* Attribute ID */ - hsize_t dims1[] = {SPACE1_DIM1, SPACE1_DIM2, SPACE1_DIM3}; - hsize_t dims2[] = {ATTR1_DIM1}; - int read_data1[ATTR1_DIM1] = {0}; /* Buffer for reading 1st attribute */ - int rewrite_data[ATTR1_DIM1] = {1234, -423, 9907256}; /* Test data for rewrite */ - int i; - herr_t ret; /* Generic return value */ - - /* Output message about test being performed */ - MESSAGE(5, ("Testing operations with two ID handles\n")); - - /*----------------------------------------------------------------------------------- - * Create an attribute in a new file and fill it with fill value. - */ - /* Create file */ - fid1 = H5Fcreate(FILENAME, H5F_ACC_TRUNC, H5P_DEFAULT, fapl); - CHECK(fid1, FAIL, "H5Fcreate"); - - /* Create dataspace for dataset */ - sid1 = H5Screate_simple(SPACE1_RANK, dims1, NULL); - CHECK(sid1, FAIL, "H5Screate_simple"); - - /* Create a dataset */ - dataset = H5Dcreate2(fid1, DSET1_NAME, H5T_NATIVE_UCHAR, sid1, H5P_DEFAULT, dcpl_g, H5P_DEFAULT); - CHECK(dataset, FAIL, "H5Dcreate2"); - - /* Create dataspace for attribute */ - sid2 = H5Screate_simple(ATTR1_RANK, dims2, NULL); - CHECK(sid2, FAIL, "H5Screate_simple"); - - /* Try to create an attribute on the dataset */ - attr = H5Acreate2(dataset, ATTR1_NAME, H5T_NATIVE_INT, sid2, H5P_DEFAULT, H5P_DEFAULT); - CHECK(attr, FAIL, "H5Acreate2"); - - /* Open the attribute just created and get a second ID */ - attr2 = H5Aopen(dataset, ATTR1_NAME, H5P_DEFAULT); - CHECK(attr2, FAIL, "H5Aopen"); - - /* Close attribute */ - ret = H5Aclose(attr2); - CHECK(ret, FAIL, "H5Aclose"); - - /* Close attribute */ - ret = H5Aclose(attr); - CHECK(ret, FAIL, "H5Aclose"); - - /* Close Dataset */ - ret = H5Dclose(dataset); - CHECK(ret, FAIL, "H5Dclose"); - - /* Close file */ - ret = H5Fclose(fid1); - CHECK(ret, FAIL, "H5Fclose"); - - /*----------------------------------------------------------------------------------- - * Reopen the file and verify the fill value for attribute. Also write - * some real data. - */ - - /* Open file */ - fid1 = H5Fopen(FILENAME, H5F_ACC_RDWR, fapl); - CHECK(fid1, FAIL, "H5Fopen"); - - /* Open the dataset */ - dataset = H5Dopen2(fid1, DSET1_NAME, H5P_DEFAULT); - CHECK(dataset, FAIL, "H5Dopen2"); - - /* Open first attribute for the dataset */ - attr = H5Aopen(dataset, ATTR1_NAME, H5P_DEFAULT); - CHECK(attr, FAIL, "H5Aopen"); - - /* Read attribute with fill value */ - ret = H5Aread(attr, H5T_NATIVE_INT, read_data1); - CHECK(ret, FAIL, "H5Aread"); - - /* Verify values read in */ - for (i = 0; i < ATTR1_DIM1; i++) - if (0 != read_data1[i]) - TestErrPrintf("%d: attribute data different: read_data1[%d]=%d\n", __LINE__, i, read_data1[i]); - - /* Open attribute for the second time */ - attr2 = H5Aopen(dataset, ATTR1_NAME, H5P_DEFAULT); - CHECK(attr, FAIL, "H5Aopen"); - - /* Write attribute information */ - ret = H5Awrite(attr2, H5T_NATIVE_INT, attr_data1); - CHECK(ret, FAIL, "H5Awrite"); - - /* Close attribute */ - ret = H5Aclose(attr2); - CHECK(ret, FAIL, "H5Aclose"); - - /* Close attribute */ - ret = H5Aclose(attr); - CHECK(ret, FAIL, "H5Aclose"); - - /* Close Dataset */ - ret = H5Dclose(dataset); - CHECK(ret, FAIL, "H5Dclose"); - - /* Close file */ - ret = H5Fclose(fid1); - CHECK(ret, FAIL, "H5Fclose"); - - /*----------------------------------------------------------------------------------- - * Reopen the file and verify the data. Also rewrite the data and verify it. - */ - - /* Open file */ - fid1 = H5Fopen(FILENAME, H5F_ACC_RDWR, fapl); - CHECK(fid1, FAIL, "H5Fopen"); - - /* Open the dataset */ - dataset = H5Dopen2(fid1, DSET1_NAME, H5P_DEFAULT); - CHECK(dataset, FAIL, "H5Dopen2"); - - /* Open first attribute for the dataset */ - attr = H5Aopen(dataset, ATTR1_NAME, H5P_DEFAULT); - CHECK(attr, FAIL, "H5Aopen"); - - /* Read attribute information */ - ret = H5Aread(attr, H5T_NATIVE_INT, read_data1); - CHECK(ret, FAIL, "H5Aread"); - - /* Verify values read in */ - for (i = 0; i < ATTR1_DIM1; i++) - if (attr_data1[i] != read_data1[i]) - TestErrPrintf("%d: attribute data different: attr_data1[%d]=%d, read_data1[%d]=%d\n", __LINE__, i, - attr_data1[i], i, read_data1[i]); - - /* Open attribute for the second time */ - attr2 = H5Aopen(dataset, ATTR1_NAME, H5P_DEFAULT); - CHECK(attr, FAIL, "H5Aopen"); - - /* Write attribute information */ - ret = H5Awrite(attr2, H5T_NATIVE_INT, rewrite_data); - CHECK(ret, FAIL, "H5Awrite"); - - /* Read attribute information */ - ret = H5Aread(attr, H5T_NATIVE_INT, read_data1); - CHECK(ret, FAIL, "H5Aread"); - - /* Verify values read in */ - for (i = 0; i < ATTR1_DIM1; i++) - if (read_data1[i] != rewrite_data[i]) - TestErrPrintf("%d: attribute data different: read_data1[%d]=%d, rewrite_data[%d]=%d\n", __LINE__, - i, read_data1[i], i, rewrite_data[i]); - - /* Close attribute */ - ret = H5Aclose(attr); - CHECK(ret, FAIL, "H5Aclose"); - - ret = H5Aclose(attr2); - CHECK(ret, FAIL, "H5Aclose"); - - /* Close Dataset */ - ret = H5Dclose(dataset); - CHECK(ret, FAIL, "H5Dclose"); - - /* Close file */ - ret = H5Fclose(fid1); - CHECK(ret, FAIL, "H5Fclose"); - - /*----------------------------------------------------------------------------------- - * Verify that the attribute being pointed to by different paths shares - * the same data. - */ - /* Open file */ - fid1 = H5Fopen(FILENAME, H5F_ACC_RDWR, fapl); - CHECK(fid1, FAIL, "H5Fopen"); - - /* Create a group */ - gid1 = H5Gcreate2(fid1, GROUP1_NAME, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT); - CHECK(gid1, FAIL, "H5Gcreate2"); - - /* Create hard link to the first group */ - ret = H5Lcreate_hard(gid1, GROUP1_NAME, H5L_SAME_LOC, GROUP2_NAME, H5P_DEFAULT, H5P_DEFAULT); - CHECK(ret, FAIL, "H5Lcreate_hard"); - - /* Try to create an attribute on the group */ - attr = H5Acreate2(gid1, ATTR2_NAME, H5T_NATIVE_INT, sid2, H5P_DEFAULT, H5P_DEFAULT); - CHECK(attr, FAIL, "H5Acreate2"); - - /* Open the hard link just created */ - gid2 = H5Gopen2(fid1, GROUP2_NAME, H5P_DEFAULT); - CHECK(gid2, FAIL, "H5Gopen2"); - - /* Open the attribute of the group for the second time */ - attr2 = H5Aopen(gid2, ATTR2_NAME, H5P_DEFAULT); - CHECK(attr2, FAIL, "H5Aopen"); - - /* Write attribute information with the first attribute handle */ - ret = H5Awrite(attr, H5T_NATIVE_INT, attr_data1); - CHECK(ret, FAIL, "H5Awrite"); - - /* Read attribute information with the second attribute handle */ - ret = H5Aread(attr2, H5T_NATIVE_INT, read_data1); - CHECK(ret, FAIL, "H5Aread"); - - /* Verify values read in */ - for (i = 0; i < ATTR1_DIM1; i++) - if (attr_data1[i] != read_data1[i]) - TestErrPrintf("%d: attribute data different: attr_data1[%d]=%d, read_data1[%d]=%d\n", __LINE__, i, - attr_data1[i], i, read_data1[i]); - - /* Close attribute */ - ret = H5Aclose(attr); - CHECK(ret, FAIL, "H5Aclose"); - - ret = H5Aclose(attr2); - CHECK(ret, FAIL, "H5Aclose"); - - /* Close group */ - ret = H5Gclose(gid1); - CHECK(ret, FAIL, "H5Gclose"); - - ret = H5Gclose(gid2); - CHECK(ret, FAIL, "H5Gclose"); - - /* Close Attribute dataspace */ - ret = H5Sclose(sid2); - CHECK(ret, FAIL, "H5Sclose"); - - /* Close Dataset dataspace */ - ret = H5Sclose(sid1); - CHECK(ret, FAIL, "H5Sclose"); - - /* Close file */ - ret = H5Fclose(fid1); - CHECK(ret, FAIL, "H5Fclose"); -} /* test_attr_duplicate_ids() */ - -/**************************************************************** -** -** test_attr_dense_verify(): Test basic H5A (attribute) code. -** Verify attributes on object -** -****************************************************************/ -static int -test_attr_dense_verify(hid_t loc_id, unsigned max_attr) -{ - char attrname[NAME_BUF_SIZE]; /* Name of attribute */ - hid_t attr; /* Attribute ID */ - unsigned value; /* Attribute value */ - unsigned u; /* Local index variable */ - int old_nerrs; /* Number of errors when entering this check */ - herr_t ret; /* Generic return value */ - - /* Retrieve the current # of reported errors */ - old_nerrs = nerrors; - - /* Re-open all the attributes by name and verify the data */ - for (u = 0; u < max_attr; u++) { - /* Open attribute */ - snprintf(attrname, sizeof(attrname), "attr %02u", u); - attr = H5Aopen(loc_id, attrname, H5P_DEFAULT); - CHECK(attr, FAIL, "H5Aopen"); - - /* Read data from the attribute */ - ret = H5Aread(attr, H5T_NATIVE_UINT, &value); - CHECK(ret, FAIL, "H5Aread"); - VERIFY(value, u, "H5Aread"); - - /* Close attribute */ - ret = H5Aclose(attr); - CHECK(ret, FAIL, "H5Aclose"); - } /* end for */ - - /* Re-open all the attributes by index and verify the data */ - for (u = 0; u < max_attr; u++) { - ssize_t name_len; /* Length of attribute name */ - char check_name[ATTR_NAME_LEN]; /* Buffer for checking attribute names */ - - /* Open attribute */ - attr = H5Aopen_by_idx(loc_id, ".", H5_INDEX_CRT_ORDER, H5_ITER_INC, (hsize_t)u, H5P_DEFAULT, - H5P_DEFAULT); - CHECK(attr, FAIL, "H5Aopen_by_idx"); - - /* Verify Name */ - snprintf(attrname, sizeof(attrname), "attr %02u", u); - name_len = H5Aget_name(attr, (size_t)ATTR_NAME_LEN, check_name); - VERIFY(name_len, strlen(attrname), "H5Aget_name"); - if (strcmp(check_name, attrname) != 0) - TestErrPrintf("attribute name different: attrname = '%s', should be '%s'\n", check_name, - attrname); - - /* Read data from the attribute */ - ret = H5Aread(attr, H5T_NATIVE_UINT, &value); - CHECK(ret, FAIL, "H5Aread"); - VERIFY(value, u, "H5Aread"); - - /* Close attribute */ - ret = H5Aclose(attr); - CHECK(ret, FAIL, "H5Aclose"); - } /* end for */ - - /* Retrieve current # of errors */ - if (old_nerrs == nerrors) - return (0); - else - return (-1); -} /* test_attr_dense_verify() */ - -/**************************************************************** -** -** test_attr_dense_create(): Test basic H5A (attribute) code. -** Tests "dense" attribute storage creation -** -****************************************************************/ -static void -test_attr_dense_create(hid_t fcpl, hid_t fapl) -{ - hid_t fid; /* HDF5 File ID */ - hid_t dataset; /* Dataset ID */ - hid_t sid; /* Dataspace ID */ - hid_t attr; /* Attribute ID */ - hid_t dcpl; /* Dataset creation property list ID */ - char attrname[NAME_BUF_SIZE]; /* Name of attribute */ - unsigned max_compact; /* Maximum # of attributes to store compactly */ - unsigned min_dense; /* Minimum # of attributes to store "densely" */ -#if 0 - htri_t is_dense; /* Are attributes stored densely? */ -#endif - unsigned u; /* Local index variable */ -#if 0 - h5_stat_size_t empty_filesize; /* Size of empty file */ - h5_stat_size_t filesize; /* Size of file after modifications */ -#endif - herr_t ret; /* Generic return value */ - - /* Output message about test being performed */ - MESSAGE(5, ("Testing Dense Attribute Storage Creation\n")); - - /* Create file */ - fid = H5Fcreate(FILENAME, H5F_ACC_TRUNC, fcpl, fapl); - CHECK(fid, FAIL, "H5Fcreate"); - - /* Close file */ - ret = H5Fclose(fid); - CHECK(ret, FAIL, "H5Fclose"); -#if 0 - /* Get size of file */ - empty_filesize = h5_get_file_size(FILENAME, fapl); - if (empty_filesize < 0) - TestErrPrintf("Line %d: file size wrong!\n", __LINE__); -#endif - /* Re-open file */ - fid = H5Fopen(FILENAME, H5F_ACC_RDWR, fapl); - CHECK(fid, FAIL, "H5Fopen"); - - /* Create dataspace for dataset */ - sid = H5Screate(H5S_SCALAR); - CHECK(sid, FAIL, "H5Screate"); - - /* need DCPL to query the group creation properties */ - if (dcpl_g == H5P_DEFAULT) { - dcpl = H5Pcreate(H5P_DATASET_CREATE); - CHECK(dcpl, FAIL, "H5Pcreate"); - } - else { - dcpl = H5Pcopy(dcpl_g); - CHECK(dcpl, FAIL, "H5Pcopy"); - } - - /* Create a dataset */ - dataset = H5Dcreate2(fid, DSET1_NAME, H5T_NATIVE_UCHAR, sid, H5P_DEFAULT, dcpl, H5P_DEFAULT); - CHECK(dataset, FAIL, "H5Dcreate2"); - - /* Retrieve limits for compact/dense attribute storage */ - ret = H5Pget_attr_phase_change(dcpl, &max_compact, &min_dense); - CHECK(ret, FAIL, "H5Pget_attr_phase_change"); - - /* Close property list */ - ret = H5Pclose(dcpl); - CHECK(ret, FAIL, "H5Pclose"); -#if 0 - /* Check on dataset's attribute storage status */ - is_dense = H5O__is_attr_dense_test(dataset); - VERIFY(is_dense, false, "H5O__is_attr_dense_test"); -#endif - /* Add attributes, until just before converting to dense storage */ - for (u = 0; u < max_compact; u++) { - /* Create attribute */ - snprintf(attrname, sizeof(attrname), "attr %02u", u); - attr = H5Acreate2(dataset, attrname, H5T_NATIVE_UINT, sid, H5P_DEFAULT, H5P_DEFAULT); - CHECK(attr, FAIL, "H5Acreate2"); - - /* Write data into the attribute */ - ret = H5Awrite(attr, H5T_NATIVE_UINT, &u); - CHECK(ret, FAIL, "H5Awrite"); - - /* Close attribute */ - ret = H5Aclose(attr); - CHECK(ret, FAIL, "H5Aclose"); - } /* end for */ -#if 0 - /* Check on dataset's attribute storage status */ - is_dense = H5O__is_attr_dense_test(dataset); - VERIFY(is_dense, false, "H5O__is_attr_dense_test"); -#endif - /* Add one more attribute, to push into "dense" storage */ - /* Create attribute */ - snprintf(attrname, sizeof(attrname), "attr %02u", u); - attr = H5Acreate2(dataset, attrname, H5T_NATIVE_UINT, sid, H5P_DEFAULT, H5P_DEFAULT); - CHECK(attr, FAIL, "H5Acreate2"); -#if 0 - /* Check on dataset's attribute storage status */ - is_dense = H5O__is_attr_dense_test(dataset); - VERIFY(is_dense, true, "H5O__is_attr_dense_test"); -#endif - /* Write data into the attribute */ - ret = H5Awrite(attr, H5T_NATIVE_UINT, &u); - CHECK(ret, FAIL, "H5Awrite"); - - /* Close attribute */ - ret = H5Aclose(attr); - CHECK(ret, FAIL, "H5Aclose"); - - if (vol_cap_flags_g & H5VL_CAP_FLAG_ATTR_BASIC) { - /* Attempt to add attribute again, which should fail */ - H5E_BEGIN_TRY - { - attr = H5Acreate2(dataset, attrname, H5T_NATIVE_UINT, sid, H5P_DEFAULT, H5P_DEFAULT); - } - H5E_END_TRY - VERIFY(attr, FAIL, "H5Acreate2"); - } - - /* Close dataspace */ - ret = H5Sclose(sid); - CHECK(ret, FAIL, "H5Sclose"); - - /* Close Dataset */ - ret = H5Dclose(dataset); - CHECK(ret, FAIL, "H5Dclose"); - - /* Unlink dataset with attributes */ - ret = H5Ldelete(fid, DSET1_NAME, H5P_DEFAULT); - CHECK(ret, FAIL, "H5Ldelete"); - - /* Close file */ - ret = H5Fclose(fid); - CHECK(ret, FAIL, "H5Fclose"); -#if 0 - if (h5_using_default_driver(NULL)) { - /* Check size of file */ - filesize = h5_get_file_size(FILENAME, fapl); - VERIFY(filesize, empty_filesize, "h5_get_file_size"); - } -#endif -} /* test_attr_dense_create() */ - -/**************************************************************** -** -** test_attr_dense_open(): Test basic H5A (attribute) code. -** Tests opening attributes in "dense" storage -** -****************************************************************/ -static void -test_attr_dense_open(hid_t fcpl, hid_t fapl) -{ - hid_t fid; /* HDF5 File ID */ - hid_t dataset; /* Dataset ID */ - hid_t sid; /* Dataspace ID */ - hid_t attr; /* Attribute ID */ - hid_t dcpl; /* Dataset creation property list ID */ - char attrname[NAME_BUF_SIZE]; /* Name of attribute */ - unsigned max_compact; /* Maximum # of attributes to store compactly */ - unsigned min_dense; /* Minimum # of attributes to store "densely" */ -#if 0 - htri_t is_dense; /* Are attributes stored densely? */ -#endif - unsigned u; /* Local index variable */ -#if 0 - h5_stat_size_t empty_filesize; /* Size of empty file */ - h5_stat_size_t filesize; /* Size of file after modifications */ -#endif - herr_t ret; /* Generic return value */ - - /* Output message about test being performed */ - MESSAGE(5, ("Testing Opening Attributes in Dense Storage\n")); - - /* Create file */ - fid = H5Fcreate(FILENAME, H5F_ACC_TRUNC, fcpl, fapl); - CHECK(fid, FAIL, "H5Fcreate"); - - /* Close file */ - ret = H5Fclose(fid); - CHECK(ret, FAIL, "H5Fclose"); -#if 0 - /* Get size of file */ - empty_filesize = h5_get_file_size(FILENAME, fapl); - if (empty_filesize < 0) - TestErrPrintf("Line %d: file size wrong!\n", __LINE__); -#endif - /* Re-open file */ - fid = H5Fopen(FILENAME, H5F_ACC_RDWR, fapl); - CHECK(fid, FAIL, "H5Fopen"); - - /* Create dataspace for dataset */ - sid = H5Screate(H5S_SCALAR); - CHECK(sid, FAIL, "H5Screate"); - - /* need DCPL to query the group creation properties */ - if (dcpl_g == H5P_DEFAULT) { - dcpl = H5Pcreate(H5P_DATASET_CREATE); - CHECK(dcpl, FAIL, "H5Pcreate"); - } - else { - dcpl = H5Pcopy(dcpl_g); - CHECK(dcpl, FAIL, "H5Pcopy"); - } - - /* Enable creation order tracking on attributes, so creation order tests work */ - ret = H5Pset_attr_creation_order(dcpl, H5P_CRT_ORDER_TRACKED); - CHECK(ret, FAIL, "H5Pset_attr_creation_order"); - - /* Create a dataset */ - dataset = H5Dcreate2(fid, DSET1_NAME, H5T_NATIVE_UCHAR, sid, H5P_DEFAULT, dcpl, H5P_DEFAULT); - CHECK(dataset, FAIL, "H5Dcreate2"); - - /* Retrieve limits for compact/dense attribute storage */ - ret = H5Pget_attr_phase_change(dcpl, &max_compact, &min_dense); - CHECK(ret, FAIL, "H5Pget_attr_phase_change"); - - /* Close property list */ - ret = H5Pclose(dcpl); - CHECK(ret, FAIL, "H5Pclose"); -#if 0 - /* Check on dataset's attribute storage status */ - is_dense = H5O__is_attr_dense_test(dataset); - VERIFY(is_dense, false, "H5O__is_attr_dense_test"); -#endif - /* Add attributes, until just before converting to dense storage */ - for (u = 0; u < max_compact; u++) { - /* Create attribute */ - snprintf(attrname, sizeof(attrname), "attr %02u", u); - attr = H5Acreate2(dataset, attrname, H5T_NATIVE_UINT, sid, H5P_DEFAULT, H5P_DEFAULT); - CHECK(attr, FAIL, "H5Acreate2"); - - /* Write data into the attribute */ - ret = H5Awrite(attr, H5T_NATIVE_UINT, &u); - CHECK(ret, FAIL, "H5Awrite"); - - /* Close attribute */ - ret = H5Aclose(attr); - CHECK(ret, FAIL, "H5Aclose"); - - /* Verify attributes written so far */ - ret = test_attr_dense_verify(dataset, u); - CHECK(ret, FAIL, "test_attr_dense_verify"); - } /* end for */ -#if 0 - /* Check on dataset's attribute storage status */ - is_dense = H5O__is_attr_dense_test(dataset); - VERIFY(is_dense, false, "H5O__is_attr_dense_test"); -#endif - /* Add one more attribute, to push into "dense" storage */ - /* Create attribute */ - snprintf(attrname, sizeof(attrname), "attr %02u", u); - attr = H5Acreate2(dataset, attrname, H5T_NATIVE_UINT, sid, H5P_DEFAULT, H5P_DEFAULT); - CHECK(attr, FAIL, "H5Acreate2"); -#if 0 - /* Check on dataset's attribute storage status */ - is_dense = H5O__is_attr_dense_test(dataset); - VERIFY(is_dense, true, "H5O__is_attr_dense_test"); -#endif - /* Write data into the attribute */ - ret = H5Awrite(attr, H5T_NATIVE_UINT, &u); - CHECK(ret, FAIL, "H5Awrite"); - - /* Close attribute */ - ret = H5Aclose(attr); - CHECK(ret, FAIL, "H5Aclose"); - - /* Close dataspace */ - ret = H5Sclose(sid); - CHECK(ret, FAIL, "H5Sclose"); - - /* Verify all the attributes written */ - ret = test_attr_dense_verify(dataset, (u + 1)); - CHECK(ret, FAIL, "test_attr_dense_verify"); - - /* Close Dataset */ - ret = H5Dclose(dataset); - CHECK(ret, FAIL, "H5Dclose"); - - /* Unlink dataset with attributes */ - ret = H5Ldelete(fid, DSET1_NAME, H5P_DEFAULT); - CHECK(ret, FAIL, "H5Ldelete"); - - /* Close file */ - ret = H5Fclose(fid); - CHECK(ret, FAIL, "H5Fclose"); -#if 0 - if (h5_using_default_driver(NULL)) { - /* Check size of file */ - filesize = h5_get_file_size(FILENAME, fapl); - VERIFY(filesize, empty_filesize, "h5_get_file_size"); - } -#endif -} /* test_attr_dense_open() */ - -/**************************************************************** -** -** test_attr_dense_delete(): Test basic H5A (attribute) code. -** Tests deleting attributes in "dense" storage -** -****************************************************************/ -static void -test_attr_dense_delete(hid_t fcpl, hid_t fapl) -{ - hid_t fid; /* HDF5 File ID */ - hid_t dataset; /* Dataset ID */ - hid_t sid; /* Dataspace ID */ - hid_t attr; /* Attribute ID */ - hid_t dcpl; /* Dataset creation property list ID */ - char attrname[NAME_BUF_SIZE]; /* Name of attribute */ - unsigned max_compact; /* Maximum # of attributes to store compactly */ - unsigned min_dense; /* Minimum # of attributes to store "densely" */ -#if 0 - htri_t is_dense; /* Are attributes stored densely? */ -#endif - unsigned u; /* Local index variable */ -#if 0 - h5_stat_size_t empty_filesize; /* Size of empty file */ - h5_stat_size_t filesize; /* Size of file after modifications */ -#endif - H5O_info2_t oinfo; /* Object info */ - int use_min_dset_oh = (dcpl_g != H5P_DEFAULT); - herr_t ret; /* Generic return value */ - - /* Only run this test for sec2/default driver */ - if (!h5_using_default_driver(NULL)) - return; - - /* Output message about test being performed */ - MESSAGE(5, ("Testing Deleting Attributes in Dense Storage\n")); - - if (use_min_dset_oh) { /* using minimized dataset headers */ - /* modify fcpl... - * sidestep "bug" where file space is lost with minimized dset ohdrs - */ - fcpl = H5Pcopy(fcpl); - CHECK(fcpl, FAIL, "H5Pcopy"); - ret = H5Pset_file_space_strategy(fcpl, H5F_FSPACE_STRATEGY_FSM_AGGR, true, 1); - CHECK(ret, FAIL, "H5Pset_file_space_strategy"); - } - fid = H5Fcreate(FILENAME, H5F_ACC_TRUNC, fcpl, fapl); - CHECK(fid, FAIL, "H5Fcreate"); - if (use_min_dset_oh) - CHECK(H5Pclose(fcpl), FAIL, "H5Pclose"); - - /* Close file */ - ret = H5Fclose(fid); - CHECK(ret, FAIL, "H5Fclose"); -#if 0 - /* Get size of file */ - empty_filesize = h5_get_file_size(FILENAME, fapl); - if (empty_filesize < 0) - TestErrPrintf("Line %d: file size wrong!\n", __LINE__); -#endif - /* Re-open file */ - fid = H5Fopen(FILENAME, H5F_ACC_RDWR, fapl); - CHECK(fid, FAIL, "H5Fopen"); - - /* Create dataspace for dataset */ - sid = H5Screate(H5S_SCALAR); - CHECK(sid, FAIL, "H5Screate"); - - /* need DCPL to query the group creation properties */ - if (use_min_dset_oh) { - dcpl = H5Pcopy(dcpl_g); - CHECK(dcpl, FAIL, "H5Pcopy"); - } - else { - dcpl = H5Pcreate(H5P_DATASET_CREATE); - CHECK(dcpl, FAIL, "H5Pcreate"); - } - - /* Enable creation order tracking on attributes, so creation order tests work */ - ret = H5Pset_attr_creation_order(dcpl, H5P_CRT_ORDER_TRACKED); - CHECK(ret, FAIL, "H5Pset_attr_creation_order"); - - /* Create a dataset */ - dataset = H5Dcreate2(fid, DSET1_NAME, H5T_NATIVE_UCHAR, sid, H5P_DEFAULT, dcpl, H5P_DEFAULT); - CHECK(dataset, FAIL, "H5Dcreate2"); - - /* Retrieve limits for compact/dense attribute storage */ - ret = H5Pget_attr_phase_change(dcpl, &max_compact, &min_dense); - CHECK(ret, FAIL, "H5Pget_attr_phase_change"); - - /* Close property list */ - ret = H5Pclose(dcpl); - CHECK(ret, FAIL, "H5Pclose"); -#if 0 - /* Check on dataset's attribute storage status */ - is_dense = H5O__is_attr_dense_test(dataset); - VERIFY(is_dense, false, "H5O__is_attr_dense_test"); -#endif - /* Add attributes, until well into dense storage */ - for (u = 0; u < (max_compact * 2); u++) { - /* Create attribute */ - snprintf(attrname, sizeof(attrname), "attr %02u", u); - attr = H5Acreate2(dataset, attrname, H5T_NATIVE_UINT, sid, H5P_DEFAULT, H5P_DEFAULT); - CHECK(attr, FAIL, "H5Acreate2"); - - /* Write data into the attribute */ - ret = H5Awrite(attr, H5T_NATIVE_UINT, &u); - CHECK(ret, FAIL, "H5Awrite"); - - /* Close attribute */ - ret = H5Aclose(attr); - CHECK(ret, FAIL, "H5Aclose"); - - /* Check # of attributes */ - ret = H5Oget_info3(dataset, &oinfo, H5O_INFO_NUM_ATTRS); - CHECK(ret, FAIL, "H5Oget_info3"); - VERIFY(oinfo.num_attrs, (u + 1), "H5Oget_info3"); - } /* end for */ -#if 0 - /* Check on dataset's attribute storage status */ - is_dense = H5O__is_attr_dense_test(dataset); - VERIFY(is_dense, true, "H5O__is_attr_dense_test"); -#endif - /* Close dataspace */ - ret = H5Sclose(sid); - CHECK(ret, FAIL, "H5Sclose"); - - /* Close Dataset */ - ret = H5Dclose(dataset); - CHECK(ret, FAIL, "H5Dclose"); - - /* Close file */ - ret = H5Fclose(fid); - CHECK(ret, FAIL, "H5Fclose"); - - /* Re-open file */ - fid = H5Fopen(FILENAME, H5F_ACC_RDWR, fapl); - CHECK(fid, FAIL, "H5Fopen"); - - /* Open dataset */ - dataset = H5Dopen2(fid, DSET1_NAME, H5P_DEFAULT); - CHECK(dataset, FAIL, "H5Dopen2"); - - /* Delete attributes until the attributes revert to compact storage again */ - for (u--; u >= min_dense; u--) { - /* Delete attribute */ - snprintf(attrname, sizeof(attrname), "attr %02u", u); - ret = H5Adelete(dataset, attrname); - CHECK(ret, FAIL, "H5Adelete"); - - /* Verify attributes still left */ - ret = test_attr_dense_verify(dataset, u); - CHECK(ret, FAIL, "test_attr_dense_verify"); - } /* end for */ -#if 0 - /* Check on dataset's attribute storage status */ - is_dense = H5O__is_attr_dense_test(dataset); - VERIFY(is_dense, true, "H5O__is_attr_dense_test"); -#endif - /* Delete one more attribute, which should cause reversion to compact storage */ - snprintf(attrname, sizeof(attrname), "attr %02u", u); - ret = H5Adelete(dataset, attrname); - CHECK(ret, FAIL, "H5Adelete"); -#if 0 - /* Check on dataset's attribute storage status */ - is_dense = H5O__is_attr_dense_test(dataset); - VERIFY(is_dense, false, "H5O__is_attr_dense_test"); -#endif - /* Verify attributes still left */ - ret = test_attr_dense_verify(dataset, (u - 1)); - CHECK(ret, FAIL, "test_attr_dense_verify"); - - /* Delete another attribute, to verify deletion in compact storage */ - snprintf(attrname, sizeof(attrname), "attr %02u", (u - 1)); - ret = H5Adelete(dataset, attrname); - CHECK(ret, FAIL, "H5Adelete"); -#if 0 - /* Check on dataset's attribute storage status */ - is_dense = H5O__is_attr_dense_test(dataset); - VERIFY(is_dense, false, "H5O__is_attr_dense_test"); -#endif - /* Verify attributes still left */ - ret = test_attr_dense_verify(dataset, (u - 2)); - CHECK(ret, FAIL, "test_attr_dense_verify"); - - /* Close Dataset */ - ret = H5Dclose(dataset); - CHECK(ret, FAIL, "H5Dclose"); - - /* Unlink dataset with attributes */ - ret = H5Ldelete(fid, DSET1_NAME, H5P_DEFAULT); - CHECK(ret, FAIL, "H5Ldelete"); - - /* Close file */ - ret = H5Fclose(fid); - CHECK(ret, FAIL, "H5Fclose"); -#if 0 - if (h5_using_default_driver(NULL)) { - /* Check size of file */ - filesize = h5_get_file_size(FILENAME, fapl); - VERIFY(filesize, empty_filesize, "h5_get_file_size"); - } -#endif -} /* test_attr_dense_delete() */ - -/**************************************************************** -** -** test_attr_dense_rename(): Test basic H5A (attribute) code. -** Tests renaming attributes in "dense" storage -** -****************************************************************/ -static void -test_attr_dense_rename(hid_t fcpl, hid_t fapl) -{ - hid_t fid; /* HDF5 File ID */ - hid_t dataset; /* Dataset ID */ - hid_t sid; /* Dataspace ID */ - hid_t attr; /* Attribute ID */ - hid_t dcpl; /* Dataset creation property list ID */ - char attrname[NAME_BUF_SIZE]; /* Name of attribute */ - char new_attrname[NAME_BUF_SIZE]; /* New name of attribute */ - unsigned max_compact; /* Maximum # of attributes to store compactly */ - unsigned min_dense; /* Minimum # of attributes to store "densely" */ -#if 0 - htri_t is_dense; /* Are attributes stored densely? */ - h5_stat_size_t empty_filesize; /* Size of empty file */ - h5_stat_size_t filesize; /* Size of file after modifications */ -#endif - H5O_info2_t oinfo; /* Object info */ - unsigned u; /* Local index variable */ - int use_min_dset_oh = (dcpl_g != H5P_DEFAULT); - unsigned use_corder; /* Track creation order or not */ - herr_t ret; /* Generic return value */ - - /* Only run this test for sec2/default driver */ - if (!h5_using_default_driver(NULL)) - return; - - /* Output message about test being performed */ - MESSAGE(5, ("Testing Renaming Attributes in Dense Storage\n")); - - if (use_min_dset_oh) { /* using minimized dataset headers */ - /* modify fcpl... - * sidestep "bug" where file space is lost with minimized dset ohdrs - */ - fcpl = H5Pcopy(fcpl); - CHECK(fcpl, FAIL, "H5Pcopy"); - ret = H5Pset_file_space_strategy(fcpl, H5F_FSPACE_STRATEGY_FSM_AGGR, true, 1); - CHECK(ret, FAIL, "H5Pset_file_space_strategy"); - } - fid = H5Fcreate(FILENAME, H5F_ACC_TRUNC, fcpl, fapl); - CHECK(fid, H5I_INVALID_HID, "H5Fcreate"); - if (use_min_dset_oh) - CHECK(H5Pclose(fcpl), FAIL, "H5Pclose"); - - /* Close file */ - ret = H5Fclose(fid); - CHECK(ret, FAIL, "H5Fclose"); -#if 0 - /* Get size of file */ - empty_filesize = h5_get_file_size(FILENAME, fapl); - if (empty_filesize < 0) - TestErrPrintf("Line %d: file size wrong!\n", __LINE__); -#endif - /* Re-open file */ - fid = H5Fopen(FILENAME, H5F_ACC_RDWR, fapl); - CHECK(fid, H5I_INVALID_HID, "H5Fopen"); - - /* Create dataspace for dataset */ - sid = H5Screate(H5S_SCALAR); - CHECK(sid, H5I_INVALID_HID, "H5Screate"); - - /* need DCPL to query the group creation properties */ - if (use_min_dset_oh) { - dcpl = H5Pcopy(dcpl_g); - CHECK(dcpl, H5I_INVALID_HID, "H5Pcopy"); - } - else { - dcpl = H5Pcreate(H5P_DATASET_CREATE); - CHECK(dcpl, H5I_INVALID_HID, "H5Pcreate"); - } - - /* Retrieve limits for compact/dense attribute storage */ - ret = H5Pget_attr_phase_change(dcpl, &max_compact, &min_dense); - CHECK(ret, FAIL, "H5Pget_attr_phase_change"); - - /* Using creation order or not */ - for (use_corder = false; use_corder <= true; use_corder++) { - - if (use_corder) { - ret = H5Pset_attr_creation_order(dcpl, H5P_CRT_ORDER_TRACKED | H5P_CRT_ORDER_INDEXED); - CHECK(ret, FAIL, "H5Pset_attr_creation_order"); - } - - /* Create a dataset */ - dataset = H5Dcreate2(fid, DSET1_NAME, H5T_NATIVE_UCHAR, sid, H5P_DEFAULT, dcpl, H5P_DEFAULT); - CHECK(dataset, H5I_INVALID_HID, "H5Dcreate2"); -#if 0 - /* Check on dataset's attribute storage status */ - is_dense = H5O__is_attr_dense_test(dataset); - VERIFY(is_dense, false, "H5O__is_attr_dense_test"); -#endif - /* Add attributes, until well into dense storage */ - for (u = 0; u < (max_compact * 2); u++) { - /* Create attribute */ - snprintf(attrname, sizeof(attrname), "attr %02u", u); - attr = H5Acreate2(dataset, attrname, H5T_NATIVE_UINT, sid, H5P_DEFAULT, H5P_DEFAULT); - CHECK(attr, H5I_INVALID_HID, "H5Acreate2"); - - /* Write data into the attribute */ - ret = H5Awrite(attr, H5T_NATIVE_UINT, &u); - CHECK(ret, FAIL, "H5Awrite"); - - /* Close attribute */ - ret = H5Aclose(attr); - CHECK(ret, FAIL, "H5Aclose"); - - /* Rename attribute */ - snprintf(new_attrname, sizeof(new_attrname), "new attr %02u", u); - - /* Rename attribute */ - ret = H5Arename_by_name(fid, DSET1_NAME, attrname, new_attrname, H5P_DEFAULT); - CHECK(ret, FAIL, "H5Arename_by_name"); - - /* Check # of attributes */ - ret = H5Oget_info3(dataset, &oinfo, H5O_INFO_NUM_ATTRS); - CHECK(ret, FAIL, "H5Oget_info3"); - VERIFY(oinfo.num_attrs, (u + 1), "H5Oget_info3"); - } /* end for */ -#if 0 - /* Check on dataset's attribute storage status */ - is_dense = H5O__is_attr_dense_test(dataset); - VERIFY(is_dense, true, "H5O__is_attr_dense_test"); -#endif - /* Close Dataset */ - ret = H5Dclose(dataset); - CHECK(ret, FAIL, "H5Dclose"); - - if (!use_corder) { - /* Unlink dataset with attributes */ - ret = H5Ldelete(fid, DSET1_NAME, H5P_DEFAULT); - CHECK(ret, FAIL, "H5Ldelete"); - } - - } /* end for use_corder */ - - /* Close dataspace */ - ret = H5Sclose(sid); - CHECK(ret, FAIL, "H5Sclose"); - - /* Close property list */ - ret = H5Pclose(dcpl); - CHECK(ret, FAIL, "H5Pclose"); - - /* Close file */ - ret = H5Fclose(fid); - CHECK(ret, FAIL, "H5Fclose"); - - /* Re-open file */ - fid = H5Fopen(FILENAME, H5F_ACC_RDWR, fapl); - CHECK(fid, H5I_INVALID_HID, "H5Fopen"); - - /* Open dataset */ - dataset = H5Dopen2(fid, DSET1_NAME, H5P_DEFAULT); - CHECK(dataset, H5I_INVALID_HID, "H5Dopen2"); - - /* Verify renamed attributes */ - for (u = 0; u < (max_compact * 2); u++) { - unsigned value; /* Attribute value */ - - /* Open attribute */ - snprintf(attrname, sizeof(attrname), "new attr %02u", u); - attr = H5Aopen(dataset, attrname, H5P_DEFAULT); - CHECK(attr, H5I_INVALID_HID, "H5Aopen"); - - /* Read data from the attribute */ - ret = H5Aread(attr, H5T_NATIVE_UINT, &value); - CHECK(ret, FAIL, "H5Aread"); - VERIFY(value, u, "H5Aread"); - - /* Close attribute */ - ret = H5Aclose(attr); - CHECK(ret, FAIL, "H5Aclose"); - } /* end for */ - - /* Close Dataset */ - ret = H5Dclose(dataset); - CHECK(ret, FAIL, "H5Dclose"); - - /* Unlink dataset with attributes */ - ret = H5Ldelete(fid, DSET1_NAME, H5P_DEFAULT); - CHECK(ret, FAIL, "H5Ldelete"); - - /* Close file */ - ret = H5Fclose(fid); - CHECK(ret, FAIL, "H5Fclose"); -#if 0 - if (h5_using_default_driver(NULL)) { - /* Check size of file */ - filesize = h5_get_file_size(FILENAME, fapl); - VERIFY(filesize, empty_filesize, "h5_get_file_size"); - } -#endif -} /* test_attr_dense_rename() */ - -/**************************************************************** -** -** test_attr_dense_unlink(): Test basic H5A (attribute) code. -** Tests unlinking object with attributes in "dense" storage -** -****************************************************************/ -static void -test_attr_dense_unlink(hid_t fcpl, hid_t fapl) -{ - hid_t fid; /* HDF5 File ID */ - hid_t dataset; /* Dataset ID */ - hid_t sid; /* Dataspace ID */ - hid_t attr; /* Attribute ID */ - hid_t dcpl; /* Dataset creation property list ID */ - char attrname[NAME_BUF_SIZE]; /* Name of attribute */ - unsigned max_compact; /* Maximum # of attributes to store compactly */ - unsigned min_dense; /* Minimum # of attributes to store "densely" */ -#if 0 - htri_t is_dense; /* Are attributes stored densely? */ - size_t mesg_count; /* # of shared messages */ - h5_stat_size_t empty_filesize; /* Size of empty file */ - h5_stat_size_t filesize; /* Size of file after modifications */ -#endif - H5O_info2_t oinfo; /* Object info */ - unsigned u; /* Local index variable */ - int use_min_dset_oh = (dcpl_g != H5P_DEFAULT); - herr_t ret; /* Generic return value */ - - /* Only run this test for sec2/default driver */ - if (!h5_using_default_driver(NULL)) - return; - - /* Output message about test being performed */ - MESSAGE(5, ("Testing Unlinking Object with Attributes in Dense Storage\n")); - - if (use_min_dset_oh) { /* using minimized dataset headers */ - /* modify fcpl... - * sidestep "bug" where file space is lost with minimized dset ohdrs - */ - fcpl = H5Pcopy(fcpl); - CHECK(fcpl, FAIL, "H5Pcopy"); - ret = H5Pset_file_space_strategy(fcpl, H5F_FSPACE_STRATEGY_FSM_AGGR, true, 1); - CHECK(ret, FAIL, "H5Pset_file_space_strategy"); - } - fid = H5Fcreate(FILENAME, H5F_ACC_TRUNC, fcpl, fapl); - CHECK(fid, FAIL, "H5Fcreate"); - if (use_min_dset_oh) - CHECK(H5Pclose(fcpl), FAIL, "H5Pclose"); - - ret = H5Fclose(fid); - CHECK(ret, FAIL, "H5Fclose"); -#if 0 - empty_filesize = h5_get_file_size(FILENAME, fapl); - if (empty_filesize < 0) - TestErrPrintf("Line %d: file size wrong!\n", __LINE__); -#endif - /* Re-open file */ - fid = H5Fopen(FILENAME, H5F_ACC_RDWR, fapl); - CHECK(fid, FAIL, "H5Fopen"); - - /* Create dataspace for dataset */ - sid = H5Screate(H5S_SCALAR); - CHECK(sid, FAIL, "H5Screate"); - - /* need DCPL to query the group creation properties */ - if (use_min_dset_oh) { - dcpl = H5Pcopy(dcpl_g); - CHECK(dcpl, FAIL, "H5Pcopy"); - } - else { - dcpl = H5Pcreate(H5P_DATASET_CREATE); - CHECK(dcpl, FAIL, "H5Pcreate"); - } - - /* Create a dataset */ - dataset = H5Dcreate2(fid, DSET1_NAME, H5T_NATIVE_UCHAR, sid, H5P_DEFAULT, dcpl, H5P_DEFAULT); - CHECK(dataset, FAIL, "H5Dcreate2"); - - /* Retrieve limits for compact/dense attribute storage */ - ret = H5Pget_attr_phase_change(dcpl, &max_compact, &min_dense); - CHECK(ret, FAIL, "H5Pget_attr_phase_change"); - - /* Close property list */ - ret = H5Pclose(dcpl); - CHECK(ret, FAIL, "H5Pclose"); -#if 0 - /* Check on dataset's attribute storage status */ - is_dense = H5O__is_attr_dense_test(dataset); - VERIFY(is_dense, false, "H5O__is_attr_dense_test"); -#endif - /* Add attributes, until well into dense storage */ - for (u = 0; u < (max_compact * 2); u++) { - /* Create attribute */ - snprintf(attrname, sizeof(attrname), "attr %02u", u); - attr = H5Acreate2(dataset, attrname, H5T_NATIVE_UINT, sid, H5P_DEFAULT, H5P_DEFAULT); - CHECK(attr, FAIL, "H5Acreate2"); - - /* Write data into the attribute */ - ret = H5Awrite(attr, H5T_NATIVE_UINT, &u); - CHECK(ret, FAIL, "H5Awrite"); - - /* Close attribute */ - ret = H5Aclose(attr); - CHECK(ret, FAIL, "H5Aclose"); - - /* Check # of attributes */ - ret = H5Oget_info3(dataset, &oinfo, H5O_INFO_NUM_ATTRS); - CHECK(ret, FAIL, "H5Oget_info3"); - VERIFY(oinfo.num_attrs, (u + 1), "H5Oget_info3"); - } /* end for */ -#if 0 - /* Check on dataset's attribute storage status */ - is_dense = H5O__is_attr_dense_test(dataset); - VERIFY(is_dense, true, "H5O__is_attr_dense_test"); -#endif - /* Close dataspace */ - ret = H5Sclose(sid); - CHECK(ret, FAIL, "H5Sclose"); - - /* Close Dataset */ - ret = H5Dclose(dataset); - CHECK(ret, FAIL, "H5Dclose"); - - /* Close file */ - ret = H5Fclose(fid); - CHECK(ret, FAIL, "H5Fclose"); - - /* Re-open file */ - fid = H5Fopen(FILENAME, H5F_ACC_RDWR, fapl); - CHECK(fid, FAIL, "H5Fopen"); - - /* Unlink dataset */ - ret = H5Ldelete(fid, DSET1_NAME, H5P_DEFAULT); - CHECK(ret, FAIL, "H5Ldelete"); -#if 0 - /* Check on dataset's attribute storage status */ - ret = H5F__get_sohm_mesg_count_test(fid, H5O_ATTR_ID, &mesg_count); - CHECK(ret, FAIL, "H5F__get_sohm_mesg_count_test"); - VERIFY(mesg_count, 0, "H5F__get_sohm_mesg_count_test"); -#endif - /* Close file */ - ret = H5Fclose(fid); - CHECK(ret, FAIL, "H5Fclose"); -#if 0 - if (h5_using_default_driver(NULL)) { - /* Check size of file */ - filesize = h5_get_file_size(FILENAME, fapl); - VERIFY(filesize, empty_filesize, "h5_get_file_size"); - } -#endif -} /* test_attr_dense_unlink() */ - -/**************************************************************** -** -** test_attr_dense_limits(): Test basic H5A (attribute) code. -** Tests attribute in "dense" storage limits -** -****************************************************************/ -static void -test_attr_dense_limits(hid_t fcpl, hid_t fapl) -{ - hid_t fid; /* HDF5 File ID */ - hid_t dataset; /* Dataset ID */ - hid_t sid; /* Dataspace ID */ - hid_t attr; /* Attribute ID */ - hid_t dcpl; /* Dataset creation property list ID */ - char attrname[NAME_BUF_SIZE]; /* Name of attribute */ - unsigned max_compact, rmax_compact; /* Maximum # of attributes to store compactly */ - unsigned min_dense, rmin_dense; /* Minimum # of attributes to store "densely" */ -#if 0 - htri_t is_dense; /* Are attributes stored densely? */ -#endif - unsigned u; /* Local index variable */ -#if 0 - h5_stat_size_t empty_filesize; /* Size of empty file */ - h5_stat_size_t filesize; /* Size of file after modifications */ -#endif - herr_t ret; /* Generic return value */ - - /* Output message about test being performed */ - MESSAGE(5, ("Testing Phase Change Limits For Attributes in Dense Storage\n")); - - /* Create file */ - fid = H5Fcreate(FILENAME, H5F_ACC_TRUNC, fcpl, fapl); - CHECK(fid, FAIL, "H5Fcreate"); - - /* Close file */ - ret = H5Fclose(fid); - CHECK(ret, FAIL, "H5Fclose"); -#if 0 - /* Get size of file */ - empty_filesize = h5_get_file_size(FILENAME, fapl); - if (empty_filesize < 0) - TestErrPrintf("Line %d: file size wrong!\n", __LINE__); -#endif - /* Re-open file */ - fid = H5Fopen(FILENAME, H5F_ACC_RDWR, fapl); - CHECK(fid, FAIL, "H5Fopen"); - - /* Create dataspace for dataset */ - sid = H5Screate(H5S_SCALAR); - CHECK(sid, FAIL, "H5Screate"); - - /* need DCPL to query the group creation properties */ - if (dcpl_g == H5P_DEFAULT) { - dcpl = H5Pcreate(H5P_DATASET_CREATE); - CHECK(dcpl, FAIL, "H5Pcreate"); - } - else { - dcpl = H5Pcopy(dcpl_g); - CHECK(dcpl, FAIL, "H5Pcopy"); - } - - /* Change limits on compact/dense attribute storage */ - max_compact = 0; - min_dense = 0; - ret = H5Pset_attr_phase_change(dcpl, max_compact, min_dense); - CHECK(ret, FAIL, "H5Pget_attr_phase_change"); - - /* Create a dataset */ - dataset = H5Dcreate2(fid, DSET1_NAME, H5T_NATIVE_UCHAR, sid, H5P_DEFAULT, dcpl, H5P_DEFAULT); - CHECK(dataset, FAIL, "H5Dcreate2"); - - /* Retrieve limits for compact/dense attribute storage */ - ret = H5Pget_attr_phase_change(dcpl, &rmax_compact, &rmin_dense); - CHECK(ret, FAIL, "H5Pget_attr_phase_change"); - VERIFY(rmax_compact, max_compact, "H5Pget_attr_phase_change"); - VERIFY(rmin_dense, min_dense, "H5Pget_attr_phase_change"); - - /* Close property list */ - ret = H5Pclose(dcpl); - CHECK(ret, FAIL, "H5Pclose"); - -#if 0 - /* Check on dataset's attribute storage status */ - is_dense = H5O__is_attr_dense_test(dataset); - VERIFY(is_dense, false, "H5O__is_attr_dense_test"); -#endif - - /* Add first attribute, which should be immediately in dense storage */ - - /* Create attribute */ - u = 0; - snprintf(attrname, sizeof(attrname), "attr %02u", u); - attr = H5Acreate2(dataset, attrname, H5T_NATIVE_UINT, sid, H5P_DEFAULT, H5P_DEFAULT); - CHECK(attr, FAIL, "H5Acreate2"); - - /* Write data into the attribute */ - ret = H5Awrite(attr, H5T_NATIVE_UINT, &u); - CHECK(ret, FAIL, "H5Awrite"); - - /* Close attribute */ - ret = H5Aclose(attr); - CHECK(ret, FAIL, "H5Aclose"); -#if 0 - /* Check on dataset's attribute storage status */ - is_dense = H5O__is_attr_dense_test(dataset); - VERIFY(is_dense, true, "H5O__is_attr_dense_test"); -#endif - - /* Add second attribute, to allow deletions to be checked easily */ - - /* Create attribute */ - u = 1; - snprintf(attrname, sizeof(attrname), "attr %02u", u); - attr = H5Acreate2(dataset, attrname, H5T_NATIVE_UINT, sid, H5P_DEFAULT, H5P_DEFAULT); - CHECK(attr, FAIL, "H5Acreate2"); - - /* Write data into the attribute */ - ret = H5Awrite(attr, H5T_NATIVE_UINT, &u); - CHECK(ret, FAIL, "H5Awrite"); - - /* Close attribute */ - ret = H5Aclose(attr); - CHECK(ret, FAIL, "H5Aclose"); -#if 0 - /* Check on dataset's attribute storage status */ - is_dense = H5O__is_attr_dense_test(dataset); - VERIFY(is_dense, true, "H5O__is_attr_dense_test"); -#endif - - /* Delete second attribute, attributes should still be stored densely */ - - /* Delete attribute */ - ret = H5Adelete(dataset, attrname); - CHECK(ret, FAIL, "H5Adelete"); -#if 0 - /* Check on dataset's attribute storage status */ - is_dense = H5O__is_attr_dense_test(dataset); - VERIFY(is_dense, true, "H5O__is_attr_dense_test"); -#endif - - /* Delete first attribute, attributes should not be stored densely */ - - /* Delete attribute */ - u = 0; - snprintf(attrname, sizeof(attrname), "attr %02u", u); - ret = H5Adelete(dataset, attrname); - CHECK(ret, FAIL, "H5Adelete"); -#if 0 - /* Check on dataset's attribute storage status */ - is_dense = H5O__is_attr_dense_test(dataset); - VERIFY(is_dense, false, "H5O__is_attr_dense_test"); -#endif - - /* Close dataspace */ - ret = H5Sclose(sid); - CHECK(ret, FAIL, "H5Sclose"); - - /* Close Dataset */ - ret = H5Dclose(dataset); - CHECK(ret, FAIL, "H5Dclose"); - - /* Unlink dataset */ - ret = H5Ldelete(fid, DSET1_NAME, H5P_DEFAULT); - CHECK(ret, FAIL, "H5Ldelete"); - - /* Close file */ - ret = H5Fclose(fid); - CHECK(ret, FAIL, "H5Fclose"); -#if 0 - if (h5_using_default_driver(NULL)) { - /* Check size of file */ - filesize = h5_get_file_size(FILENAME, fapl); - VERIFY(filesize, empty_filesize, "h5_get_file_size"); - } -#endif -} /* test_attr_dense_limits() */ - -/**************************************************************** -** -** test_attr_dense_dup_ids(): Test operations with multiple ID -** handles with "dense" attribute storage creation -** -****************************************************************/ -static void -test_attr_dense_dup_ids(hid_t fcpl, hid_t fapl) -{ - hid_t fid; /* HDF5 File ID */ - hid_t dataset; /* Dataset ID */ - hid_t gid1, gid2; /* Group ID */ - hid_t sid, sid2; /* Dataspace ID */ - hid_t attr, attr2, add_attr; /* Attribute ID */ - hid_t dcpl; /* Dataset creation property list ID */ - char attrname[NAME_BUF_SIZE]; /* Name of attribute */ - hsize_t dims[] = {ATTR1_DIM1}; - int read_data1[ATTR1_DIM1] = {0}; /* Buffer for reading attribute */ - int rewrite_data[ATTR1_DIM1] = {1234, -423, 9907256}; /* Test data for rewrite */ - unsigned scalar_data = 1317; /* scalar data for attribute */ - unsigned read_scalar; /* variable for reading attribute*/ - unsigned max_compact; /* Maximum # of attributes to store compactly */ - unsigned min_dense; /* Minimum # of attributes to store "densely" */ -#if 0 - htri_t is_dense; /* Are attributes stored densely? */ -#endif - unsigned u, i; /* Local index variable */ - herr_t ret; /* Generic return value */ - - /* Output message about test being performed */ - MESSAGE(5, ("Testing operations with two IDs for Dense Storage\n")); - - /*----------------------------------------------------------------------------------- - * Create an attribute in dense storage and fill it with fill value. - */ - /* Create file */ - fid = H5Fcreate(FILENAME, H5F_ACC_TRUNC, fcpl, fapl); - CHECK(fid, FAIL, "H5Fcreate"); - - /* Close file */ - ret = H5Fclose(fid); - CHECK(ret, FAIL, "H5Fclose"); - - /* Re-open file */ - fid = H5Fopen(FILENAME, H5F_ACC_RDWR, fapl); - CHECK(fid, FAIL, "H5Fopen"); - - /* Create dataspace for dataset */ - sid = H5Screate(H5S_SCALAR); - CHECK(sid, FAIL, "H5Screate"); - - /* need DCPL to query the group creation properties */ - if (dcpl_g == H5P_DEFAULT) { - dcpl = H5Pcreate(H5P_DATASET_CREATE); - CHECK(dcpl, FAIL, "H5Pcreate"); - } - else { - dcpl = H5Pcopy(dcpl_g); - CHECK(dcpl, FAIL, "H5Pcopy"); - } - - /* Create a dataset */ - dataset = H5Dcreate2(fid, DSET1_NAME, H5T_NATIVE_UCHAR, sid, H5P_DEFAULT, dcpl, H5P_DEFAULT); - CHECK(dataset, FAIL, "H5Dcreate2"); - - /* Retrieve limits for compact/dense attribute storage */ - ret = H5Pget_attr_phase_change(dcpl, &max_compact, &min_dense); - CHECK(ret, FAIL, "H5Pget_attr_phase_change"); - - /* Close property list */ - ret = H5Pclose(dcpl); - CHECK(ret, FAIL, "H5Pclose"); -#if 0 - /* Check on dataset's attribute storage status */ - is_dense = H5O__is_attr_dense_test(dataset); - VERIFY(is_dense, false, "H5O__is_attr_dense_test"); -#endif - /* Add attributes, until just before converting to dense storage */ - for (u = 0; u < max_compact; u++) { - /* Create attribute */ - snprintf(attrname, sizeof(attrname), "attr %02u", u); - attr = H5Acreate2(dataset, attrname, H5T_NATIVE_UINT, sid, H5P_DEFAULT, H5P_DEFAULT); - CHECK(attr, FAIL, "H5Acreate2"); - - /* Write data into the attribute */ - ret = H5Awrite(attr, H5T_NATIVE_UINT, &u); - CHECK(ret, FAIL, "H5Awrite"); - - /* Close attribute */ - ret = H5Aclose(attr); - CHECK(ret, FAIL, "H5Aclose"); - } /* end for */ -#if 0 - /* Check on dataset's attribute storage status */ - is_dense = H5O__is_attr_dense_test(dataset); - VERIFY(is_dense, false, "H5O__is_attr_dense_test"); -#endif - /* Add one more attribute, to push into "dense" storage */ - /* Create dataspace for attribute */ - sid2 = H5Screate_simple(ATTR1_RANK, dims, NULL); - CHECK(sid2, FAIL, "H5Screate_simple"); - - /* Create attribute */ - snprintf(attrname, sizeof(attrname), "attr %02u", u); - attr = H5Acreate2(dataset, attrname, H5T_NATIVE_INT, sid2, H5P_DEFAULT, H5P_DEFAULT); - CHECK(attr, FAIL, "H5Acreate2"); -#if 0 - /* Check on dataset's attribute storage status */ - is_dense = H5O__is_attr_dense_test(dataset); - VERIFY(is_dense, true, "H5O__is_attr_dense_test"); -#endif - /* Open the attribute just created and get a second ID */ - attr2 = H5Aopen(dataset, attrname, H5P_DEFAULT); - CHECK(attr2, FAIL, "H5Aopen"); - - /* Close attribute */ - ret = H5Aclose(attr); - CHECK(ret, FAIL, "H5Aclose"); - - ret = H5Aclose(attr2); - CHECK(ret, FAIL, "H5Aclose"); - - /* Close Dataset */ - ret = H5Dclose(dataset); - CHECK(ret, FAIL, "H5Dclose"); - - /* Close file */ - ret = H5Fclose(fid); - CHECK(ret, FAIL, "H5Fclose"); - - /*----------------------------------------------------------------------------------- - * Reopen the file and verify the fill value for attribute. Also write - * some real data. - */ - /* Open file */ - fid = H5Fopen(FILENAME, H5F_ACC_RDWR, fapl); - CHECK(fid, FAIL, "H5Fopen"); - - /* Open the dataset */ - dataset = H5Dopen2(fid, DSET1_NAME, H5P_DEFAULT); - CHECK(dataset, FAIL, "H5Dopen2"); -#if 0 - /* Check on dataset's attribute storage status */ - is_dense = H5O__is_attr_dense_test(dataset); - VERIFY(is_dense, true, "H5O__is_attr_dense_test"); -#endif - /* Open first attribute for the dataset */ - attr = H5Aopen(dataset, attrname, H5P_DEFAULT); - CHECK(attr, FAIL, "H5Aopen"); - - /* Read attribute with fill value */ - ret = H5Aread(attr, H5T_NATIVE_INT, read_data1); - CHECK(ret, FAIL, "H5Aread"); - - /* Verify values read in */ - for (i = 0; i < ATTR1_DIM1; i++) - if (0 != read_data1[i]) - TestErrPrintf("%d: attribute data different: read_data1[%d]=%d\n", __LINE__, i, read_data1[i]); - - /* Open attribute for the second time */ - attr2 = H5Aopen(dataset, attrname, H5P_DEFAULT); - CHECK(attr, FAIL, "H5Aopen"); - - /* Write attribute information */ - ret = H5Awrite(attr2, H5T_NATIVE_INT, attr_data1); - CHECK(ret, FAIL, "H5Awrite"); - - /* Close attribute */ - ret = H5Aclose(attr2); - CHECK(ret, FAIL, "H5Aclose"); - - /* Close attribute */ - ret = H5Aclose(attr); - CHECK(ret, FAIL, "H5Aclose"); - - /* Close Dataset */ - ret = H5Dclose(dataset); - CHECK(ret, FAIL, "H5Dclose"); - - /* Close file */ - ret = H5Fclose(fid); - CHECK(ret, FAIL, "H5Fclose"); - - /*----------------------------------------------------------------------------------- - * Reopen the file and verify the data. Also rewrite the data and verify it. - */ - /* Open file */ - fid = H5Fopen(FILENAME, H5F_ACC_RDWR, fapl); - CHECK(fid, FAIL, "H5Fopen"); - - /* Open the dataset */ - dataset = H5Dopen2(fid, DSET1_NAME, H5P_DEFAULT); - CHECK(dataset, FAIL, "H5Dopen2"); -#if 0 - /* Check on dataset's attribute storage status */ - is_dense = H5O__is_attr_dense_test(dataset); - VERIFY(is_dense, true, "H5O__is_attr_dense_test"); -#endif - /* Open first attribute for the dataset */ - attr = H5Aopen(dataset, attrname, H5P_DEFAULT); - CHECK(attr, FAIL, "H5Aopen"); - - /* Read attribute information */ - ret = H5Aread(attr, H5T_NATIVE_INT, read_data1); - CHECK(ret, FAIL, "H5Aread"); - - /* Verify values read in */ - for (i = 0; i < ATTR1_DIM1; i++) - if (attr_data1[i] != read_data1[i]) - TestErrPrintf("%d: attribute data different: attr_data1[%d]=%d, read_data1[%d]=%d\n", __LINE__, i, - attr_data1[i], i, read_data1[i]); - - /* Open attribute for the second time */ - attr2 = H5Aopen(dataset, attrname, H5P_DEFAULT); - CHECK(attr, FAIL, "H5Aopen"); - - /* Write attribute information with the second ID */ - ret = H5Awrite(attr2, H5T_NATIVE_INT, rewrite_data); - CHECK(ret, FAIL, "H5Awrite"); - - /* Read attribute information with the first ID */ - ret = H5Aread(attr, H5T_NATIVE_INT, read_data1); - CHECK(ret, FAIL, "H5Aread"); - - /* Verify values read in */ - for (i = 0; i < ATTR1_DIM1; i++) - if (read_data1[i] != rewrite_data[i]) - TestErrPrintf("%d: attribute data different: read_data1[%d]=%d, rewrite_data[%d]=%d\n", __LINE__, - i, read_data1[i], i, rewrite_data[i]); - - /* Close attribute */ - ret = H5Aclose(attr); - CHECK(ret, FAIL, "H5Aclose"); - - ret = H5Aclose(attr2); - CHECK(ret, FAIL, "H5Aclose"); - - /* Close Dataset */ - ret = H5Dclose(dataset); - CHECK(ret, FAIL, "H5Dclose"); - - /* Close file */ - ret = H5Fclose(fid); - CHECK(ret, FAIL, "H5Fclose"); - - /*----------------------------------------------------------------------------------- - * Open the attribute by index. Verify the data is shared when the attribute - * is opened twice. - */ - /* Open file */ - fid = H5Fopen(FILENAME, H5F_ACC_RDWR, fapl); - CHECK(fid, FAIL, "H5Fopen"); - - /* Open the dataset */ - dataset = H5Dopen2(fid, DSET1_NAME, H5P_DEFAULT); - CHECK(dataset, FAIL, "H5Dopen2"); -#if 0 - /* Check on dataset's attribute storage status */ - is_dense = H5O__is_attr_dense_test(dataset); - VERIFY(is_dense, true, "H5O__is_attr_dense_test"); -#endif - /* Open first attribute for the dataset */ - attr = H5Aopen_by_idx(dataset, ".", H5_INDEX_NAME, H5_ITER_INC, (hsize_t)4, H5P_DEFAULT, H5P_DEFAULT); - CHECK(attr, FAIL, "H5Aopen"); - - /* Open attribute for the second time */ - attr2 = H5Aopen_by_idx(dataset, ".", H5_INDEX_NAME, H5_ITER_INC, (hsize_t)4, H5P_DEFAULT, H5P_DEFAULT); - CHECK(attr, FAIL, "H5Aopen"); - - /* Write attribute information with the second ID */ - ret = H5Awrite(attr2, H5T_NATIVE_UINT, &scalar_data); - CHECK(ret, FAIL, "H5Awrite"); - - /* Read attribute information with the first ID */ - ret = H5Aread(attr, H5T_NATIVE_INT, &read_scalar); - CHECK(ret, FAIL, "H5Aread"); - - /* Verify values read in */ - if (read_scalar != scalar_data) - TestErrPrintf("%d: attribute data different: read_scalar=%d, scalar_data=%d\n", __LINE__, read_scalar, - scalar_data); - - /* Close attribute */ - ret = H5Aclose(attr); - CHECK(ret, FAIL, "H5Aclose"); - - ret = H5Aclose(attr2); - CHECK(ret, FAIL, "H5Aclose"); - - /* Close Dataset */ - ret = H5Dclose(dataset); - CHECK(ret, FAIL, "H5Dclose"); - - /* Close file */ - ret = H5Fclose(fid); - CHECK(ret, FAIL, "H5Fclose"); - - /*----------------------------------------------------------------------------------- - * Open one attribute. As it remains open, delete some attributes. The - * attribute storage should switch from dense to compact. Then open the - * same attribute for the second time and verify that the attribute data - * is shared. - */ - /* Open file */ - fid = H5Fopen(FILENAME, H5F_ACC_RDWR, fapl); - CHECK(fid, FAIL, "H5Fopen"); - - /* Open the dataset */ - dataset = H5Dopen2(fid, DSET1_NAME, H5P_DEFAULT); - CHECK(dataset, FAIL, "H5Dopen2"); -#if 0 - /* Check on dataset's attribute storage status */ - is_dense = H5O__is_attr_dense_test(dataset); - VERIFY(is_dense, true, "H5O__is_attr_dense_test"); -#endif - /* Open attribute of the dataset for the first time */ - attr = H5Aopen_by_idx(dataset, ".", H5_INDEX_NAME, H5_ITER_INC, (hsize_t)2, H5P_DEFAULT, H5P_DEFAULT); - CHECK(attr, FAIL, "H5Aopen"); - - /* Delete a few attributes until the storage switches to compact */ - for (u = max_compact; u >= min_dense - 1; u--) { - ret = H5Adelete_by_idx(dataset, ".", H5_INDEX_NAME, H5_ITER_INC, (hsize_t)u, H5P_DEFAULT); - CHECK(ret, FAIL, "H5Adelete_by_idx"); - } -#if 0 - /* Check on dataset's attribute storage status */ - is_dense = H5O__is_attr_dense_test(dataset); - VERIFY(is_dense, false, "H5O__is_attr_dense_test"); -#endif - /* Open attribute for the second time */ - attr2 = H5Aopen_by_idx(dataset, ".", H5_INDEX_NAME, H5_ITER_INC, (hsize_t)2, H5P_DEFAULT, H5P_DEFAULT); - CHECK(attr, FAIL, "H5Aopen"); - - /* Write attribute information with the second ID */ - ret = H5Awrite(attr2, H5T_NATIVE_UINT, &scalar_data); - CHECK(ret, FAIL, "H5Awrite"); - - /* Read attribute information with the first ID */ - ret = H5Aread(attr, H5T_NATIVE_INT, &read_scalar); - CHECK(ret, FAIL, "H5Aread"); - - /* Verify values read in */ - if (read_scalar != scalar_data) - TestErrPrintf("%d: attribute data different: read_scalar=%d, scalar_data=%d\n", __LINE__, read_scalar, - scalar_data); - - /* Close attribute */ - ret = H5Aclose(attr); - CHECK(ret, FAIL, "H5Aclose"); - - ret = H5Aclose(attr2); - CHECK(ret, FAIL, "H5Aclose"); - - /* Close Dataset */ - ret = H5Dclose(dataset); - CHECK(ret, FAIL, "H5Dclose"); - - /* Close file */ - ret = H5Fclose(fid); - CHECK(ret, FAIL, "H5Fclose"); - - /*----------------------------------------------------------------------------------- - * Open one attribute. As it remains open, create some attributes. The - * attribute storage should switch from compact to dense. Then open the - * same attribute for the second time and verify that the attribute data - * is shared. - */ - /* Open file */ - fid = H5Fopen(FILENAME, H5F_ACC_RDWR, fapl); - CHECK(fid, FAIL, "H5Fopen"); - - /* Open the dataset */ - dataset = H5Dopen2(fid, DSET1_NAME, H5P_DEFAULT); - CHECK(dataset, FAIL, "H5Dopen2"); -#if 0 - /* Check on dataset's attribute storage status */ - is_dense = H5O__is_attr_dense_test(dataset); - VERIFY(is_dense, false, "H5O__is_attr_dense_test"); -#endif - /* Open attribute of the dataset for the first time */ - attr = H5Aopen_by_idx(dataset, ".", H5_INDEX_NAME, H5_ITER_INC, (hsize_t)3, H5P_DEFAULT, H5P_DEFAULT); - CHECK(attr, FAIL, "H5Aopen"); - - /* Delete a few attributes until the storage switches to compact */ - for (u = min_dense - 1; u <= max_compact; u++) { - /* Create attribute */ - snprintf(attrname, sizeof(attrname), "attr %02u", u); - add_attr = H5Acreate2(dataset, attrname, H5T_NATIVE_UINT, sid, H5P_DEFAULT, H5P_DEFAULT); - CHECK(add_attr, FAIL, "H5Acreate2"); - - /* Write data into the attribute */ - ret = H5Awrite(add_attr, H5T_NATIVE_UINT, &u); - CHECK(ret, FAIL, "H5Awrite"); - - /* Close attribute */ - ret = H5Aclose(add_attr); - CHECK(ret, FAIL, "H5Aclose"); - } -#if 0 - /* Check on dataset's attribute storage status */ - is_dense = H5O__is_attr_dense_test(dataset); - VERIFY(is_dense, true, "H5O__is_attr_dense_test"); -#endif - /* Open attribute for the second time */ - attr2 = H5Aopen_by_idx(dataset, ".", H5_INDEX_NAME, H5_ITER_INC, (hsize_t)3, H5P_DEFAULT, H5P_DEFAULT); - CHECK(attr, FAIL, "H5Aopen"); - - /* Write attribute information with the second ID */ - ret = H5Awrite(attr2, H5T_NATIVE_UINT, &scalar_data); - CHECK(ret, FAIL, "H5Awrite"); - - /* Read attribute information with the first ID */ - ret = H5Aread(attr, H5T_NATIVE_INT, &read_scalar); - CHECK(ret, FAIL, "H5Aread"); - - /* Verify values read in */ - if (read_scalar != scalar_data) - TestErrPrintf("%d: attribute data different: read_scalar=%d, scalar_data=%d\n", __LINE__, read_scalar, - scalar_data); - - /* Close attribute */ - ret = H5Aclose(attr); - CHECK(ret, FAIL, "H5Aclose"); - - ret = H5Aclose(attr2); - CHECK(ret, FAIL, "H5Aclose"); - - /* Close Dataset */ - ret = H5Dclose(dataset); - CHECK(ret, FAIL, "H5Dclose"); - - /* Close file */ - ret = H5Fclose(fid); - CHECK(ret, FAIL, "H5Fclose"); - - /*----------------------------------------------------------------------------------- - * Verify that the attribute being pointed to by different paths shares - * the same data. - */ - /* Open file */ - fid = H5Fopen(FILENAME, H5F_ACC_RDWR, fapl); - CHECK(fid, FAIL, "H5Fopen"); - - /* Create a group */ - gid1 = H5Gcreate2(fid, GROUP1_NAME, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT); - CHECK(gid1, FAIL, "H5Gcreate2"); - - /* Create hard link to the first group */ - ret = H5Lcreate_hard(gid1, GROUP1_NAME, H5L_SAME_LOC, GROUP2_NAME, H5P_DEFAULT, H5P_DEFAULT); - CHECK(ret, FAIL, "H5Lcreate_hard"); - - /* Add attributes, until just before converting to dense storage */ - for (u = 0; u < max_compact; u++) { - /* Create attribute */ - snprintf(attrname, sizeof(attrname), "attr %02u", u); - attr = H5Acreate2(gid1, attrname, H5T_NATIVE_UINT, sid, H5P_DEFAULT, H5P_DEFAULT); - CHECK(attr, FAIL, "H5Acreate2"); - - /* Write data into the attribute */ - ret = H5Awrite(attr, H5T_NATIVE_UINT, &u); - CHECK(ret, FAIL, "H5Awrite"); - - /* Close attribute */ - ret = H5Aclose(attr); - CHECK(ret, FAIL, "H5Aclose"); - } /* end for */ - - /* Try to create another attribute to make dense storage */ - attr = H5Acreate2(gid1, ATTR2_NAME, H5T_NATIVE_INT, sid2, H5P_DEFAULT, H5P_DEFAULT); - CHECK(attr, FAIL, "H5Acreate2"); -#if 0 - /* Check on group's attribute storage status */ - is_dense = H5O__is_attr_dense_test(gid1); - VERIFY(is_dense, true, "H5O__is_attr_dense_test"); -#endif - /* Open the hard link just created */ - gid2 = H5Gopen2(fid, GROUP2_NAME, H5P_DEFAULT); - CHECK(gid2, FAIL, "H5Gopen2"); - - /* Open the attribute of the group for the second time */ - attr2 = H5Aopen(gid2, ATTR2_NAME, H5P_DEFAULT); - CHECK(attr2, FAIL, "H5Aopen"); - - /* Write attribute information with the first attribute handle */ - ret = H5Awrite(attr, H5T_NATIVE_INT, attr_data1); - CHECK(ret, FAIL, "H5Awrite"); - - /* Read attribute information with the second attribute handle */ - ret = H5Aread(attr2, H5T_NATIVE_INT, read_data1); - CHECK(ret, FAIL, "H5Aread"); - - /* Verify values read in */ - for (i = 0; i < ATTR1_DIM1; i++) - if (attr_data1[i] != read_data1[i]) - TestErrPrintf("%d: attribute data different: attr_data1[%d]=%d, read_data1[%d]=%d\n", __LINE__, i, - attr_data1[i], i, read_data1[i]); - - /* Close attribute */ - ret = H5Aclose(attr); - CHECK(ret, FAIL, "H5Aclose"); - - ret = H5Aclose(attr2); - CHECK(ret, FAIL, "H5Aclose"); - - /* Close group */ - ret = H5Gclose(gid1); - CHECK(ret, FAIL, "H5Gclose"); - - ret = H5Gclose(gid2); - CHECK(ret, FAIL, "H5Gclose"); - - /* Close Attribute dataspace */ - ret = H5Sclose(sid); - CHECK(ret, FAIL, "H5Sclose"); - - /* Close Dataset dataspace */ - ret = H5Sclose(sid2); - CHECK(ret, FAIL, "H5Sclose"); - - /* Close file */ - ret = H5Fclose(fid); - CHECK(ret, FAIL, "H5Fclose"); -} /* test_attr_dense_dup_ids() */ - -/**************************************************************** -** -** test_attr_big(): Test basic H5A (attribute) code. -** Tests storing "big" attribute in dense storage immediately, if available -** -****************************************************************/ -static void -test_attr_big(hid_t fcpl, hid_t fapl) -{ - hid_t fid; /* HDF5 File ID */ - hid_t dataset; /* Dataset ID */ - hid_t sid; /* Dataspace ID */ - hid_t big_sid; /* "Big" dataspace ID */ - hsize_t dims[ATTR6_RANK] = {ATTR6_DIM1, ATTR6_DIM2, ATTR6_DIM3}; /* Attribute dimensions */ - hid_t attr; /* Attribute ID */ - hid_t dcpl; /* Dataset creation property list ID */ - char attrname[NAME_BUF_SIZE]; /* Name of attribute */ - unsigned max_compact; /* Maximum # of attributes to store compactly */ - unsigned min_dense; /* Minimum # of attributes to store "densely" */ - unsigned nshared_indices; /* # of shared message indices */ - H5F_libver_t low, high; /* File format bounds */ -#if 0 - htri_t is_empty; /* Are there any attributes? */ - htri_t is_dense; /* Are attributes stored densely? */ -#endif - unsigned u; /* Local index variable */ -#if 0 - h5_stat_size_t empty_filesize; /* Size of empty file */ - h5_stat_size_t filesize; /* Size of file after modifications */ -#endif - herr_t ret; /* Generic return value */ - - /* Output message about test being performed */ - MESSAGE(5, ("Testing Storing 'Big' Attributes in Dense Storage\n")); - - /* Create file */ - fid = H5Fcreate(FILENAME, H5F_ACC_TRUNC, fcpl, fapl); - CHECK(fid, FAIL, "H5Fcreate"); - - /* Close file */ - ret = H5Fclose(fid); - CHECK(ret, FAIL, "H5Fclose"); -#if 0 - /* Get size of file */ - empty_filesize = h5_get_file_size(FILENAME, fapl); - if (empty_filesize < 0) - TestErrPrintf("Line %d: file size wrong!\n", __LINE__); -#endif - /* Re-open file */ - fid = H5Fopen(FILENAME, H5F_ACC_RDWR, fapl); - CHECK(fid, FAIL, "H5Fopen"); - - /* Create dataspace for dataset & "small" attributes */ - sid = H5Screate(H5S_SCALAR); - CHECK(sid, FAIL, "H5Screate"); - - /* Create "big" dataspace for "big" attributes */ - big_sid = H5Screate_simple(ATTR6_RANK, dims, NULL); - CHECK(big_sid, FAIL, "H5Screate_simple"); - - /* need DCPL to query the group creation properties */ - if (dcpl_g == H5P_DEFAULT) { - dcpl = H5Pcreate(H5P_DATASET_CREATE); - CHECK(dcpl, FAIL, "H5Pcreate"); - } - else { - dcpl = H5Pcopy(dcpl_g); - CHECK(dcpl, FAIL, "H5Pcopy"); - } - - /* Retrieve limits for compact/dense attribute storage */ - ret = H5Pget_attr_phase_change(dcpl, &max_compact, &min_dense); - CHECK(ret, FAIL, "H5Pget_attr_phase_change"); - - /* Retrieve # of shared message indices (ie. whether attributes are shared or not) */ - ret = H5Pget_shared_mesg_nindexes(fcpl, &nshared_indices); - CHECK(ret, FAIL, "H5Pget_shared_mesg_nindexes"); - - /* Retrieve the format bounds for creating objects in the file */ - ret = H5Pget_libver_bounds(fapl, &low, &high); - CHECK(ret, FAIL, "H5Pget_libver_bounds"); - - /* Create a dataset */ - dataset = H5Dcreate2(fid, DSET1_NAME, H5T_NATIVE_UCHAR, sid, H5P_DEFAULT, dcpl, H5P_DEFAULT); - CHECK(dataset, FAIL, "H5Dcreate2"); - - /* Close property list */ - ret = H5Pclose(dcpl); - CHECK(ret, FAIL, "H5Pclose"); - -#if 0 - /* Check on dataset's attribute storage status */ - is_empty = H5O__is_attr_empty_test(dataset); - VERIFY(is_empty, true, "H5O__is_attr_empty_test"); - is_dense = H5O__is_attr_dense_test(dataset); - VERIFY(is_dense, false, "H5O__is_attr_dense_test"); -#endif - - /* Add first "small" attribute, which should be in compact storage */ - - /* Create attribute */ - u = 0; - snprintf(attrname, sizeof(attrname), "attr %02u", u); - attr = H5Acreate2(dataset, attrname, H5T_NATIVE_UINT, sid, H5P_DEFAULT, H5P_DEFAULT); - CHECK(attr, FAIL, "H5Acreate2"); - - /* Close attribute */ - ret = H5Aclose(attr); - CHECK(ret, FAIL, "H5Aclose"); -#if 0 - /* Check on dataset's attribute storage status */ - is_empty = H5O__is_attr_empty_test(dataset); - VERIFY(is_empty, false, "H5O__is_attr_empty_test"); - is_dense = H5O__is_attr_dense_test(dataset); - VERIFY(is_dense, false, "H5O__is_attr_dense_test"); -#endif - - /* Add second "small" attribute, which should stay in compact storage */ - - /* Create attribute */ - u = 1; - snprintf(attrname, sizeof(attrname), "attr %02u", u); - attr = H5Acreate2(dataset, attrname, H5T_NATIVE_UINT, sid, H5P_DEFAULT, H5P_DEFAULT); - CHECK(attr, FAIL, "H5Acreate2"); - - /* Close attribute */ - ret = H5Aclose(attr); - CHECK(ret, FAIL, "H5Aclose"); -#if 0 - /* Check on dataset's attribute storage status */ - is_empty = H5O__is_attr_empty_test(dataset); - VERIFY(is_empty, false, "H5O__is_attr_empty_test"); - is_dense = H5O__is_attr_dense_test(dataset); - VERIFY(is_dense, false, "H5O__is_attr_dense_test"); -#endif - - /* Add first "big" attribute, which should push storage into dense form */ - - /* Create attribute */ - u = 2; - snprintf(attrname, sizeof(attrname), "attr %02u", u); - attr = H5Acreate2(dataset, attrname, H5T_NATIVE_UINT, big_sid, H5P_DEFAULT, H5P_DEFAULT); - if (low == H5F_LIBVER_LATEST || attr >= 0) { - CHECK(attr, FAIL, "H5Acreate2"); - - /* Close attribute */ - ret = H5Aclose(attr); - CHECK(ret, FAIL, "H5Aclose"); - - /* Check on dataset's attribute storage status */ - /* (when attributes are shared, the "big" attribute goes into the shared - * message heap instead of forcing the attribute storage into the dense - * form - QAK) - */ -#if 0 - is_empty = H5O__is_attr_empty_test(dataset); - VERIFY(is_empty, false, "H5O__is_attr_empty_test"); - is_dense = H5O__is_attr_dense_test(dataset); - VERIFY(is_dense, (nshared_indices ? false : true), "H5O__is_attr_dense_test"); -#endif - - /* Add second "big" attribute, which should leave storage in dense form */ - - /* Create attribute */ - u = 3; - snprintf(attrname, sizeof(attrname), "attr %02u", u); - attr = H5Acreate2(dataset, attrname, H5T_NATIVE_UINT, big_sid, H5P_DEFAULT, H5P_DEFAULT); - CHECK(attr, FAIL, "H5Acreate2"); - - /* Close attribute */ - ret = H5Aclose(attr); - CHECK(ret, FAIL, "H5Aclose"); - - /* Check on dataset's attribute storage status */ - /* (when attributes are shared, the "big" attribute goes into the shared - * message heap instead of forcing the attribute storage into the dense - * form - QAK) - */ -#if 0 - is_empty = H5O__is_attr_empty_test(dataset); - VERIFY(is_empty, false, "H5O__is_attr_empty_test"); - is_dense = H5O__is_attr_dense_test(dataset); - VERIFY(is_dense, (nshared_indices ? false : true), "H5O__is_attr_dense_test"); -#endif - - /* Delete second "small" attribute, attributes should still be stored densely */ - - /* Delete attribute */ - u = 1; - snprintf(attrname, sizeof(attrname), "attr %02u", u); - ret = H5Adelete(dataset, attrname); - CHECK(ret, FAIL, "H5Adelete"); -#if 0 - /* Check on dataset's attribute storage status */ - is_empty = H5O__is_attr_empty_test(dataset); - VERIFY(is_empty, false, "H5O__is_attr_empty_test"); - is_dense = H5O__is_attr_dense_test(dataset); - VERIFY(is_dense, (nshared_indices ? false : true), "H5O__is_attr_dense_test"); -#endif - - /* Delete second "big" attribute, attributes should still be stored densely */ - - /* Delete attribute */ - u = 3; - snprintf(attrname, sizeof(attrname), "attr %02u", u); - ret = H5Adelete(dataset, attrname); - CHECK(ret, FAIL, "H5Adelete"); -#if 0 - /* Check on dataset's attribute storage status */ - is_empty = H5O__is_attr_empty_test(dataset); - VERIFY(is_empty, false, "H5O__is_attr_empty_test"); - is_dense = H5O__is_attr_dense_test(dataset); - VERIFY(is_dense, (nshared_indices ? false : true), "H5O__is_attr_dense_test"); -#endif - - /* Delete first "big" attribute, attributes should _not_ be stored densely */ - - /* Delete attribute */ - u = 2; - snprintf(attrname, sizeof(attrname), "attr %02u", u); - ret = H5Adelete(dataset, attrname); - CHECK(ret, FAIL, "H5Adelete"); -#if 0 - /* Check on dataset's attribute storage status */ - is_empty = H5O__is_attr_empty_test(dataset); - VERIFY(is_empty, false, "H5O__is_attr_empty_test"); - is_dense = H5O__is_attr_dense_test(dataset); - VERIFY(is_dense, false, "H5O__is_attr_dense_test"); -#endif - - /* Delete first "small" attribute, should be no attributes now */ - - /* Delete attribute */ - u = 0; - snprintf(attrname, sizeof(attrname), "attr %02u", u); - ret = H5Adelete(dataset, attrname); - CHECK(ret, FAIL, "H5Adelete"); -#if 0 - /* Check on dataset's attribute storage status */ - is_empty = H5O__is_attr_empty_test(dataset); - VERIFY(is_empty, true, "H5O__is_attr_empty_test"); -#endif - } /* end if */ -#if 0 - else { - /* Shouldn't be able to create "big" attributes with older version of format */ - VERIFY(attr, FAIL, "H5Acreate2"); - - /* Check on dataset's attribute storage status */ - /* (when attributes are shared, the "big" attribute goes into the shared - * message heap instead of forcing the attribute storage into the dense - * form - QAK) - */ - is_empty = H5O__is_attr_empty_test(dataset); - VERIFY(is_empty, false, "H5O__is_attr_empty_test"); - is_dense = H5O__is_attr_dense_test(dataset); - VERIFY(is_dense, false, "H5O__is_attr_dense_test"); - } /* end else */ -#endif - - /* Close dataspaces */ - ret = H5Sclose(sid); - CHECK(ret, FAIL, "H5Sclose"); - ret = H5Sclose(big_sid); - CHECK(ret, FAIL, "H5Sclose"); - - /* Close Dataset */ - ret = H5Dclose(dataset); - CHECK(ret, FAIL, "H5Dclose"); - - /* Unlink dataset */ - ret = H5Ldelete(fid, DSET1_NAME, H5P_DEFAULT); - CHECK(ret, FAIL, "H5Ldelete"); - - /* Close file */ - ret = H5Fclose(fid); - CHECK(ret, FAIL, "H5Fclose"); -#if 0 - if (h5_using_default_driver(NULL)) { - /* Check size of file */ - filesize = h5_get_file_size(FILENAME, fapl); - VERIFY(filesize, empty_filesize, "h5_get_file_size"); - } -#endif -} /* test_attr_big() */ - -/**************************************************************** -** -** test_attr_null_space(): Test basic H5A (attribute) code. -** Tests storing attribute with "null" dataspace -** -****************************************************************/ -static void -test_attr_null_space(hid_t fcpl, hid_t fapl) -{ - hid_t fid; /* HDF5 File ID */ - hid_t dataset; /* Dataset ID */ - hid_t sid; /* Dataspace ID */ - hid_t null_sid; /* "null" dataspace ID */ - hid_t attr_sid; /* Attribute's dataspace ID */ - hid_t attr; /* Attribute ID */ - char attrname[NAME_BUF_SIZE]; /* Name of attribute */ - unsigned value; /* Attribute value */ - htri_t cmp; /* Results of comparison */ -#if 0 - hsize_t storage_size; /* Size of storage for attribute */ -#endif - H5A_info_t ainfo; /* Attribute info */ -#if 0 - h5_stat_size_t empty_filesize; /* Size of empty file */ - h5_stat_size_t filesize; /* Size of file after modifications */ -#endif - herr_t ret; /* Generic return value */ - - /* Output message about test being performed */ - MESSAGE(5, ("Testing Storing Attributes with 'null' dataspace\n")); - - /* Create file */ - fid = H5Fcreate(FILENAME, H5F_ACC_TRUNC, fcpl, fapl); - CHECK(fid, FAIL, "H5Fcreate"); - - /* Close file */ - ret = H5Fclose(fid); - CHECK(ret, FAIL, "H5Fclose"); -#if 0 - /* Get size of file */ - empty_filesize = h5_get_file_size(FILENAME, fapl); - if (empty_filesize < 0) - TestErrPrintf("Line %d: file size wrong!\n", __LINE__); -#endif - /* Re-open file */ - fid = H5Fopen(FILENAME, H5F_ACC_RDWR, fapl); - CHECK(fid, FAIL, "H5Fopen"); - - /* Create dataspace for dataset attributes */ - sid = H5Screate(H5S_SCALAR); - CHECK(sid, FAIL, "H5Screate"); - - /* Create "null" dataspace for attribute */ - null_sid = H5Screate(H5S_NULL); - CHECK(null_sid, FAIL, "H5Screate"); - - /* Create a dataset */ - dataset = H5Dcreate2(fid, DSET1_NAME, H5T_NATIVE_UCHAR, sid, H5P_DEFAULT, dcpl_g, H5P_DEFAULT); - CHECK(dataset, FAIL, "H5Dcreate2"); - - /* Add attribute with 'null' dataspace */ - - /* Create attribute */ - strcpy(attrname, "null attr"); - attr = H5Acreate2(dataset, attrname, H5T_NATIVE_UINT, null_sid, H5P_DEFAULT, H5P_DEFAULT); - CHECK(attr, FAIL, "H5Acreate2"); - - /* Try to read data from the attribute */ - /* (shouldn't fail, but should leave buffer alone) */ - value = 23; - ret = H5Aread(attr, H5T_NATIVE_UINT, &value); - CHECK(ret, FAIL, "H5Aread"); - VERIFY(value, 23, "H5Aread"); - - /* Get the dataspace for the attribute and make certain it's 'null' */ - attr_sid = H5Aget_space(attr); - CHECK(attr_sid, FAIL, "H5Aget_space"); - - /* Compare the dataspaces */ - cmp = H5Sextent_equal(attr_sid, null_sid); - CHECK(cmp, FAIL, "H5Sextent_equal"); - VERIFY(cmp, true, "H5Sextent_equal"); - - /* Close dataspace */ - ret = H5Sclose(attr_sid); - CHECK(ret, FAIL, "H5Sclose"); -#if 0 - /* Check the storage size for the attribute */ - storage_size = H5Aget_storage_size(attr); - VERIFY(storage_size, 0, "H5Aget_storage_size"); -#endif - /* Get the attribute info */ - ret = H5Aget_info(attr, &ainfo); - CHECK(ret, FAIL, "H5Aget_info"); -#if 0 - VERIFY(ainfo.data_size, storage_size, "H5Aget_info"); -#endif - /* Close attribute */ - ret = H5Aclose(attr); - CHECK(ret, FAIL, "H5Aclose"); - - /* Add another attribute with 'null' dataspace */ - - /* Create attribute */ - strcpy(attrname, "null attr #2"); - attr = H5Acreate2(dataset, attrname, H5T_NATIVE_UINT, null_sid, H5P_DEFAULT, H5P_DEFAULT); - CHECK(attr, FAIL, "H5Acreate2"); - - /* Try to write data to the attribute */ - /* (shouldn't fail, but should leave buffer alone) */ - value = 23; - ret = H5Awrite(attr, H5T_NATIVE_UINT, &value); - CHECK(ret, FAIL, "H5Awrite"); - VERIFY(value, 23, "H5Awrite"); - - /* Close attribute */ - ret = H5Aclose(attr); - CHECK(ret, FAIL, "H5Aclose"); - - /* Close Dataset */ - ret = H5Dclose(dataset); - CHECK(ret, FAIL, "H5Dclose"); - - /* Close file */ - ret = H5Fclose(fid); - CHECK(ret, FAIL, "H5Fclose"); - - /* Re-open the file and check on the attributes */ - - /* Re-open file */ - fid = H5Fopen(FILENAME, H5F_ACC_RDWR, fapl); - CHECK(fid, FAIL, "H5Fopen"); - - /* Open dataset */ - dataset = H5Dopen2(fid, DSET1_NAME, H5P_DEFAULT); - CHECK(dataset, FAIL, "H5Dopen2"); - - /* Open first attribute */ - strcpy(attrname, "null attr #2"); - attr = H5Aopen(dataset, attrname, H5P_DEFAULT); - CHECK(attr, FAIL, "H5Aopen"); - - /* Try to read data from the attribute */ - /* (shouldn't fail, but should leave buffer alone) */ - value = 23; - ret = H5Aread(attr, H5T_NATIVE_UINT, &value); - CHECK(ret, FAIL, "H5Aread"); - VERIFY(value, 23, "H5Aread"); - - /* Get the dataspace for the attribute and make certain it's 'null' */ - attr_sid = H5Aget_space(attr); - CHECK(attr_sid, FAIL, "H5Aget_space"); - - /* Compare the dataspaces */ - cmp = H5Sextent_equal(attr_sid, null_sid); - CHECK(cmp, FAIL, "H5Sextent_equal"); - VERIFY(cmp, true, "H5Sextent_equal"); - - /* Close dataspace */ - ret = H5Sclose(attr_sid); - CHECK(ret, FAIL, "H5Sclose"); -#if 0 - /* Check the storage size for the attribute */ - storage_size = H5Aget_storage_size(attr); - VERIFY(storage_size, 0, "H5Aget_storage_size"); -#endif - /* Get the attribute info */ - ret = H5Aget_info(attr, &ainfo); - CHECK(ret, FAIL, "H5Aget_info"); -#if 0 - VERIFY(ainfo.data_size, storage_size, "H5Aget_info"); -#endif - - /* Close attribute */ - ret = H5Aclose(attr); - CHECK(ret, FAIL, "H5Aclose"); - - /* Open second attribute */ - strcpy(attrname, "null attr"); - attr = H5Aopen(dataset, attrname, H5P_DEFAULT); - CHECK(attr, FAIL, "H5Aopen"); - - /* Try to write data to the attribute */ - /* (shouldn't fail, but should leave buffer alone) */ - value = 23; - ret = H5Awrite(attr, H5T_NATIVE_UINT, &value); - CHECK(ret, FAIL, "H5Awrite"); - VERIFY(value, 23, "H5Awrite"); - - /* Close attribute */ - ret = H5Aclose(attr); - CHECK(ret, FAIL, "H5Aclose"); - - /* Close Dataset */ - ret = H5Dclose(dataset); - CHECK(ret, FAIL, "H5Dclose"); - - /* Unlink dataset */ - ret = H5Ldelete(fid, DSET1_NAME, H5P_DEFAULT); - CHECK(ret, FAIL, "H5Ldelete"); - - /* Close file */ - ret = H5Fclose(fid); - CHECK(ret, FAIL, "H5Fclose"); - - /* Close dataspaces */ - ret = H5Sclose(sid); - CHECK(ret, FAIL, "H5Sclose"); - ret = H5Sclose(null_sid); - CHECK(ret, FAIL, "H5Sclose"); - -#if 0 - if (h5_using_default_driver(NULL)) { - /* Check size of file */ - filesize = h5_get_file_size(FILENAME, fapl); - VERIFY(filesize, empty_filesize, "h5_get_file_size"); - } -#endif -} /* test_attr_null_space() */ - -/**************************************************************** -** -** test_attr_deprec(): Test basic H5A (attribute) code. -** Tests deprecated API routines -** -****************************************************************/ -static void -test_attr_deprec(hid_t fcpl, hid_t fapl) -{ -#ifndef H5_NO_DEPRECATED_SYMBOLS - hid_t fid; /* HDF5 File ID */ - hid_t dataset; /* Dataset ID */ - hid_t sid; /* Dataspace ID */ - hid_t attr; /* Attribute ID */ - herr_t ret; /* Generic return value */ - - /* Output message about test being performed */ - MESSAGE(5, ("Testing Deprecated Attribute Routines\n")); - - /* Create file */ - fid = H5Fcreate(FILENAME, H5F_ACC_TRUNC, fcpl, fapl); - CHECK(fid, FAIL, "H5Fcreate"); - - /* Create dataspace for dataset attributes */ - sid = H5Screate(H5S_SCALAR); - CHECK(sid, FAIL, "H5Screate"); - - /* Create a dataset */ - dataset = H5Dcreate2(fid, DSET1_NAME, H5T_NATIVE_UCHAR, sid, H5P_DEFAULT, dcpl_g, H5P_DEFAULT); - CHECK(dataset, FAIL, "H5Dcreate2"); - - /* Add attribute to dataset */ - - /* Create attribute */ - attr = H5Acreate1(dataset, "attr", H5T_NATIVE_UINT, sid, H5P_DEFAULT); - CHECK(attr, FAIL, "H5Acreate1"); - - /* Close attribute */ - ret = H5Aclose(attr); - CHECK(ret, FAIL, "H5Aclose"); - - /* Close dataspaces */ - ret = H5Sclose(sid); - - /* Close Dataset */ - ret = H5Dclose(dataset); - CHECK(ret, FAIL, "H5Dclose"); - - /* Close file */ - ret = H5Fclose(fid); - CHECK(ret, FAIL, "H5Fclose"); - - /* Re-open the file and operate on the attribute */ - - /* Re-open file */ - fid = H5Fopen(FILENAME, H5F_ACC_RDWR, fapl); - CHECK(fid, FAIL, "H5Fopen"); - - /* Open dataset */ - dataset = H5Dopen2(fid, DSET1_NAME, H5P_DEFAULT); - CHECK(dataset, FAIL, "H5Dopen2"); - -#if 0 - /* Get number of attributes with bad ID */ - H5E_BEGIN_TRY - { - ret = H5Aget_num_attrs((hid_t)-1); - } - H5E_END_TRY - VERIFY(ret, FAIL, "H5Aget_num_attrs"); - - /* Get number of attributes */ - ret = H5Aget_num_attrs(dataset); - VERIFY(ret, 1, "H5Aget_num_attrs"); -#endif - /* Open the attribute by index */ - attr = H5Aopen_idx(dataset, 0); - CHECK(attr, FAIL, "H5Aopen_idx"); - - /* Close attribute */ - ret = H5Aclose(attr); - CHECK(ret, FAIL, "H5Aclose"); - - /* Open the attribute by name */ - attr = H5Aopen_name(dataset, "attr"); - CHECK(attr, FAIL, "H5Aopen_name"); - - /* Close attribute */ - ret = H5Aclose(attr); - CHECK(ret, FAIL, "H5Aclose"); - - /* Close Dataset */ - ret = H5Dclose(dataset); - CHECK(ret, FAIL, "H5Dclose"); - - /* Close file */ - ret = H5Fclose(fid); - CHECK(ret, FAIL, "H5Fclose"); -#else /* H5_NO_DEPRECATED_SYMBOLS */ - /* Shut compiler up */ - (void)fcpl; - (void)fapl; - - /* Output message about test being skipped */ - MESSAGE(5, ("Skipping Test On Deprecated Attribute Routines\n")); - -#endif /* H5_NO_DEPRECATED_SYMBOLS */ -} /* test_attr_deprec() */ - -/**************************************************************** -** -** test_attr_many(): Test basic H5A (attribute) code. -** Tests storing lots of attributes -** -****************************************************************/ -static void -test_attr_many(bool new_format, hid_t fcpl, hid_t fapl) -{ - hid_t fid; /* HDF5 File ID */ - hid_t gid; /* Group ID */ - hid_t sid; /* Dataspace ID */ - hid_t aid; /* Attribute ID */ - char attrname[NAME_BUF_SIZE]; /* Name of attribute */ - unsigned nattr = (new_format ? NATTR_MANY_NEW : NATTR_MANY_OLD); /* Number of attributes */ - htri_t exists; /* Whether the attribute exists or not */ - unsigned u; /* Local index variable */ - herr_t ret; /* Generic return value */ - - /* Output message about test being performed */ - MESSAGE(5, ("Testing Storing Many Attributes\n")); - - /* Create file */ - fid = H5Fcreate(FILENAME, H5F_ACC_TRUNC, fcpl, fapl); - CHECK(fid, FAIL, "H5Fcreate"); - - /* Create dataspace for attribute */ - sid = H5Screate(H5S_SCALAR); - CHECK(sid, FAIL, "H5Screate"); - - /* Create group for attributes */ - gid = H5Gcreate2(fid, GROUP1_NAME, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT); - CHECK(gid, FAIL, "H5Gcreate2"); - - /* Create many attributes */ - for (u = 0; u < nattr; u++) { - snprintf(attrname, sizeof(attrname), "a-%06u", u); - - exists = H5Aexists(gid, attrname); - VERIFY(exists, false, "H5Aexists"); - - exists = H5Aexists_by_name(fid, GROUP1_NAME, attrname, H5P_DEFAULT); - VERIFY(exists, false, "H5Aexists_by_name"); - - aid = H5Acreate2(gid, attrname, H5T_NATIVE_UINT, sid, H5P_DEFAULT, H5P_DEFAULT); - CHECK(aid, FAIL, "H5Acreate2"); - - exists = H5Aexists(gid, attrname); - VERIFY(exists, true, "H5Aexists"); - - exists = H5Aexists_by_name(fid, GROUP1_NAME, attrname, H5P_DEFAULT); - VERIFY(exists, true, "H5Aexists_by_name"); - - ret = H5Awrite(aid, H5T_NATIVE_UINT, &u); - CHECK(ret, FAIL, "H5Awrite"); - - ret = H5Aclose(aid); - CHECK(ret, FAIL, "H5Aclose"); - - exists = H5Aexists(gid, attrname); - VERIFY(exists, true, "H5Aexists"); - - exists = H5Aexists_by_name(fid, GROUP1_NAME, attrname, H5P_DEFAULT); - VERIFY(exists, true, "H5Aexists_by_name"); - } /* end for */ - - /* Close group */ - ret = H5Gclose(gid); - CHECK(ret, FAIL, "H5Gclose"); - - /* Close file */ - ret = H5Fclose(fid); - CHECK(ret, FAIL, "H5Fclose"); - - /* Re-open the file and check on the attributes */ - - /* Re-open file */ - fid = H5Fopen(FILENAME, H5F_ACC_RDONLY, fapl); - CHECK(fid, FAIL, "H5Fopen"); - - /* Re-open group */ - gid = H5Gopen2(fid, GROUP1_NAME, H5P_DEFAULT); - CHECK(gid, FAIL, "H5Gopen2"); - - /* Verify attributes */ - for (u = 0; u < nattr; u++) { - unsigned value; /* Attribute value */ - - snprintf(attrname, sizeof(attrname), "a-%06u", u); - - exists = H5Aexists(gid, attrname); - VERIFY(exists, true, "H5Aexists"); - - exists = H5Aexists_by_name(fid, GROUP1_NAME, attrname, H5P_DEFAULT); - VERIFY(exists, true, "H5Aexists_by_name"); - - aid = H5Aopen(gid, attrname, H5P_DEFAULT); - CHECK(aid, FAIL, "H5Aopen"); - - exists = H5Aexists(gid, attrname); - VERIFY(exists, true, "H5Aexists"); - - exists = H5Aexists_by_name(fid, GROUP1_NAME, attrname, H5P_DEFAULT); - VERIFY(exists, true, "H5Aexists_by_name"); - - ret = H5Aread(aid, H5T_NATIVE_UINT, &value); - CHECK(ret, FAIL, "H5Aread"); - VERIFY(value, u, "H5Aread"); - - ret = H5Aclose(aid); - CHECK(ret, FAIL, "H5Aclose"); - } /* end for */ - - /* Close group */ - ret = H5Gclose(gid); - CHECK(ret, FAIL, "H5Gclose"); - - /* Close file */ - ret = H5Fclose(fid); - CHECK(ret, FAIL, "H5Fclose"); - - /* Close dataspaces */ - ret = H5Sclose(sid); - CHECK(ret, FAIL, "H5Sclose"); -} /* test_attr_many() */ - -/**************************************************************** -** -** test_attr_corder_create_empty(): Test basic H5A (attribute) code. -** Tests basic code to create objects with attribute creation order info -** -****************************************************************/ -static void -test_attr_corder_create_basic(hid_t fcpl, hid_t fapl) -{ - hid_t fid; /* HDF5 File ID */ - hid_t dataset; /* Dataset ID */ - hid_t sid; /* Dataspace ID */ - hid_t dcpl; /* Dataset creation property list ID */ - unsigned crt_order_flags; /* Creation order flags */ -#if 0 - htri_t is_empty; /* Are there any attributes? */ - htri_t is_dense; /* Are attributes stored densely? */ -#endif - herr_t ret; /* Generic return value */ - - /* Output message about test being performed */ - MESSAGE(5, ("Testing Basic Code for Attributes with Creation Order Info\n")); - - /* Create file */ - fid = H5Fcreate(FILENAME, H5F_ACC_TRUNC, fcpl, fapl); - CHECK(fid, FAIL, "H5Fcreate"); - - /* Create dataset creation property list */ - if (dcpl_g == H5P_DEFAULT) { - dcpl = H5Pcreate(H5P_DATASET_CREATE); - CHECK(dcpl, FAIL, "H5Pcreate"); - } - else { - dcpl = H5Pcopy(dcpl_g); - CHECK(dcpl, FAIL, "H5Pcopy"); - } -#if 0 - /* Get creation order indexing on object */ - ret = H5Pget_attr_creation_order(dcpl, &crt_order_flags); - CHECK(ret, FAIL, "H5Pget_attr_creation_order"); - VERIFY(crt_order_flags, 0, "H5Pget_attr_creation_order"); -#endif - /* Setting invalid combination of a attribute order creation order indexing on should fail */ - H5E_BEGIN_TRY - { - ret = H5Pset_attr_creation_order(dcpl, H5P_CRT_ORDER_INDEXED); - } - H5E_END_TRY - VERIFY(ret, FAIL, "H5Pset_attr_creation_order"); - -#if 0 - ret = H5Pget_attr_creation_order(dcpl, &crt_order_flags); - CHECK(ret, FAIL, "H5Pget_attr_creation_order"); - VERIFY(crt_order_flags, 0, "H5Pget_attr_creation_order"); -#endif - - /* Set attribute creation order tracking & indexing for object */ - ret = H5Pset_attr_creation_order(dcpl, (H5P_CRT_ORDER_TRACKED | H5P_CRT_ORDER_INDEXED)); - CHECK(ret, FAIL, "H5Pset_attr_creation_order"); - ret = H5Pget_attr_creation_order(dcpl, &crt_order_flags); - CHECK(ret, FAIL, "H5Pget_attr_creation_order"); - VERIFY(crt_order_flags, (H5P_CRT_ORDER_TRACKED | H5P_CRT_ORDER_INDEXED), "H5Pget_attr_creation_order"); - - /* Create dataspace for dataset */ - sid = H5Screate(H5S_SCALAR); - CHECK(sid, FAIL, "H5Screate"); - - /* Create a dataset */ - dataset = H5Dcreate2(fid, DSET1_NAME, H5T_NATIVE_UCHAR, sid, H5P_DEFAULT, dcpl, H5P_DEFAULT); - CHECK(dataset, FAIL, "H5Dcreate2"); - - /* Close dataspace */ - ret = H5Sclose(sid); - CHECK(ret, FAIL, "H5Sclose"); -#if 0 - /* Check on dataset's attribute storage status */ - is_empty = H5O__is_attr_empty_test(dataset); - VERIFY(is_empty, true, "H5O__is_attr_empty_test"); - is_dense = H5O__is_attr_dense_test(dataset); - VERIFY(is_dense, false, "H5O__is_attr_dense_test"); -#endif - - /* Close Dataset */ - ret = H5Dclose(dataset); - CHECK(ret, FAIL, "H5Dclose"); - - /* Close property list */ - ret = H5Pclose(dcpl); - CHECK(ret, FAIL, "H5Pclose"); - - /* Close file */ - ret = H5Fclose(fid); - CHECK(ret, FAIL, "H5Fclose"); - - /* Re-open file */ - fid = H5Fopen(FILENAME, H5F_ACC_RDWR, fapl); - CHECK(fid, FAIL, "H5Fopen"); - - /* Open dataset created */ - dataset = H5Dopen2(fid, DSET1_NAME, H5P_DEFAULT); - CHECK(dataset, FAIL, "H5Dopen2"); -#if 0 - /* Check on dataset's attribute storage status */ - is_empty = H5O__is_attr_empty_test(dataset); - VERIFY(is_empty, true, "H5O__is_attr_empty_test"); - is_dense = H5O__is_attr_dense_test(dataset); - VERIFY(is_dense, false, "H5O__is_attr_dense_test"); -#endif - - /* Retrieve dataset creation property list for group */ - dcpl = H5Dget_create_plist(dataset); - CHECK(dcpl, FAIL, "H5Dget_create_plist"); - - /* Query the attribute creation properties */ - ret = H5Pget_attr_creation_order(dcpl, &crt_order_flags); - CHECK(ret, FAIL, "H5Pget_attr_creation_order"); - VERIFY(crt_order_flags, (H5P_CRT_ORDER_TRACKED | H5P_CRT_ORDER_INDEXED), "H5Pget_attr_creation_order"); - - /* Close property list */ - ret = H5Pclose(dcpl); - CHECK(ret, FAIL, "H5Pclose"); - - /* Close Dataset */ - ret = H5Dclose(dataset); - CHECK(ret, FAIL, "H5Dclose"); - - /* Close file */ - ret = H5Fclose(fid); - CHECK(ret, FAIL, "H5Fclose"); -} /* test_attr_corder_create_basic() */ - -/**************************************************************** -** -** test_attr_corder_create_compact(): Test basic H5A (attribute) code. -** Tests compact attribute storage on objects with attribute creation order info -** -****************************************************************/ -static void -test_attr_corder_create_compact(hid_t fcpl, hid_t fapl) -{ - hid_t fid; /* HDF5 File ID */ - hid_t dset1, dset2, dset3; /* Dataset IDs */ - hid_t my_dataset; /* Current dataset ID */ - hid_t sid; /* Dataspace ID */ - hid_t attr; /* Attribute ID */ - hid_t dcpl; /* Dataset creation property list ID */ - unsigned max_compact; /* Maximum # of links to store in group compactly */ - unsigned min_dense; /* Minimum # of links to store in group "densely" */ -#if 0 - htri_t is_empty; /* Are there any attributes? */ - htri_t is_dense; /* Are attributes stored densely? */ - hsize_t nattrs; /* Number of attributes on object */ -#endif - char attrname[NAME_BUF_SIZE]; /* Name of attribute */ - unsigned curr_dset; /* Current dataset to work on */ - unsigned u; /* Local index variable */ - herr_t ret; /* Generic return value */ - - /* Output message about test being performed */ - MESSAGE(5, ("Testing Compact Storage of Attributes with Creation Order Info\n")); - - /* Create file */ - fid = H5Fcreate(FILENAME, H5F_ACC_TRUNC, fcpl, fapl); - CHECK(fid, FAIL, "H5Fcreate"); - - /* Create dataset creation property list */ - if (dcpl_g == H5P_DEFAULT) { - dcpl = H5Pcreate(H5P_DATASET_CREATE); - CHECK(dcpl, FAIL, "H5Pcreate"); - } - else { - dcpl = H5Pcopy(dcpl_g); - CHECK(dcpl, FAIL, "H5Pcopy"); - } - - /* Set attribute creation order tracking & indexing for object */ - ret = H5Pset_attr_creation_order(dcpl, (H5P_CRT_ORDER_TRACKED | H5P_CRT_ORDER_INDEXED)); - CHECK(ret, FAIL, "H5Pset_attr_creation_order"); - - /* Query the attribute creation properties */ - ret = H5Pget_attr_phase_change(dcpl, &max_compact, &min_dense); - CHECK(ret, FAIL, "H5Pget_attr_phase_change"); - - /* Create dataspace for dataset & attributes */ - sid = H5Screate(H5S_SCALAR); - CHECK(sid, FAIL, "H5Screate"); - - /* Create datasets */ - dset1 = H5Dcreate2(fid, DSET1_NAME, H5T_NATIVE_UCHAR, sid, H5P_DEFAULT, dcpl, H5P_DEFAULT); - CHECK(dset1, FAIL, "H5Dcreate2"); - dset2 = H5Dcreate2(fid, DSET2_NAME, H5T_NATIVE_UCHAR, sid, H5P_DEFAULT, dcpl, H5P_DEFAULT); - CHECK(dset2, FAIL, "H5Dcreate2"); - dset3 = H5Dcreate2(fid, DSET3_NAME, H5T_NATIVE_UCHAR, sid, H5P_DEFAULT, dcpl, H5P_DEFAULT); - CHECK(dset3, FAIL, "H5Dcreate2"); - - /* Work on all the datasets */ - for (curr_dset = 0; curr_dset < NUM_DSETS; curr_dset++) { - switch (curr_dset) { - case 0: - my_dataset = dset1; - break; - - case 1: - my_dataset = dset2; - break; - - case 2: - my_dataset = dset3; - break; - - default: - assert(0 && "Too many datasets!"); - } /* end switch */ -#if 0 - /* Check on dataset's attribute storage status */ - is_empty = H5O__is_attr_empty_test(my_dataset); - VERIFY(is_empty, true, "H5O__is_attr_empty_test"); - is_dense = H5O__is_attr_dense_test(my_dataset); - VERIFY(is_dense, false, "H5O__is_attr_dense_test"); -#endif - /* Create several attributes, but keep storage in compact form */ - for (u = 0; u < max_compact; u++) { - /* Create attribute */ - snprintf(attrname, sizeof(attrname), "attr %02u", u); - attr = H5Acreate2(my_dataset, attrname, H5T_NATIVE_UINT, sid, H5P_DEFAULT, H5P_DEFAULT); - CHECK(attr, FAIL, "H5Acreate2"); - - /* Write data into the attribute */ - ret = H5Awrite(attr, H5T_NATIVE_UINT, &u); - CHECK(ret, FAIL, "H5Awrite"); - - /* Close attribute */ - ret = H5Aclose(attr); - CHECK(ret, FAIL, "H5Aclose"); -#if 0 - /* Verify state of object */ - ret = H5O__num_attrs_test(my_dataset, &nattrs); - CHECK(ret, FAIL, "H5O__num_attrs_test"); - VERIFY(nattrs, (u + 1), "H5O__num_attrs_test"); - is_empty = H5O__is_attr_empty_test(my_dataset); - VERIFY(is_empty, false, "H5O__is_attr_empty_test"); - is_dense = H5O__is_attr_dense_test(my_dataset); - VERIFY(is_dense, false, "H5O__is_attr_dense_test"); -#endif - } /* end for */ - } /* end for */ - - /* Close Datasets */ - ret = H5Dclose(dset1); - CHECK(ret, FAIL, "H5Dclose"); - ret = H5Dclose(dset2); - CHECK(ret, FAIL, "H5Dclose"); - ret = H5Dclose(dset3); - CHECK(ret, FAIL, "H5Dclose"); - - /* Close dataspace */ - ret = H5Sclose(sid); - CHECK(ret, FAIL, "H5Sclose"); - - /* Close property list */ - ret = H5Pclose(dcpl); - CHECK(ret, FAIL, "H5Pclose"); - - /* Close file */ - ret = H5Fclose(fid); - CHECK(ret, FAIL, "H5Fclose"); - - /* Re-open file */ - fid = H5Fopen(FILENAME, H5F_ACC_RDWR, fapl); - CHECK(fid, FAIL, "H5Fopen"); - - /* Open datasets created */ - dset1 = H5Dopen2(fid, DSET1_NAME, H5P_DEFAULT); - CHECK(dset1, FAIL, "H5Dopen2"); - dset2 = H5Dopen2(fid, DSET2_NAME, H5P_DEFAULT); - CHECK(dset2, FAIL, "H5Dopen2"); - dset3 = H5Dopen2(fid, DSET3_NAME, H5P_DEFAULT); - CHECK(dset3, FAIL, "H5Dopen2"); - - /* Work on all the datasets */ - for (curr_dset = 0; curr_dset < NUM_DSETS; curr_dset++) { - switch (curr_dset) { - case 0: - my_dataset = dset1; - break; - - case 1: - my_dataset = dset2; - break; - - case 2: - my_dataset = dset3; - break; - - default: - assert(0 && "Too many datasets!"); - } /* end switch */ -#if 0 - /* Check on dataset's attribute storage status */ - ret = H5O__num_attrs_test(my_dataset, &nattrs); - CHECK(ret, FAIL, "H5O__num_attrs_test"); - VERIFY(nattrs, max_compact, "H5O__num_attrs_test"); - is_empty = H5O__is_attr_empty_test(my_dataset); - VERIFY(is_empty, false, "H5O__is_attr_empty_test"); - is_dense = H5O__is_attr_dense_test(my_dataset); - VERIFY(is_dense, false, "H5O__is_attr_dense_test"); -#endif - /* Loop through attributes, checking their creation order values */ - /* (the name index is used, but the creation order value is in the same order) */ - for (u = 0; u < max_compact; u++) { - H5A_info_t ainfo; /* Attribute information */ - - /* Retrieve information for attribute */ - snprintf(attrname, sizeof(attrname), "attr %02u", u); - ret = H5Aget_info_by_name(my_dataset, ".", attrname, &ainfo, H5P_DEFAULT); - CHECK(ret, FAIL, "H5Aget_info_by_name"); - - /* Verify creation order of attribute */ - VERIFY(ainfo.corder_valid, true, "H5Aget_info_by_name"); - VERIFY(ainfo.corder, u, "H5Aget_info_by_name"); - } /* end for */ - } /* end for */ - - /* Close Datasets */ - ret = H5Dclose(dset1); - CHECK(ret, FAIL, "H5Dclose"); - ret = H5Dclose(dset2); - CHECK(ret, FAIL, "H5Dclose"); - ret = H5Dclose(dset3); - CHECK(ret, FAIL, "H5Dclose"); - - /* Close file */ - ret = H5Fclose(fid); - CHECK(ret, FAIL, "H5Fclose"); -} /* test_attr_corder_create_compact() */ - -/**************************************************************** -** -** test_attr_corder_create_dense(): Test basic H5A (attribute) code. -** Tests dense attribute storage on objects with attribute creation order info -** -****************************************************************/ -static void -test_attr_corder_create_dense(hid_t fcpl, hid_t fapl) -{ - hid_t fid; /* HDF5 File ID */ - hid_t dset1, dset2, dset3; /* Dataset IDs */ - hid_t my_dataset; /* Current dataset ID */ - hid_t sid; /* Dataspace ID */ - hid_t attr; /* Attribute ID */ - hid_t dcpl; /* Dataset creation property list ID */ - unsigned max_compact; /* Maximum # of links to store in group compactly */ - unsigned min_dense; /* Minimum # of links to store in group "densely" */ -#if 0 - htri_t is_empty; /* Are there any attributes? */ - htri_t is_dense; /* Are attributes stored densely? */ - hsize_t nattrs; /* Number of attributes on object */ - hsize_t name_count; /* # of records in name index */ - hsize_t corder_count; /* # of records in creation order index */ -#endif - char attrname[NAME_BUF_SIZE]; /* Name of attribute */ - unsigned curr_dset; /* Current dataset to work on */ - unsigned u; /* Local index variable */ - herr_t ret; /* Generic return value */ - - /* Output message about test being performed */ - MESSAGE(5, ("Testing Dense Storage of Attributes with Creation Order Info\n")); - - /* Create file */ - fid = H5Fcreate(FILENAME, H5F_ACC_TRUNC, fcpl, fapl); - CHECK(fid, FAIL, "H5Fcreate"); - - /* Create dataset creation property list */ - if (dcpl_g == H5P_DEFAULT) { - dcpl = H5Pcreate(H5P_DATASET_CREATE); - CHECK(dcpl, FAIL, "H5Pcreate"); - } - else { - dcpl = H5Pcopy(dcpl_g); - CHECK(dcpl, FAIL, "H5Pcopy"); - } - - /* Set attribute creation order tracking & indexing for object */ - ret = H5Pset_attr_creation_order(dcpl, (H5P_CRT_ORDER_TRACKED | H5P_CRT_ORDER_INDEXED)); - CHECK(ret, FAIL, "H5Pset_attr_creation_order"); - - /* Query the attribute creation properties */ - ret = H5Pget_attr_phase_change(dcpl, &max_compact, &min_dense); - CHECK(ret, FAIL, "H5Pget_attr_phase_change"); - - /* Create dataspace for dataset & attributes */ - sid = H5Screate(H5S_SCALAR); - CHECK(sid, FAIL, "H5Screate"); - - /* Create datasets */ - dset1 = H5Dcreate2(fid, DSET1_NAME, H5T_NATIVE_UCHAR, sid, H5P_DEFAULT, dcpl, H5P_DEFAULT); - CHECK(dset1, FAIL, "H5Dcreate2"); - dset2 = H5Dcreate2(fid, DSET2_NAME, H5T_NATIVE_UCHAR, sid, H5P_DEFAULT, dcpl, H5P_DEFAULT); - CHECK(dset2, FAIL, "H5Dcreate2"); - dset3 = H5Dcreate2(fid, DSET3_NAME, H5T_NATIVE_UCHAR, sid, H5P_DEFAULT, dcpl, H5P_DEFAULT); - CHECK(dset3, FAIL, "H5Dcreate2"); - - /* Work on all the datasets */ - for (curr_dset = 0; curr_dset < NUM_DSETS; curr_dset++) { - switch (curr_dset) { - case 0: - my_dataset = dset1; - break; - - case 1: - my_dataset = dset2; - break; - - case 2: - my_dataset = dset3; - break; - - default: - assert(0 && "Too many datasets!"); - } /* end switch */ -#if 0 - /* Check on dataset's attribute storage status */ - is_empty = H5O__is_attr_empty_test(my_dataset); - VERIFY(is_empty, true, "H5O__is_attr_empty_test"); - is_dense = H5O__is_attr_dense_test(my_dataset); - VERIFY(is_dense, false, "H5O__is_attr_dense_test"); -#endif - /* Create several attributes, but keep storage in compact form */ - for (u = 0; u < max_compact; u++) { - /* Create attribute */ - snprintf(attrname, sizeof(attrname), "attr %02u", u); - attr = H5Acreate2(my_dataset, attrname, H5T_NATIVE_UINT, sid, H5P_DEFAULT, H5P_DEFAULT); - CHECK(attr, FAIL, "H5Acreate2"); - - /* Write data into the attribute */ - ret = H5Awrite(attr, H5T_NATIVE_UINT, &u); - CHECK(ret, FAIL, "H5Awrite"); - - /* Close attribute */ - ret = H5Aclose(attr); - CHECK(ret, FAIL, "H5Aclose"); -#if 0 - /* Verify state of object */ - ret = H5O__num_attrs_test(my_dataset, &nattrs); - CHECK(ret, FAIL, "H5O__num_attrs_test"); - VERIFY(nattrs, (u + 1), "H5O__num_attrs_test"); - is_empty = H5O__is_attr_empty_test(my_dataset); - VERIFY(is_empty, false, "H5O__is_attr_empty_test"); - is_dense = H5O__is_attr_dense_test(my_dataset); - VERIFY(is_dense, false, "H5O__is_attr_dense_test"); -#endif - } /* end for */ - - /* Create another attribute, to push into dense storage */ - snprintf(attrname, sizeof(attrname), "attr %02u", max_compact); - attr = H5Acreate2(my_dataset, attrname, H5T_NATIVE_UINT, sid, H5P_DEFAULT, H5P_DEFAULT); - CHECK(attr, FAIL, "H5Acreate2"); - - /* Write data into the attribute */ - ret = H5Awrite(attr, H5T_NATIVE_UINT, &u); - CHECK(ret, FAIL, "H5Awrite"); - - /* Close attribute */ - ret = H5Aclose(attr); - CHECK(ret, FAIL, "H5Aclose"); -#if 0 - /* Verify state of object */ - ret = H5O__num_attrs_test(my_dataset, &nattrs); - CHECK(ret, FAIL, "H5O__num_attrs_test"); - VERIFY(nattrs, (max_compact + 1), "H5O__num_attrs_test"); - is_empty = H5O__is_attr_empty_test(my_dataset); - VERIFY(is_empty, false, "H5O__is_attr_empty_test"); - is_dense = H5O__is_attr_dense_test(my_dataset); - VERIFY(is_dense, true, "H5O__is_attr_dense_test"); - - /* Retrieve & verify # of records in the name & creation order indices */ - ret = H5O__attr_dense_info_test(my_dataset, &name_count, &corder_count); - CHECK(ret, FAIL, "H5O__attr_dense_info_test"); - VERIFY(name_count, corder_count, "H5O__attr_dense_info_test"); -#endif - } /* end for */ - - /* Close Datasets */ - ret = H5Dclose(dset1); - CHECK(ret, FAIL, "H5Dclose"); - ret = H5Dclose(dset2); - CHECK(ret, FAIL, "H5Dclose"); - ret = H5Dclose(dset3); - CHECK(ret, FAIL, "H5Dclose"); - - /* Close dataspace */ - ret = H5Sclose(sid); - CHECK(ret, FAIL, "H5Sclose"); - - /* Close property list */ - ret = H5Pclose(dcpl); - CHECK(ret, FAIL, "H5Pclose"); - - /* Close file */ - ret = H5Fclose(fid); - CHECK(ret, FAIL, "H5Fclose"); - - /* Re-open file */ - fid = H5Fopen(FILENAME, H5F_ACC_RDWR, fapl); - CHECK(fid, FAIL, "H5Fopen"); - - /* Open datasets created */ - dset1 = H5Dopen2(fid, DSET1_NAME, H5P_DEFAULT); - CHECK(dset1, FAIL, "H5Dopen2"); - dset2 = H5Dopen2(fid, DSET2_NAME, H5P_DEFAULT); - CHECK(dset2, FAIL, "H5Dopen2"); - dset3 = H5Dopen2(fid, DSET3_NAME, H5P_DEFAULT); - CHECK(dset3, FAIL, "H5Dopen2"); - - /* Work on all the datasets */ - for (curr_dset = 0; curr_dset < NUM_DSETS; curr_dset++) { - switch (curr_dset) { - case 0: - my_dataset = dset1; - break; - - case 1: - my_dataset = dset2; - break; - - case 2: - my_dataset = dset3; - break; - - default: - assert(0 && "Too many datasets!"); - } /* end switch */ -#if 0 - /* Check on dataset's attribute storage status */ - ret = H5O__num_attrs_test(my_dataset, &nattrs); - CHECK(ret, FAIL, "H5O__num_attrs_test"); - VERIFY(nattrs, (max_compact + 1), "H5O__num_attrs_test"); - is_empty = H5O__is_attr_empty_test(my_dataset); - VERIFY(is_empty, false, "H5O__is_attr_empty_test"); - is_dense = H5O__is_attr_dense_test(my_dataset); - VERIFY(is_dense, true, "H5O__is_attr_dense_test"); -#endif - /* Loop through attributes, checking their creation order values */ - /* (the name index is used, but the creation order value is in the same order) */ - for (u = 0; u < (max_compact + 1); u++) { - H5A_info_t ainfo; /* Attribute information */ - - /* Retrieve information for attribute */ - snprintf(attrname, sizeof(attrname), "attr %02u", u); - ret = H5Aget_info_by_name(my_dataset, ".", attrname, &ainfo, H5P_DEFAULT); - CHECK(ret, FAIL, "H5Aget_info_by_name"); - - /* Verify creation order of attribute */ - VERIFY(ainfo.corder_valid, true, "H5Aget_info_by_name"); - VERIFY(ainfo.corder, u, "H5Aget_info_by_name"); - } /* end for */ - } /* end for */ - - /* Close Datasets */ - ret = H5Dclose(dset1); - CHECK(ret, FAIL, "H5Dclose"); - ret = H5Dclose(dset2); - CHECK(ret, FAIL, "H5Dclose"); - ret = H5Dclose(dset3); - CHECK(ret, FAIL, "H5Dclose"); - - /* Close file */ - ret = H5Fclose(fid); - CHECK(ret, FAIL, "H5Fclose"); -} /* test_attr_corder_create_dense() */ - -/**************************************************************** -** -** test_attr_corder_create_reopen(): Test basic H5A (attribute) code. -** Test creating attributes w/reopening file from using new format -** to using old format -** -****************************************************************/ -static void -test_attr_corder_create_reopen(hid_t fcpl, hid_t fapl) -{ - hid_t fid = -1; /* File ID */ - hid_t gcpl_id = -1; /* Group creation property list ID */ - hid_t gid = -1; /* Group ID */ - hid_t sid = -1; /* Dataspace ID */ - hid_t aid = -1; /* Attribute ID */ - int buf; /* Attribute data */ - herr_t ret; /* Generic return value */ - - /* Output message about test being performed */ - MESSAGE(5, ("Testing Creating Attributes w/New & Old Format\n")); - - /* Create dataspace for attributes */ - sid = H5Screate(H5S_SCALAR); - CHECK(sid, FAIL, "H5Screate"); - - /* Create file */ - fid = H5Fcreate(FILENAME, H5F_ACC_TRUNC, fcpl, fapl); - CHECK(fid, FAIL, "H5Fcreate"); - - /* Create group */ - gcpl_id = H5Pcreate(H5P_GROUP_CREATE); - CHECK(gcpl_id, FAIL, "H5Pcreate"); - ret = H5Pset_attr_creation_order(gcpl_id, H5P_CRT_ORDER_TRACKED | H5P_CRT_ORDER_INDEXED); - CHECK(ret, FAIL, "H5Pset_attr_creation_order"); - gid = H5Gcreate2(fid, GROUP1_NAME, H5P_DEFAULT, gcpl_id, H5P_DEFAULT); - CHECK(gid, FAIL, "H5Gcreate2"); - - /* Create a couple of attributes */ - aid = H5Acreate2(gid, "attr-003", H5T_NATIVE_INT, sid, H5P_DEFAULT, H5P_DEFAULT); - CHECK(aid, FAIL, "H5Acreate2"); - buf = 3; - ret = H5Awrite(aid, H5T_NATIVE_INT, &buf); - CHECK(ret, FAIL, "H5Awrite"); - ret = H5Aclose(aid); - CHECK(ret, FAIL, "H5Aclose"); - - aid = H5Acreate2(gid, "attr-004", H5T_NATIVE_INT, sid, H5P_DEFAULT, H5P_DEFAULT); - CHECK(aid, FAIL, "H5Acreate2"); - buf = 4; - ret = H5Awrite(aid, H5T_NATIVE_INT, &buf); - CHECK(ret, FAIL, "H5Awrite"); - ret = H5Aclose(aid); - CHECK(ret, FAIL, "H5Aclose"); - - /***** Close group & GCPL *****/ - ret = H5Gclose(gid); - CHECK(ret, FAIL, "H5Gclose"); - ret = H5Pclose(gcpl_id); - CHECK(ret, FAIL, "H5Pclose"); - - /* Close file */ - ret = H5Fclose(fid); - CHECK(ret, FAIL, "H5Fclose"); - - /* Re-open file, without "use the latest format" flag */ - fid = H5Fopen(FILENAME, H5F_ACC_RDWR, H5P_DEFAULT); - CHECK(fid, FAIL, "H5Fopen"); - - /* Re-open group */ - gid = H5Gopen2(fid, GROUP1_NAME, H5P_DEFAULT); - CHECK(gid, FAIL, "H5Gopen2"); - - /* Delete attribute */ - ret = H5Adelete(gid, "attr-003"); - CHECK(aid, FAIL, "H5Adelete"); - - /* Create some additional attributes */ - aid = H5Acreate2(gid, "attr-008", H5T_NATIVE_INT, sid, H5P_DEFAULT, H5P_DEFAULT); - CHECK(aid, FAIL, "H5Acreate2"); - buf = 8; - ret = H5Awrite(aid, H5T_NATIVE_INT, &buf); - CHECK(ret, FAIL, "H5Awrite"); - ret = H5Aclose(aid); - CHECK(ret, FAIL, "H5Aclose"); - - aid = H5Acreate2(gid, "attr-006", H5T_NATIVE_INT, sid, H5P_DEFAULT, H5P_DEFAULT); - CHECK(aid, FAIL, "H5Acreate2"); - buf = 6; - ret = H5Awrite(aid, H5T_NATIVE_INT, &buf); - CHECK(ret, FAIL, "H5Awrite"); - ret = H5Aclose(aid); - CHECK(ret, FAIL, "H5Aclose"); - - /***** Close group *****/ - ret = H5Gclose(gid); - CHECK(ret, FAIL, "H5Gclose"); - - /* Close file */ - ret = H5Fclose(fid); - CHECK(ret, FAIL, "H5Fclose"); - - /* Close attribute dataspace */ - ret = H5Sclose(sid); - CHECK(ret, FAIL, "H5Sclose"); -} /* test_attr_corder_create_reopen() */ - -/**************************************************************** -** -** test_attr_corder_transition(): Test basic H5A (attribute) code. -** Tests attribute storage transitions on objects with attribute creation order info -** -****************************************************************/ -static void -test_attr_corder_transition(hid_t fcpl, hid_t fapl) -{ - hid_t fid; /* HDF5 File ID */ - hid_t dset1, dset2, dset3; /* Dataset IDs */ - hid_t my_dataset; /* Current dataset ID */ - hid_t sid; /* Dataspace ID */ - hid_t attr; /* Attribute ID */ - hid_t dcpl; /* Dataset creation property list ID */ - unsigned max_compact; /* Maximum # of links to store in group compactly */ - unsigned min_dense; /* Minimum # of links to store in group "densely" */ -#if 0 - htri_t is_empty; /* Are there any attributes? */ - htri_t is_dense; /* Are attributes stored densely? */ - hsize_t nattrs; /* Number of attributes on object */ - hsize_t name_count; /* # of records in name index */ - hsize_t corder_count; /* # of records in creation order index */ -#endif - char attrname[NAME_BUF_SIZE]; /* Name of attribute */ - unsigned curr_dset; /* Current dataset to work on */ - unsigned u; /* Local index variable */ - herr_t ret; /* Generic return value */ - - /* Output message about test being performed */ - MESSAGE(5, ("Testing Storage Transitions of Attributes with Creation Order Info\n")); - - /* Create file */ - fid = H5Fcreate(FILENAME, H5F_ACC_TRUNC, fcpl, fapl); - CHECK(fid, FAIL, "H5Fcreate"); - - /* Create dataset creation property list */ - if (dcpl_g == H5P_DEFAULT) { - dcpl = H5Pcreate(H5P_DATASET_CREATE); - CHECK(dcpl, FAIL, "H5Pcreate"); - } - else { - dcpl = H5Pcopy(dcpl_g); - CHECK(dcpl, FAIL, "H5Pcopy"); - } - - /* Set attribute creation order tracking & indexing for object */ - ret = H5Pset_attr_creation_order(dcpl, (H5P_CRT_ORDER_TRACKED | H5P_CRT_ORDER_INDEXED)); - CHECK(ret, FAIL, "H5Pset_attr_creation_order"); - - /* Query the attribute creation properties */ - ret = H5Pget_attr_phase_change(dcpl, &max_compact, &min_dense); - CHECK(ret, FAIL, "H5Pget_attr_phase_change"); - - /* Create dataspace for dataset & attributes */ - sid = H5Screate(H5S_SCALAR); - CHECK(sid, FAIL, "H5Screate"); - - /* XXX: Try to find a way to resize dataset's object header so that the object - * header can have one chunk, then retrieve "empty" file size and check - * that size after everything is deleted -QAK - */ - /* Create datasets */ - dset1 = H5Dcreate2(fid, DSET1_NAME, H5T_NATIVE_UCHAR, sid, H5P_DEFAULT, dcpl, H5P_DEFAULT); - CHECK(dset1, FAIL, "H5Dcreate2"); - dset2 = H5Dcreate2(fid, DSET2_NAME, H5T_NATIVE_UCHAR, sid, H5P_DEFAULT, dcpl, H5P_DEFAULT); - CHECK(dset2, FAIL, "H5Dcreate2"); - dset3 = H5Dcreate2(fid, DSET3_NAME, H5T_NATIVE_UCHAR, sid, H5P_DEFAULT, dcpl, H5P_DEFAULT); - CHECK(dset3, FAIL, "H5Dcreate2"); - - /* Work on all the datasets */ - for (curr_dset = 0; curr_dset < NUM_DSETS; curr_dset++) { - switch (curr_dset) { - case 0: - my_dataset = dset1; - break; - - case 1: - my_dataset = dset2; - break; - - case 2: - my_dataset = dset3; - break; - - default: - assert(0 && "Too many datasets!"); - } /* end switch */ -#if 0 - /* Check on dataset's attribute storage status */ - is_empty = H5O__is_attr_empty_test(my_dataset); - VERIFY(is_empty, true, "H5O__is_attr_empty_test"); - is_dense = H5O__is_attr_dense_test(my_dataset); - VERIFY(is_dense, false, "H5O__is_attr_dense_test"); -#endif - } /* end for */ - - /* Close Datasets */ - ret = H5Dclose(dset1); - CHECK(ret, FAIL, "H5Dclose"); - ret = H5Dclose(dset2); - CHECK(ret, FAIL, "H5Dclose"); - ret = H5Dclose(dset3); - CHECK(ret, FAIL, "H5Dclose"); - - /* Close property list */ - ret = H5Pclose(dcpl); - CHECK(ret, FAIL, "H5Pclose"); - - /* Close file */ - ret = H5Fclose(fid); - CHECK(ret, FAIL, "H5Fclose"); - - /* Re-open file */ - fid = H5Fopen(FILENAME, H5F_ACC_RDWR, fapl); - CHECK(fid, FAIL, "H5Fopen"); - - /* Open datasets created */ - dset1 = H5Dopen2(fid, DSET1_NAME, H5P_DEFAULT); - CHECK(dset1, FAIL, "H5Dopen2"); - dset2 = H5Dopen2(fid, DSET2_NAME, H5P_DEFAULT); - CHECK(dset2, FAIL, "H5Dopen2"); - dset3 = H5Dopen2(fid, DSET3_NAME, H5P_DEFAULT); - CHECK(dset3, FAIL, "H5Dopen2"); - - /* Work on all the datasets */ - for (curr_dset = 0; curr_dset < NUM_DSETS; curr_dset++) { - switch (curr_dset) { - case 0: - my_dataset = dset1; - break; - - case 1: - my_dataset = dset2; - break; - - case 2: - my_dataset = dset3; - break; - - default: - assert(0 && "Too many datasets!"); - } /* end switch */ - - /* Create several attributes, but keep storage in compact form */ - for (u = 0; u < max_compact; u++) { - /* Create attribute */ - snprintf(attrname, sizeof(attrname), "attr %02u", u); - attr = H5Acreate2(my_dataset, attrname, H5T_NATIVE_UINT, sid, H5P_DEFAULT, H5P_DEFAULT); - CHECK(attr, FAIL, "H5Acreate2"); - - /* Write data into the attribute */ - ret = H5Awrite(attr, H5T_NATIVE_UINT, &u); - CHECK(ret, FAIL, "H5Awrite"); - - /* Close attribute */ - ret = H5Aclose(attr); - CHECK(ret, FAIL, "H5Aclose"); -#if 0 - /* Verify state of object */ - ret = H5O__num_attrs_test(my_dataset, &nattrs); - CHECK(ret, FAIL, "H5O__num_attrs_test"); - VERIFY(nattrs, (u + 1), "H5O__num_attrs_test"); - is_empty = H5O__is_attr_empty_test(my_dataset); - VERIFY(is_empty, false, "H5O__is_attr_empty_test"); - is_dense = H5O__is_attr_dense_test(my_dataset); - VERIFY(is_dense, false, "H5O__is_attr_dense_test"); -#endif - } /* end for */ - - /* Create another attribute, to push into dense storage */ - snprintf(attrname, sizeof(attrname), "attr %02u", max_compact); - attr = H5Acreate2(my_dataset, attrname, H5T_NATIVE_UINT, sid, H5P_DEFAULT, H5P_DEFAULT); - CHECK(attr, FAIL, "H5Acreate2"); - - /* Write data into the attribute */ - ret = H5Awrite(attr, H5T_NATIVE_UINT, &u); - CHECK(ret, FAIL, "H5Awrite"); - - /* Close attribute */ - ret = H5Aclose(attr); - CHECK(ret, FAIL, "H5Aclose"); -#if 0 - /* Verify state of object */ - ret = H5O__num_attrs_test(my_dataset, &nattrs); - CHECK(ret, FAIL, "H5O__num_attrs_test"); - VERIFY(nattrs, (max_compact + 1), "H5O__num_attrs_test"); - is_empty = H5O__is_attr_empty_test(my_dataset); - VERIFY(is_empty, false, "H5O__is_attr_empty_test"); - is_dense = H5O__is_attr_dense_test(my_dataset); - VERIFY(is_dense, true, "H5O__is_attr_dense_test"); - - /* Retrieve & verify # of records in the name & creation order indices */ - ret = H5O__attr_dense_info_test(my_dataset, &name_count, &corder_count); - CHECK(ret, FAIL, "H5O__attr_dense_info_test"); - VERIFY(name_count, corder_count, "H5O__attr_dense_info_test"); -#endif - /* Delete several attributes from object, until attribute storage resumes compact form */ - for (u = max_compact; u >= min_dense; u--) { - snprintf(attrname, sizeof(attrname), "attr %02u", u); - ret = H5Adelete(my_dataset, attrname); - CHECK(ret, FAIL, "H5Adelete"); -#if 0 - /* Verify state of object */ - ret = H5O__num_attrs_test(my_dataset, &nattrs); - CHECK(ret, FAIL, "H5O__num_attrs_test"); - VERIFY(nattrs, u, "H5O__num_attrs_test"); - is_empty = H5O__is_attr_empty_test(my_dataset); - VERIFY(is_empty, false, "H5O__is_attr_empty_test"); - is_dense = H5O__is_attr_dense_test(my_dataset); - VERIFY(is_dense, true, "H5O__is_attr_dense_test"); - - /* Retrieve & verify # of records in the name & creation order indices */ - ret = H5O__attr_dense_info_test(my_dataset, &name_count, &corder_count); - CHECK(ret, FAIL, "H5O__attr_dense_info_test"); - VERIFY(name_count, corder_count, "H5O__attr_dense_info_test"); -#endif - } /* end for */ - - /* Delete another attribute, to push attribute storage into compact form */ - snprintf(attrname, sizeof(attrname), "attr %02u", (min_dense - 1)); - ret = H5Adelete(my_dataset, attrname); - CHECK(ret, FAIL, "H5Adelete"); -#if 0 - /* Verify state of object */ - ret = H5O__num_attrs_test(my_dataset, &nattrs); - CHECK(ret, FAIL, "H5O__num_attrs_test"); - VERIFY(nattrs, (min_dense - 1), "H5O__num_attrs_test"); - is_empty = H5O__is_attr_empty_test(my_dataset); - VERIFY(is_empty, false, "H5O__is_attr_empty_test"); - is_dense = H5O__is_attr_dense_test(my_dataset); - VERIFY(is_dense, false, "H5O__is_attr_dense_test"); -#endif - /* Re-add attributes to get back into dense form */ - for (u = (min_dense - 1); u < (max_compact + 1); u++) { - /* Create attribute */ - snprintf(attrname, sizeof(attrname), "attr %02u", u); - attr = H5Acreate2(my_dataset, attrname, H5T_NATIVE_UINT, sid, H5P_DEFAULT, H5P_DEFAULT); - CHECK(attr, FAIL, "H5Acreate2"); - - /* Write data into the attribute */ - ret = H5Awrite(attr, H5T_NATIVE_UINT, &u); - CHECK(ret, FAIL, "H5Awrite"); - - /* Close attribute */ - ret = H5Aclose(attr); - CHECK(ret, FAIL, "H5Aclose"); - } /* end for */ -#if 0 - /* Verify state of object */ - ret = H5O__num_attrs_test(my_dataset, &nattrs); - CHECK(ret, FAIL, "H5O__num_attrs_test"); - VERIFY(nattrs, (max_compact + 1), "H5O__num_attrs_test"); - is_empty = H5O__is_attr_empty_test(my_dataset); - VERIFY(is_empty, false, "H5O__is_attr_empty_test"); - is_dense = H5O__is_attr_dense_test(my_dataset); - VERIFY(is_dense, true, "H5O__is_attr_dense_test"); - - /* Retrieve & verify # of records in the name & creation order indices */ - ret = H5O__attr_dense_info_test(my_dataset, &name_count, &corder_count); - CHECK(ret, FAIL, "H5O__attr_dense_info_test"); - VERIFY(name_count, corder_count, "H5O__attr_dense_info_test"); -#endif - } /* end for */ - - /* Close Datasets */ - ret = H5Dclose(dset1); - CHECK(ret, FAIL, "H5Dclose"); - ret = H5Dclose(dset2); - CHECK(ret, FAIL, "H5Dclose"); - ret = H5Dclose(dset3); - CHECK(ret, FAIL, "H5Dclose"); - - /* Close file */ - ret = H5Fclose(fid); - CHECK(ret, FAIL, "H5Fclose"); - - /* Re-open file */ - fid = H5Fopen(FILENAME, H5F_ACC_RDWR, fapl); - CHECK(fid, FAIL, "H5Fopen"); - - /* Open datasets created */ - dset1 = H5Dopen2(fid, DSET1_NAME, H5P_DEFAULT); - CHECK(dset1, FAIL, "H5Dopen2"); - dset2 = H5Dopen2(fid, DSET2_NAME, H5P_DEFAULT); - CHECK(dset2, FAIL, "H5Dopen2"); - dset3 = H5Dopen2(fid, DSET3_NAME, H5P_DEFAULT); - CHECK(dset3, FAIL, "H5Dopen2"); - - /* Work on all the datasets */ - for (curr_dset = 0; curr_dset < NUM_DSETS; curr_dset++) { - switch (curr_dset) { - case 0: - my_dataset = dset1; - break; - - case 1: - my_dataset = dset2; - break; - - case 2: - my_dataset = dset3; - break; - - default: - assert(0 && "Too many datasets!"); - } /* end switch */ -#if 0 - /* Check on dataset's attribute storage status */ - ret = H5O__num_attrs_test(my_dataset, &nattrs); - CHECK(ret, FAIL, "H5O__num_attrs_test"); - VERIFY(nattrs, (max_compact + 1), "H5O__num_attrs_test"); - is_empty = H5O__is_attr_empty_test(my_dataset); - VERIFY(is_empty, false, "H5O__is_attr_empty_test"); - is_dense = H5O__is_attr_dense_test(my_dataset); - VERIFY(is_dense, true, "H5O__is_attr_dense_test"); - - /* Retrieve & verify # of records in the name & creation order indices */ - ret = H5O__attr_dense_info_test(my_dataset, &name_count, &corder_count); - CHECK(ret, FAIL, "H5O__attr_dense_info_test"); - VERIFY(name_count, corder_count, "H5O__attr_dense_info_test"); -#endif - /* Delete several attributes from object, until attribute storage resumes compact form */ - for (u = max_compact; u >= min_dense; u--) { - snprintf(attrname, sizeof(attrname), "attr %02u", u); - ret = H5Adelete(my_dataset, attrname); - CHECK(ret, FAIL, "H5Adelete"); -#if 0 - /* Verify state of object */ - ret = H5O__num_attrs_test(my_dataset, &nattrs); - CHECK(ret, FAIL, "H5O__num_attrs_test"); - VERIFY(nattrs, u, "H5O__num_attrs_test"); - is_empty = H5O__is_attr_empty_test(my_dataset); - VERIFY(is_empty, false, "H5O__is_attr_empty_test"); - is_dense = H5O__is_attr_dense_test(my_dataset); - VERIFY(is_dense, true, "H5O__is_attr_dense_test"); - - /* Retrieve & verify # of records in the name & creation order indices */ - ret = H5O__attr_dense_info_test(my_dataset, &name_count, &corder_count); - CHECK(ret, FAIL, "H5O__attr_dense_info_test"); - VERIFY(name_count, corder_count, "H5O__attr_dense_info_test"); -#endif - } /* end for */ - - /* Delete another attribute, to push attribute storage into compact form */ - snprintf(attrname, sizeof(attrname), "attr %02u", (min_dense - 1)); - ret = H5Adelete(my_dataset, attrname); - CHECK(ret, FAIL, "H5Adelete"); -#if 0 - /* Verify state of object */ - ret = H5O__num_attrs_test(my_dataset, &nattrs); - CHECK(ret, FAIL, "H5O__num_attrs_test"); - VERIFY(nattrs, (min_dense - 1), "H5O__num_attrs_test"); - is_empty = H5O__is_attr_empty_test(my_dataset); - VERIFY(is_empty, false, "H5O__is_attr_empty_test"); - is_dense = H5O__is_attr_dense_test(my_dataset); - VERIFY(is_dense, false, "H5O__is_attr_dense_test"); -#endif - /* Re-add attributes to get back into dense form */ - for (u = (min_dense - 1); u < (max_compact + 1); u++) { - /* Create attribute */ - snprintf(attrname, sizeof(attrname), "attr %02u", u); - attr = H5Acreate2(my_dataset, attrname, H5T_NATIVE_UINT, sid, H5P_DEFAULT, H5P_DEFAULT); - CHECK(attr, FAIL, "H5Acreate2"); - - /* Write data into the attribute */ - ret = H5Awrite(attr, H5T_NATIVE_UINT, &u); - CHECK(ret, FAIL, "H5Awrite"); - - /* Close attribute */ - ret = H5Aclose(attr); - CHECK(ret, FAIL, "H5Aclose"); - } /* end for */ -#if 0 - /* Verify state of object */ - ret = H5O__num_attrs_test(my_dataset, &nattrs); - CHECK(ret, FAIL, "H5O__num_attrs_test"); - VERIFY(nattrs, (max_compact + 1), "H5O__num_attrs_test"); - is_empty = H5O__is_attr_empty_test(my_dataset); - VERIFY(is_empty, false, "H5O__is_attr_empty_test"); - is_dense = H5O__is_attr_dense_test(my_dataset); - VERIFY(is_dense, true, "H5O__is_attr_dense_test"); - - /* Retrieve & verify # of records in the name & creation order indices */ - ret = H5O__attr_dense_info_test(my_dataset, &name_count, &corder_count); - CHECK(ret, FAIL, "H5O__attr_dense_info_test"); - VERIFY(name_count, corder_count, "H5O__attr_dense_info_test"); -#endif - /* Delete all attributes */ - for (u = max_compact; u > 0; u--) { - snprintf(attrname, sizeof(attrname), "attr %02u", u); - ret = H5Adelete(my_dataset, attrname); - CHECK(ret, FAIL, "H5Adelete"); - } /* end for */ - snprintf(attrname, sizeof(attrname), "attr %02u", 0); - ret = H5Adelete(my_dataset, attrname); - CHECK(ret, FAIL, "H5Adelete"); - } /* end for */ - - /* Close Datasets */ - ret = H5Dclose(dset1); - CHECK(ret, FAIL, "H5Dclose"); - ret = H5Dclose(dset2); - CHECK(ret, FAIL, "H5Dclose"); - ret = H5Dclose(dset3); - CHECK(ret, FAIL, "H5Dclose"); - - /* Close file */ - ret = H5Fclose(fid); - CHECK(ret, FAIL, "H5Fclose"); - - /* Close dataspace */ - ret = H5Sclose(sid); - CHECK(ret, FAIL, "H5Sclose"); -} /* test_attr_corder_transition() */ - -/**************************************************************** -** -** test_attr_corder_delete(): Test basic H5A (attribute) code. -** Tests deleting object w/dense attribute storage on objects with attribute creation order info -** -****************************************************************/ -static void -test_attr_corder_delete(hid_t fcpl, hid_t fapl) -{ - hid_t fid; /* HDF5 File ID */ - hid_t dset1, dset2, dset3; /* Dataset IDs */ - hid_t my_dataset; /* Current dataset ID */ - hid_t sid; /* Dataspace ID */ - hid_t attr; /* Attribute ID */ - hid_t dcpl; /* Dataset creation property list ID */ - unsigned max_compact; /* Maximum # of links to store in group compactly */ - unsigned min_dense; /* Minimum # of links to store in group "densely" */ -#if 0 - htri_t is_empty; /* Are there any attributes? */ - htri_t is_dense; /* Are attributes stored densely? */ - hsize_t nattrs; /* Number of attributes on object */ - hsize_t name_count; /* # of records in name index */ - hsize_t corder_count; /* # of records in creation order index */ -#endif - unsigned reopen_file; /* Whether to re-open the file before deleting group */ - char attrname[NAME_BUF_SIZE]; /* Name of attribute */ -#ifdef LATER - h5_stat_size_t empty_size; /* Size of empty file */ - h5_stat_size_t file_size; /* Size of file after operating on it */ -#endif /* LATER */ - unsigned curr_dset; /* Current dataset to work on */ - unsigned u; /* Local index variable */ - herr_t ret; /* Generic return value */ - - /* Output message about test being performed */ - MESSAGE(5, ("Testing Deleting Object w/Dense Attribute Storage and Creation Order Info\n")); - - /* Create dataspace for dataset & attributes */ - sid = H5Screate(H5S_SCALAR); - CHECK(sid, FAIL, "H5Screate"); - - /* Create dataset creation property list */ - if (dcpl_g == H5P_DEFAULT) { - dcpl = H5Pcreate(H5P_DATASET_CREATE); - CHECK(dcpl, FAIL, "H5Pcreate"); - } - else { - dcpl = H5Pcopy(dcpl_g); - CHECK(dcpl, FAIL, "H5Pcopy"); - } - - /* Set attribute creation order tracking & indexing for object */ - ret = H5Pset_attr_creation_order(dcpl, (H5P_CRT_ORDER_TRACKED | H5P_CRT_ORDER_INDEXED)); - CHECK(ret, FAIL, "H5Pset_attr_creation_order"); - - /* Query the attribute creation properties */ - ret = H5Pget_attr_phase_change(dcpl, &max_compact, &min_dense); - CHECK(ret, FAIL, "H5Pget_attr_phase_change"); - -/* XXX: Try to find a way to resize dataset's object header so that the object - * header can have one chunk, then retrieve "empty" file size and check - * that size after everything is deleted -QAK - */ -#ifdef LATER - /* Create empty file */ - fid = H5Fcreate(FILENAME, H5F_ACC_TRUNC, fcpl, fapl); - CHECK(fid, FAIL, "H5Fcreate"); - - /* Close file */ - ret = H5Fclose(fid); - CHECK(ret, FAIL, "H5Fclose"); - - /* Get the size of an empty file */ - empty_size = h5_get_file_size(FILENAME); - CHECK(empty_size, FAIL, "h5_get_file_size"); -#endif /* LATER */ - - /* Loop to leave file open when deleting dataset, or to close & re-open file - * before deleting dataset */ - for (reopen_file = false; reopen_file <= true; reopen_file++) { - /* Create test file */ - fid = H5Fcreate(FILENAME, H5F_ACC_TRUNC, fcpl, fapl); - CHECK(fid, FAIL, "H5Fopen"); - - /* Create datasets */ - dset1 = H5Dcreate2(fid, DSET1_NAME, H5T_NATIVE_UCHAR, sid, H5P_DEFAULT, dcpl, H5P_DEFAULT); - CHECK(dset1, FAIL, "H5Dcreate2"); - dset2 = H5Dcreate2(fid, DSET2_NAME, H5T_NATIVE_UCHAR, sid, H5P_DEFAULT, dcpl, H5P_DEFAULT); - CHECK(dset2, FAIL, "H5Dcreate2"); - dset3 = H5Dcreate2(fid, DSET3_NAME, H5T_NATIVE_UCHAR, sid, H5P_DEFAULT, dcpl, H5P_DEFAULT); - CHECK(dset3, FAIL, "H5Dcreate2"); - - /* Work on all the datasets */ - for (curr_dset = 0; curr_dset < NUM_DSETS; curr_dset++) { - switch (curr_dset) { - case 0: - my_dataset = dset1; - break; - - case 1: - my_dataset = dset2; - break; - - case 2: - my_dataset = dset3; - break; - - default: - assert(0 && "Too many datasets!"); - } /* end switch */ -#if 0 - /* Check on dataset's attribute storage status */ - is_empty = H5O__is_attr_empty_test(my_dataset); - VERIFY(is_empty, true, "H5O__is_attr_empty_test"); - is_dense = H5O__is_attr_dense_test(my_dataset); - VERIFY(is_dense, false, "H5O__is_attr_dense_test"); -#endif - /* Create attributes, until attribute storage is in dense form */ - for (u = 0; u < max_compact * 2; u++) { - /* Create attribute */ - snprintf(attrname, sizeof(attrname), "attr %02u", u); - attr = H5Acreate2(my_dataset, attrname, H5T_NATIVE_UINT, sid, H5P_DEFAULT, H5P_DEFAULT); - CHECK(attr, FAIL, "H5Acreate2"); - - /* Write data into the attribute */ - ret = H5Awrite(attr, H5T_NATIVE_UINT, &u); - CHECK(ret, FAIL, "H5Awrite"); - - /* Close attribute */ - ret = H5Aclose(attr); - CHECK(ret, FAIL, "H5Aclose"); - } /* end for */ -#if 0 - /* Verify state of object */ - ret = H5O__num_attrs_test(my_dataset, &nattrs); - CHECK(ret, FAIL, "H5O__num_attrs_test"); - VERIFY(nattrs, (max_compact * 2), "H5O__num_attrs_test"); - is_empty = H5O__is_attr_empty_test(my_dataset); - VERIFY(is_empty, false, "H5O__is_attr_empty_test"); - is_dense = H5O__is_attr_dense_test(my_dataset); - VERIFY(is_dense, true, "H5O__is_attr_dense_test"); - - /* Retrieve & verify # of records in the name & creation order indices */ - ret = H5O__attr_dense_info_test(my_dataset, &name_count, &corder_count); - CHECK(ret, FAIL, "H5O__attr_dense_info_test"); - VERIFY(name_count, corder_count, "H5O__attr_dense_info_test"); -#endif - } /* end for */ - - /* Close Datasets */ - ret = H5Dclose(dset1); - CHECK(ret, FAIL, "H5Dclose"); - ret = H5Dclose(dset2); - CHECK(ret, FAIL, "H5Dclose"); - ret = H5Dclose(dset3); - CHECK(ret, FAIL, "H5Dclose"); - - /* Check for deleting datasets without re-opening file */ - if (!reopen_file) { - ret = H5Ldelete(fid, DSET1_NAME, H5P_DEFAULT); - CHECK(ret, FAIL, "H5Ldelete"); - ret = H5Ldelete(fid, DSET2_NAME, H5P_DEFAULT); - CHECK(ret, FAIL, "H5Ldelete"); - ret = H5Ldelete(fid, DSET3_NAME, H5P_DEFAULT); - CHECK(ret, FAIL, "H5Ldelete"); - } /* end if */ - - /* Close file */ - ret = H5Fclose(fid); - CHECK(ret, FAIL, "H5Fclose"); - - /* Check for deleting dataset after re-opening file */ - if (reopen_file) { - /* Re-open file */ - fid = H5Fopen(FILENAME, H5F_ACC_RDWR, fapl); - CHECK(fid, FAIL, "H5Fopen"); - - /* Delete the datasets */ - ret = H5Ldelete(fid, DSET1_NAME, H5P_DEFAULT); - CHECK(ret, FAIL, "H5Ldelete"); - ret = H5Ldelete(fid, DSET2_NAME, H5P_DEFAULT); - CHECK(ret, FAIL, "H5Ldelete"); - ret = H5Ldelete(fid, DSET3_NAME, H5P_DEFAULT); - CHECK(ret, FAIL, "H5Ldelete"); - - /* Close file */ - ret = H5Fclose(fid); - CHECK(ret, FAIL, "H5Fclose"); - } /* end if */ - -#ifdef LATER - /* Get the size of the file now */ - file_size = h5_get_file_size(FILENAME); - CHECK(file_size, FAIL, "h5_get_file_size"); - VERIFY(file_size, empty_size, "h5_get_file_size"); -#endif /* LATER */ - } /* end for */ - - /* Close property list */ - ret = H5Pclose(dcpl); - CHECK(ret, FAIL, "H5Pclose"); - - /* Close dataspace */ - ret = H5Sclose(sid); - CHECK(ret, FAIL, "H5Sclose"); -} /* test_attr_corder_delete() */ - -/*------------------------------------------------------------------------- - * Function: attr_info_by_idx_check - * - * Purpose: Support routine for attr_info_by_idx, to verify the attribute - * info is correct for a attribute - * - * Note: This routine assumes that the attributes have been added to the - * object in alphabetical order. - * - * Return: Success: 0 - * Failure: -1 - * - *------------------------------------------------------------------------- - */ -static int -attr_info_by_idx_check(hid_t obj_id, const char *attrname, hsize_t n, bool use_index) -{ - char tmpname[NAME_BUF_SIZE]; /* Temporary attribute name */ - H5A_info_t ainfo; /* Attribute info struct */ - int old_nerrs; /* Number of errors when entering this check */ - herr_t ret; /* Generic return value */ - - /* Retrieve the current # of reported errors */ - old_nerrs = nerrors; - - /* Verify the information for first attribute, in increasing creation order */ - memset(&ainfo, 0, sizeof(ainfo)); - ret = H5Aget_info_by_idx(obj_id, ".", H5_INDEX_CRT_ORDER, H5_ITER_INC, (hsize_t)0, &ainfo, H5P_DEFAULT); - CHECK(ret, FAIL, "H5Aget_info_by_idx"); - VERIFY(ainfo.corder, 0, "H5Aget_info_by_idx"); - - /* Verify the information for new attribute, in increasing creation order */ - memset(&ainfo, 0, sizeof(ainfo)); - ret = H5Aget_info_by_idx(obj_id, ".", H5_INDEX_CRT_ORDER, H5_ITER_INC, n, &ainfo, H5P_DEFAULT); - CHECK(ret, FAIL, "H5Aget_info_by_idx"); - VERIFY(ainfo.corder, n, "H5Aget_info_by_idx"); - - /* Verify the name for new link, in increasing creation order */ - memset(tmpname, 0, (size_t)NAME_BUF_SIZE); - ret = (herr_t)H5Aget_name_by_idx(obj_id, ".", H5_INDEX_CRT_ORDER, H5_ITER_INC, n, tmpname, - (size_t)NAME_BUF_SIZE, H5P_DEFAULT); - CHECK(ret, FAIL, "H5Aget_name_by_idx"); - if (strcmp(attrname, tmpname) != 0) - TestErrPrintf("Line %d: attribute name size wrong!\n", __LINE__); - - /* Don't test "native" order if there is no creation order index, since - * there's not a good way to easily predict the attribute's order in the name - * index. - */ - if (use_index) { - /* Verify the information for first attribute, in native creation order */ - memset(&ainfo, 0, sizeof(ainfo)); - ret = H5Aget_info_by_idx(obj_id, ".", H5_INDEX_CRT_ORDER, H5_ITER_INC /* H5_ITER_NATIVE */, - (hsize_t)0, &ainfo, H5P_DEFAULT); - CHECK(ret, FAIL, "H5Aget_info_by_idx"); - VERIFY(ainfo.corder, 0, "H5Aget_info_by_idx"); - - /* Verify the information for new attribute, in native creation order */ - memset(&ainfo, 0, sizeof(ainfo)); - ret = H5Aget_info_by_idx(obj_id, ".", H5_INDEX_CRT_ORDER, H5_ITER_INC /* H5_ITER_NATIVE */, n, &ainfo, - H5P_DEFAULT); - CHECK(ret, FAIL, "H5Aget_info_by_idx"); - VERIFY(ainfo.corder, n, "H5Aget_info_by_idx"); - - /* Verify the name for new link, in increasing native order */ - memset(tmpname, 0, (size_t)NAME_BUF_SIZE); - ret = (herr_t)H5Aget_name_by_idx(obj_id, ".", H5_INDEX_CRT_ORDER, H5_ITER_INC /* H5_ITER_NATIVE */, n, - tmpname, (size_t)NAME_BUF_SIZE, H5P_DEFAULT); - CHECK(ret, FAIL, "H5Aget_name_by_idx"); - if (strcmp(attrname, tmpname) != 0) - TestErrPrintf("Line %d: attribute name size wrong!\n", __LINE__); - } /* end if */ - - /* Verify the information for first attribute, in decreasing creation order */ - memset(&ainfo, 0, sizeof(ainfo)); - ret = H5Aget_info_by_idx(obj_id, ".", H5_INDEX_CRT_ORDER, H5_ITER_DEC, n, &ainfo, H5P_DEFAULT); - CHECK(ret, FAIL, "H5Aget_info_by_idx"); - VERIFY(ainfo.corder, 0, "H5Aget_info_by_idx"); - - /* Verify the information for new attribute, in increasing creation order */ - memset(&ainfo, 0, sizeof(ainfo)); - ret = H5Aget_info_by_idx(obj_id, ".", H5_INDEX_CRT_ORDER, H5_ITER_DEC, (hsize_t)0, &ainfo, H5P_DEFAULT); - CHECK(ret, FAIL, "H5Aget_info_by_idx"); - VERIFY(ainfo.corder, n, "H5Aget_info_by_idx"); - - /* Verify the name for new link, in increasing creation order */ - memset(tmpname, 0, (size_t)NAME_BUF_SIZE); - ret = (herr_t)H5Aget_name_by_idx(obj_id, ".", H5_INDEX_CRT_ORDER, H5_ITER_DEC, (hsize_t)0, tmpname, - (size_t)NAME_BUF_SIZE, H5P_DEFAULT); - CHECK(ret, FAIL, "H5Aget_name_by_idx"); - if (strcmp(attrname, tmpname) != 0) - TestErrPrintf("Line %d: attribute name size wrong!\n", __LINE__); - - /* Verify the information for first attribute, in increasing name order */ - memset(&ainfo, 0, sizeof(ainfo)); - ret = H5Aget_info_by_idx(obj_id, ".", H5_INDEX_NAME, H5_ITER_INC, (hsize_t)0, &ainfo, H5P_DEFAULT); - CHECK(ret, FAIL, "H5Aget_info_by_idx"); - VERIFY(ainfo.corder, 0, "H5Aget_info_by_idx"); - - /* Verify the information for new attribute, in increasing name order */ - memset(&ainfo, 0, sizeof(ainfo)); - ret = H5Aget_info_by_idx(obj_id, ".", H5_INDEX_NAME, H5_ITER_INC, n, &ainfo, H5P_DEFAULT); - CHECK(ret, FAIL, "H5Aget_info_by_idx"); - VERIFY(ainfo.corder, n, "H5Aget_info_by_idx"); - - /* Verify the name for new link, in increasing name order */ - memset(tmpname, 0, (size_t)NAME_BUF_SIZE); - ret = (herr_t)H5Aget_name_by_idx(obj_id, ".", H5_INDEX_NAME, H5_ITER_INC, n, tmpname, - (size_t)NAME_BUF_SIZE, H5P_DEFAULT); - CHECK(ret, FAIL, "H5Aget_name_by_idx"); - if (strcmp(attrname, tmpname) != 0) - TestErrPrintf("Line %d: attribute name size wrong!\n", __LINE__); - - /* Don't test "native" order queries on link name order, since there's not - * a good way to easily predict the order of the links in the name index. - */ - - /* Verify the information for first attribute, in decreasing name order */ - memset(&ainfo, 0, sizeof(ainfo)); - ret = H5Aget_info_by_idx(obj_id, ".", H5_INDEX_NAME, H5_ITER_DEC, n, &ainfo, H5P_DEFAULT); - CHECK(ret, FAIL, "H5Aget_info_by_idx"); - VERIFY(ainfo.corder, 0, "H5Aget_info_by_idx"); - - /* Verify the information for new attribute, in increasing name order */ - memset(&ainfo, 0, sizeof(ainfo)); - ret = H5Aget_info_by_idx(obj_id, ".", H5_INDEX_NAME, H5_ITER_DEC, (hsize_t)0, &ainfo, H5P_DEFAULT); - CHECK(ret, FAIL, "H5Aget_info_by_idx"); - VERIFY(ainfo.corder, n, "H5Aget_info_by_idx"); - - /* Verify the name for new link, in increasing name order */ - memset(tmpname, 0, (size_t)NAME_BUF_SIZE); - ret = (herr_t)H5Aget_name_by_idx(obj_id, ".", H5_INDEX_NAME, H5_ITER_DEC, (hsize_t)0, tmpname, - (size_t)NAME_BUF_SIZE, H5P_DEFAULT); - CHECK(ret, FAIL, "H5Aget_name_by_idx"); - if (strcmp(attrname, tmpname) != 0) - TestErrPrintf("Line %d: attribute name size wrong!\n", __LINE__); - - /* Retrieve current # of errors */ - if (old_nerrs == nerrors) - return (0); - else - return (-1); -} /* end attr_info_by_idx_check() */ - -/**************************************************************** -** -** test_attr_info_by_idx(): Test basic H5A (attribute) code. -** Tests querying attribute info by index -** -****************************************************************/ -static void -test_attr_info_by_idx(bool new_format, hid_t fcpl, hid_t fapl) -{ - hid_t fid; /* HDF5 File ID */ - hid_t dset1, dset2, dset3; /* Dataset IDs */ - hid_t my_dataset; /* Current dataset ID */ - hid_t sid; /* Dataspace ID */ - hid_t attr; /* Attribute ID */ - hid_t dcpl; /* Dataset creation property list ID */ - H5A_info_t ainfo; /* Attribute information */ - unsigned max_compact; /* Maximum # of links to store in group compactly */ - unsigned min_dense; /* Minimum # of links to store in group "densely" */ -#if 0 - htri_t is_empty; /* Are there any attributes? */ - htri_t is_dense; /* Are attributes stored densely? */ - hsize_t nattrs; /* Number of attributes on object */ - hsize_t name_count; /* # of records in name index */ - hsize_t corder_count; /* # of records in creation order index */ -#endif - unsigned use_index; /* Use index on creation order values */ - char attrname[NAME_BUF_SIZE]; /* Name of attribute */ - char tmpname[NAME_BUF_SIZE]; /* Temporary attribute name */ - unsigned curr_dset; /* Current dataset to work on */ - unsigned u; /* Local index variable */ - herr_t ret; /* Generic return value */ - - /* Create dataspace for dataset & attributes */ - sid = H5Screate(H5S_SCALAR); - CHECK(sid, FAIL, "H5Screate"); - - /* Create dataset creation property list */ - if (dcpl_g == H5P_DEFAULT) { - dcpl = H5Pcreate(H5P_DATASET_CREATE); - CHECK(dcpl, FAIL, "H5Pcreate"); - } - else { - dcpl = H5Pcopy(dcpl_g); - CHECK(dcpl, FAIL, "H5Pcopy"); - } - - /* Query the attribute creation properties */ - ret = H5Pget_attr_phase_change(dcpl, &max_compact, &min_dense); - CHECK(ret, FAIL, "H5Pget_attr_phase_change"); - - /* Loop over using index for creation order value */ - for (use_index = false; use_index <= true; use_index++) { - /* Output message about test being performed */ - if (use_index) - MESSAGE(5, ("Testing Querying Attribute Info By Index w/Creation Order Index\n")) - else - MESSAGE(5, ("Testing Querying Attribute Info By Index w/o Creation Order Index\n")) - - /* Create file */ - fid = H5Fcreate(FILENAME, H5F_ACC_TRUNC, fcpl, fapl); - CHECK(fid, FAIL, "H5Fcreate"); - - /* Set attribute creation order tracking & indexing for object */ - if (new_format == true) { - ret = H5Pset_attr_creation_order( - dcpl, (H5P_CRT_ORDER_TRACKED | (use_index ? H5P_CRT_ORDER_INDEXED : (unsigned)0))); - CHECK(ret, FAIL, "H5Pset_attr_creation_order"); - } /* end if */ - - /* Create datasets */ - dset1 = H5Dcreate2(fid, DSET1_NAME, H5T_NATIVE_UCHAR, sid, H5P_DEFAULT, dcpl, H5P_DEFAULT); - CHECK(dset1, FAIL, "H5Dcreate2"); - dset2 = H5Dcreate2(fid, DSET2_NAME, H5T_NATIVE_UCHAR, sid, H5P_DEFAULT, dcpl, H5P_DEFAULT); - CHECK(dset2, FAIL, "H5Dcreate2"); - dset3 = H5Dcreate2(fid, DSET3_NAME, H5T_NATIVE_UCHAR, sid, H5P_DEFAULT, dcpl, H5P_DEFAULT); - CHECK(dset3, FAIL, "H5Dcreate2"); - - /* Work on all the datasets */ - for (curr_dset = 0; curr_dset < NUM_DSETS; curr_dset++) { - switch (curr_dset) { - case 0: - my_dataset = dset1; - break; - - case 1: - my_dataset = dset2; - break; - - case 2: - my_dataset = dset3; - break; - - default: - assert(0 && "Too many datasets!"); - } /* end switch */ -#if 0 - /* Check on dataset's attribute storage status */ - is_empty = H5O__is_attr_empty_test(my_dataset); - VERIFY(is_empty, true, "H5O__is_attr_empty_test"); - is_dense = H5O__is_attr_dense_test(my_dataset); - VERIFY(is_dense, false, "H5O__is_attr_dense_test"); -#endif - /* Check for query on non-existent attribute */ - H5E_BEGIN_TRY - { - ret = H5Aget_info_by_idx(my_dataset, ".", H5_INDEX_CRT_ORDER, H5_ITER_INC, (hsize_t)0, &ainfo, - H5P_DEFAULT); - } - H5E_END_TRY - VERIFY(ret, FAIL, "H5Aget_info_by_idx"); - H5E_BEGIN_TRY - { - ret = (herr_t)H5Aget_name_by_idx(my_dataset, ".", H5_INDEX_CRT_ORDER, H5_ITER_INC, (hsize_t)0, - tmpname, (size_t)NAME_BUF_SIZE, H5P_DEFAULT); - } - H5E_END_TRY - VERIFY(ret, FAIL, "H5Aget_name_by_idx"); - - /* Create attributes, up to limit of compact form */ - for (u = 0; u < max_compact; u++) { - /* Create attribute */ - snprintf(attrname, sizeof(attrname), "attr %02u", u); - attr = H5Acreate2(my_dataset, attrname, H5T_NATIVE_UINT, sid, H5P_DEFAULT, H5P_DEFAULT); - CHECK(attr, FAIL, "H5Acreate2"); - - /* Write data into the attribute */ - ret = H5Awrite(attr, H5T_NATIVE_UINT, &u); - CHECK(ret, FAIL, "H5Awrite"); - - /* Close attribute */ - ret = H5Aclose(attr); - CHECK(ret, FAIL, "H5Aclose"); - - /* Verify information for new attribute */ - ret = attr_info_by_idx_check(my_dataset, attrname, (hsize_t)u, use_index); - CHECK(ret, FAIL, "attr_info_by_idx_check"); - } /* end for */ -#if 0 - /* Verify state of object */ - ret = H5O__num_attrs_test(my_dataset, &nattrs); - CHECK(ret, FAIL, "H5O__num_attrs_test"); - VERIFY(nattrs, max_compact, "H5O__num_attrs_test"); - is_empty = H5O__is_attr_empty_test(my_dataset); - VERIFY(is_empty, false, "H5O__is_attr_empty_test"); - is_dense = H5O__is_attr_dense_test(my_dataset); - VERIFY(is_dense, false, "H5O__is_attr_dense_test"); -#endif - /* Check for out of bound offset queries */ - H5E_BEGIN_TRY - { - ret = H5Aget_info_by_idx(my_dataset, ".", H5_INDEX_CRT_ORDER, H5_ITER_INC, (hsize_t)u, &ainfo, - H5P_DEFAULT); - } - H5E_END_TRY - VERIFY(ret, FAIL, "H5Aget_info_by_idx"); - H5E_BEGIN_TRY - { - ret = H5Aget_info_by_idx(my_dataset, ".", H5_INDEX_CRT_ORDER, H5_ITER_DEC, (hsize_t)u, &ainfo, - H5P_DEFAULT); - } - H5E_END_TRY - VERIFY(ret, FAIL, "H5Aget_info_by_idx"); - H5E_BEGIN_TRY - { - ret = (herr_t)H5Aget_name_by_idx(my_dataset, ".", H5_INDEX_CRT_ORDER, H5_ITER_INC, (hsize_t)u, - tmpname, (size_t)NAME_BUF_SIZE, H5P_DEFAULT); - } - H5E_END_TRY - VERIFY(ret, FAIL, "H5Aget_name_by_idx"); - - /* Create more attributes, to push into dense form */ - for (; u < (max_compact * 2); u++) { - /* Create attribute */ - snprintf(attrname, sizeof(attrname), "attr %02u", u); - attr = H5Acreate2(my_dataset, attrname, H5T_NATIVE_UINT, sid, H5P_DEFAULT, H5P_DEFAULT); - CHECK(attr, FAIL, "H5Acreate2"); - - /* Write data into the attribute */ - ret = H5Awrite(attr, H5T_NATIVE_UINT, &u); - CHECK(ret, FAIL, "H5Awrite"); - - /* Close attribute */ - ret = H5Aclose(attr); - CHECK(ret, FAIL, "H5Aclose"); -#if 0 - /* Verify state of object */ - is_dense = H5O__is_attr_dense_test(my_dataset); - VERIFY(is_dense, (new_format ? true : false), "H5O__is_attr_dense_test"); -#endif - /* Verify information for new attribute */ - ret = attr_info_by_idx_check(my_dataset, attrname, (hsize_t)u, use_index); - CHECK(ret, FAIL, "attr_info_by_idx_check"); - } /* end for */ -#if 0 - /* Verify state of object */ - ret = H5O__num_attrs_test(my_dataset, &nattrs); - CHECK(ret, FAIL, "H5O__num_attrs_test"); - VERIFY(nattrs, (max_compact * 2), "H5O__num_attrs_test"); - is_empty = H5O__is_attr_empty_test(my_dataset); - VERIFY(is_empty, false, "H5O__is_attr_empty_test"); - is_dense = H5O__is_attr_dense_test(my_dataset); - VERIFY(is_dense, (new_format ? true : false), "H5O__is_attr_dense_test"); - - if (new_format) { - /* Retrieve & verify # of records in the name & creation order indices */ - ret = H5O__attr_dense_info_test(my_dataset, &name_count, &corder_count); - CHECK(ret, FAIL, "H5O__attr_dense_info_test"); - if (use_index) - VERIFY(name_count, corder_count, "H5O__attr_dense_info_test"); - VERIFY(name_count, (max_compact * 2), "H5O__attr_dense_info_test"); - } /* end if */ -#endif - /* Check for out of bound offset queries */ - H5E_BEGIN_TRY - { - ret = H5Aget_info_by_idx(my_dataset, ".", H5_INDEX_CRT_ORDER, H5_ITER_INC, (hsize_t)u, &ainfo, - H5P_DEFAULT); - } - H5E_END_TRY - VERIFY(ret, FAIL, "H5Aget_info_by_idx"); - H5E_BEGIN_TRY - { - ret = H5Aget_info_by_idx(my_dataset, ".", H5_INDEX_CRT_ORDER, H5_ITER_DEC, (hsize_t)u, &ainfo, - H5P_DEFAULT); - } - H5E_END_TRY - VERIFY(ret, FAIL, "H5Aget_info_by_idx"); - H5E_BEGIN_TRY - { - ret = (herr_t)H5Aget_name_by_idx(my_dataset, ".", H5_INDEX_CRT_ORDER, H5_ITER_INC, (hsize_t)u, - tmpname, (size_t)NAME_BUF_SIZE, H5P_DEFAULT); - } - H5E_END_TRY - VERIFY(ret, FAIL, "H5Aget_name_by_idx"); - } /* end for */ - - /* Close Datasets */ - ret = H5Dclose(dset1); - CHECK(ret, FAIL, "H5Dclose"); - ret = H5Dclose(dset2); - CHECK(ret, FAIL, "H5Dclose"); - ret = H5Dclose(dset3); - CHECK(ret, FAIL, "H5Dclose"); - - /* Close file */ - ret = H5Fclose(fid); - CHECK(ret, FAIL, "H5Fclose"); - } /* end for */ - - /* Close property list */ - ret = H5Pclose(dcpl); - CHECK(ret, FAIL, "H5Pclose"); - - /* Close dataspace */ - ret = H5Sclose(sid); - CHECK(ret, FAIL, "H5Sclose"); -} /* test_attr_info_by_idx() */ - -/*************************************************************** -** -** test_attr_info_null_info_pointer(): A test to ensure that -** passing a NULL attribute info pointer to H5Aget_info -** (_by_name/_by_idx) doesn't cause bad behavior. -** -****************************************************************/ -static void -test_attr_info_null_info_pointer(hid_t fcpl, hid_t fapl) -{ - herr_t err_ret = -1; - hid_t fid; - hid_t attr; - hid_t sid; - - /* Create dataspace for attribute */ - sid = H5Screate(H5S_SCALAR); - CHECK(sid, FAIL, "H5Screate"); - - /* Create file */ - fid = H5Fcreate(FILENAME, H5F_ACC_TRUNC, fcpl, fapl); - CHECK(fid, FAIL, "H5Fcreate"); - - /* Create attribute */ - attr = H5Acreate2(fid, GET_INFO_NULL_POINTER_ATTR_NAME, H5T_NATIVE_UINT, sid, H5P_DEFAULT, H5P_DEFAULT); - CHECK(attr, FAIL, "H5Acreate2"); - - H5E_BEGIN_TRY - { - err_ret = H5Aget_info(attr, NULL); - } - H5E_END_TRY - - CHECK(err_ret, SUCCEED, "H5Aget_info"); - - H5E_BEGIN_TRY - { - err_ret = H5Aget_info_by_name(fid, ".", GET_INFO_NULL_POINTER_ATTR_NAME, NULL, H5P_DEFAULT); - } - H5E_END_TRY - - CHECK(err_ret, SUCCEED, "H5Aget_info_by_name"); - - H5E_BEGIN_TRY - { - err_ret = H5Aget_info_by_idx(fid, ".", H5_INDEX_NAME, H5_ITER_INC, 0, NULL, H5P_DEFAULT); - } - H5E_END_TRY - - CHECK(err_ret, SUCCEED, "H5Aget_info_by_idx"); - - /* Close dataspace */ - err_ret = H5Sclose(sid); - CHECK(err_ret, FAIL, "H5Sclose"); - - /* Close attribute */ - err_ret = H5Aclose(attr); - CHECK(err_ret, FAIL, "H5Aclose"); - - /* Close file */ - err_ret = H5Fclose(fid); - CHECK(err_ret, FAIL, "H5Fclose"); -} - -/*************************************************************** -** -** test_attr_rename_invalid_name(): A test to ensure that -** passing a NULL or empty attribute name to -** H5Arename(_by_name) doesn't cause bad behavior. -** -****************************************************************/ -static void -test_attr_rename_invalid_name(hid_t fcpl, hid_t fapl) -{ - herr_t err_ret = -1; - hid_t fid; - hid_t attr; - hid_t sid; - - /* Create dataspace for attribute */ - sid = H5Screate(H5S_SCALAR); - CHECK(sid, FAIL, "H5Screate"); - - /* Create file */ - fid = H5Fcreate(FILENAME, H5F_ACC_TRUNC, fcpl, fapl); - CHECK(fid, FAIL, "H5Fcreate"); - - /* Create attribute */ - attr = H5Acreate2(fid, INVALID_RENAME_TEST_ATTR_NAME, H5T_NATIVE_UINT, sid, H5P_DEFAULT, H5P_DEFAULT); - CHECK(attr, FAIL, "H5Acreate2"); - - H5E_BEGIN_TRY - { - err_ret = H5Arename(fid, NULL, INVALID_RENAME_TEST_NEW_ATTR_NAME); - } - H5E_END_TRY - - CHECK(err_ret, SUCCEED, "H5Arename"); - - H5E_BEGIN_TRY - { - err_ret = H5Arename(fid, "", INVALID_RENAME_TEST_NEW_ATTR_NAME); - } - H5E_END_TRY - - CHECK(err_ret, SUCCEED, "H5Arename"); - - H5E_BEGIN_TRY - { - err_ret = H5Arename(fid, INVALID_RENAME_TEST_ATTR_NAME, NULL); - } - H5E_END_TRY - - CHECK(err_ret, SUCCEED, "H5Arename"); - - H5E_BEGIN_TRY - { - err_ret = H5Arename(fid, INVALID_RENAME_TEST_ATTR_NAME, ""); - } - H5E_END_TRY - - CHECK(err_ret, SUCCEED, "H5Arename"); - - H5E_BEGIN_TRY - { - err_ret = H5Arename_by_name(fid, ".", NULL, INVALID_RENAME_TEST_NEW_ATTR_NAME, H5P_DEFAULT); - } - H5E_END_TRY - - CHECK(err_ret, SUCCEED, "H5Arename_by_name"); - - H5E_BEGIN_TRY - { - err_ret = H5Arename_by_name(fid, ".", "", INVALID_RENAME_TEST_NEW_ATTR_NAME, H5P_DEFAULT); - } - H5E_END_TRY - - CHECK(err_ret, SUCCEED, "H5Arename_by_name"); - - H5E_BEGIN_TRY - { - err_ret = H5Arename_by_name(fid, ".", INVALID_RENAME_TEST_ATTR_NAME, NULL, H5P_DEFAULT); - } - H5E_END_TRY - - CHECK(err_ret, SUCCEED, "H5Arename_by_name"); - - H5E_BEGIN_TRY - { - err_ret = H5Arename_by_name(fid, ".", INVALID_RENAME_TEST_ATTR_NAME, "", H5P_DEFAULT); - } - H5E_END_TRY - - CHECK(err_ret, SUCCEED, "H5Arename_by_name"); - - /* Close dataspace */ - err_ret = H5Sclose(sid); - CHECK(err_ret, FAIL, "H5Sclose"); - - /* Close attribute */ - err_ret = H5Aclose(attr); - CHECK(err_ret, FAIL, "H5Aclose"); - - /* Close file */ - err_ret = H5Fclose(fid); - CHECK(err_ret, FAIL, "H5Fclose"); -} - -/*************************************************************** -** -** test_attr_get_name_invalid_buf(): A test to ensure that -** passing a NULL buffer to H5Aget_name(_by_idx) when -** the 'size' parameter is non-zero doesn't cause bad -** behavior. -** -****************************************************************/ -static void -test_attr_get_name_invalid_buf(hid_t fcpl, hid_t fapl) -{ - ssize_t err_ret = -1; - hid_t fid; - hid_t attr; - hid_t sid; - - /* Create dataspace for attribute */ - sid = H5Screate(H5S_SCALAR); - CHECK(sid, FAIL, "H5Screate"); - - /* Create file */ - fid = H5Fcreate(FILENAME, H5F_ACC_TRUNC, fcpl, fapl); - CHECK(fid, FAIL, "H5Fcreate"); - - /* Create attribute */ - attr = - H5Acreate2(fid, GET_NAME_INVALID_BUF_TEST_ATTR_NAME, H5T_NATIVE_UINT, sid, H5P_DEFAULT, H5P_DEFAULT); - CHECK(attr, FAIL, "H5Acreate2"); - - H5E_BEGIN_TRY - { - err_ret = H5Aget_name(attr, 1, NULL); - } - H5E_END_TRY - - VERIFY(err_ret, FAIL, "H5Aget_name"); - - H5E_BEGIN_TRY - { - err_ret = H5Aget_name_by_idx(fid, ".", H5_INDEX_NAME, H5_ITER_INC, 0, NULL, 1, H5P_DEFAULT); - } - H5E_END_TRY - - VERIFY(err_ret, FAIL, "H5Aget_name_by_idx"); - - /* Close dataspace */ - err_ret = H5Sclose(sid); - CHECK(err_ret, FAIL, "H5Sclose"); - - /* Close attribute */ - err_ret = H5Aclose(attr); - CHECK(err_ret, FAIL, "H5Aclose"); - - /* Close file */ - err_ret = H5Fclose(fid); - CHECK(err_ret, FAIL, "H5Fclose"); -} - -/**************************************************************** -** -** test_attr_delete_by_idx(): Test basic H5A (attribute) code. -** Tests deleting attribute by index -** -****************************************************************/ -static void -test_attr_delete_by_idx(bool new_format, hid_t fcpl, hid_t fapl) -{ - hid_t fid; /* HDF5 File ID */ - hid_t dset1, dset2, dset3; /* Dataset IDs */ - hid_t my_dataset; /* Current dataset ID */ - hid_t sid; /* Dataspace ID */ - hid_t attr; /* Attribute ID */ - hid_t dcpl; /* Dataset creation property list ID */ - H5A_info_t ainfo; /* Attribute information */ - unsigned max_compact; /* Maximum # of links to store in group compactly */ - unsigned min_dense; /* Minimum # of links to store in group "densely" */ -#if 0 - htri_t is_empty; /* Are there any attributes? */ - htri_t is_dense; /* Are attributes stored densely? */ - hsize_t nattrs; /* Number of attributes on object */ - hsize_t name_count; /* # of records in name index */ - hsize_t corder_count; /* # of records in creation order index */ -#endif - H5_index_t idx_type; /* Type of index to operate on */ - H5_iter_order_t order; /* Order within in the index */ - unsigned use_index; /* Use index on creation order values */ - char attrname[NAME_BUF_SIZE]; /* Name of attribute */ - char tmpname[NAME_BUF_SIZE]; /* Temporary attribute name */ - unsigned curr_dset; /* Current dataset to work on */ - unsigned u; /* Local index variable */ - herr_t ret; /* Generic return value */ - - MESSAGE(5, ("Testing Deleting Attribute By Index\n")) - - if (!(vol_cap_flags_g & H5VL_CAP_FLAG_CREATION_ORDER)) { - MESSAGE(5, (" SKIPPED\n")) - return; - } - - /* Create dataspace for dataset & attributes */ - sid = H5Screate(H5S_SCALAR); - CHECK(sid, FAIL, "H5Screate"); - - /* Create dataset creation property list */ - if (dcpl_g == H5P_DEFAULT) { - dcpl = H5Pcreate(H5P_DATASET_CREATE); - CHECK(dcpl, FAIL, "H5Pcreate"); - } - else { - dcpl = H5Pcopy(dcpl_g); - CHECK(dcpl, FAIL, "H5Pcopy"); - } - - /* Query the attribute creation properties */ - ret = H5Pget_attr_phase_change(dcpl, &max_compact, &min_dense); - CHECK(ret, FAIL, "H5Pget_attr_phase_change"); - - /* Loop over operating on different indices on link fields */ - for (idx_type = H5_INDEX_NAME; idx_type <= H5_INDEX_CRT_ORDER; idx_type++) { - /* Loop over operating in different orders */ - for (order = H5_ITER_INC; order <= H5_ITER_DEC; order++) { - /* Loop over using index for creation order value */ - for (use_index = false; use_index <= true; use_index++) { - /* Print appropriate test message */ - if (idx_type == H5_INDEX_CRT_ORDER) { - if (order == H5_ITER_INC) { - if (use_index) - MESSAGE(5, ("Testing Deleting Attribute By Creation Order Index in Increasing " - "Order w/Creation Order Index\n")) - else - MESSAGE(5, ("Testing Deleting Attribute By Creation Order Index in Increasing " - "Order w/o Creation Order Index\n")) - } /* end if */ - else { - if (use_index) - MESSAGE(5, ("Testing Deleting Attribute By Creation Order Index in Decreasing " - "Order w/Creation Order Index\n")) - else - MESSAGE(5, ("Testing Deleting Attribute By Creation Order Index in Decreasing " - "Order w/o Creation Order Index\n")) - } /* end else */ - } /* end if */ - else { - if (order == H5_ITER_INC) { - if (use_index) - MESSAGE(5, ("Testing Deleting Attribute By Name Index in Increasing Order " - "w/Creation Order Index\n")) - else - MESSAGE(5, ("Testing Deleting Attribute By Name Index in Increasing Order w/o " - "Creation Order Index\n")) - } /* end if */ - else { - if (use_index) - MESSAGE(5, ("Testing Deleting Attribute By Name Index in Decreasing Order " - "w/Creation Order Index\n")) - else - MESSAGE(5, ("Testing Deleting Attribute By Name Index in Decreasing Order w/o " - "Creation Order Index\n")) - } - } /* end else */ - - /* Create file */ - fid = H5Fcreate(FILENAME, H5F_ACC_TRUNC, fcpl, fapl); - CHECK(fid, FAIL, "H5Fcreate"); - - /* Set attribute creation order tracking & indexing for object */ - if (new_format == true) { - ret = H5Pset_attr_creation_order( - dcpl, (H5P_CRT_ORDER_TRACKED | (use_index ? H5P_CRT_ORDER_INDEXED : (unsigned)0))); - CHECK(ret, FAIL, "H5Pset_attr_creation_order"); - } /* end if */ - - /* Create datasets */ - dset1 = H5Dcreate2(fid, DSET1_NAME, H5T_NATIVE_UCHAR, sid, H5P_DEFAULT, dcpl, H5P_DEFAULT); - CHECK(dset1, FAIL, "H5Dcreate2"); - dset2 = H5Dcreate2(fid, DSET2_NAME, H5T_NATIVE_UCHAR, sid, H5P_DEFAULT, dcpl, H5P_DEFAULT); - CHECK(dset2, FAIL, "H5Dcreate2"); - dset3 = H5Dcreate2(fid, DSET3_NAME, H5T_NATIVE_UCHAR, sid, H5P_DEFAULT, dcpl, H5P_DEFAULT); - CHECK(dset3, FAIL, "H5Dcreate2"); - - /* Work on all the datasets */ - for (curr_dset = 0; curr_dset < NUM_DSETS; curr_dset++) { - switch (curr_dset) { - case 0: - my_dataset = dset1; - break; - - case 1: - my_dataset = dset2; - break; - - case 2: - my_dataset = dset3; - break; - - default: - assert(0 && "Too many datasets!"); - } /* end switch */ -#if 0 - /* Check on dataset's attribute storage status */ - is_empty = H5O__is_attr_empty_test(my_dataset); - VERIFY(is_empty, true, "H5O__is_attr_empty_test"); - is_dense = H5O__is_attr_dense_test(my_dataset); - VERIFY(is_dense, false, "H5O__is_attr_dense_test"); -#endif - /* Check for deleting non-existent attribute */ - H5E_BEGIN_TRY - { - ret = H5Adelete_by_idx(my_dataset, ".", idx_type, order, (hsize_t)0, H5P_DEFAULT); - } - H5E_END_TRY - VERIFY(ret, FAIL, "H5Adelete_by_idx"); - - /* Create attributes, up to limit of compact form */ - for (u = 0; u < max_compact; u++) { - /* Create attribute */ - snprintf(attrname, sizeof(attrname), "attr %02u", u); - attr = - H5Acreate2(my_dataset, attrname, H5T_NATIVE_UINT, sid, H5P_DEFAULT, H5P_DEFAULT); - CHECK(attr, FAIL, "H5Acreate2"); - - /* Write data into the attribute */ - ret = H5Awrite(attr, H5T_NATIVE_UINT, &u); - CHECK(ret, FAIL, "H5Awrite"); - - /* Close attribute */ - ret = H5Aclose(attr); - CHECK(ret, FAIL, "H5Aclose"); - - /* Verify information for new attribute */ - ret = attr_info_by_idx_check(my_dataset, attrname, (hsize_t)u, use_index); - CHECK(ret, FAIL, "attr_info_by_idx_check"); - } /* end for */ -#if 0 - /* Verify state of object */ - ret = H5O__num_attrs_test(my_dataset, &nattrs); - CHECK(ret, FAIL, "H5O__num_attrs_test"); - VERIFY(nattrs, max_compact, "H5O__num_attrs_test"); - is_empty = H5O__is_attr_empty_test(my_dataset); - VERIFY(is_empty, false, "H5O__is_attr_empty_test"); - is_dense = H5O__is_attr_dense_test(my_dataset); - VERIFY(is_dense, false, "H5O__is_attr_dense_test"); -#endif - /* Check for out of bound deletions */ - H5E_BEGIN_TRY - { - ret = H5Adelete_by_idx(my_dataset, ".", idx_type, order, (hsize_t)u, H5P_DEFAULT); - } - H5E_END_TRY - VERIFY(ret, FAIL, "H5Adelete_by_idx"); - } /* end for */ - - /* Work on all the datasets */ - for (curr_dset = 0; curr_dset < NUM_DSETS; curr_dset++) { - switch (curr_dset) { - case 0: - my_dataset = dset1; - break; - - case 1: - my_dataset = dset2; - break; - - case 2: - my_dataset = dset3; - break; - - default: - assert(0 && "Too many datasets!"); - } /* end switch */ - - /* Delete attributes from compact storage */ - for (u = 0; u < (max_compact - 1); u++) { - /* Delete first attribute in appropriate order */ - ret = H5Adelete_by_idx(my_dataset, ".", idx_type, order, (hsize_t)0, H5P_DEFAULT); - CHECK(ret, FAIL, "H5Adelete_by_idx"); - - /* Verify the attribute information for first attribute in appropriate order */ - memset(&ainfo, 0, sizeof(ainfo)); - ret = H5Aget_info_by_idx(my_dataset, ".", idx_type, order, (hsize_t)0, &ainfo, - H5P_DEFAULT); - if (new_format) { - if (order == H5_ITER_INC) { - VERIFY(ainfo.corder, (u + 1), "H5Aget_info_by_idx"); - } /* end if */ - else { - VERIFY(ainfo.corder, (max_compact - (u + 2)), "H5Aget_info_by_idx"); - } /* end else */ - } /* end if */ - - /* Verify the name for first attribute in appropriate order */ - memset(tmpname, 0, (size_t)NAME_BUF_SIZE); - ret = (herr_t)H5Aget_name_by_idx(my_dataset, ".", idx_type, order, (hsize_t)0, - tmpname, (size_t)NAME_BUF_SIZE, H5P_DEFAULT); - if (order == H5_ITER_INC) - snprintf(attrname, sizeof(attrname), "attr %02u", (u + 1)); - else - snprintf(attrname, sizeof(attrname), "attr %02u", (max_compact - (u + 2))); - ret = strcmp(attrname, tmpname); - VERIFY(ret, 0, "H5Aget_name_by_idx"); - } /* end for */ - - /* Delete last attribute */ - ret = H5Adelete_by_idx(my_dataset, ".", idx_type, order, (hsize_t)0, H5P_DEFAULT); - CHECK(ret, FAIL, "H5Adelete_by_idx"); -#if 0 - /* Verify state of attribute storage (empty) */ - is_empty = H5O__is_attr_empty_test(my_dataset); - VERIFY(is_empty, true, "H5O__is_attr_empty_test"); -#endif - } /* end for */ - - /* Work on all the datasets */ - for (curr_dset = 0; curr_dset < NUM_DSETS; curr_dset++) { - switch (curr_dset) { - case 0: - my_dataset = dset1; - break; - - case 1: - my_dataset = dset2; - break; - - case 2: - my_dataset = dset3; - break; - - default: - assert(0 && "Too many datasets!"); - } /* end switch */ - - /* Create more attributes, to push into dense form */ - for (u = 0; u < (max_compact * 2); u++) { - /* Create attribute */ - snprintf(attrname, sizeof(attrname), "attr %02u", u); - attr = - H5Acreate2(my_dataset, attrname, H5T_NATIVE_UINT, sid, H5P_DEFAULT, H5P_DEFAULT); - CHECK(attr, FAIL, "H5Acreate2"); - - /* Write data into the attribute */ - ret = H5Awrite(attr, H5T_NATIVE_UINT, &u); - CHECK(ret, FAIL, "H5Awrite"); - - /* Close attribute */ - ret = H5Aclose(attr); - CHECK(ret, FAIL, "H5Aclose"); -#if 0 - /* Verify state of object */ - if (u >= max_compact) { - is_dense = H5O__is_attr_dense_test(my_dataset); - VERIFY(is_dense, (new_format ? true : false), "H5O__is_attr_dense_test"); - } /* end if */ -#endif - /* Verify information for new attribute */ - ret = attr_info_by_idx_check(my_dataset, attrname, (hsize_t)u, use_index); - CHECK(ret, FAIL, "attr_info_by_idx_check"); - } /* end for */ -#if 0 - /* Verify state of object */ - ret = H5O__num_attrs_test(my_dataset, &nattrs); - CHECK(ret, FAIL, "H5O__num_attrs_test"); - VERIFY(nattrs, (max_compact * 2), "H5O__num_attrs_test"); - is_empty = H5O__is_attr_empty_test(my_dataset); - VERIFY(is_empty, false, "H5O__is_attr_empty_test"); - is_dense = H5O__is_attr_dense_test(my_dataset); - VERIFY(is_dense, (new_format ? true : false), "H5O__is_attr_dense_test"); - - if (new_format) { - /* Retrieve & verify # of records in the name & creation order indices */ - ret = H5O__attr_dense_info_test(my_dataset, &name_count, &corder_count); - CHECK(ret, FAIL, "H5O__attr_dense_info_test"); - if (use_index) - VERIFY(name_count, corder_count, "H5O__attr_dense_info_test"); - VERIFY(name_count, (max_compact * 2), "H5O__attr_dense_info_test"); - } /* end if */ -#endif - /* Check for out of bound deletion */ - H5E_BEGIN_TRY - { - ret = H5Adelete_by_idx(my_dataset, ".", idx_type, order, (hsize_t)u, H5P_DEFAULT); - } - H5E_END_TRY - VERIFY(ret, FAIL, "H5Adelete_by_idx"); - } /* end for */ - - /* Work on all the datasets */ - for (curr_dset = 0; curr_dset < NUM_DSETS; curr_dset++) { - switch (curr_dset) { - case 0: - my_dataset = dset1; - break; - - case 1: - my_dataset = dset2; - break; - - case 2: - my_dataset = dset3; - break; - - default: - assert(0 && "Too many datasets!"); - } /* end switch */ - - /* Delete attributes from dense storage */ - for (u = 0; u < ((max_compact * 2) - 1); u++) { - /* Delete first attribute in appropriate order */ - ret = H5Adelete_by_idx(my_dataset, ".", idx_type, order, (hsize_t)0, H5P_DEFAULT); - CHECK(ret, FAIL, "H5Adelete_by_idx"); - - /* Verify the attribute information for first attribute in appropriate order */ - memset(&ainfo, 0, sizeof(ainfo)); - ret = H5Aget_info_by_idx(my_dataset, ".", idx_type, order, (hsize_t)0, &ainfo, - H5P_DEFAULT); - if (new_format) { - if (order == H5_ITER_INC) { - VERIFY(ainfo.corder, (u + 1), "H5Aget_info_by_idx"); - } /* end if */ - else { - VERIFY(ainfo.corder, ((max_compact * 2) - (u + 2)), "H5Aget_info_by_idx"); - } /* end else */ - } /* end if */ - - /* Verify the name for first attribute in appropriate order */ - memset(tmpname, 0, (size_t)NAME_BUF_SIZE); - ret = (herr_t)H5Aget_name_by_idx(my_dataset, ".", idx_type, order, (hsize_t)0, - tmpname, (size_t)NAME_BUF_SIZE, H5P_DEFAULT); - if (order == H5_ITER_INC) - snprintf(attrname, sizeof(attrname), "attr %02u", (u + 1)); - else - snprintf(attrname, sizeof(attrname), "attr %02u", ((max_compact * 2) - (u + 2))); - ret = strcmp(attrname, tmpname); - VERIFY(ret, 0, "H5Aget_name_by_idx"); - } /* end for */ - - /* Delete last attribute */ - ret = H5Adelete_by_idx(my_dataset, ".", idx_type, order, (hsize_t)0, H5P_DEFAULT); - CHECK(ret, FAIL, "H5Adelete_by_idx"); -#if 0 - /* Verify state of attribute storage (empty) */ - is_empty = H5O__is_attr_empty_test(my_dataset); - VERIFY(is_empty, true, "H5O__is_attr_empty_test"); -#endif - /* Check for deletion on empty attribute storage again */ - H5E_BEGIN_TRY - { - ret = H5Adelete_by_idx(my_dataset, ".", idx_type, order, (hsize_t)0, H5P_DEFAULT); - } - H5E_END_TRY - VERIFY(ret, FAIL, "H5Adelete_by_idx"); - } /* end for */ - - /* Delete attributes in middle */ - - /* Work on all the datasets */ - for (curr_dset = 0; curr_dset < NUM_DSETS; curr_dset++) { - switch (curr_dset) { - case 0: - my_dataset = dset1; - break; - - case 1: - my_dataset = dset2; - break; - - case 2: - my_dataset = dset3; - break; - - default: - assert(0 && "Too many datasets!"); - } /* end switch */ - - /* Create attributes, to push into dense form */ - for (u = 0; u < (max_compact * 2); u++) { - /* Create attribute */ - snprintf(attrname, sizeof(attrname), "attr %02u", u); - attr = - H5Acreate2(my_dataset, attrname, H5T_NATIVE_UINT, sid, H5P_DEFAULT, H5P_DEFAULT); - CHECK(attr, FAIL, "H5Acreate2"); - - /* Write data into the attribute */ - ret = H5Awrite(attr, H5T_NATIVE_UINT, &u); - CHECK(ret, FAIL, "H5Awrite"); - - /* Close attribute */ - ret = H5Aclose(attr); - CHECK(ret, FAIL, "H5Aclose"); -#if 0 - /* Verify state of object */ - if (u >= max_compact) { - is_dense = H5O__is_attr_dense_test(my_dataset); - VERIFY(is_dense, (new_format ? true : false), "H5O__is_attr_dense_test"); - } /* end if */ -#endif - /* Verify information for new attribute */ - ret = attr_info_by_idx_check(my_dataset, attrname, (hsize_t)u, use_index); - CHECK(ret, FAIL, "attr_info_by_idx_check"); - } /* end for */ - } /* end for */ - - /* Work on all the datasets */ - for (curr_dset = 0; curr_dset < NUM_DSETS; curr_dset++) { - switch (curr_dset) { - case 0: - my_dataset = dset1; - break; - - case 1: - my_dataset = dset2; - break; - - case 2: - my_dataset = dset3; - break; - - default: - assert(0 && "Too many datasets!"); - } /* end switch */ - - /* Delete every other attribute from dense storage, in appropriate order */ - for (u = 0; u < max_compact; u++) { - /* Delete attribute */ - ret = H5Adelete_by_idx(my_dataset, ".", idx_type, order, (hsize_t)u, H5P_DEFAULT); - CHECK(ret, FAIL, "H5Adelete_by_idx"); - - /* Verify the attribute information for first attribute in appropriate order */ - memset(&ainfo, 0, sizeof(ainfo)); - ret = H5Aget_info_by_idx(my_dataset, ".", idx_type, order, (hsize_t)u, &ainfo, - H5P_DEFAULT); - if (new_format) { - if (order == H5_ITER_INC) { - VERIFY(ainfo.corder, ((u * 2) + 1), "H5Aget_info_by_idx"); - } /* end if */ - else { - VERIFY(ainfo.corder, ((max_compact * 2) - ((u * 2) + 2)), - "H5Aget_info_by_idx"); - } /* end else */ - } /* end if */ - - /* Verify the name for first attribute in appropriate order */ - memset(tmpname, 0, (size_t)NAME_BUF_SIZE); - ret = (herr_t)H5Aget_name_by_idx(my_dataset, ".", idx_type, order, (hsize_t)u, - tmpname, (size_t)NAME_BUF_SIZE, H5P_DEFAULT); - if (order == H5_ITER_INC) - snprintf(attrname, sizeof(attrname), "attr %02u", ((u * 2) + 1)); - else - snprintf(attrname, sizeof(attrname), "attr %02u", - ((max_compact * 2) - ((u * 2) + 2))); - ret = strcmp(attrname, tmpname); - VERIFY(ret, 0, "H5Aget_name_by_idx"); - } /* end for */ - } /* end for */ - - /* Work on all the datasets */ - for (curr_dset = 0; curr_dset < NUM_DSETS; curr_dset++) { - switch (curr_dset) { - case 0: - my_dataset = dset1; - break; - - case 1: - my_dataset = dset2; - break; - - case 2: - my_dataset = dset3; - break; - - default: - assert(0 && "Too many datasets!"); - } /* end switch */ - - /* Delete remaining attributes from dense storage, in appropriate order */ - for (u = 0; u < (max_compact - 1); u++) { - /* Delete attribute */ - ret = H5Adelete_by_idx(my_dataset, ".", idx_type, order, (hsize_t)0, H5P_DEFAULT); - CHECK(ret, FAIL, "H5Adelete_by_idx"); - - /* Verify the attribute information for first attribute in appropriate order */ - memset(&ainfo, 0, sizeof(ainfo)); - ret = H5Aget_info_by_idx(my_dataset, ".", idx_type, order, (hsize_t)0, &ainfo, - H5P_DEFAULT); - if (new_format) { - if (order == H5_ITER_INC) { - VERIFY(ainfo.corder, ((u * 2) + 3), "H5Aget_info_by_idx"); - } /* end if */ - else { - VERIFY(ainfo.corder, ((max_compact * 2) - ((u * 2) + 4)), - "H5Aget_info_by_idx"); - } /* end else */ - } /* end if */ - - /* Verify the name for first attribute in appropriate order */ - memset(tmpname, 0, (size_t)NAME_BUF_SIZE); - ret = (herr_t)H5Aget_name_by_idx(my_dataset, ".", idx_type, order, (hsize_t)0, - tmpname, (size_t)NAME_BUF_SIZE, H5P_DEFAULT); - if (order == H5_ITER_INC) - snprintf(attrname, sizeof(attrname), "attr %02u", ((u * 2) + 3)); - else - snprintf(attrname, sizeof(attrname), "attr %02u", - ((max_compact * 2) - ((u * 2) + 4))); - ret = strcmp(attrname, tmpname); - VERIFY(ret, 0, "H5Aget_name_by_idx"); - } /* end for */ - - /* Delete last attribute */ - ret = H5Adelete_by_idx(my_dataset, ".", idx_type, order, (hsize_t)0, H5P_DEFAULT); - CHECK(ret, FAIL, "H5Adelete_by_idx"); -#if 0 - /* Verify state of attribute storage (empty) */ - is_empty = H5O__is_attr_empty_test(my_dataset); - VERIFY(is_empty, true, "H5O__is_attr_empty_test"); -#endif - /* Check for deletion on empty attribute storage again */ - H5E_BEGIN_TRY - { - ret = H5Adelete_by_idx(my_dataset, ".", idx_type, order, (hsize_t)0, H5P_DEFAULT); - } - H5E_END_TRY - VERIFY(ret, FAIL, "H5Adelete_by_idx"); - } /* end for */ - - /* Close Datasets */ - ret = H5Dclose(dset1); - CHECK(ret, FAIL, "H5Dclose"); - ret = H5Dclose(dset2); - CHECK(ret, FAIL, "H5Dclose"); - ret = H5Dclose(dset3); - CHECK(ret, FAIL, "H5Dclose"); - - /* Close file */ - ret = H5Fclose(fid); - CHECK(ret, FAIL, "H5Fclose"); - } /* end for */ - } /* end for */ - } /* end for */ - - /* Close property list */ - ret = H5Pclose(dcpl); - CHECK(ret, FAIL, "H5Pclose"); - - /* Close dataspace */ - ret = H5Sclose(sid); - CHECK(ret, FAIL, "H5Sclose"); -} /* test_attr_delete_by_idx() */ - -/**************************************************************** -** -** attr_iterate2_cb(): Revised attribute operator -** -****************************************************************/ -static herr_t -attr_iterate2_cb(hid_t loc_id, const char *attr_name, const H5A_info_t *info, void *_op_data) -{ - attr_iter_info_t *op_data = (attr_iter_info_t *)_op_data; /* User data */ - char attrname[NAME_BUF_SIZE]; /* Object name */ - H5A_info_t my_info; /* Local attribute info */ - - /* Increment # of times the callback was called */ - op_data->ncalled++; - - /* Get the attribute information directly to compare */ - if (H5Aget_info_by_name(loc_id, ".", attr_name, &my_info, H5P_DEFAULT) < 0) - return (H5_ITER_ERROR); - - /* Check more things for revised attribute iteration (vs. older attribute iteration) */ - if (info) { - /* Check for correct order of iteration */ - /* (if we are operating in increasing or decreasing order) */ - if (op_data->order != H5_ITER_NATIVE) - if (info->corder != op_data->curr) - return (H5_ITER_ERROR); - - /* Compare attribute info structs */ - if (info->corder_valid != my_info.corder_valid) - return (H5_ITER_ERROR); - if (info->corder != my_info.corder) - return (H5_ITER_ERROR); - if (info->cset != my_info.cset) - return (H5_ITER_ERROR); - if (info->data_size != my_info.data_size) - return (H5_ITER_ERROR); - } /* end if */ - - /* Verify name of link */ - snprintf(attrname, sizeof(attrname), "attr %02u", (unsigned)my_info.corder); - if (strcmp(attr_name, attrname) != 0) - return (H5_ITER_ERROR); - - /* Check if we've visited this link before */ - if ((size_t)op_data->curr >= op_data->max_visit) - return (H5_ITER_ERROR); - if (op_data->visited[op_data->curr]) - return (H5_ITER_ERROR); - op_data->visited[op_data->curr] = true; - - /* Advance to next value, in correct direction */ - if (op_data->order != H5_ITER_DEC) - op_data->curr++; - else - op_data->curr--; - - /* Check for stopping in the middle of iterating */ - if (op_data->stop > 0) - if (--op_data->stop == 0) - return (CORDER_ITER_STOP); - - return (H5_ITER_CONT); -} /* end attr_iterate2_cb() */ - -#ifndef H5_NO_DEPRECATED_SYMBOLS - -/**************************************************************** -** -** attr_iterate1_cb(): Attribute operator -** -****************************************************************/ -#if 0 -static herr_t -attr_iterate1_cb(hid_t loc_id, const char *attr_name, void *_op_data) -{ - return (attr_iterate2_cb(loc_id, attr_name, NULL, _op_data)); -} /* end attr_iterate1_cb() */ -#endif /* H5_NO_DEPRECATED_SYMBOLS */ -#endif - -/*------------------------------------------------------------------------- - * Function: attr_iterate2_fail_cb - * - * Purpose: Callback routine for iterating over attributes on object that - * always returns failure - * - * Return: Success: 0 - * Failure: -1 - * - *------------------------------------------------------------------------- - */ -static int -attr_iterate2_fail_cb(hid_t H5_ATTR_UNUSED group_id, const char H5_ATTR_UNUSED *attr_name, - const H5A_info_t H5_ATTR_UNUSED *info, void H5_ATTR_UNUSED *_op_data) -{ - return (H5_ITER_ERROR); -} /* end attr_iterate2_fail_cb() */ - -/*------------------------------------------------------------------------- - * Function: attr_iterate_check - * - * Purpose: Check iteration over attributes on an object - * - * Return: Success: 0 - * Failure: -1 - * - *------------------------------------------------------------------------- - */ -static int -attr_iterate_check(hid_t fid, const char *dsetname, hid_t obj_id, H5_index_t idx_type, H5_iter_order_t order, - unsigned max_attrs, attr_iter_info_t *iter_info) -{ - unsigned v; /* Local index variable */ - hsize_t skip; /* # of attributes to skip on object */ -#if 0 -#ifndef H5_NO_DEPRECATED_SYMBOLS - unsigned oskip; /* # of attributes to skip on object, with H5Aiterate1 */ -#endif /* H5_NO_DEPRECATED_SYMBOLS */ -#endif - int old_nerrs; /* Number of errors when entering this check */ - herr_t ret; /* Generic return value */ - - /* Retrieve the current # of reported errors */ - old_nerrs = nerrors; - - if (!(vol_cap_flags_g & H5VL_CAP_FLAG_ITERATE)) { - SKIPPED(); - printf(" API functions for iterate aren't " - "supported with this connector\n"); - return 1; - } - - /* Iterate over attributes on object */ - iter_info->nskipped = (unsigned)(skip = 0); - iter_info->order = order; - iter_info->stop = -1; - iter_info->ncalled = 0; - iter_info->curr = order != H5_ITER_DEC ? 0 : (max_attrs - 1); - memset(iter_info->visited, 0, sizeof(bool) * iter_info->max_visit); - ret = H5Aiterate2(obj_id, idx_type, order, &skip, attr_iterate2_cb, iter_info); - CHECK(ret, FAIL, "H5Aiterate2"); - - /* Verify that we visited all the attributes */ - VERIFY(skip, max_attrs, "H5Aiterate2"); - for (v = 0; v < max_attrs; v++) - VERIFY(iter_info->visited[v], true, "H5Aiterate2"); - - /* Iterate over attributes on object */ - iter_info->nskipped = (unsigned)(skip = 0); - iter_info->order = order; - iter_info->stop = -1; - iter_info->ncalled = 0; - iter_info->curr = order != H5_ITER_DEC ? 0 : (max_attrs - 1); - memset(iter_info->visited, 0, sizeof(bool) * iter_info->max_visit); - ret = H5Aiterate_by_name(fid, dsetname, idx_type, order, &skip, attr_iterate2_cb, iter_info, H5P_DEFAULT); - CHECK(ret, FAIL, "H5Aiterate_by_name"); - - /* Verify that we visited all the attributes */ - VERIFY(skip, max_attrs, "H5Aiterate_by_name"); - for (v = 0; v < max_attrs; v++) - VERIFY(iter_info->visited[v], true, "H5Aiterate_by_name"); - - /* Iterate over attributes on object */ - iter_info->nskipped = (unsigned)(skip = 0); - iter_info->order = order; - iter_info->stop = -1; - iter_info->ncalled = 0; - iter_info->curr = order != H5_ITER_DEC ? 0 : (max_attrs - 1); - memset(iter_info->visited, 0, sizeof(bool) * iter_info->max_visit); - ret = H5Aiterate_by_name(obj_id, ".", idx_type, order, &skip, attr_iterate2_cb, iter_info, H5P_DEFAULT); - CHECK(ret, FAIL, "H5Aiterate_by_name"); - - /* Verify that we visited all the attributes */ - VERIFY(skip, max_attrs, "H5Aiterate_by_name"); - for (v = 0; v < max_attrs; v++) - VERIFY(iter_info->visited[v], true, "H5Aiterate_by_name"); - -#if 0 -#ifndef H5_NO_DEPRECATED_SYMBOLS - /* Iterate over attributes on object, with H5Aiterate1 */ - iter_info->nskipped = oskip = 0; - iter_info->order = order; - iter_info->stop = -1; - iter_info->ncalled = 0; - iter_info->curr = order != H5_ITER_DEC ? 0 : (max_attrs - 1); - memset(iter_info->visited, 0, sizeof(bool) * iter_info->max_visit); - ret = H5Aiterate1(obj_id, &oskip, attr_iterate1_cb, iter_info); - CHECK(ret, FAIL, "H5Aiterate1"); - - /* Verify that we visited all the attributes */ - VERIFY(skip, max_attrs, "H5Aiterate1"); - for (v = 0; v < max_attrs; v++) - VERIFY(iter_info->visited[v], true, "H5Aiterate1"); -#endif /* H5_NO_DEPRECATED_SYMBOLS */ -#endif - - /* Skip over some attributes on object */ - iter_info->nskipped = (unsigned)(skip = max_attrs / 2); - iter_info->order = order; - iter_info->stop = -1; - iter_info->ncalled = 0; - iter_info->curr = order != H5_ITER_DEC ? skip : ((max_attrs - 1) - skip); - memset(iter_info->visited, 0, sizeof(bool) * iter_info->max_visit); - ret = H5Aiterate2(obj_id, idx_type, order, &skip, attr_iterate2_cb, iter_info); - CHECK(ret, FAIL, "H5Aiterate2"); - - /* Verify that we visited all the attributes */ - VERIFY(skip, max_attrs, "H5Aiterate2"); - if (order == H5_ITER_INC) { - for (v = 0; v < (max_attrs / 2); v++) - VERIFY(iter_info->visited[v + (max_attrs / 2)], true, "H5Aiterate2"); - } /* end if */ - else if (order == H5_ITER_DEC) { - for (v = 0; v < (max_attrs / 2); v++) - VERIFY(iter_info->visited[v], true, "H5Aiterate2"); - } /* end if */ - else { - unsigned nvisit = 0; /* # of links visited */ - - assert(order == H5_ITER_NATIVE); - for (v = 0; v < max_attrs; v++) - if (iter_info->visited[v] == true) - nvisit++; - - VERIFY(skip, (max_attrs / 2), "H5Aiterate2"); - } /* end else */ - - /* Skip over some attributes on object */ - iter_info->nskipped = (unsigned)(skip = max_attrs / 2); - iter_info->order = order; - iter_info->stop = -1; - iter_info->ncalled = 0; - iter_info->curr = order != H5_ITER_DEC ? skip : ((max_attrs - 1) - skip); - memset(iter_info->visited, 0, sizeof(bool) * iter_info->max_visit); - ret = H5Aiterate_by_name(fid, dsetname, idx_type, order, &skip, attr_iterate2_cb, iter_info, H5P_DEFAULT); - CHECK(ret, FAIL, "H5Aiterate_by_name"); - - /* Verify that we visited all the attributes */ - VERIFY(skip, max_attrs, "H5Aiterate_by_name"); - if (order == H5_ITER_INC) { - for (v = 0; v < (max_attrs / 2); v++) - VERIFY(iter_info->visited[v + (max_attrs / 2)], true, "H5Aiterate_by_name"); - } /* end if */ - else if (order == H5_ITER_DEC) { - for (v = 0; v < (max_attrs / 2); v++) - VERIFY(iter_info->visited[v], true, "H5Aiterate_by_name"); - } /* end if */ - else { - unsigned nvisit = 0; /* # of links visited */ - - assert(order == H5_ITER_NATIVE); - for (v = 0; v < max_attrs; v++) - if (iter_info->visited[v] == true) - nvisit++; - - VERIFY(skip, (max_attrs / 2), "H5Aiterate_by_name"); - } /* end else */ - - /* Skip over some attributes on object */ - iter_info->nskipped = (unsigned)(skip = max_attrs / 2); - iter_info->order = order; - iter_info->stop = -1; - iter_info->ncalled = 0; - iter_info->curr = order != H5_ITER_DEC ? skip : ((max_attrs - 1) - skip); - memset(iter_info->visited, 0, sizeof(bool) * iter_info->max_visit); - ret = H5Aiterate_by_name(obj_id, ".", idx_type, order, &skip, attr_iterate2_cb, iter_info, H5P_DEFAULT); - CHECK(ret, FAIL, "H5Aiterate_by_name"); - - /* Verify that we visited all the attributes */ - VERIFY(skip, max_attrs, "H5Aiterate_by_name"); - if (order == H5_ITER_INC) { - for (v = 0; v < (max_attrs / 2); v++) - VERIFY(iter_info->visited[v + (max_attrs / 2)], true, "H5Aiterate_by_name"); - } /* end if */ - else if (order == H5_ITER_DEC) { - for (v = 0; v < (max_attrs / 2); v++) - VERIFY(iter_info->visited[v], true, "H5Aiterate_by_name"); - } /* end if */ - else { - unsigned nvisit = 0; /* # of links visited */ - - assert(order == H5_ITER_NATIVE); - for (v = 0; v < max_attrs; v++) - if (iter_info->visited[v] == true) - nvisit++; - - VERIFY(skip, (max_attrs / 2), "H5Aiterate_by_name"); - } /* end else */ - -#if 0 -#ifndef H5_NO_DEPRECATED_SYMBOLS - /* Skip over some attributes on object, with H5Aiterate1 */ - iter_info->nskipped = oskip = max_attrs / 2; - iter_info->order = order; - iter_info->stop = -1; - iter_info->ncalled = 0; - iter_info->curr = order != H5_ITER_DEC ? (unsigned)oskip : ((max_attrs - 1) - oskip); - memset(iter_info->visited, 0, sizeof(bool) * iter_info->max_visit); - ret = H5Aiterate1(obj_id, &oskip, attr_iterate1_cb, iter_info); - CHECK(ret, FAIL, "H5Aiterate1"); - - /* Verify that we visited all the links */ - VERIFY(oskip, max_attrs, "H5Aiterate1"); - if (order == H5_ITER_INC) { - for (v = 0; v < (max_attrs / 2); v++) - VERIFY(iter_info->visited[v + (max_attrs / 2)], true, "H5Aiterate1"); - } /* end if */ - else if (order == H5_ITER_DEC) { - for (v = 0; v < (max_attrs / 2); v++) - VERIFY(iter_info->visited[v], true, "H5Aiterate1"); - } /* end if */ - else { - unsigned nvisit = 0; /* # of links visited */ - - assert(order == H5_ITER_NATIVE); - for (v = 0; v < max_attrs; v++) - if (iter_info->visited[v] == true) - nvisit++; - - VERIFY(skip, (max_attrs / 2), "H5Aiterate1"); - } /* end else */ -#endif /* H5_NO_DEPRECATED_SYMBOLS */ -#endif - - /* Iterate over attributes on object, stopping in the middle */ - iter_info->nskipped = (unsigned)(skip = 0); - iter_info->order = order; - iter_info->stop = 3; - iter_info->ncalled = 0; - iter_info->curr = order != H5_ITER_DEC ? 0 : (max_attrs - 1); - memset(iter_info->visited, 0, sizeof(bool) * iter_info->max_visit); - ret = H5Aiterate2(obj_id, idx_type, order, &skip, attr_iterate2_cb, iter_info); - CHECK(ret, FAIL, "H5Aiterate2"); - VERIFY(ret, CORDER_ITER_STOP, "H5Aiterate2"); - VERIFY(iter_info->ncalled, 3, "H5Aiterate2"); - - /* Iterate over attributes on object, stopping in the middle */ - iter_info->nskipped = (unsigned)(skip = 0); - iter_info->order = order; - iter_info->stop = 3; - iter_info->ncalled = 0; - iter_info->curr = order != H5_ITER_DEC ? 0 : (max_attrs - 1); - memset(iter_info->visited, 0, sizeof(bool) * iter_info->max_visit); - ret = H5Aiterate_by_name(fid, dsetname, idx_type, order, &skip, attr_iterate2_cb, iter_info, H5P_DEFAULT); - CHECK(ret, FAIL, "H5Aiterate_by_name"); - VERIFY(ret, CORDER_ITER_STOP, "H5Aiterate_by_name"); - VERIFY(iter_info->ncalled, 3, "H5Aiterate_by_name"); - - /* Iterate over attributes on object, stopping in the middle */ - iter_info->nskipped = (unsigned)(skip = 0); - iter_info->order = order; - iter_info->stop = 3; - iter_info->ncalled = 0; - iter_info->curr = order != H5_ITER_DEC ? 0 : (max_attrs - 1); - memset(iter_info->visited, 0, sizeof(bool) * iter_info->max_visit); - ret = H5Aiterate_by_name(obj_id, ".", idx_type, order, &skip, attr_iterate2_cb, iter_info, H5P_DEFAULT); - CHECK(ret, FAIL, "H5Aiterate_by_name"); - VERIFY(ret, CORDER_ITER_STOP, "H5Aiterate_by_name"); - VERIFY(iter_info->ncalled, 3, "H5Aiterate_by_name"); - -#if 0 -#ifndef H5_NO_DEPRECATED_SYMBOLS - /* Iterate over attributes on object, stopping in the middle, with H5Aiterate1() */ - iter_info->nskipped = oskip = 0; - iter_info->order = order; - iter_info->stop = 3; - iter_info->ncalled = 0; - iter_info->curr = order != H5_ITER_DEC ? 0 : (max_attrs - 1); - memset(iter_info->visited, 0, sizeof(bool) * iter_info->max_visit); - ret = H5Aiterate1(obj_id, &oskip, attr_iterate1_cb, iter_info); - CHECK(ret, FAIL, "H5Aiterate1"); - VERIFY(ret, CORDER_ITER_STOP, "H5Aiterate1"); - VERIFY(iter_info->ncalled, 3, "H5Aiterate1"); -#endif /* H5_NO_DEPRECATED_SYMBOLS */ -#endif - - /* Check for iteration routine indicating failure */ - skip = 0; - H5E_BEGIN_TRY - { - ret = H5Aiterate2(obj_id, idx_type, order, &skip, attr_iterate2_fail_cb, NULL); - } - H5E_END_TRY - VERIFY(ret, FAIL, "H5Aiterate2"); - - skip = 0; - H5E_BEGIN_TRY - { - ret = H5Aiterate_by_name(fid, dsetname, idx_type, order, &skip, attr_iterate2_fail_cb, NULL, - H5P_DEFAULT); - } - H5E_END_TRY - VERIFY(ret, FAIL, "H5Aiterate_by_name"); - - skip = 0; - H5E_BEGIN_TRY - { - ret = - H5Aiterate_by_name(obj_id, ".", idx_type, order, &skip, attr_iterate2_fail_cb, NULL, H5P_DEFAULT); - } - H5E_END_TRY - VERIFY(ret, FAIL, "H5Aiterate_by_name"); - - /* Retrieve current # of errors */ - if (old_nerrs == nerrors) - return (0); - else - return (-1); -} /* end attr_iterate_check() */ - -/**************************************************************** -** -** test_attr_iterate2(): Test basic H5A (attribute) code. -** Tests iterating over attributes by index -** -****************************************************************/ -static void -test_attr_iterate2(bool new_format, hid_t fcpl, hid_t fapl) -{ - hid_t fid; /* HDF5 File ID */ - hid_t dset1, dset2, dset3; /* Dataset IDs */ - hid_t my_dataset; /* Current dataset ID */ - hid_t sid; /* Dataspace ID */ - hid_t attr; /* Attribute ID */ - hid_t dcpl; /* Dataset creation property list ID */ - unsigned max_compact; /* Maximum # of links to store in group compactly */ - unsigned min_dense; /* Minimum # of links to store in group "densely" */ -#if 0 - htri_t is_empty; /* Are there any attributes? */ - htri_t is_dense; /* Are attributes stored densely? */ - hsize_t nattrs; /* Number of attributes on object */ - hsize_t name_count; /* # of records in name index */ - hsize_t corder_count; /* # of records in creation order index */ -#endif - H5_index_t idx_type; /* Type of index to operate on */ - H5_iter_order_t order; /* Order within in the index */ - attr_iter_info_t iter_info; /* Iterator info */ - bool *visited = NULL; /* Array of flags for visiting links */ - hsize_t idx; /* Start index for iteration */ - unsigned use_index; /* Use index on creation order values */ - const char *dsetname; /* Name of dataset for attributes */ - char attrname[NAME_BUF_SIZE]; /* Name of attribute */ - unsigned curr_dset; /* Current dataset to work on */ - unsigned u; /* Local index variable */ - herr_t ret; /* Generic return value */ - - if (!(vol_cap_flags_g & H5VL_CAP_FLAG_CREATION_ORDER)) { - return; - } - - /* Create dataspace for dataset & attributes */ - sid = H5Screate(H5S_SCALAR); - CHECK(sid, FAIL, "H5Screate"); - - /* Create dataset creation property list */ - if (dcpl_g == H5P_DEFAULT) { - dcpl = H5Pcreate(H5P_DATASET_CREATE); - CHECK(dcpl, FAIL, "H5Pcreate"); - } - else { - dcpl = H5Pcopy(dcpl_g); - CHECK(dcpl, FAIL, "H5Pcopy"); - } - - /* Query the attribute creation properties */ - ret = H5Pget_attr_phase_change(dcpl, &max_compact, &min_dense); - CHECK(ret, FAIL, "H5Pget_attr_phase_change"); - - /* Allocate the "visited link" array */ - iter_info.max_visit = max_compact * 2; - visited = (bool *)malloc(sizeof(bool) * iter_info.max_visit); - CHECK_PTR(visited, "malloc"); - iter_info.visited = visited; - - /* Loop over operating on different indices on link fields */ - for (idx_type = H5_INDEX_NAME; idx_type <= H5_INDEX_CRT_ORDER; idx_type++) { - /* Loop over operating in different orders */ - for (order = H5_ITER_INC; order <= H5_ITER_DEC; order++) { - /* Loop over using index for creation order value */ - for (use_index = false; use_index <= true; use_index++) { - /* Print appropriate test message */ - if (idx_type == H5_INDEX_CRT_ORDER) { - if (order == H5_ITER_INC) { - if (use_index) - MESSAGE(5, ("Testing Iterating over Attributes By Creation Order Index in " - "Increasing Order w/Creation Order Index\n")) - else - MESSAGE(5, ("Testing Iterating over Attributes By Creation Order Index in " - "Increasing Order w/o Creation Order Index\n")) - } /* end if */ - else { - if (use_index) - MESSAGE(5, ("Testing Iterating over Attributes By Creation Order Index in " - "Decreasing Order w/Creation Order Index\n")) - else - MESSAGE(5, ("Testing Iterating over Attributes By Creation Order Index in " - "Decreasing Order w/o Creation Order Index\n")) - } /* end else */ - } /* end if */ - else { - if (order == H5_ITER_INC) { - if (use_index) - MESSAGE(5, ("Testing Iterating over Attributes By Name Index in Increasing Order " - "w/Creation Order Index\n")) - else - MESSAGE(5, ("Testing Iterating over Attributes By Name Index in Increasing Order " - "w/o Creation Order Index\n")) - } /* end if */ - else { - if (use_index) - MESSAGE(5, ("Testing Iterating over Attributes By Name Index in Decreasing Order " - "w/Creation Order Index\n")) - else - MESSAGE(5, ("Testing Iterating over Attributes By Name Index in Decreasing Order " - "w/o Creation Order Index\n")) - } /* end else */ - } /* end else */ - - /* Create file */ - fid = H5Fcreate(FILENAME, H5F_ACC_TRUNC, fcpl, fapl); - CHECK(fid, FAIL, "H5Fcreate"); - - /* Set attribute creation order tracking & indexing for object */ - if (new_format == true) { - ret = H5Pset_attr_creation_order( - dcpl, (H5P_CRT_ORDER_TRACKED | (use_index ? H5P_CRT_ORDER_INDEXED : (unsigned)0))); - CHECK(ret, FAIL, "H5Pset_attr_creation_order"); - } /* end if */ - - /* Create datasets */ - dset1 = H5Dcreate2(fid, DSET1_NAME, H5T_NATIVE_UCHAR, sid, H5P_DEFAULT, dcpl, H5P_DEFAULT); - CHECK(dset1, FAIL, "H5Dcreate2"); - dset2 = H5Dcreate2(fid, DSET2_NAME, H5T_NATIVE_UCHAR, sid, H5P_DEFAULT, dcpl, H5P_DEFAULT); - CHECK(dset2, FAIL, "H5Dcreate2"); - dset3 = H5Dcreate2(fid, DSET3_NAME, H5T_NATIVE_UCHAR, sid, H5P_DEFAULT, dcpl, H5P_DEFAULT); - CHECK(dset3, FAIL, "H5Dcreate2"); - - /* Work on all the datasets */ - for (curr_dset = 0; curr_dset < NUM_DSETS; curr_dset++) { - switch (curr_dset) { - case 0: - my_dataset = dset1; - dsetname = DSET1_NAME; - break; - - case 1: - my_dataset = dset2; - dsetname = DSET2_NAME; - break; - - case 2: - my_dataset = dset3; - dsetname = DSET3_NAME; - break; - - default: - assert(0 && "Too many datasets!"); - } /* end switch */ -#if 0 - /* Check on dataset's attribute storage status */ - is_empty = H5O__is_attr_empty_test(my_dataset); - VERIFY(is_empty, true, "H5O__is_attr_empty_test"); - is_dense = H5O__is_attr_dense_test(my_dataset); - VERIFY(is_dense, false, "H5O__is_attr_dense_test"); -#endif - /* Check for iterating over object with no attributes (should be OK) */ - ret = H5Aiterate2(my_dataset, idx_type, order, NULL, attr_iterate2_cb, NULL); - CHECK(ret, FAIL, "H5Aiterate2"); - - ret = H5Aiterate_by_name(fid, dsetname, idx_type, order, NULL, attr_iterate2_cb, NULL, - H5P_DEFAULT); - CHECK(ret, FAIL, "H5Aiterate_by_name"); - - ret = H5Aiterate_by_name(my_dataset, ".", idx_type, order, NULL, attr_iterate2_cb, NULL, - H5P_DEFAULT); - CHECK(ret, FAIL, "H5Aiterate_by_name"); - - /* Create attributes, up to limit of compact form */ - for (u = 0; u < max_compact; u++) { - /* Create attribute */ - snprintf(attrname, sizeof(attrname), "attr %02u", u); - attr = - H5Acreate2(my_dataset, attrname, H5T_NATIVE_UINT, sid, H5P_DEFAULT, H5P_DEFAULT); - CHECK(attr, FAIL, "H5Acreate2"); - - /* Write data into the attribute */ - ret = H5Awrite(attr, H5T_NATIVE_UINT, &u); - CHECK(ret, FAIL, "H5Awrite"); - - /* Close attribute */ - ret = H5Aclose(attr); - CHECK(ret, FAIL, "H5Aclose"); - - /* Verify information for new attribute */ - ret = attr_info_by_idx_check(my_dataset, attrname, (hsize_t)u, use_index); - CHECK(ret, FAIL, "attr_info_by_idx_check"); - } /* end for */ -#if 0 - /* Verify state of object */ - ret = H5O__num_attrs_test(my_dataset, &nattrs); - CHECK(ret, FAIL, "H5O__num_attrs_test"); - VERIFY(nattrs, max_compact, "H5O__num_attrs_test"); - is_empty = H5O__is_attr_empty_test(my_dataset); - VERIFY(is_empty, false, "H5O__is_attr_empty_test"); - is_dense = H5O__is_attr_dense_test(my_dataset); - VERIFY(is_dense, false, "H5O__is_attr_dense_test"); -#endif - - if (vol_cap_flags_g & H5VL_CAP_FLAG_ITERATE) { - /* Check for out of bound iteration */ - idx = u; - H5E_BEGIN_TRY - { - ret = H5Aiterate2(my_dataset, idx_type, order, &idx, attr_iterate2_cb, NULL); - } - H5E_END_TRY - VERIFY(ret, FAIL, "H5Aiterate2"); - - idx = u; - H5E_BEGIN_TRY - { - ret = H5Aiterate_by_name(fid, dsetname, idx_type, order, &idx, attr_iterate2_cb, - NULL, H5P_DEFAULT); - } - H5E_END_TRY - VERIFY(ret, FAIL, "H5Aiterate_by_name"); - - idx = u; - H5E_BEGIN_TRY - { - ret = H5Aiterate_by_name(my_dataset, ".", idx_type, order, &idx, attr_iterate2_cb, - NULL, H5P_DEFAULT); - } - H5E_END_TRY - VERIFY(ret, FAIL, "H5Aiterate_by_name"); - - /* Test iteration over attributes stored compactly */ - ret = attr_iterate_check(fid, dsetname, my_dataset, idx_type, order, u, &iter_info); - CHECK(ret, FAIL, "attr_iterate_check"); - } - } /* end for */ - - /* Work on all the datasets */ - for (curr_dset = 0; curr_dset < NUM_DSETS; curr_dset++) { - switch (curr_dset) { - case 0: - my_dataset = dset1; - dsetname = DSET1_NAME; - break; - - case 1: - my_dataset = dset2; - dsetname = DSET2_NAME; - break; - - case 2: - my_dataset = dset3; - dsetname = DSET3_NAME; - break; - - default: - assert(0 && "Too many datasets!"); - } /* end switch */ - - /* Create more attributes, to push into dense form */ - for (u = max_compact; u < (max_compact * 2); u++) { - /* Create attribute */ - snprintf(attrname, sizeof(attrname), "attr %02u", u); - attr = - H5Acreate2(my_dataset, attrname, H5T_NATIVE_UINT, sid, H5P_DEFAULT, H5P_DEFAULT); - CHECK(attr, FAIL, "H5Acreate2"); - - /* Write data into the attribute */ - ret = H5Awrite(attr, H5T_NATIVE_UINT, &u); - CHECK(ret, FAIL, "H5Awrite"); - - /* Close attribute */ - ret = H5Aclose(attr); - CHECK(ret, FAIL, "H5Aclose"); -#if 0 - /* Verify state of object */ - if (u >= max_compact) { - is_dense = H5O__is_attr_dense_test(my_dataset); - VERIFY(is_dense, (new_format ? true : false), "H5O__is_attr_dense_test"); - } /* end if */ -#endif - /* Verify information for new attribute */ - ret = attr_info_by_idx_check(my_dataset, attrname, (hsize_t)u, use_index); - CHECK(ret, FAIL, "attr_info_by_idx_check"); - } /* end for */ -#if 0 - /* Verify state of object */ - ret = H5O__num_attrs_test(my_dataset, &nattrs); - CHECK(ret, FAIL, "H5O__num_attrs_test"); - VERIFY(nattrs, (max_compact * 2), "H5O__num_attrs_test"); - is_empty = H5O__is_attr_empty_test(my_dataset); - VERIFY(is_empty, false, "H5O__is_attr_empty_test"); - is_dense = H5O__is_attr_dense_test(my_dataset); - VERIFY(is_dense, (new_format ? true : false), "H5O__is_attr_dense_test"); - - if (new_format) { - /* Retrieve & verify # of records in the name & creation order indices */ - ret = H5O__attr_dense_info_test(my_dataset, &name_count, &corder_count); - CHECK(ret, FAIL, "H5O__attr_dense_info_test"); - if (use_index) - VERIFY(name_count, corder_count, "H5O__attr_dense_info_test"); - VERIFY(name_count, (max_compact * 2), "H5O__attr_dense_info_test"); - } -#endif - - if (vol_cap_flags_g & H5VL_CAP_FLAG_ITERATE) { - /* Check for out of bound iteration */ - idx = u; - H5E_BEGIN_TRY - { - ret = H5Aiterate2(my_dataset, idx_type, order, &idx, attr_iterate2_cb, NULL); - } - H5E_END_TRY - VERIFY(ret, FAIL, "H5Aiterate2"); - - idx = u; - H5E_BEGIN_TRY - { - ret = H5Aiterate_by_name(fid, dsetname, idx_type, order, &idx, attr_iterate2_cb, - NULL, H5P_DEFAULT); - } - H5E_END_TRY - VERIFY(ret, FAIL, "H5Aiterate_by_name"); - - idx = u; - H5E_BEGIN_TRY - { - ret = H5Aiterate_by_name(my_dataset, ".", idx_type, order, &idx, attr_iterate2_cb, - NULL, H5P_DEFAULT); - } - H5E_END_TRY - VERIFY(ret, FAIL, "H5Aiterate_by_name"); - - /* Test iteration over attributes stored densely */ - ret = attr_iterate_check(fid, dsetname, my_dataset, idx_type, order, u, &iter_info); - CHECK(ret, FAIL, "attr_iterate_check"); - } - } - - /* Close Datasets */ - ret = H5Dclose(dset1); - CHECK(ret, FAIL, "H5Dclose"); - ret = H5Dclose(dset2); - CHECK(ret, FAIL, "H5Dclose"); - ret = H5Dclose(dset3); - CHECK(ret, FAIL, "H5Dclose"); - - /* Close file */ - ret = H5Fclose(fid); - CHECK(ret, FAIL, "H5Fclose"); - } /* end for */ - } /* end for */ - } /* end for */ - - /* Close property list */ - ret = H5Pclose(dcpl); - CHECK(ret, FAIL, "H5Pclose"); - - /* Close dataspace */ - ret = H5Sclose(sid); - CHECK(ret, FAIL, "H5Sclose"); - - /* Free the "visited link" array */ - free(visited); -} /* test_attr_iterate2() */ - -/*------------------------------------------------------------------------- - * Function: attr_open_by_idx_check - * - * Purpose: Check opening attribute by index on an object - * - * Return: Success: 0 - * Failure: -1 - * - *------------------------------------------------------------------------- - */ -static int -attr_open_by_idx_check(hid_t obj_id, H5_index_t idx_type, H5_iter_order_t order, unsigned max_attrs) -{ - hid_t attr_id; /* ID of attribute to test */ - H5A_info_t ainfo; /* Attribute info */ - int old_nerrs; /* Number of errors when entering this check */ - unsigned u; /* Local index variable */ - herr_t ret; /* Generic return value */ - - /* Retrieve the current # of reported errors */ - old_nerrs = nerrors; - - /* Open each attribute on object by index and check that it's the correct one */ - for (u = 0; u < max_attrs; u++) { - /* Open the attribute */ - attr_id = H5Aopen_by_idx(obj_id, ".", idx_type, order, (hsize_t)u, H5P_DEFAULT, H5P_DEFAULT); - CHECK(attr_id, FAIL, "H5Aopen_by_idx"); - - /* Get the attribute's information */ - ret = H5Aget_info(attr_id, &ainfo); - CHECK(ret, FAIL, "H5Aget_info"); - - /* Check that the object is the correct one */ - if (order == H5_ITER_INC) { - VERIFY(ainfo.corder, u, "H5Aget_info"); - } /* end if */ - else if (order == H5_ITER_DEC) { - VERIFY(ainfo.corder, (max_attrs - (u + 1)), "H5Aget_info"); - } /* end if */ - else { - /* XXX: What to do about native order? */ - } /* end else */ - - /* Close attribute */ - ret = H5Aclose(attr_id); - CHECK(ret, FAIL, "H5Aclose"); - } /* end for */ - - /* Retrieve current # of errors */ - if (old_nerrs == nerrors) - return (0); - else - return (-1); -} /* end attr_open_by_idx_check() */ - -/**************************************************************** -** -** test_attr_open_by_idx(): Test basic H5A (attribute) code. -** Tests opening attributes by index -** -****************************************************************/ -static void -test_attr_open_by_idx(bool new_format, hid_t fcpl, hid_t fapl) -{ - hid_t fid; /* HDF5 File ID */ - hid_t dset1, dset2, dset3; /* Dataset IDs */ - hid_t my_dataset; /* Current dataset ID */ - hid_t sid; /* Dataspace ID */ - hid_t attr; /* Attribute ID */ - hid_t dcpl; /* Dataset creation property list ID */ - unsigned max_compact; /* Maximum # of links to store in group compactly */ - unsigned min_dense; /* Minimum # of links to store in group "densely" */ -#if 0 - htri_t is_empty; /* Are there any attributes? */ - htri_t is_dense; /* Are attributes stored densely? */ - hsize_t nattrs; /* Number of attributes on object */ - hsize_t name_count; /* # of records in name index */ - hsize_t corder_count; /* # of records in creation order index */ -#endif - H5_index_t idx_type; /* Type of index to operate on */ - H5_iter_order_t order; /* Order within in the index */ - unsigned use_index; /* Use index on creation order values */ - char attrname[NAME_BUF_SIZE]; /* Name of attribute */ - unsigned curr_dset; /* Current dataset to work on */ - unsigned u; /* Local index variable */ - hid_t ret_id; /* Generic hid_t return value */ - herr_t ret; /* Generic return value */ - - if (!(vol_cap_flags_g & H5VL_CAP_FLAG_CREATION_ORDER)) { - return; - } - - /* Create dataspace for dataset & attributes */ - sid = H5Screate(H5S_SCALAR); - CHECK(sid, FAIL, "H5Screate"); - - /* Create dataset creation property list */ - if (dcpl_g == H5P_DEFAULT) { - dcpl = H5Pcreate(H5P_DATASET_CREATE); - CHECK(dcpl, FAIL, "H5Pcreate"); - } - else { - dcpl = H5Pcopy(dcpl_g); - CHECK(dcpl, FAIL, "H5Pcopy"); - } - - /* Query the attribute creation properties */ - ret = H5Pget_attr_phase_change(dcpl, &max_compact, &min_dense); - CHECK(ret, FAIL, "H5Pget_attr_phase_change"); - - /* Loop over operating on different indices on link fields */ - for (idx_type = H5_INDEX_NAME; idx_type <= H5_INDEX_CRT_ORDER; idx_type++) { - /* Loop over operating in different orders */ - for (order = H5_ITER_INC; order <= H5_ITER_DEC; order++) { - /* Loop over using index for creation order value */ - for (use_index = false; use_index <= true; use_index++) { - /* Print appropriate test message */ - if (idx_type == H5_INDEX_CRT_ORDER) { - if (order == H5_ITER_INC) { - if (use_index) - MESSAGE(5, ("Testing Opening Attributes By Creation Order Index in Increasing " - "Order w/Creation Order Index\n")) - else - MESSAGE(5, ("Testing Opening Attributes By Creation Order Index in Increasing " - "Order w/o Creation Order Index\n")) - } /* end if */ - else { - if (use_index) - MESSAGE(5, ("Testing Opening Attributes By Creation Order Index in Decreasing " - "Order w/Creation Order Index\n")) - else - MESSAGE(5, ("Testing Opening Attributes By Creation Order Index in Decreasing " - "Order w/o Creation Order Index\n")) - } /* end else */ - } /* end if */ - else { - if (order == H5_ITER_INC) { - if (use_index) - MESSAGE(5, ("Testing Opening Attributes By Name Index in Increasing Order " - "w/Creation Order Index\n")) - else - MESSAGE(5, ("Testing Opening Attributes By Name Index in Increasing Order w/o " - "Creation Order Index\n")) - } /* end if */ - else { - if (use_index) - MESSAGE(5, ("Testing Opening Attributes By Name Index in Decreasing Order " - "w/Creation Order Index\n")) - else - MESSAGE(5, ("Testing Opening Attributes By Name Index in Decreasing Order w/o " - "Creation Order Index\n")) - } /* end else */ - } /* end else */ - - /* Create file */ - fid = H5Fcreate(FILENAME, H5F_ACC_TRUNC, fcpl, fapl); - CHECK(fid, FAIL, "H5Fcreate"); - - /* Set attribute creation order tracking & indexing for object */ - if (new_format == true) { - ret = H5Pset_attr_creation_order( - dcpl, (H5P_CRT_ORDER_TRACKED | (use_index ? H5P_CRT_ORDER_INDEXED : (unsigned)0))); - CHECK(ret, FAIL, "H5Pset_attr_creation_order"); - } /* end if */ - - /* Create datasets */ - dset1 = H5Dcreate2(fid, DSET1_NAME, H5T_NATIVE_UCHAR, sid, H5P_DEFAULT, dcpl, H5P_DEFAULT); - CHECK(dset1, FAIL, "H5Dcreate2"); - dset2 = H5Dcreate2(fid, DSET2_NAME, H5T_NATIVE_UCHAR, sid, H5P_DEFAULT, dcpl, H5P_DEFAULT); - CHECK(dset2, FAIL, "H5Dcreate2"); - dset3 = H5Dcreate2(fid, DSET3_NAME, H5T_NATIVE_UCHAR, sid, H5P_DEFAULT, dcpl, H5P_DEFAULT); - CHECK(dset3, FAIL, "H5Dcreate2"); - - /* Work on all the datasets */ - for (curr_dset = 0; curr_dset < NUM_DSETS; curr_dset++) { - switch (curr_dset) { - case 0: - my_dataset = dset1; - break; - - case 1: - my_dataset = dset2; - break; - - case 2: - my_dataset = dset3; - break; - - default: - assert(0 && "Too many datasets!"); - } /* end switch */ -#if 0 - /* Check on dataset's attribute storage status */ - is_empty = H5O__is_attr_empty_test(my_dataset); - VERIFY(is_empty, true, "H5O__is_attr_empty_test"); - is_dense = H5O__is_attr_dense_test(my_dataset); - VERIFY(is_dense, false, "H5O__is_attr_dense_test"); -#endif - /* Check for opening an attribute on an object with no attributes */ - H5E_BEGIN_TRY - { - ret_id = H5Aopen_by_idx(my_dataset, ".", idx_type, order, (hsize_t)0, H5P_DEFAULT, - H5P_DEFAULT); - } - H5E_END_TRY - VERIFY(ret_id, FAIL, "H5Aopen_by_idx"); - - /* Create attributes, up to limit of compact form */ - for (u = 0; u < max_compact; u++) { - /* Create attribute */ - snprintf(attrname, sizeof(attrname), "attr %02u", u); - attr = - H5Acreate2(my_dataset, attrname, H5T_NATIVE_UINT, sid, H5P_DEFAULT, H5P_DEFAULT); - CHECK(attr, FAIL, "H5Acreate2"); - - /* Write data into the attribute */ - ret = H5Awrite(attr, H5T_NATIVE_UINT, &u); - CHECK(ret, FAIL, "H5Awrite"); - - /* Close attribute */ - ret = H5Aclose(attr); - CHECK(ret, FAIL, "H5Aclose"); - - /* Verify information for new attribute */ - ret = attr_info_by_idx_check(my_dataset, attrname, (hsize_t)u, use_index); - CHECK(ret, FAIL, "attr_info_by_idx_check"); - } /* end for */ -#if 0 - /* Verify state of object */ - ret = H5O__num_attrs_test(my_dataset, &nattrs); - CHECK(ret, FAIL, "H5O__num_attrs_test"); - VERIFY(nattrs, max_compact, "H5O__num_attrs_test"); - is_empty = H5O__is_attr_empty_test(my_dataset); - VERIFY(is_empty, false, "H5O__is_attr_empty_test"); - is_dense = H5O__is_attr_dense_test(my_dataset); - VERIFY(is_dense, false, "H5O__is_attr_dense_test"); -#endif - /* Check for out of bound opening an attribute on an object */ - H5E_BEGIN_TRY - { - ret_id = H5Aopen_by_idx(my_dataset, ".", idx_type, order, (hsize_t)u, H5P_DEFAULT, - H5P_DEFAULT); - } - H5E_END_TRY - VERIFY(ret_id, FAIL, "H5Aopen_by_idx"); - - /* Test opening attributes by index stored compactly */ - ret = attr_open_by_idx_check(my_dataset, idx_type, order, u); - CHECK(ret, FAIL, "attr_open_by_idx_check"); - } /* end for */ - - /* Work on all the datasets */ - for (curr_dset = 0; curr_dset < NUM_DSETS; curr_dset++) { - switch (curr_dset) { - case 0: - my_dataset = dset1; - break; - - case 1: - my_dataset = dset2; - break; - - case 2: - my_dataset = dset3; - break; - - default: - assert(0 && "Too many datasets!"); - } /* end switch */ - - /* Create more attributes, to push into dense form */ - for (u = max_compact; u < (max_compact * 2); u++) { - /* Create attribute */ - snprintf(attrname, sizeof(attrname), "attr %02u", u); - attr = - H5Acreate2(my_dataset, attrname, H5T_NATIVE_UINT, sid, H5P_DEFAULT, H5P_DEFAULT); - CHECK(attr, FAIL, "H5Acreate2"); - - /* Write data into the attribute */ - ret = H5Awrite(attr, H5T_NATIVE_UINT, &u); - CHECK(ret, FAIL, "H5Awrite"); - - /* Close attribute */ - ret = H5Aclose(attr); - CHECK(ret, FAIL, "H5Aclose"); -#if 0 - /* Verify state of object */ - if (u >= max_compact) { - is_dense = H5O__is_attr_dense_test(my_dataset); - VERIFY(is_dense, (new_format ? true : false), "H5O__is_attr_dense_test"); - } /* end if */ -#endif - /* Verify information for new attribute */ - ret = attr_info_by_idx_check(my_dataset, attrname, (hsize_t)u, use_index); - CHECK(ret, FAIL, "attr_info_by_idx_check"); - } /* end for */ -#if 0 - /* Verify state of object */ - ret = H5O__num_attrs_test(my_dataset, &nattrs); - CHECK(ret, FAIL, "H5O__num_attrs_test"); - VERIFY(nattrs, (max_compact * 2), "H5O__num_attrs_test"); - is_empty = H5O__is_attr_empty_test(my_dataset); - VERIFY(is_empty, false, "H5O__is_attr_empty_test"); - is_dense = H5O__is_attr_dense_test(my_dataset); - VERIFY(is_dense, (new_format ? true : false), "H5O__is_attr_dense_test"); - - if (new_format) { - /* Retrieve & verify # of records in the name & creation order indices */ - ret = H5O__attr_dense_info_test(my_dataset, &name_count, &corder_count); - CHECK(ret, FAIL, "H5O__attr_dense_info_test"); - if (use_index) - VERIFY(name_count, corder_count, "H5O__attr_dense_info_test"); - VERIFY(name_count, (max_compact * 2), "H5O__attr_dense_info_test"); - } /* end if */ -#endif - /* Check for out of bound opening an attribute on an object */ - H5E_BEGIN_TRY - { - ret_id = H5Aopen_by_idx(my_dataset, ".", idx_type, order, (hsize_t)u, H5P_DEFAULT, - H5P_DEFAULT); - } - H5E_END_TRY - VERIFY(ret_id, FAIL, "H5Aopen_by_idx"); - - /* Test opening attributes by index stored compactly */ - ret = attr_open_by_idx_check(my_dataset, idx_type, order, u); - CHECK(ret, FAIL, "attr_open_by_idx_check"); - } /* end for */ - - /* Close Datasets */ - ret = H5Dclose(dset1); - CHECK(ret, FAIL, "H5Dclose"); - ret = H5Dclose(dset2); - CHECK(ret, FAIL, "H5Dclose"); - ret = H5Dclose(dset3); - CHECK(ret, FAIL, "H5Dclose"); - - /* Close file */ - ret = H5Fclose(fid); - CHECK(ret, FAIL, "H5Fclose"); - } /* end for */ - } /* end for */ - } /* end for */ - - /* Close property list */ - ret = H5Pclose(dcpl); - CHECK(ret, FAIL, "H5Pclose"); - - /* Close dataspace */ - ret = H5Sclose(sid); - CHECK(ret, FAIL, "H5Sclose"); -} /* test_attr_open_by_idx() */ - -/*------------------------------------------------------------------------- - * Function: attr_open_check - * - * Purpose: Check opening attribute on an object - * - * Return: Success: 0 - * Failure: -1 - * - *------------------------------------------------------------------------- - */ -static int -attr_open_check(hid_t fid, const char *dsetname, hid_t obj_id, unsigned max_attrs) -{ - hid_t attr_id; /* ID of attribute to test */ - H5A_info_t ainfo; /* Attribute info */ - char attrname[NAME_BUF_SIZE]; /* Name of attribute */ - int old_nerrs; /* Number of errors when entering this check */ - unsigned u; /* Local index variable */ - herr_t ret; /* Generic return value */ - - /* Retrieve the current # of reported errors */ - old_nerrs = nerrors; - - /* Open each attribute on object by index and check that it's the correct one */ - for (u = 0; u < max_attrs; u++) { - /* Open the attribute */ - snprintf(attrname, sizeof(attrname), "attr %02u", u); - attr_id = H5Aopen(obj_id, attrname, H5P_DEFAULT); - CHECK(attr_id, FAIL, "H5Aopen"); - - /* Get the attribute's information */ - ret = H5Aget_info(attr_id, &ainfo); - CHECK(ret, FAIL, "H5Aget_info"); - - /* Check that the object is the correct one */ - VERIFY(ainfo.corder, u, "H5Aget_info"); - - /* Close attribute */ - ret = H5Aclose(attr_id); - CHECK(ret, FAIL, "H5Aclose"); - - /* Open the attribute */ - attr_id = H5Aopen_by_name(obj_id, ".", attrname, H5P_DEFAULT, H5P_DEFAULT); - CHECK(attr_id, FAIL, "H5Aopen_by_name"); - - /* Get the attribute's information */ - ret = H5Aget_info(attr_id, &ainfo); - CHECK(ret, FAIL, "H5Aget_info"); - - /* Check that the object is the correct one */ - VERIFY(ainfo.corder, u, "H5Aget_info"); - - /* Close attribute */ - ret = H5Aclose(attr_id); - CHECK(ret, FAIL, "H5Aclose"); - - /* Open the attribute */ - attr_id = H5Aopen_by_name(fid, dsetname, attrname, H5P_DEFAULT, H5P_DEFAULT); - CHECK(attr_id, FAIL, "H5Aopen_by_name"); - - /* Get the attribute's information */ - ret = H5Aget_info(attr_id, &ainfo); - CHECK(ret, FAIL, "H5Aget_info"); - - /* Check that the object is the correct one */ - VERIFY(ainfo.corder, u, "H5Aget_info"); - - /* Close attribute */ - ret = H5Aclose(attr_id); - CHECK(ret, FAIL, "H5Aclose"); - } /* end for */ - - /* Retrieve current # of errors */ - if (old_nerrs == nerrors) - return (0); - else - return (-1); -} /* end attr_open_check() */ - -/**************************************************************** -** -** test_attr_open_by_name(): Test basic H5A (attribute) code. -** Tests opening attributes by name -** -****************************************************************/ -static void -test_attr_open_by_name(bool new_format, hid_t fcpl, hid_t fapl) -{ - hid_t fid; /* HDF5 File ID */ - hid_t dset1, dset2, dset3; /* Dataset IDs */ - hid_t my_dataset; /* Current dataset ID */ - hid_t sid; /* Dataspace ID */ - hid_t attr; /* Attribute ID */ - hid_t dcpl; /* Dataset creation property list ID */ - unsigned max_compact; /* Maximum # of links to store in group compactly */ - unsigned min_dense; /* Minimum # of links to store in group "densely" */ -#if 0 - htri_t is_empty; /* Are there any attributes? */ - htri_t is_dense; /* Are attributes stored densely? */ - hsize_t nattrs; /* Number of attributes on object */ - hsize_t name_count; /* # of records in name index */ - hsize_t corder_count; /* # of records in creation order index */ -#endif - unsigned use_index; /* Use index on creation order values */ - const char *dsetname; /* Name of dataset for attributes */ - char attrname[NAME_BUF_SIZE]; /* Name of attribute */ - unsigned curr_dset; /* Current dataset to work on */ - unsigned u; /* Local index variable */ - hid_t ret_id; /* Generic hid_t return value */ - herr_t ret; /* Generic return value */ - - /* Create dataspace for dataset & attributes */ - sid = H5Screate(H5S_SCALAR); - CHECK(sid, FAIL, "H5Screate"); - - /* Create dataset creation property list */ - if (dcpl_g == H5P_DEFAULT) { - dcpl = H5Pcreate(H5P_DATASET_CREATE); - CHECK(dcpl, FAIL, "H5Pcreate"); - } - else { - dcpl = H5Pcopy(dcpl_g); - CHECK(dcpl, FAIL, "H5Pcopy"); - } - - /* Query the attribute creation properties */ - ret = H5Pget_attr_phase_change(dcpl, &max_compact, &min_dense); - CHECK(ret, FAIL, "H5Pget_attr_phase_change"); - - /* Loop over using index for creation order value */ - for (use_index = false; use_index <= true; use_index++) { - /* Print appropriate test message */ - if (use_index) - MESSAGE(5, ("Testing Opening Attributes By Name w/Creation Order Index\n")) - else - MESSAGE(5, ("Testing Opening Attributes By Name w/o Creation Order Index\n")) - - /* Create file */ - fid = H5Fcreate(FILENAME, H5F_ACC_TRUNC, fcpl, fapl); - CHECK(fid, FAIL, "H5Fcreate"); - - /* Set attribute creation order tracking & indexing for object */ - if (new_format == true) { - ret = H5Pset_attr_creation_order( - dcpl, (H5P_CRT_ORDER_TRACKED | (use_index ? H5P_CRT_ORDER_INDEXED : (unsigned)0))); - CHECK(ret, FAIL, "H5Pset_attr_creation_order"); - } /* end if */ - - /* Create datasets */ - dset1 = H5Dcreate2(fid, DSET1_NAME, H5T_NATIVE_UCHAR, sid, H5P_DEFAULT, dcpl, H5P_DEFAULT); - CHECK(dset1, FAIL, "H5Dcreate2"); - dset2 = H5Dcreate2(fid, DSET2_NAME, H5T_NATIVE_UCHAR, sid, H5P_DEFAULT, dcpl, H5P_DEFAULT); - CHECK(dset2, FAIL, "H5Dcreate2"); - dset3 = H5Dcreate2(fid, DSET3_NAME, H5T_NATIVE_UCHAR, sid, H5P_DEFAULT, dcpl, H5P_DEFAULT); - CHECK(dset3, FAIL, "H5Dcreate2"); - - /* Work on all the datasets */ - for (curr_dset = 0; curr_dset < NUM_DSETS; curr_dset++) { - switch (curr_dset) { - case 0: - my_dataset = dset1; - dsetname = DSET1_NAME; - break; - - case 1: - my_dataset = dset2; - dsetname = DSET2_NAME; - break; - - case 2: - my_dataset = dset3; - dsetname = DSET3_NAME; - break; - - default: - assert(0 && "Too many datasets!"); - } /* end switch */ -#if 0 - /* Check on dataset's attribute storage status */ - is_empty = H5O__is_attr_empty_test(my_dataset); - VERIFY(is_empty, true, "H5O__is_attr_empty_test"); - is_dense = H5O__is_attr_dense_test(my_dataset); - VERIFY(is_dense, false, "H5O__is_attr_dense_test"); -#endif - /* Check for opening a non-existent attribute on an object with no attributes */ - H5E_BEGIN_TRY - { - ret_id = H5Aopen(my_dataset, "foo", H5P_DEFAULT); - } - H5E_END_TRY - VERIFY(ret_id, FAIL, "H5Aopen"); - - H5E_BEGIN_TRY - { - ret_id = H5Aopen_by_name(my_dataset, ".", "foo", H5P_DEFAULT, H5P_DEFAULT); - } - H5E_END_TRY - VERIFY(ret_id, FAIL, "H5Aopen_by_name"); - - H5E_BEGIN_TRY - { - ret_id = H5Aopen_by_name(fid, dsetname, "foo", H5P_DEFAULT, H5P_DEFAULT); - } - H5E_END_TRY - VERIFY(ret_id, FAIL, "H5Aopen_by_name"); - - /* Create attributes, up to limit of compact form */ - for (u = 0; u < max_compact; u++) { - /* Create attribute */ - snprintf(attrname, sizeof(attrname), "attr %02u", u); - attr = H5Acreate2(my_dataset, attrname, H5T_NATIVE_UINT, sid, H5P_DEFAULT, H5P_DEFAULT); - CHECK(attr, FAIL, "H5Acreate2"); - - /* Write data into the attribute */ - ret = H5Awrite(attr, H5T_NATIVE_UINT, &u); - CHECK(ret, FAIL, "H5Awrite"); - - /* Close attribute */ - ret = H5Aclose(attr); - CHECK(ret, FAIL, "H5Aclose"); - - /* Verify information for new attribute */ - ret = attr_info_by_idx_check(my_dataset, attrname, (hsize_t)u, use_index); - CHECK(ret, FAIL, "attr_info_by_idx_check"); - } /* end for */ -#if 0 - /* Verify state of object */ - ret = H5O__num_attrs_test(my_dataset, &nattrs); - CHECK(ret, FAIL, "H5O__num_attrs_test"); - VERIFY(nattrs, max_compact, "H5O__num_attrs_test"); - is_empty = H5O__is_attr_empty_test(my_dataset); - VERIFY(is_empty, false, "H5O__is_attr_empty_test"); - is_dense = H5O__is_attr_dense_test(my_dataset); - VERIFY(is_dense, false, "H5O__is_attr_dense_test"); -#endif - /* Check for opening a non-existent attribute on an object with compact attribute storage */ - H5E_BEGIN_TRY - { - ret_id = H5Aopen(my_dataset, "foo", H5P_DEFAULT); - } - H5E_END_TRY - VERIFY(ret_id, FAIL, "H5Aopen"); - - H5E_BEGIN_TRY - { - ret_id = H5Aopen_by_name(my_dataset, ".", "foo", H5P_DEFAULT, H5P_DEFAULT); - } - H5E_END_TRY - VERIFY(ret_id, FAIL, "H5Aopen_by_name"); - - H5E_BEGIN_TRY - { - ret_id = H5Aopen_by_name(fid, dsetname, "foo", H5P_DEFAULT, H5P_DEFAULT); - } - H5E_END_TRY - VERIFY(ret_id, FAIL, "H5Aopen_by_name"); - - /* Test opening attributes stored compactly */ - ret = attr_open_check(fid, dsetname, my_dataset, u); - CHECK(ret, FAIL, "attr_open_check"); - } /* end for */ - - /* Work on all the datasets */ - for (curr_dset = 0; curr_dset < NUM_DSETS; curr_dset++) { - switch (curr_dset) { - case 0: - my_dataset = dset1; - dsetname = DSET1_NAME; - break; - - case 1: - my_dataset = dset2; - dsetname = DSET2_NAME; - break; - - case 2: - my_dataset = dset3; - dsetname = DSET3_NAME; - break; - - default: - assert(0 && "Too many datasets!"); - } /* end switch */ - - /* Create more attributes, to push into dense form */ - for (u = max_compact; u < (max_compact * 2); u++) { - /* Create attribute */ - snprintf(attrname, sizeof(attrname), "attr %02u", u); - attr = H5Acreate2(my_dataset, attrname, H5T_NATIVE_UINT, sid, H5P_DEFAULT, H5P_DEFAULT); - CHECK(attr, FAIL, "H5Acreate2"); - - /* Write data into the attribute */ - ret = H5Awrite(attr, H5T_NATIVE_UINT, &u); - CHECK(ret, FAIL, "H5Awrite"); - - /* Close attribute */ - ret = H5Aclose(attr); - CHECK(ret, FAIL, "H5Aclose"); -#if 0 - /* Verify state of object */ - if (u >= max_compact) { - is_dense = H5O__is_attr_dense_test(my_dataset); - VERIFY(is_dense, (new_format ? true : false), "H5O__is_attr_dense_test"); - } /* end if */ -#endif - /* Verify information for new attribute */ - ret = attr_info_by_idx_check(my_dataset, attrname, (hsize_t)u, use_index); - CHECK(ret, FAIL, "attr_info_by_idx_check"); - } /* end for */ -#if 0 - /* Verify state of object */ - ret = H5O__num_attrs_test(my_dataset, &nattrs); - CHECK(ret, FAIL, "H5O__num_attrs_test"); - VERIFY(nattrs, (max_compact * 2), "H5O__num_attrs_test"); - is_empty = H5O__is_attr_empty_test(my_dataset); - VERIFY(is_empty, false, "H5O__is_attr_empty_test"); - is_dense = H5O__is_attr_dense_test(my_dataset); - VERIFY(is_dense, (new_format ? true : false), "H5O__is_attr_dense_test"); - - if (new_format) { - /* Retrieve & verify # of records in the name & creation order indices */ - ret = H5O__attr_dense_info_test(my_dataset, &name_count, &corder_count); - CHECK(ret, FAIL, "H5O__attr_dense_info_test"); - if (use_index) - VERIFY(name_count, corder_count, "H5O__attr_dense_info_test"); - VERIFY(name_count, (max_compact * 2), "H5O__attr_dense_info_test"); - } /* end if */ -#endif - /* Check for opening a non-existent attribute on an object with dense attribute storage */ - H5E_BEGIN_TRY - { - ret_id = H5Aopen(my_dataset, "foo", H5P_DEFAULT); - } - H5E_END_TRY - VERIFY(ret_id, FAIL, "H5Aopen"); - - H5E_BEGIN_TRY - { - ret_id = H5Aopen_by_name(my_dataset, ".", "foo", H5P_DEFAULT, H5P_DEFAULT); - } - H5E_END_TRY - VERIFY(ret_id, FAIL, "H5Aopen_by_name"); - - H5E_BEGIN_TRY - { - ret_id = H5Aopen_by_name(fid, dsetname, "foo", H5P_DEFAULT, H5P_DEFAULT); - } - H5E_END_TRY - VERIFY(ret_id, FAIL, "H5Aopen_by_name"); - - /* Test opening attributes stored compactly */ - ret = attr_open_check(fid, dsetname, my_dataset, u); - CHECK(ret, FAIL, "attr_open_check"); - } /* end for */ - - /* Close Datasets */ - ret = H5Dclose(dset1); - CHECK(ret, FAIL, "H5Dclose"); - ret = H5Dclose(dset2); - CHECK(ret, FAIL, "H5Dclose"); - ret = H5Dclose(dset3); - CHECK(ret, FAIL, "H5Dclose"); - - /* Close file */ - ret = H5Fclose(fid); - CHECK(ret, FAIL, "H5Fclose"); - } /* end for */ - - /* Close property list */ - ret = H5Pclose(dcpl); - CHECK(ret, FAIL, "H5Pclose"); - - /* Close dataspace */ - ret = H5Sclose(sid); - CHECK(ret, FAIL, "H5Sclose"); -} /* test_attr_open_by_name() */ - -/**************************************************************** -** -** test_attr_create_by_name(): Test basic H5A (attribute) code. -** Tests creating attributes by name -** -****************************************************************/ -static void -test_attr_create_by_name(bool new_format, hid_t fcpl, hid_t fapl) -{ - hid_t fid; /* HDF5 File ID */ - hid_t dset1, dset2, dset3; /* Dataset IDs */ - hid_t my_dataset; /* Current dataset ID */ - hid_t sid; /* Dataspace ID */ - hid_t attr; /* Attribute ID */ - hid_t dcpl; /* Dataset creation property list ID */ - unsigned max_compact; /* Maximum # of links to store in group compactly */ - unsigned min_dense; /* Minimum # of links to store in group "densely" */ -#if 0 - htri_t is_empty; /* Are there any attributes? */ - htri_t is_dense; /* Are attributes stored densely? */ - hsize_t nattrs; /* Number of attributes on object */ - hsize_t name_count; /* # of records in name index */ - hsize_t corder_count; /* # of records in creation order index */ -#endif - unsigned use_index; /* Use index on creation order values */ - const char *dsetname; /* Name of dataset for attributes */ - char attrname[NAME_BUF_SIZE]; /* Name of attribute */ - unsigned curr_dset; /* Current dataset to work on */ - unsigned u; /* Local index variable */ - herr_t ret; /* Generic return value */ - - /* Create dataspace for dataset & attributes */ - sid = H5Screate(H5S_SCALAR); - CHECK(sid, FAIL, "H5Screate"); - - /* Create dataset creation property list */ - if (dcpl_g == H5P_DEFAULT) { - dcpl = H5Pcreate(H5P_DATASET_CREATE); - CHECK(dcpl, FAIL, "H5Pcreate"); - } - else { - dcpl = H5Pcopy(dcpl_g); - CHECK(dcpl, FAIL, "H5Pcopy"); - } - - /* Query the attribute creation properties */ - ret = H5Pget_attr_phase_change(dcpl, &max_compact, &min_dense); - CHECK(ret, FAIL, "H5Pget_attr_phase_change"); - - /* Loop over using index for creation order value */ - for (use_index = false; use_index <= true; use_index++) { - /* Print appropriate test message */ - if (use_index) - MESSAGE(5, ("Testing Creating Attributes By Name w/Creation Order Index\n")) - else - MESSAGE(5, ("Testing Creating Attributes By Name w/o Creation Order Index\n")) - - /* Create file */ - fid = H5Fcreate(FILENAME, H5F_ACC_TRUNC, fcpl, fapl); - CHECK(fid, FAIL, "H5Fcreate"); - - /* Set attribute creation order tracking & indexing for object */ - if (new_format == true) { - ret = H5Pset_attr_creation_order( - dcpl, (H5P_CRT_ORDER_TRACKED | (use_index ? H5P_CRT_ORDER_INDEXED : (unsigned)0))); - CHECK(ret, FAIL, "H5Pset_attr_creation_order"); - } /* end if */ - - /* Create datasets */ - dset1 = H5Dcreate2(fid, DSET1_NAME, H5T_NATIVE_UCHAR, sid, H5P_DEFAULT, dcpl, H5P_DEFAULT); - CHECK(dset1, FAIL, "H5Dcreate2"); - dset2 = H5Dcreate2(fid, DSET2_NAME, H5T_NATIVE_UCHAR, sid, H5P_DEFAULT, dcpl, H5P_DEFAULT); - CHECK(dset2, FAIL, "H5Dcreate2"); - dset3 = H5Dcreate2(fid, DSET3_NAME, H5T_NATIVE_UCHAR, sid, H5P_DEFAULT, dcpl, H5P_DEFAULT); - CHECK(dset3, FAIL, "H5Dcreate2"); - - /* Work on all the datasets */ - for (curr_dset = 0; curr_dset < NUM_DSETS; curr_dset++) { - switch (curr_dset) { - case 0: - my_dataset = dset1; - dsetname = DSET1_NAME; - break; - - case 1: - my_dataset = dset2; - dsetname = DSET2_NAME; - break; - - case 2: - my_dataset = dset3; - dsetname = DSET3_NAME; - break; - - default: - assert(0 && "Too many datasets!"); - } /* end switch */ -#if 0 - /* Check on dataset's attribute storage status */ - is_empty = H5O__is_attr_empty_test(my_dataset); - VERIFY(is_empty, true, "H5O__is_attr_empty_test"); - is_dense = H5O__is_attr_dense_test(my_dataset); - VERIFY(is_dense, false, "H5O__is_attr_dense_test"); -#endif - /* Create attributes, up to limit of compact form */ - for (u = 0; u < max_compact; u++) { - /* Create attribute */ - snprintf(attrname, sizeof(attrname), "attr %02u", u); - attr = H5Acreate_by_name(fid, dsetname, attrname, H5T_NATIVE_UINT, sid, H5P_DEFAULT, - H5P_DEFAULT, H5P_DEFAULT); - CHECK(attr, FAIL, "H5Acreate_by_name"); - - /* Write data into the attribute */ - ret = H5Awrite(attr, H5T_NATIVE_UINT, &u); - CHECK(ret, FAIL, "H5Awrite"); - - /* Close attribute */ - ret = H5Aclose(attr); - CHECK(ret, FAIL, "H5Aclose"); - - /* Verify information for new attribute */ - ret = attr_info_by_idx_check(my_dataset, attrname, (hsize_t)u, use_index); - CHECK(ret, FAIL, "attr_info_by_idx_check"); - } /* end for */ -#if 0 - /* Verify state of object */ - ret = H5O__num_attrs_test(my_dataset, &nattrs); - CHECK(ret, FAIL, "H5O__num_attrs_test"); - VERIFY(nattrs, max_compact, "H5O__num_attrs_test"); - is_empty = H5O__is_attr_empty_test(my_dataset); - VERIFY(is_empty, false, "H5O__is_attr_empty_test"); - is_dense = H5O__is_attr_dense_test(my_dataset); - VERIFY(is_dense, false, "H5O__is_attr_dense_test"); -#endif - /* Test opening attributes stored compactly */ - ret = attr_open_check(fid, dsetname, my_dataset, u); - CHECK(ret, FAIL, "attr_open_check"); - } /* end for */ - - /* Work on all the datasets */ - for (curr_dset = 0; curr_dset < NUM_DSETS; curr_dset++) { - switch (curr_dset) { - case 0: - my_dataset = dset1; - dsetname = DSET1_NAME; - break; - - case 1: - my_dataset = dset2; - dsetname = DSET2_NAME; - break; - - case 2: - my_dataset = dset3; - dsetname = DSET3_NAME; - break; - - default: - assert(0 && "Too many datasets!"); - } /* end switch */ - - /* Create more attributes, to push into dense form */ - for (u = max_compact; u < (max_compact * 2); u++) { - /* Create attribute */ - snprintf(attrname, sizeof(attrname), "attr %02u", u); - attr = H5Acreate_by_name(fid, dsetname, attrname, H5T_NATIVE_UINT, sid, H5P_DEFAULT, - H5P_DEFAULT, H5P_DEFAULT); - CHECK(attr, FAIL, "H5Acreate_by_name"); - - /* Write data into the attribute */ - ret = H5Awrite(attr, H5T_NATIVE_UINT, &u); - CHECK(ret, FAIL, "H5Awrite"); - - /* Close attribute */ - ret = H5Aclose(attr); - CHECK(ret, FAIL, "H5Aclose"); -#if 0 - /* Verify state of object */ - if (u >= max_compact) { - is_dense = H5O__is_attr_dense_test(my_dataset); - VERIFY(is_dense, (new_format ? true : false), "H5O__is_attr_dense_test"); - } /* end if */ -#endif - /* Verify information for new attribute */ - ret = attr_info_by_idx_check(my_dataset, attrname, (hsize_t)u, use_index); - CHECK(ret, FAIL, "attr_info_by_idx_check"); - } /* end for */ -#if 0 - /* Verify state of object */ - ret = H5O__num_attrs_test(my_dataset, &nattrs); - CHECK(ret, FAIL, "H5O__num_attrs_test"); - VERIFY(nattrs, (max_compact * 2), "H5O__num_attrs_test"); - is_empty = H5O__is_attr_empty_test(my_dataset); - VERIFY(is_empty, false, "H5O__is_attr_empty_test"); - is_dense = H5O__is_attr_dense_test(my_dataset); - VERIFY(is_dense, (new_format ? true : false), "H5O__is_attr_dense_test"); - - if (new_format) { - /* Retrieve & verify # of records in the name & creation order indices */ - ret = H5O__attr_dense_info_test(my_dataset, &name_count, &corder_count); - CHECK(ret, FAIL, "H5O__attr_dense_info_test"); - if (use_index) - VERIFY(name_count, corder_count, "H5O__attr_dense_info_test"); - VERIFY(name_count, (max_compact * 2), "H5O__attr_dense_info_test"); - } /* end if */ -#endif - /* Test opening attributes stored compactly */ - ret = attr_open_check(fid, dsetname, my_dataset, u); - CHECK(ret, FAIL, "attr_open_check"); - } /* end for */ - - /* Close Datasets */ - ret = H5Dclose(dset1); - CHECK(ret, FAIL, "H5Dclose"); - ret = H5Dclose(dset2); - CHECK(ret, FAIL, "H5Dclose"); - ret = H5Dclose(dset3); - CHECK(ret, FAIL, "H5Dclose"); - - /* Close file */ - ret = H5Fclose(fid); - CHECK(ret, FAIL, "H5Fclose"); - } /* end for */ - - /* Close property list */ - ret = H5Pclose(dcpl); - CHECK(ret, FAIL, "H5Pclose"); - - /* Close dataspace */ - ret = H5Sclose(sid); - CHECK(ret, FAIL, "H5Sclose"); -} /* test_attr_create_by_name() */ - -/**************************************************************** -** -** test_attr_shared_write(): Test basic H5A (attribute) code. -** Tests writing mix of shared & un-shared attributes in "compact" & "dense" storage -** -****************************************************************/ -static void -test_attr_shared_write(hid_t fcpl, hid_t fapl) -{ - hid_t fid; /* File ID */ - hid_t my_fcpl; /* File creation property list ID */ - hid_t dataset, dataset2; /* Dataset IDs */ - hid_t attr_tid; /* Attribute's datatype ID */ - hid_t sid, big_sid; /* Dataspace IDs */ - hsize_t big_dims[] = {SPACE1_DIM1, SPACE1_DIM2, SPACE1_DIM3}; /* Dimensions for "big" attribute */ - hid_t attr; /* Attribute ID */ - hid_t dcpl; /* Dataset creation property list ID */ - char attrname[NAME_BUF_SIZE]; /* Name of attribute */ - unsigned max_compact; /* Maximum # of attributes to store compactly */ - unsigned min_dense; /* Minimum # of attributes to store "densely" */ -#if 0 - htri_t is_dense; /* Are attributes stored densely? */ - htri_t is_shared; /* Is attributes shared? */ - hsize_t shared_refcount; /* Reference count of shared attribute */ -#endif - unsigned attr_value; /* Attribute value */ - unsigned *big_value; /* Data for "big" attribute */ -#if 0 - size_t mesg_count; /* # of shared messages */ -#endif - unsigned test_shared; /* Index over shared component type */ - unsigned u; /* Local index variable */ -#if 0 - h5_stat_size_t empty_filesize; /* Size of empty file */ - h5_stat_size_t filesize; /* Size of file after modifications */ -#endif - herr_t ret; /* Generic return value */ - - /* Output message about test being performed */ - MESSAGE(5, ("Testing Writing Shared & Unshared Attributes in Compact & Dense Storage\n")); - - /* Allocate & initialize "big" attribute data */ - big_value = (unsigned *)malloc((size_t)(SPACE1_DIM1 * SPACE1_DIM2 * SPACE1_DIM3) * sizeof(unsigned)); - CHECK_PTR(big_value, "malloc"); - memset(big_value, 1, sizeof(unsigned) * (size_t)(SPACE1_DIM1 * SPACE1_DIM2 * SPACE1_DIM3)); - - /* Create dataspace for dataset */ - sid = H5Screate(H5S_SCALAR); - CHECK(sid, FAIL, "H5Screate"); - - /* Create "big" dataspace for "large" attributes */ - big_sid = H5Screate_simple(SPACE1_RANK, big_dims, NULL); - CHECK(big_sid, FAIL, "H5Screate_simple"); - - /* Loop over type of shared components */ - for (test_shared = 0; test_shared < 3; test_shared++) { - /* Make copy of file creation property list */ - my_fcpl = H5Pcopy(fcpl); - CHECK(my_fcpl, FAIL, "H5Pcopy"); - - /* Set up datatype for attributes */ - attr_tid = H5Tcopy(H5T_NATIVE_UINT); - CHECK(attr_tid, FAIL, "H5Tcopy"); - - /* Special setup for each type of shared components */ - if (test_shared == 0) { - /* Make attributes > 500 bytes shared */ - ret = H5Pset_shared_mesg_nindexes(my_fcpl, (unsigned)1); - CHECK_I(ret, "H5Pset_shared_mesg_nindexes"); - ret = H5Pset_shared_mesg_index(my_fcpl, (unsigned)0, H5O_SHMESG_ATTR_FLAG, (unsigned)500); - CHECK_I(ret, "H5Pset_shared_mesg_index"); - } /* end if */ - else { - /* Set up copy of file creation property list */ - - ret = H5Pset_shared_mesg_nindexes(my_fcpl, (unsigned)3); - CHECK_I(ret, "H5Pset_shared_mesg_nindexes"); - - /* Make attributes > 500 bytes shared */ - ret = H5Pset_shared_mesg_index(my_fcpl, (unsigned)0, H5O_SHMESG_ATTR_FLAG, (unsigned)500); - CHECK_I(ret, "H5Pset_shared_mesg_index"); - - /* Make datatypes & dataspaces > 1 byte shared (i.e. all of them :-) */ - ret = H5Pset_shared_mesg_index(my_fcpl, (unsigned)1, H5O_SHMESG_DTYPE_FLAG, (unsigned)1); - CHECK_I(ret, "H5Pset_shared_mesg_index"); - ret = H5Pset_shared_mesg_index(my_fcpl, (unsigned)2, H5O_SHMESG_SDSPACE_FLAG, (unsigned)1); - CHECK_I(ret, "H5Pset_shared_mesg_index"); - } /* end else */ - - /* Create file */ - fid = H5Fcreate(FILENAME, H5F_ACC_TRUNC, my_fcpl, fapl); - CHECK(fid, FAIL, "H5Fcreate"); - - /* Close FCPL copy */ - ret = H5Pclose(my_fcpl); - CHECK(ret, FAIL, "H5Pclose"); - - /* Close file */ - ret = H5Fclose(fid); - CHECK(ret, FAIL, "H5Fclose"); -#if 0 - /* Get size of file */ - empty_filesize = h5_get_file_size(FILENAME, fapl); - if (empty_filesize < 0) - TestErrPrintf("Line %d: file size wrong!\n", __LINE__); -#endif - - /* Re-open file */ - fid = H5Fopen(FILENAME, H5F_ACC_RDWR, fapl); - CHECK(fid, FAIL, "H5Fopen"); - - /* Commit datatype to file */ - if (test_shared == 2) { - ret = H5Tcommit2(fid, TYPE1_NAME, attr_tid, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT); - CHECK(ret, FAIL, "H5Tcommit2"); - } /* end if */ - - /* Set up to query the object creation properties */ - if (dcpl_g == H5P_DEFAULT) { - dcpl = H5Pcreate(H5P_DATASET_CREATE); - CHECK(dcpl, FAIL, "H5Pcreate"); - } - else { - dcpl = H5Pcopy(dcpl_g); - CHECK(dcpl, FAIL, "H5Pcopy"); - } - - /* Create datasets */ - dataset = H5Dcreate2(fid, DSET1_NAME, H5T_NATIVE_UCHAR, sid, H5P_DEFAULT, dcpl, H5P_DEFAULT); - CHECK(dataset, FAIL, "H5Dcreate2"); - dataset2 = H5Dcreate2(fid, DSET2_NAME, H5T_NATIVE_UCHAR, sid, H5P_DEFAULT, dcpl, H5P_DEFAULT); - CHECK(dataset2, FAIL, "H5Dcreate2"); - - /* Check on dataset's message storage status */ - if (test_shared != 0) { -#if 0 - /* Datasets' datatypes can be shared */ - ret = H5F__get_sohm_mesg_count_test(fid, H5O_DTYPE_ID, &mesg_count); - CHECK(ret, FAIL, "H5F__get_sohm_mesg_count_test"); - VERIFY(mesg_count, 1, "H5F__get_sohm_mesg_count_test"); - - /* Datasets' dataspace can be shared */ - ret = H5F__get_sohm_mesg_count_test(fid, H5O_SDSPACE_ID, &mesg_count); - CHECK(ret, FAIL, "H5F__get_sohm_mesg_count_test"); - VERIFY(mesg_count, 1, "H5F__get_sohm_mesg_count_test"); -#endif - } /* end if */ - - /* Retrieve limits for compact/dense attribute storage */ - ret = H5Pget_attr_phase_change(dcpl, &max_compact, &min_dense); - CHECK(ret, FAIL, "H5Pget_attr_phase_change"); - - /* Close property list */ - ret = H5Pclose(dcpl); - CHECK(ret, FAIL, "H5Pclose"); -#if 0 - /* Check on datasets' attribute storage status */ - is_dense = H5O__is_attr_dense_test(dataset); - VERIFY(is_dense, false, "H5O__is_attr_dense_test"); - is_dense = H5O__is_attr_dense_test(dataset2); - VERIFY(is_dense, false, "H5O__is_attr_dense_test"); -#endif - /* Add attributes to each dataset, until after converting to dense storage */ - for (u = 0; u < max_compact * 2; u++) { - /* Create attribute name */ - snprintf(attrname, sizeof(attrname), "attr %02u", u); - - /* Alternate between creating "small" & "big" attributes */ - if (u % 2) { - /* Create "small" attribute on first dataset */ - attr = H5Acreate2(dataset, attrname, attr_tid, sid, H5P_DEFAULT, H5P_DEFAULT); - CHECK(attr, FAIL, "H5Acreate2"); -#if 0 - /* Check that attribute is not shared */ - is_shared = H5A__is_shared_test(attr); - VERIFY(is_shared, false, "H5A__is_shared_test"); -#endif - /* Write data into the attribute */ - attr_value = u + 1; - ret = H5Awrite(attr, attr_tid, &attr_value); - CHECK(ret, FAIL, "H5Awrite"); - } /* end if */ - else { - /* Create "big" attribute on first dataset */ - attr = H5Acreate2(dataset, attrname, attr_tid, big_sid, H5P_DEFAULT, H5P_DEFAULT); - CHECK(attr, FAIL, "H5Acreate2"); -#if 0 - /* Check that attribute is shared */ - is_shared = H5A__is_shared_test(attr); - VERIFY(is_shared, true, "H5A__is_shared_test"); - - /* Check refcount for attribute */ - ret = H5A__get_shared_rc_test(attr, &shared_refcount); - CHECK(ret, FAIL, "H5A__get_shared_rc_test"); - VERIFY(shared_refcount, 1, "H5A__get_shared_rc_test"); -#endif - /* Write data into the attribute */ - big_value[0] = u + 1; - ret = H5Awrite(attr, attr_tid, big_value); - CHECK(ret, FAIL, "H5Awrite"); -#if 0 - /* Check refcount for attribute */ - ret = H5A__get_shared_rc_test(attr, &shared_refcount); - CHECK(ret, FAIL, "H5A__get_shared_rc_test"); - VERIFY(shared_refcount, 1, "H5A__get_shared_rc_test"); -#endif - } /* end else */ - - /* Close attribute */ - ret = H5Aclose(attr); - CHECK(ret, FAIL, "H5Aclose"); -#if 0 - /* Check on dataset's attribute storage status */ - is_dense = H5O__is_attr_dense_test(dataset); - if (u < max_compact) - VERIFY(is_dense, false, "H5O__is_attr_dense_test"); - else - VERIFY(is_dense, true, "H5O__is_attr_dense_test"); -#endif - - /* Alternate between creating "small" & "big" attributes */ - if (u % 2) { - /* Create "small" attribute on second dataset */ - attr = H5Acreate2(dataset2, attrname, attr_tid, sid, H5P_DEFAULT, H5P_DEFAULT); - CHECK(attr, FAIL, "H5Acreate2"); -#if 0 - /* Check that attribute is not shared */ - is_shared = H5A__is_shared_test(attr); - VERIFY(is_shared, false, "H5A__is_shared_test"); -#endif - /* Write data into the attribute */ - attr_value = u + 1; - ret = H5Awrite(attr, attr_tid, &attr_value); - CHECK(ret, FAIL, "H5Awrite"); - } /* end if */ - else { - /* Create "big" attribute on second dataset */ - attr = H5Acreate2(dataset2, attrname, attr_tid, big_sid, H5P_DEFAULT, H5P_DEFAULT); - CHECK(attr, FAIL, "H5Acreate2"); -#if 0 - /* Check that attribute is shared */ - is_shared = H5A__is_shared_test(attr); - VERIFY(is_shared, true, "H5A__is_shared_test"); - - /* Check refcount for attribute */ - ret = H5A__get_shared_rc_test(attr, &shared_refcount); - CHECK(ret, FAIL, "H5A__get_shared_rc_test"); - VERIFY(shared_refcount, 1, "H5A__get_shared_rc_test"); -#endif - /* Write data into the attribute */ - big_value[0] = u + 1; - ret = H5Awrite(attr, attr_tid, big_value); - CHECK(ret, FAIL, "H5Awrite"); -#if 0 - /* Check refcount for attribute */ - ret = H5A__get_shared_rc_test(attr, &shared_refcount); - CHECK(ret, FAIL, "H5A__get_shared_rc_test"); - VERIFY(shared_refcount, 2, "H5A__get_shared_rc_test"); -#endif - } /* end else */ - - /* Close attribute */ - ret = H5Aclose(attr); - CHECK(ret, FAIL, "H5Aclose"); -#if 0 - /* Check on dataset's attribute storage status */ - is_dense = H5O__is_attr_dense_test(dataset2); - if (u < max_compact) - VERIFY(is_dense, false, "H5O__is_attr_dense_test"); - else - VERIFY(is_dense, true, "H5O__is_attr_dense_test"); -#endif - } /* end for */ - - /* Close attribute's datatype */ - ret = H5Tclose(attr_tid); - CHECK(ret, FAIL, "H5Tclose"); - - /* Close Datasets */ - ret = H5Dclose(dataset); - CHECK(ret, FAIL, "H5Dclose"); - ret = H5Dclose(dataset2); - CHECK(ret, FAIL, "H5Dclose"); -#if 0 - /* Check on shared message status now */ - if (test_shared != 0) { - if (test_shared == 1) { - /* Check on datatype storage status */ - ret = H5F__get_sohm_mesg_count_test(fid, H5O_DTYPE_ID, &mesg_count); - CHECK(ret, FAIL, "H5F__get_sohm_mesg_count_test"); - VERIFY(mesg_count, 2, "H5F__get_sohm_mesg_count_test"); - } /* end if */ - - /* Check on dataspace storage status */ - ret = H5F__get_sohm_mesg_count_test(fid, H5O_SDSPACE_ID, &mesg_count); - CHECK(ret, FAIL, "H5F__get_sohm_mesg_count_test"); - VERIFY(mesg_count, 2, "H5F__get_sohm_mesg_count_test"); - } /* end if */ -#endif - /* Unlink datasets with attributes */ - ret = H5Ldelete(fid, DSET1_NAME, H5P_DEFAULT); - CHECK(ret, FAIL, "H5Ldelete"); - ret = H5Ldelete(fid, DSET2_NAME, H5P_DEFAULT); - CHECK(ret, FAIL, "H5Ldelete"); - - /* Unlink committed datatype */ - if (test_shared == 2) { - ret = H5Ldelete(fid, TYPE1_NAME, H5P_DEFAULT); - CHECK(ret, FAIL, "H5Ldelete"); - } /* end if */ -#if 0 - /* Check on attribute storage status */ - ret = H5F__get_sohm_mesg_count_test(fid, H5O_ATTR_ID, &mesg_count); - CHECK(ret, FAIL, "H5F__get_sohm_mesg_count_test"); - VERIFY(mesg_count, 0, "H5F__get_sohm_mesg_count_test"); - - if (test_shared != 0) { - /* Check on datatype storage status */ - ret = H5F__get_sohm_mesg_count_test(fid, H5O_DTYPE_ID, &mesg_count); - CHECK(ret, FAIL, "H5F__get_sohm_mesg_count_test"); - VERIFY(mesg_count, 0, "H5F__get_sohm_mesg_count_test"); - - /* Check on dataspace storage status */ - ret = H5F__get_sohm_mesg_count_test(fid, H5O_SDSPACE_ID, &mesg_count); - CHECK(ret, FAIL, "H5F__get_sohm_mesg_count_test"); - VERIFY(mesg_count, 0, "H5F__get_sohm_mesg_count_test"); - } /* end if */ -#endif - /* Close file */ - ret = H5Fclose(fid); - CHECK(ret, FAIL, "H5Fclose"); -#if 0 - if (h5_using_default_driver(NULL)) { - /* Check size of file */ - filesize = h5_get_file_size(FILENAME, fapl); - VERIFY(filesize, empty_filesize, "h5_get_file_size"); - } -#endif - } /* end for */ - - /* Close dataspaces */ - ret = H5Sclose(sid); - CHECK(ret, FAIL, "H5Sclose"); - ret = H5Sclose(big_sid); - CHECK(ret, FAIL, "H5Sclose"); - - /* Release memory */ - free(big_value); -} /* test_attr_shared_write() */ - -/**************************************************************** -** -** test_attr_shared_rename(): Test basic H5A (attribute) code. -** Tests renaming shared attributes in "compact" & "dense" storage -** -****************************************************************/ -static void -test_attr_shared_rename(hid_t fcpl, hid_t fapl) -{ - hid_t fid; /* HDF5 File ID */ - hid_t my_fcpl; /* File creation property list ID */ - hid_t dataset, dataset2; /* Dataset ID2 */ - hid_t attr_tid; /* Attribute's datatype ID */ - hid_t sid, big_sid; /* Dataspace IDs */ - hsize_t big_dims[] = {SPACE1_DIM1, SPACE1_DIM2, SPACE1_DIM3}; /* Dimensions for "big" attribute */ - hid_t attr; /* Attribute ID */ - hid_t dcpl; /* Dataset creation property list ID */ - char attrname[NAME_BUF_SIZE]; /* Name of attribute on first dataset */ - char attrname2[NAME_BUF_SIZE]; /* Name of attribute on second dataset */ - unsigned max_compact; /* Maximum # of attributes to store compactly */ - unsigned min_dense; /* Minimum # of attributes to store "densely" */ -#if 0 - htri_t is_dense; /* Are attributes stored densely? */ - htri_t is_shared; /* Is attributes shared? */ - hsize_t shared_refcount; /* Reference count of shared attribute */ -#endif - unsigned attr_value; /* Attribute value */ - unsigned *big_value; /* Data for "big" attribute */ -#if 0 - size_t mesg_count; /* # of shared messages */ -#endif - unsigned test_shared; /* Index over shared component type */ - unsigned u; /* Local index variable */ -#if 0 - h5_stat_size_t empty_filesize; /* Size of empty file */ - h5_stat_size_t filesize; /* Size of file after modifications */ -#endif - herr_t ret; /* Generic return value */ - - /* Output message about test being performed */ - MESSAGE(5, ("Testing Renaming Shared & Unshared Attributes in Compact & Dense Storage\n")); - - /* Allocate & initialize "big" attribute data */ - big_value = (unsigned *)malloc((size_t)(SPACE1_DIM1 * SPACE1_DIM2 * SPACE1_DIM3) * sizeof(unsigned)); - CHECK_PTR(big_value, "malloc"); - memset(big_value, 1, sizeof(unsigned) * (size_t)(SPACE1_DIM1 * SPACE1_DIM2 * SPACE1_DIM3)); - - /* Create dataspace for dataset */ - sid = H5Screate(H5S_SCALAR); - CHECK(sid, FAIL, "H5Screate"); - - /* Create "big" dataspace for "large" attributes */ - big_sid = H5Screate_simple(SPACE1_RANK, big_dims, NULL); - CHECK(big_sid, FAIL, "H5Screate_simple"); - - /* Loop over type of shared components */ - for (test_shared = 0; test_shared < 3; test_shared++) { - /* Make copy of file creation property list */ - my_fcpl = H5Pcopy(fcpl); - CHECK(my_fcpl, FAIL, "H5Pcopy"); - - /* Set up datatype for attributes */ - attr_tid = H5Tcopy(H5T_NATIVE_UINT); - CHECK(attr_tid, FAIL, "H5Tcopy"); - - /* Special setup for each type of shared components */ - if (test_shared == 0) { - /* Make attributes > 500 bytes shared */ - ret = H5Pset_shared_mesg_nindexes(my_fcpl, (unsigned)1); - CHECK_I(ret, "H5Pset_shared_mesg_nindexes"); - ret = H5Pset_shared_mesg_index(my_fcpl, (unsigned)0, H5O_SHMESG_ATTR_FLAG, (unsigned)500); - CHECK_I(ret, "H5Pset_shared_mesg_index"); - } /* end if */ - else { - /* Set up copy of file creation property list */ - - ret = H5Pset_shared_mesg_nindexes(my_fcpl, (unsigned)3); - CHECK_I(ret, "H5Pset_shared_mesg_nindexes"); - - /* Make attributes > 500 bytes shared */ - ret = H5Pset_shared_mesg_index(my_fcpl, (unsigned)0, H5O_SHMESG_ATTR_FLAG, (unsigned)500); - CHECK_I(ret, "H5Pset_shared_mesg_index"); - - /* Make datatypes & dataspaces > 1 byte shared (i.e. all of them :-) */ - ret = H5Pset_shared_mesg_index(my_fcpl, (unsigned)1, H5O_SHMESG_DTYPE_FLAG, (unsigned)1); - CHECK_I(ret, "H5Pset_shared_mesg_index"); - ret = H5Pset_shared_mesg_index(my_fcpl, (unsigned)2, H5O_SHMESG_SDSPACE_FLAG, (unsigned)1); - CHECK_I(ret, "H5Pset_shared_mesg_index"); - } /* end else */ - - /* Create file */ - fid = H5Fcreate(FILENAME, H5F_ACC_TRUNC, my_fcpl, fapl); - CHECK(fid, FAIL, "H5Fcreate"); - - /* Close FCPL copy */ - ret = H5Pclose(my_fcpl); - CHECK(ret, FAIL, "H5Pclose"); - - /* Close file */ - ret = H5Fclose(fid); - CHECK(ret, FAIL, "H5Fclose"); -#if 0 - /* Get size of file */ - empty_filesize = h5_get_file_size(FILENAME, fapl); - if (empty_filesize < 0) - TestErrPrintf("Line %d: file size wrong!\n", __LINE__); -#endif - - /* Re-open file */ - fid = H5Fopen(FILENAME, H5F_ACC_RDWR, fapl); - CHECK(fid, FAIL, "H5Fopen"); - - /* Commit datatype to file */ - if (test_shared == 2) { - ret = H5Tcommit2(fid, TYPE1_NAME, attr_tid, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT); - CHECK(ret, FAIL, "H5Tcommit2"); - } /* end if */ - - /* Set up to query the object creation properties */ - if (dcpl_g == H5P_DEFAULT) { - dcpl = H5Pcreate(H5P_DATASET_CREATE); - CHECK(dcpl, FAIL, "H5Pcreate"); - } - else { - dcpl = H5Pcopy(dcpl_g); - CHECK(dcpl, FAIL, "H5Pcopy"); - } - - /* Create datasets */ - dataset = H5Dcreate2(fid, DSET1_NAME, H5T_NATIVE_UCHAR, sid, H5P_DEFAULT, dcpl, H5P_DEFAULT); - CHECK(dataset, FAIL, "H5Dcreate2"); - dataset2 = H5Dcreate2(fid, DSET2_NAME, H5T_NATIVE_UCHAR, sid, H5P_DEFAULT, dcpl, H5P_DEFAULT); - CHECK(dataset2, FAIL, "H5Dcreate2"); -#if 0 - /* Check on dataset's message storage status */ - if (test_shared != 0) { - /* Datasets' datatypes can be shared */ - ret = H5F__get_sohm_mesg_count_test(fid, H5O_DTYPE_ID, &mesg_count); - CHECK(ret, FAIL, "H5F__get_sohm_mesg_count_test"); - VERIFY(mesg_count, 1, "H5F__get_sohm_mesg_count_test"); - - /* Datasets' dataspace can be shared */ - ret = H5F__get_sohm_mesg_count_test(fid, H5O_SDSPACE_ID, &mesg_count); - CHECK(ret, FAIL, "H5F__get_sohm_mesg_count_test"); - VERIFY(mesg_count, 1, "H5F__get_sohm_mesg_count_test"); - } /* end if */ -#endif - /* Retrieve limits for compact/dense attribute storage */ - ret = H5Pget_attr_phase_change(dcpl, &max_compact, &min_dense); - CHECK(ret, FAIL, "H5Pget_attr_phase_change"); - - /* Close property list */ - ret = H5Pclose(dcpl); - CHECK(ret, FAIL, "H5Pclose"); -#if 0 - /* Check on datasets' attribute storage status */ - is_dense = H5O__is_attr_dense_test(dataset); - VERIFY(is_dense, false, "H5O__is_attr_dense_test"); - is_dense = H5O__is_attr_dense_test(dataset2); - VERIFY(is_dense, false, "H5O__is_attr_dense_test"); -#endif - /* Add attributes to each dataset, until after converting to dense storage */ - for (u = 0; u < max_compact * 2; u++) { - /* Create attribute name */ - snprintf(attrname, sizeof(attrname), "attr %02u", u); - - /* Alternate between creating "small" & "big" attributes */ - if (u % 2) { - /* Create "small" attribute on first dataset */ - attr = H5Acreate2(dataset, attrname, attr_tid, sid, H5P_DEFAULT, H5P_DEFAULT); - CHECK(attr, FAIL, "H5Acreate2"); -#if 0 - /* Check that attribute is not shared */ - is_shared = H5A__is_shared_test(attr); - VERIFY(is_shared, false, "H5A__is_shared_test"); -#endif - /* Write data into the attribute */ - attr_value = u + 1; - ret = H5Awrite(attr, attr_tid, &attr_value); - CHECK(ret, FAIL, "H5Awrite"); - } /* end if */ - else { - /* Create "big" attribute on first dataset */ - attr = H5Acreate2(dataset, attrname, attr_tid, big_sid, H5P_DEFAULT, H5P_DEFAULT); - CHECK(attr, FAIL, "H5Acreate2"); -#if 0 - /* Check that attribute is shared */ - is_shared = H5A__is_shared_test(attr); - VERIFY(is_shared, true, "H5A__is_shared_test"); - - /* Check refcount for attribute */ - ret = H5A__get_shared_rc_test(attr, &shared_refcount); - CHECK(ret, FAIL, "H5A__get_shared_rc_test"); - VERIFY(shared_refcount, 1, "H5A__get_shared_rc_test"); -#endif - /* Write data into the attribute */ - big_value[0] = u + 1; - ret = H5Awrite(attr, attr_tid, big_value); - CHECK(ret, FAIL, "H5Awrite"); -#if 0 - /* Check refcount for attribute */ - ret = H5A__get_shared_rc_test(attr, &shared_refcount); - CHECK(ret, FAIL, "H5A__get_shared_rc_test"); - VERIFY(shared_refcount, 1, "H5A__get_shared_rc_test"); -#endif - } /* end else */ - - /* Close attribute */ - ret = H5Aclose(attr); - CHECK(ret, FAIL, "H5Aclose"); -#if 0 - /* Check on dataset's attribute storage status */ - is_dense = H5O__is_attr_dense_test(dataset); - if (u < max_compact) - VERIFY(is_dense, false, "H5O__is_attr_dense_test"); - else - VERIFY(is_dense, true, "H5O__is_attr_dense_test"); -#endif - - /* Alternate between creating "small" & "big" attributes */ - if (u % 2) { - /* Create "small" attribute on second dataset */ - attr = H5Acreate2(dataset2, attrname, attr_tid, sid, H5P_DEFAULT, H5P_DEFAULT); - CHECK(attr, FAIL, "H5Acreate2"); -#if 0 - /* Check that attribute is not shared */ - is_shared = H5A__is_shared_test(attr); - VERIFY(is_shared, false, "H5A__is_shared_test"); -#endif - /* Write data into the attribute */ - attr_value = u + 1; - ret = H5Awrite(attr, attr_tid, &attr_value); - CHECK(ret, FAIL, "H5Awrite"); - } /* end if */ - else { - /* Create "big" attribute on second dataset */ - attr = H5Acreate2(dataset2, attrname, attr_tid, big_sid, H5P_DEFAULT, H5P_DEFAULT); - CHECK(attr, FAIL, "H5Acreate2"); -#if 0 - /* Check that attribute is shared */ - is_shared = H5A__is_shared_test(attr); - VERIFY(is_shared, true, "H5A__is_shared_test"); - - /* Check refcount for attribute */ - ret = H5A__get_shared_rc_test(attr, &shared_refcount); - CHECK(ret, FAIL, "H5A__get_shared_rc_test"); - VERIFY(shared_refcount, 1, "H5A__get_shared_rc_test"); -#endif - /* Write data into the attribute */ - big_value[0] = u + 1; - ret = H5Awrite(attr, attr_tid, big_value); - CHECK(ret, FAIL, "H5Awrite"); -#if 0 - /* Check refcount for attribute */ - ret = H5A__get_shared_rc_test(attr, &shared_refcount); - CHECK(ret, FAIL, "H5A__get_shared_rc_test"); - VERIFY(shared_refcount, 2, "H5A__get_shared_rc_test"); -#endif - } /* end else */ - - /* Close attribute */ - ret = H5Aclose(attr); - CHECK(ret, FAIL, "H5Aclose"); -#if 0 - /* Check on dataset's attribute storage status */ - is_dense = H5O__is_attr_dense_test(dataset2); - if (u < max_compact) - VERIFY(is_dense, false, "H5O__is_attr_dense_test"); - else - VERIFY(is_dense, true, "H5O__is_attr_dense_test"); -#endif - - /* Create new attribute name */ - snprintf(attrname2, sizeof(attrname2), "new attr %02u", u); - - /* Change second dataset's attribute's name */ - ret = H5Arename_by_name(fid, DSET2_NAME, attrname, attrname2, H5P_DEFAULT); - CHECK(ret, FAIL, "H5Arename_by_name"); - - /* Check refcount on attributes now */ - - /* Check refcount on renamed attribute */ - attr = H5Aopen(dataset2, attrname2, H5P_DEFAULT); - CHECK(attr, FAIL, "H5Aopen"); -#if 0 - if (u % 2) { - /* Check that attribute is not shared */ - is_shared = H5A__is_shared_test(attr); - VERIFY(is_shared, false, "H5A__is_shared_test"); - } /* end if */ - else { - /* Check that attribute is shared */ - is_shared = H5A__is_shared_test(attr); - VERIFY(is_shared, true, "H5A__is_shared_test"); - - /* Check refcount for attribute */ - ret = H5A__get_shared_rc_test(attr, &shared_refcount); - CHECK(ret, FAIL, "H5A__get_shared_rc_test"); - VERIFY(shared_refcount, 1, "H5A__get_shared_rc_test"); - } /* end else */ -#endif - /* Close attribute */ - ret = H5Aclose(attr); - CHECK(ret, FAIL, "H5Aclose"); - - /* Check refcount on original attribute */ - attr = H5Aopen(dataset, attrname, H5P_DEFAULT); - CHECK(attr, FAIL, "H5Aopen"); -#if 0 - if (u % 2) { - /* Check that attribute is not shared */ - is_shared = H5A__is_shared_test(attr); - VERIFY(is_shared, false, "H5A__is_shared_test"); - } /* end if */ - else { - /* Check that attribute is shared */ - is_shared = H5A__is_shared_test(attr); - VERIFY(is_shared, true, "H5A__is_shared_test"); - - /* Check refcount for attribute */ - ret = H5A__get_shared_rc_test(attr, &shared_refcount); - CHECK(ret, FAIL, "H5A__get_shared_rc_test"); - VERIFY(shared_refcount, 1, "H5A__get_shared_rc_test"); - } /* end else */ -#endif - /* Close attribute */ - ret = H5Aclose(attr); - CHECK(ret, FAIL, "H5Aclose"); - - /* Change second dataset's attribute's name back to original */ - ret = H5Arename_by_name(fid, DSET2_NAME, attrname2, attrname, H5P_DEFAULT); - CHECK(ret, FAIL, "H5Arename_by_name"); - - /* Check refcount on attributes now */ - - /* Check refcount on renamed attribute */ - attr = H5Aopen(dataset2, attrname, H5P_DEFAULT); - CHECK(attr, FAIL, "H5Aopen"); -#if 0 - if (u % 2) { - /* Check that attribute is not shared */ - is_shared = H5A__is_shared_test(attr); - VERIFY(is_shared, false, "H5A__is_shared_test"); - } /* end if */ - else { - /* Check that attribute is shared */ - is_shared = H5A__is_shared_test(attr); - VERIFY(is_shared, true, "H5A__is_shared_test"); - - /* Check refcount for attribute */ - ret = H5A__get_shared_rc_test(attr, &shared_refcount); - CHECK(ret, FAIL, "H5A__get_shared_rc_test"); - VERIFY(shared_refcount, 2, "H5A__get_shared_rc_test"); - } /* end else */ -#endif - /* Close attribute */ - ret = H5Aclose(attr); - CHECK(ret, FAIL, "H5Aclose"); - - /* Check refcount on original attribute */ - attr = H5Aopen(dataset, attrname, H5P_DEFAULT); - CHECK(attr, FAIL, "H5Aopen"); -#if 0 - if (u % 2) { - /* Check that attribute is not shared */ - is_shared = H5A__is_shared_test(attr); - VERIFY(is_shared, false, "H5A__is_shared_test"); - } /* end if */ - else { - /* Check that attribute is shared */ - is_shared = H5A__is_shared_test(attr); - VERIFY(is_shared, true, "H5A__is_shared_test"); - - /* Check refcount for attribute */ - ret = H5A__get_shared_rc_test(attr, &shared_refcount); - CHECK(ret, FAIL, "H5A__get_shared_rc_test"); - VERIFY(shared_refcount, 2, "H5A__get_shared_rc_test"); - } /* end else */ -#endif - /* Close attribute */ - ret = H5Aclose(attr); - CHECK(ret, FAIL, "H5Aclose"); - } /* end for */ - - /* Close attribute's datatype */ - ret = H5Tclose(attr_tid); - CHECK(ret, FAIL, "H5Tclose"); - - /* Close Datasets */ - ret = H5Dclose(dataset); - CHECK(ret, FAIL, "H5Dclose"); - ret = H5Dclose(dataset2); - CHECK(ret, FAIL, "H5Dclose"); -#if 0 - /* Check on shared message status now */ - if (test_shared != 0) { - if (test_shared == 1) { - /* Check on datatype storage status */ - ret = H5F__get_sohm_mesg_count_test(fid, H5O_DTYPE_ID, &mesg_count); - CHECK(ret, FAIL, "H5F__get_sohm_mesg_count_test"); - VERIFY(mesg_count, 2, "H5F__get_sohm_mesg_count_test"); - } /* end if */ - - /* Check on dataspace storage status */ - ret = H5F__get_sohm_mesg_count_test(fid, H5O_SDSPACE_ID, &mesg_count); - CHECK(ret, FAIL, "H5F__get_sohm_mesg_count_test"); - VERIFY(mesg_count, 2, "H5F__get_sohm_mesg_count_test"); - } /* end if */ -#endif - /* Unlink datasets with attributes */ - ret = H5Ldelete(fid, DSET1_NAME, H5P_DEFAULT); - CHECK(ret, FAIL, "HLdelete"); - ret = H5Ldelete(fid, DSET2_NAME, H5P_DEFAULT); - CHECK(ret, FAIL, "H5Ldelete"); - - /* Unlink committed datatype */ - if (test_shared == 2) { - ret = H5Ldelete(fid, TYPE1_NAME, H5P_DEFAULT); - CHECK(ret, FAIL, "H5Ldelete"); - } /* end if */ -#if 0 - /* Check on attribute storage status */ - ret = H5F__get_sohm_mesg_count_test(fid, H5O_ATTR_ID, &mesg_count); - CHECK(ret, FAIL, "H5F__get_sohm_mesg_count_test"); - VERIFY(mesg_count, 0, "H5F__get_sohm_mesg_count_test"); - - if (test_shared != 0) { - /* Check on datatype storage status */ - ret = H5F__get_sohm_mesg_count_test(fid, H5O_DTYPE_ID, &mesg_count); - CHECK(ret, FAIL, "H5F__get_sohm_mesg_count_test"); - VERIFY(mesg_count, 0, "H5F__get_sohm_mesg_count_test"); - - /* Check on dataspace storage status */ - ret = H5F__get_sohm_mesg_count_test(fid, H5O_SDSPACE_ID, &mesg_count); - CHECK(ret, FAIL, "H5F__get_sohm_mesg_count_test"); - VERIFY(mesg_count, 0, "H5F__get_sohm_mesg_count_test"); - } /* end if */ -#endif - /* Close file */ - ret = H5Fclose(fid); - CHECK(ret, FAIL, "H5Fclose"); -#if 0 - if (h5_using_default_driver(NULL)) { - /* Check size of file */ - filesize = h5_get_file_size(FILENAME, fapl); - VERIFY(filesize, empty_filesize, "h5_get_file_size"); - } -#endif - } /* end for */ - - /* Close dataspaces */ - ret = H5Sclose(sid); - CHECK(ret, FAIL, "H5Sclose"); - ret = H5Sclose(big_sid); - CHECK(ret, FAIL, "H5Sclose"); - - /* Release memory */ - free(big_value); -} /* test_attr_shared_rename() */ - -/**************************************************************** -** -** test_attr_shared_delete(): Test basic H5A (attribute) code. -** Tests deleting shared attributes in "compact" & "dense" storage -** -****************************************************************/ -static void -test_attr_shared_delete(hid_t fcpl, hid_t fapl) -{ - hid_t fid; /* File ID */ - hid_t my_fcpl; /* File creation property list ID */ - hid_t dataset, dataset2; /* Dataset IDs */ - hid_t attr_tid; /* Attribute's datatype ID */ - hid_t sid, big_sid; /* Dataspace IDs */ - hsize_t big_dims[] = {SPACE1_DIM1, SPACE1_DIM2, SPACE1_DIM3}; /* Dimensions for "big" attribute */ - hid_t attr; /* Attribute ID */ - hid_t dcpl; /* Dataset creation property list ID */ - char attrname[NAME_BUF_SIZE]; /* Name of attribute on first dataset */ - unsigned max_compact; /* Maximum # of attributes to store compactly */ - unsigned min_dense; /* Minimum # of attributes to store "densely" */ -#if 0 - htri_t is_dense; /* Are attributes stored densely? */ - htri_t is_shared; /* Is attributes shared? */ - hsize_t shared_refcount; /* Reference count of shared attribute */ -#endif - unsigned attr_value; /* Attribute value */ - unsigned *big_value; /* Data for "big" attribute */ -#if 0 - size_t mesg_count; /* # of shared messages */ -#endif - unsigned test_shared; /* Index over shared component type */ - unsigned u; /* Local index variable */ -#if 0 - h5_stat_size_t empty_filesize; /* Size of empty file */ - h5_stat_size_t filesize; /* Size of file after modifications */ -#endif - herr_t ret; /* Generic return value */ - - /* Output message about test being performed */ - MESSAGE(5, ("Testing Deleting Shared & Unshared Attributes in Compact & Dense Storage\n")); - - /* Allocate & initialize "big" attribute data */ - big_value = (unsigned *)malloc((size_t)(SPACE1_DIM1 * SPACE1_DIM2 * SPACE1_DIM3) * sizeof(unsigned)); - CHECK_PTR(big_value, "malloc"); - memset(big_value, 1, sizeof(unsigned) * (size_t)(SPACE1_DIM1 * SPACE1_DIM2 * SPACE1_DIM3)); - - /* Create dataspace for dataset */ - sid = H5Screate(H5S_SCALAR); - CHECK(sid, FAIL, "H5Screate"); - - /* Create "big" dataspace for "large" attributes */ - big_sid = H5Screate_simple(SPACE1_RANK, big_dims, NULL); - CHECK(big_sid, FAIL, "H5Screate_simple"); - - /* Loop over type of shared components */ - for (test_shared = 0; test_shared < 3; test_shared++) { - /* Make copy of file creation property list */ - my_fcpl = H5Pcopy(fcpl); - CHECK(my_fcpl, FAIL, "H5Pcopy"); - - /* Set up datatype for attributes */ - attr_tid = H5Tcopy(H5T_NATIVE_UINT); - CHECK(attr_tid, FAIL, "H5Tcopy"); - - /* Special setup for each type of shared components */ - if (test_shared == 0) { - /* Make attributes > 500 bytes shared */ - ret = H5Pset_shared_mesg_nindexes(my_fcpl, (unsigned)1); - CHECK_I(ret, "H5Pset_shared_mesg_nindexes"); - ret = H5Pset_shared_mesg_index(my_fcpl, (unsigned)0, H5O_SHMESG_ATTR_FLAG, (unsigned)500); - CHECK_I(ret, "H5Pset_shared_mesg_index"); - } /* end if */ - else { - /* Set up copy of file creation property list */ - - ret = H5Pset_shared_mesg_nindexes(my_fcpl, (unsigned)3); - CHECK_I(ret, "H5Pset_shared_mesg_nindexes"); - - /* Make attributes > 500 bytes shared */ - ret = H5Pset_shared_mesg_index(my_fcpl, (unsigned)0, H5O_SHMESG_ATTR_FLAG, (unsigned)500); - CHECK_I(ret, "H5Pset_shared_mesg_index"); - - /* Make datatypes & dataspaces > 1 byte shared (i.e. all of them :-) */ - ret = H5Pset_shared_mesg_index(my_fcpl, (unsigned)1, H5O_SHMESG_DTYPE_FLAG, (unsigned)1); - CHECK_I(ret, "H5Pset_shared_mesg_index"); - ret = H5Pset_shared_mesg_index(my_fcpl, (unsigned)2, H5O_SHMESG_SDSPACE_FLAG, (unsigned)1); - CHECK_I(ret, "H5Pset_shared_mesg_index"); - } /* end else */ - - /* Create file */ - fid = H5Fcreate(FILENAME, H5F_ACC_TRUNC, my_fcpl, fapl); - CHECK(fid, FAIL, "H5Fcreate"); - - /* Close FCPL copy */ - ret = H5Pclose(my_fcpl); - CHECK(ret, FAIL, "H5Pclose"); - - /* Close file */ - ret = H5Fclose(fid); - CHECK(ret, FAIL, "H5Fclose"); -#if 0 - /* Get size of file */ - empty_filesize = h5_get_file_size(FILENAME, fapl); - if (empty_filesize < 0) - TestErrPrintf("Line %d: file size wrong!\n", __LINE__); -#endif - - /* Re-open file */ - fid = H5Fopen(FILENAME, H5F_ACC_RDWR, fapl); - CHECK(fid, FAIL, "H5Fopen"); - - /* Commit datatype to file */ - if (test_shared == 2) { - ret = H5Tcommit2(fid, TYPE1_NAME, attr_tid, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT); - CHECK(ret, FAIL, "H5Tcommit2"); - } /* end if */ - - /* Set up to query the object creation properties */ - if (dcpl_g == H5P_DEFAULT) { - dcpl = H5Pcreate(H5P_DATASET_CREATE); - CHECK(dcpl, FAIL, "H5Pcreate"); - } - else { - dcpl = H5Pcopy(dcpl_g); - CHECK(dcpl, FAIL, "H5Pcopy"); - } - - /* Create datasets */ - dataset = H5Dcreate2(fid, DSET1_NAME, H5T_NATIVE_UCHAR, sid, H5P_DEFAULT, dcpl, H5P_DEFAULT); - CHECK(dataset, FAIL, "H5Dcreate2"); - dataset2 = H5Dcreate2(fid, DSET2_NAME, H5T_NATIVE_UCHAR, sid, H5P_DEFAULT, dcpl, H5P_DEFAULT); - CHECK(dataset2, FAIL, "H5Dcreate2"); -#if 0 - /* Check on dataset's message storage status */ - if (test_shared != 0) { - /* Datasets' datatypes can be shared */ - ret = H5F__get_sohm_mesg_count_test(fid, H5O_DTYPE_ID, &mesg_count); - CHECK(ret, FAIL, "H5F__get_sohm_mesg_count_test"); - VERIFY(mesg_count, 1, "H5F__get_sohm_mesg_count_test"); - - /* Datasets' dataspace can be shared */ - ret = H5F__get_sohm_mesg_count_test(fid, H5O_SDSPACE_ID, &mesg_count); - CHECK(ret, FAIL, "H5F__get_sohm_mesg_count_test"); - VERIFY(mesg_count, 1, "H5F__get_sohm_mesg_count_test"); - } /* end if */ -#endif - /* Retrieve limits for compact/dense attribute storage */ - ret = H5Pget_attr_phase_change(dcpl, &max_compact, &min_dense); - CHECK(ret, FAIL, "H5Pget_attr_phase_change"); - - /* Close property list */ - ret = H5Pclose(dcpl); - CHECK(ret, FAIL, "H5Pclose"); -#if 0 - /* Check on datasets' attribute storage status */ - is_dense = H5O__is_attr_dense_test(dataset); - VERIFY(is_dense, false, "H5O__is_attr_dense_test"); - is_dense = H5O__is_attr_dense_test(dataset2); - VERIFY(is_dense, false, "H5O__is_attr_dense_test"); -#endif - /* Add attributes to each dataset, until after converting to dense storage */ - for (u = 0; u < max_compact * 2; u++) { - /* Create attribute name */ - snprintf(attrname, sizeof(attrname), "attr %02u", u); - - /* Alternate between creating "small" & "big" attributes */ - if (u % 2) { - /* Create "small" attribute on first dataset */ - attr = H5Acreate2(dataset, attrname, attr_tid, sid, H5P_DEFAULT, H5P_DEFAULT); - CHECK(attr, FAIL, "H5Acreate2"); -#if 0 - /* Check that attribute is not shared */ - is_shared = H5A__is_shared_test(attr); - VERIFY(is_shared, false, "H5A__is_shared_test"); -#endif - /* Write data into the attribute */ - attr_value = u + 1; - ret = H5Awrite(attr, attr_tid, &attr_value); - CHECK(ret, FAIL, "H5Awrite"); - } /* end if */ - else { - /* Create "big" attribute on first dataset */ - attr = H5Acreate2(dataset, attrname, attr_tid, big_sid, H5P_DEFAULT, H5P_DEFAULT); - CHECK(attr, FAIL, "H5Acreate2"); -#if 0 - /* Check that attribute is shared */ - is_shared = H5A__is_shared_test(attr); - VERIFY(is_shared, true, "H5A__is_shared_test"); - - /* Check refcount for attribute */ - ret = H5A__get_shared_rc_test(attr, &shared_refcount); - CHECK(ret, FAIL, "H5A__get_shared_rc_test"); - VERIFY(shared_refcount, 1, "H5A__get_shared_rc_test"); -#endif - /* Write data into the attribute */ - big_value[0] = u + 1; - ret = H5Awrite(attr, attr_tid, big_value); - CHECK(ret, FAIL, "H5Awrite"); -#if 0 - /* Check refcount for attribute */ - ret = H5A__get_shared_rc_test(attr, &shared_refcount); - CHECK(ret, FAIL, "H5A__get_shared_rc_test"); - VERIFY(shared_refcount, 1, "H5A__get_shared_rc_test"); -#endif - } /* end else */ - - /* Close attribute */ - ret = H5Aclose(attr); - CHECK(ret, FAIL, "H5Aclose"); -#if 0 - /* Check on dataset's attribute storage status */ - is_dense = H5O__is_attr_dense_test(dataset); - if (u < max_compact) - VERIFY(is_dense, false, "H5O__is_attr_dense_test"); - else - VERIFY(is_dense, true, "H5O__is_attr_dense_test"); -#endif - - /* Alternate between creating "small" & "big" attributes */ - if (u % 2) { - /* Create "small" attribute on second dataset */ - attr = H5Acreate2(dataset2, attrname, attr_tid, sid, H5P_DEFAULT, H5P_DEFAULT); - CHECK(attr, FAIL, "H5Acreate2"); -#if 0 - /* Check that attribute is not shared */ - is_shared = H5A__is_shared_test(attr); - VERIFY(is_shared, false, "H5A__is_shared_test"); -#endif - /* Write data into the attribute */ - attr_value = u + 1; - ret = H5Awrite(attr, attr_tid, &attr_value); - CHECK(ret, FAIL, "H5Awrite"); - } /* end if */ - else { - /* Create "big" attribute on second dataset */ - attr = H5Acreate2(dataset2, attrname, attr_tid, big_sid, H5P_DEFAULT, H5P_DEFAULT); - CHECK(attr, FAIL, "H5Acreate2"); -#if 0 - /* Check that attribute is shared */ - is_shared = H5A__is_shared_test(attr); - VERIFY(is_shared, true, "H5A__is_shared_test"); - - /* Check refcount for attribute */ - ret = H5A__get_shared_rc_test(attr, &shared_refcount); - CHECK(ret, FAIL, "H5A__get_shared_rc_test"); - VERIFY(shared_refcount, 1, "H5A__get_shared_rc_test"); -#endif - /* Write data into the attribute */ - big_value[0] = u + 1; - ret = H5Awrite(attr, attr_tid, big_value); - CHECK(ret, FAIL, "H5Awrite"); -#if 0 - /* Check refcount for attribute */ - ret = H5A__get_shared_rc_test(attr, &shared_refcount); - CHECK(ret, FAIL, "H5A__get_shared_rc_test"); - VERIFY(shared_refcount, 2, "H5A__get_shared_rc_test"); -#endif - } /* end else */ - - /* Close attribute */ - ret = H5Aclose(attr); - CHECK(ret, FAIL, "H5Aclose"); -#if 0 - /* Check on dataset's attribute storage status */ - is_dense = H5O__is_attr_dense_test(dataset2); - if (u < max_compact) - VERIFY(is_dense, false, "H5O__is_attr_dense_test"); - else - VERIFY(is_dense, true, "H5O__is_attr_dense_test"); -#endif - } /* end for */ - - /* Delete attributes from second dataset */ - for (u = 0; u < max_compact * 2; u++) { - /* Create attribute name */ - snprintf(attrname, sizeof(attrname), "attr %02u", u); - - /* Delete second dataset's attribute */ - ret = H5Adelete_by_name(fid, DSET2_NAME, attrname, H5P_DEFAULT); - CHECK(ret, FAIL, "H5Adelete_by_name"); - - /* Check refcount on attributes now */ - - /* Check refcount on first dataset's attribute */ - attr = H5Aopen(dataset, attrname, H5P_DEFAULT); - CHECK(attr, FAIL, "H5Aopen"); -#if 0 - if (u % 2) { - /* Check that attribute is not shared */ - is_shared = H5A__is_shared_test(attr); - VERIFY(is_shared, false, "H5A__is_shared_test"); - } /* end if */ - else { - /* Check that attribute is shared */ - is_shared = H5A__is_shared_test(attr); - VERIFY(is_shared, true, "H5A__is_shared_test"); - - /* Check refcount for attribute */ - ret = H5A__get_shared_rc_test(attr, &shared_refcount); - CHECK(ret, FAIL, "H5A__get_shared_rc_test"); - VERIFY(shared_refcount, 1, "H5A__get_shared_rc_test"); - } /* end else */ -#endif - /* Close attribute */ - ret = H5Aclose(attr); - CHECK(ret, FAIL, "H5Aclose"); - } /* end for */ - - /* Close attribute's datatype */ - ret = H5Tclose(attr_tid); - CHECK(ret, FAIL, "H5Tclose"); - - /* Close Datasets */ - ret = H5Dclose(dataset); - CHECK(ret, FAIL, "H5Dclose"); - ret = H5Dclose(dataset2); - CHECK(ret, FAIL, "H5Dclose"); -#if 0 - /* Check on shared message status now */ - if (test_shared != 0) { - if (test_shared == 1) { - /* Check on datatype storage status */ - ret = H5F__get_sohm_mesg_count_test(fid, H5O_DTYPE_ID, &mesg_count); - CHECK(ret, FAIL, "H5F__get_sohm_mesg_count_test"); - VERIFY(mesg_count, 2, "H5F__get_sohm_mesg_count_test"); - } /* end if */ - - /* Check on dataspace storage status */ - ret = H5F__get_sohm_mesg_count_test(fid, H5O_SDSPACE_ID, &mesg_count); - CHECK(ret, FAIL, "H5F__get_sohm_mesg_count_test"); - VERIFY(mesg_count, 2, "H5F__get_sohm_mesg_count_test"); - } /* end if */ -#endif - /* Unlink datasets with attributes */ - ret = H5Ldelete(fid, DSET1_NAME, H5P_DEFAULT); - CHECK(ret, FAIL, "H5Ldelete"); - ret = H5Ldelete(fid, DSET2_NAME, H5P_DEFAULT); - CHECK(ret, FAIL, "H5Ldelete"); - - /* Unlink committed datatype */ - if (test_shared == 2) { - ret = H5Ldelete(fid, TYPE1_NAME, H5P_DEFAULT); - CHECK(ret, FAIL, "H5Ldelete"); - } /* end if */ -#if 0 - /* Check on attribute storage status */ - ret = H5F__get_sohm_mesg_count_test(fid, H5O_ATTR_ID, &mesg_count); - CHECK(ret, FAIL, "H5F__get_sohm_mesg_count_test"); - VERIFY(mesg_count, 0, "H5F__get_sohm_mesg_count_test"); - - if (test_shared != 0) { - /* Check on datatype storage status */ - ret = H5F__get_sohm_mesg_count_test(fid, H5O_DTYPE_ID, &mesg_count); - CHECK(ret, FAIL, "H5F__get_sohm_mesg_count_test"); - VERIFY(mesg_count, 0, "H5F__get_sohm_mesg_count_test"); - - /* Check on dataspace storage status */ - ret = H5F__get_sohm_mesg_count_test(fid, H5O_SDSPACE_ID, &mesg_count); - CHECK(ret, FAIL, "H5F__get_sohm_mesg_count_test"); - VERIFY(mesg_count, 0, "H5F__get_sohm_mesg_count_test"); - } /* end if */ -#endif - /* Close file */ - ret = H5Fclose(fid); - CHECK(ret, FAIL, "H5Fclose"); -#if 0 - if (h5_using_default_driver(NULL)) { - /* Check size of file */ - filesize = h5_get_file_size(FILENAME, fapl); - VERIFY(filesize, empty_filesize, "h5_get_file_size"); - } -#endif - } /* end for */ - - /* Close dataspaces */ - ret = H5Sclose(sid); - CHECK(ret, FAIL, "H5Sclose"); - ret = H5Sclose(big_sid); - CHECK(ret, FAIL, "H5Sclose"); - - /* Release memory */ - free(big_value); -} /* test_attr_shared_delete() */ - -/**************************************************************** -** -** test_attr_shared_unlink(): Test basic H5A (attribute) code. -** Tests unlinking object with shared attributes in "compact" & "dense" storage -** -****************************************************************/ -static void -test_attr_shared_unlink(hid_t fcpl, hid_t fapl) -{ - hid_t fid; /* File ID */ - hid_t my_fcpl; /* File creation property list ID */ - hid_t dataset, dataset2; /* Dataset IDs */ - hid_t attr_tid; /* Attribute's datatype ID */ - hid_t sid, big_sid; /* Dataspace IDs */ - hsize_t big_dims[] = {SPACE1_DIM1, SPACE1_DIM2, SPACE1_DIM3}; /* Dimensions for "big" attribute */ - hid_t attr; /* Attribute ID */ - hid_t dcpl; /* Dataset creation property list ID */ - char attrname[NAME_BUF_SIZE]; /* Name of attribute on first dataset */ - unsigned max_compact; /* Maximum # of attributes to store compactly */ - unsigned min_dense; /* Minimum # of attributes to store "densely" */ -#if 0 - htri_t is_dense; /* Are attributes stored densely? */ - htri_t is_shared; /* Is attributes shared? */ - hsize_t shared_refcount; /* Reference count of shared attribute */ -#endif - unsigned attr_value; /* Attribute value */ - unsigned *big_value; /* Data for "big" attribute */ -#if 0 - size_t mesg_count; /* # of shared messages */ -#endif - unsigned test_shared; /* Index over shared component type */ - unsigned u; /* Local index variable */ -#if 0 - h5_stat_size_t empty_filesize; /* Size of empty file */ - h5_stat_size_t filesize; /* Size of file after modifications */ -#endif - herr_t ret; /* Generic return value */ - - /* Output message about test being performed */ - MESSAGE(5, ("Testing Unlinking Object with Shared Attributes in Compact & Dense Storage\n")); - - /* Allocate & initialize "big" attribute data */ - big_value = (unsigned *)malloc((size_t)(SPACE1_DIM1 * SPACE1_DIM2 * SPACE1_DIM3) * sizeof(unsigned)); - CHECK_PTR(big_value, "malloc"); - memset(big_value, 1, sizeof(unsigned) * (size_t)(SPACE1_DIM1 * SPACE1_DIM2 * SPACE1_DIM3)); - - /* Create dataspace for dataset */ - sid = H5Screate(H5S_SCALAR); - CHECK(sid, FAIL, "H5Screate"); - - /* Create "big" dataspace for "large" attributes */ - big_sid = H5Screate_simple(SPACE1_RANK, big_dims, NULL); - CHECK(big_sid, FAIL, "H5Screate_simple"); - - /* Loop over type of shared components */ - for (test_shared = 0; test_shared < 3; test_shared++) { - /* Make copy of file creation property list */ - my_fcpl = H5Pcopy(fcpl); - CHECK(my_fcpl, FAIL, "H5Pcopy"); - - /* Set up datatype for attributes */ - attr_tid = H5Tcopy(H5T_NATIVE_UINT); - CHECK(attr_tid, FAIL, "H5Tcopy"); - - /* Special setup for each type of shared components */ - if (test_shared == 0) { - /* Make attributes > 500 bytes shared */ - ret = H5Pset_shared_mesg_nindexes(my_fcpl, (unsigned)1); - CHECK_I(ret, "H5Pset_shared_mesg_nindexes"); - ret = H5Pset_shared_mesg_index(my_fcpl, (unsigned)0, H5O_SHMESG_ATTR_FLAG, (unsigned)500); - CHECK_I(ret, "H5Pset_shared_mesg_index"); - } /* end if */ - else { - /* Set up copy of file creation property list */ - - ret = H5Pset_shared_mesg_nindexes(my_fcpl, (unsigned)3); - CHECK_I(ret, "H5Pset_shared_mesg_nindexes"); - - /* Make attributes > 500 bytes shared */ - ret = H5Pset_shared_mesg_index(my_fcpl, (unsigned)0, H5O_SHMESG_ATTR_FLAG, (unsigned)500); - CHECK_I(ret, "H5Pset_shared_mesg_index"); - - /* Make datatypes & dataspaces > 1 byte shared (i.e. all of them :-) */ - ret = H5Pset_shared_mesg_index(my_fcpl, (unsigned)1, H5O_SHMESG_DTYPE_FLAG, (unsigned)1); - CHECK_I(ret, "H5Pset_shared_mesg_index"); - ret = H5Pset_shared_mesg_index(my_fcpl, (unsigned)2, H5O_SHMESG_SDSPACE_FLAG, (unsigned)1); - CHECK_I(ret, "H5Pset_shared_mesg_index"); - } /* end else */ - - /* Create file */ - fid = H5Fcreate(FILENAME, H5F_ACC_TRUNC, my_fcpl, fapl); - CHECK(fid, FAIL, "H5Fcreate"); - - /* Close FCPL copy */ - ret = H5Pclose(my_fcpl); - CHECK(ret, FAIL, "H5Pclose"); - - /* Close file */ - ret = H5Fclose(fid); - CHECK(ret, FAIL, "H5Fclose"); -#if 0 - /* Get size of file */ - empty_filesize = h5_get_file_size(FILENAME, fapl); - if (empty_filesize < 0) - TestErrPrintf("Line %d: file size wrong!\n", __LINE__); -#endif - - /* Re-open file */ - fid = H5Fopen(FILENAME, H5F_ACC_RDWR, fapl); - CHECK(fid, FAIL, "H5Fopen"); - - /* Commit datatype to file */ - if (test_shared == 2) { - ret = H5Tcommit2(fid, TYPE1_NAME, attr_tid, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT); - CHECK(ret, FAIL, "H5Tcommit2"); - } /* end if */ - - /* Set up to query the object creation properties */ - if (dcpl_g == H5P_DEFAULT) { - dcpl = H5Pcreate(H5P_DATASET_CREATE); - CHECK(dcpl, FAIL, "H5Pcreate"); - } - else { - dcpl = H5Pcopy(dcpl_g); - CHECK(dcpl, FAIL, "H5Pcopy"); - } - - /* Create datasets */ - dataset = H5Dcreate2(fid, DSET1_NAME, H5T_NATIVE_UCHAR, sid, H5P_DEFAULT, dcpl, H5P_DEFAULT); - CHECK(dataset, FAIL, "H5Dcreate2"); - dataset2 = H5Dcreate2(fid, DSET2_NAME, H5T_NATIVE_UCHAR, sid, H5P_DEFAULT, dcpl, H5P_DEFAULT); - CHECK(dataset2, FAIL, "H5Dcreate2"); -#if 0 - /* Check on dataset's message storage status */ - if (test_shared != 0) { - /* Datasets' datatypes can be shared */ - ret = H5F__get_sohm_mesg_count_test(fid, H5O_DTYPE_ID, &mesg_count); - CHECK(ret, FAIL, "H5F__get_sohm_mesg_count_test"); - VERIFY(mesg_count, 1, "H5F__get_sohm_mesg_count_test"); - - /* Datasets' dataspace can be shared */ - ret = H5F__get_sohm_mesg_count_test(fid, H5O_SDSPACE_ID, &mesg_count); - CHECK(ret, FAIL, "H5F__get_sohm_mesg_count_test"); - VERIFY(mesg_count, 1, "H5F__get_sohm_mesg_count_test"); - } /* end if */ -#endif - /* Retrieve limits for compact/dense attribute storage */ - ret = H5Pget_attr_phase_change(dcpl, &max_compact, &min_dense); - CHECK(ret, FAIL, "H5Pget_attr_phase_change"); - - /* Close property list */ - ret = H5Pclose(dcpl); - CHECK(ret, FAIL, "H5Pclose"); -#if 0 - /* Check on datasets' attribute storage status */ - is_dense = H5O__is_attr_dense_test(dataset); - VERIFY(is_dense, false, "H5O__is_attr_dense_test"); - is_dense = H5O__is_attr_dense_test(dataset2); - VERIFY(is_dense, false, "H5O__is_attr_dense_test"); -#endif - /* Add attributes to each dataset, until after converting to dense storage */ - for (u = 0; u < max_compact * 2; u++) { - /* Create attribute name */ - snprintf(attrname, sizeof(attrname), "attr %02u", u); - - /* Alternate between creating "small" & "big" attributes */ - if (u % 2) { - /* Create "small" attribute on first dataset */ - attr = H5Acreate2(dataset, attrname, attr_tid, sid, H5P_DEFAULT, H5P_DEFAULT); - CHECK(attr, FAIL, "H5Acreate2"); -#if 0 - /* Check that attribute is not shared */ - is_shared = H5A__is_shared_test(attr); - VERIFY(is_shared, false, "H5A__is_shared_test"); -#endif - /* Write data into the attribute */ - attr_value = u + 1; - ret = H5Awrite(attr, attr_tid, &attr_value); - CHECK(ret, FAIL, "H5Awrite"); - } /* end if */ - else { - /* Create "big" attribute on first dataset */ - attr = H5Acreate2(dataset, attrname, attr_tid, big_sid, H5P_DEFAULT, H5P_DEFAULT); - CHECK(attr, FAIL, "H5Acreate2"); -#if 0 - /* ChecFk that attribute is shared */ - is_shared = H5A__is_shared_test(attr); - VERIFY(is_shared, true, "H5A__is_shared_test"); - - /* Check refcount for attribute */ - ret = H5A__get_shared_rc_test(attr, &shared_refcount); - CHECK(ret, FAIL, "H5A__get_shared_rc_test"); - VERIFY(shared_refcount, 1, "H5A__get_shared_rc_test"); -#endif - /* Write data into the attribute */ - big_value[0] = u + 1; - ret = H5Awrite(attr, attr_tid, big_value); - CHECK(ret, FAIL, "H5Awrite"); -#if 0 - /* Check refcount for attribute */ - ret = H5A__get_shared_rc_test(attr, &shared_refcount); - CHECK(ret, FAIL, "H5A__get_shared_rc_test"); - VERIFY(shared_refcount, 1, "H5A__get_shared_rc_test"); -#endif - } /* end else */ - - /* Close attribute */ - ret = H5Aclose(attr); - CHECK(ret, FAIL, "H5Aclose"); -#if 0 - /* Check on dataset's attribute storage status */ - is_dense = H5O__is_attr_dense_test(dataset); - if (u < max_compact) - VERIFY(is_dense, false, "H5O__is_attr_dense_test"); - else - VERIFY(is_dense, true, "H5O__is_attr_dense_test"); -#endif - - /* Alternate between creating "small" & "big" attributes */ - if (u % 2) { - /* Create "small" attribute on second dataset */ - attr = H5Acreate2(dataset2, attrname, attr_tid, sid, H5P_DEFAULT, H5P_DEFAULT); - CHECK(attr, FAIL, "H5Acreate2"); -#if 0 - /* Check that attribute is not shared */ - is_shared = H5A__is_shared_test(attr); - VERIFY(is_shared, false, "H5A__is_shared_test"); -#endif - /* Write data into the attribute */ - attr_value = u + 1; - ret = H5Awrite(attr, attr_tid, &attr_value); - CHECK(ret, FAIL, "H5Awrite"); - } /* end if */ - else { - /* Create "big" attribute on second dataset */ - attr = H5Acreate2(dataset2, attrname, attr_tid, big_sid, H5P_DEFAULT, H5P_DEFAULT); - CHECK(attr, FAIL, "H5Acreate2"); -#if 0 - /* Check that attribute is shared */ - is_shared = H5A__is_shared_test(attr); - VERIFY(is_shared, true, "H5A__is_shared_test"); - - /* Check refcount for attribute */ - ret = H5A__get_shared_rc_test(attr, &shared_refcount); - CHECK(ret, FAIL, "H5A__get_shared_rc_test"); - VERIFY(shared_refcount, 1, "H5A__get_shared_rc_test"); -#endif - /* Write data into the attribute */ - big_value[0] = u + 1; - ret = H5Awrite(attr, attr_tid, big_value); - CHECK(ret, FAIL, "H5Awrite"); -#if 0 - /* Check refcount for attribute */ - ret = H5A__get_shared_rc_test(attr, &shared_refcount); - CHECK(ret, FAIL, "H5A__get_shared_rc_test"); - VERIFY(shared_refcount, 2, "H5A__get_shared_rc_test"); -#endif - } /* end else */ - - /* Close attribute */ - ret = H5Aclose(attr); - CHECK(ret, FAIL, "H5Aclose"); -#if 0 - /* Check on dataset's attribute storage status */ - is_dense = H5O__is_attr_dense_test(dataset2); - if (u < max_compact) - VERIFY(is_dense, false, "H5O__is_attr_dense_test"); - else - VERIFY(is_dense, true, "H5O__is_attr_dense_test"); -#endif - } /* end for */ - - /* Close attribute's datatype */ - ret = H5Tclose(attr_tid); - CHECK(ret, FAIL, "H5Tclose"); - - /* Close second dataset */ - ret = H5Dclose(dataset2); - CHECK(ret, FAIL, "H5Dclose"); - - /* Unlink second dataset */ - ret = H5Ldelete(fid, DSET2_NAME, H5P_DEFAULT); - CHECK(ret, FAIL, "H5Ldelete"); - -#if 0 - /* Check on first dataset's attribute storage status */ - is_dense = H5O__is_attr_dense_test(dataset); - VERIFY(is_dense, true, "H5O__is_attr_dense_test"); -#endif - /* Check ref count on attributes of first dataset */ - for (u = 0; u < max_compact * 2; u++) { - /* Create attribute name */ - snprintf(attrname, sizeof(attrname), "attr %02u", u); - - /* Open attribute on first dataset */ - attr = H5Aopen(dataset, attrname, H5P_DEFAULT); - CHECK(attr, FAIL, "H5Aopen"); -#if 0 - if (u % 2) { - /* Check that attribute is not shared */ - is_shared = H5A__is_shared_test(attr); - VERIFY(is_shared, false, "H5A__is_shared_test"); - } /* end if */ - else { - /* Check that attribute is shared */ - is_shared = H5A__is_shared_test(attr); - VERIFY(is_shared, true, "H5A__is_shared_test"); - - /* Check refcount for attribute */ - ret = H5A__get_shared_rc_test(attr, &shared_refcount); - CHECK(ret, FAIL, "H5A__get_shared_rc_test"); - VERIFY(shared_refcount, 1, "H5A__get_shared_rc_test"); - } /* end else */ -#endif - /* Close attribute */ - ret = H5Aclose(attr); - CHECK(ret, FAIL, "H5Aclose"); - } /* end for */ - - /* Close Datasets */ - ret = H5Dclose(dataset); - CHECK(ret, FAIL, "H5Dclose"); - - /* Unlink first dataset */ - ret = H5Ldelete(fid, DSET1_NAME, H5P_DEFAULT); - CHECK(ret, FAIL, "H5Ldelete"); - - /* Unlink committed datatype */ - if (test_shared == 2) { - ret = H5Ldelete(fid, TYPE1_NAME, H5P_DEFAULT); - CHECK(ret, FAIL, "H5Ldelete"); - } /* end if */ -#if 0 - /* Check on attribute storage status */ - ret = H5F__get_sohm_mesg_count_test(fid, H5O_ATTR_ID, &mesg_count); - CHECK(ret, FAIL, "H5F__get_sohm_mesg_count_test"); - VERIFY(mesg_count, 0, "H5F__get_sohm_mesg_count_test"); - - if (test_shared != 0) { - /* Check on datatype storage status */ - ret = H5F__get_sohm_mesg_count_test(fid, H5O_DTYPE_ID, &mesg_count); - CHECK(ret, FAIL, "H5F__get_sohm_mesg_count_test"); - VERIFY(mesg_count, 0, "H5F__get_sohm_mesg_count_test"); - - /* Check on dataspace storage status */ - ret = H5F__get_sohm_mesg_count_test(fid, H5O_SDSPACE_ID, &mesg_count); - CHECK(ret, FAIL, "H5F__get_sohm_mesg_count_test"); - VERIFY(mesg_count, 0, "H5F__get_sohm_mesg_count_test"); - } /* end if */ -#endif - /* Close file */ - ret = H5Fclose(fid); - CHECK(ret, FAIL, "H5Fclose"); -#if 0 - if (h5_using_default_driver(NULL)) { - /* Check size of file */ - filesize = h5_get_file_size(FILENAME, fapl); - VERIFY(filesize, empty_filesize, "h5_get_file_size"); - } -#endif - } /* end for */ - - /* Close dataspaces */ - ret = H5Sclose(sid); - CHECK(ret, FAIL, "H5Sclose"); - ret = H5Sclose(big_sid); - CHECK(ret, FAIL, "H5Sclose"); - - /* Release memory */ - free(big_value); -} /* test_attr_shared_unlink() */ - -/**************************************************************** -** -** test_attr_bug1(): Test basic H5A (attribute) code. -** Tests odd sequence of allocating and deallocating space in the file. -** The series of actions below constructs a file with an attribute -** in each object header chunk, except the first. Then, the attributes -** are removed and re-created in a way that makes the object header -** allocation code remove an object header chunk "in the middle" of -** the sequence of the chunks. -** -****************************************************************/ -static void -test_attr_bug1(hid_t fcpl, hid_t fapl) -{ - hid_t fid; /* File ID */ - hid_t gid; /* Group ID */ - hid_t aid; /* Attribute ID */ - hid_t sid; /* Dataspace ID */ - herr_t ret; /* Generic return status */ - - /* Output message about test being performed */ - MESSAGE(5, ("Testing Allocating and De-allocating Attributes in Unusual Way\n")); - - /* Create dataspace ID for attributes */ - sid = H5Screate(H5S_SCALAR); - CHECK(sid, FAIL, "H5Screate"); - - /* Create main group to operate on */ - fid = H5Fcreate(FILENAME, H5F_ACC_TRUNC, fcpl, fapl); - CHECK(fid, FAIL, "H5Fcreate"); - - gid = H5Gcreate2(fid, GROUP1_NAME, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT); - CHECK(gid, FAIL, "H5Gcreate2"); - - ret = H5Gclose(gid); - CHECK(ret, FAIL, "H5Gclose"); - - ret = H5Fclose(fid); - CHECK(ret, FAIL, "H5Fclose"); - - /* Re-open file and create another group, then attribute on first group */ - fid = H5Fopen(FILENAME, H5F_ACC_RDWR, fapl); - CHECK(fid, FAIL, "H5Fopen"); - - /* Create second group */ - gid = H5Gcreate2(fid, GROUP2_NAME, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT); - CHECK(gid, FAIL, "H5Gcreate2"); - - ret = H5Gclose(gid); - CHECK(ret, FAIL, "H5Gclose"); - - /* Re-open first group */ - gid = H5Gopen2(fid, GROUP1_NAME, H5P_DEFAULT); - CHECK(gid, FAIL, "H5Gopen2"); - - /* Create attribute on first group */ - aid = H5Acreate2(gid, ATTR7_NAME, H5T_NATIVE_DOUBLE, sid, H5P_DEFAULT, H5P_DEFAULT); - CHECK(aid, FAIL, "H5Acreate2"); - - ret = H5Aclose(aid); - CHECK(ret, FAIL, "H5Aclose"); - - ret = H5Gclose(gid); - CHECK(ret, FAIL, "H5Gclose"); - - ret = H5Fclose(fid); - CHECK(ret, FAIL, "H5Fclose"); - - /* Re-open file and create another group, then another attribute on first group */ - fid = H5Fopen(FILENAME, H5F_ACC_RDWR, fapl); - CHECK(fid, FAIL, "H5Fopen"); - - /* Create third group */ - gid = H5Gcreate2(fid, GROUP3_NAME, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT); - CHECK(gid, FAIL, "H5Gcreate2"); - - ret = H5Gclose(gid); - CHECK(ret, FAIL, "H5Gclose"); - - /* Unlink second group */ - ret = H5Ldelete(fid, GROUP2_NAME, H5P_DEFAULT); - CHECK(ret, FAIL, "H5Ldelete"); - - /* Re-open first group */ - gid = H5Gopen2(fid, GROUP1_NAME, H5P_DEFAULT); - CHECK(gid, FAIL, "H5Gopen2"); - - /* Create another attribute on first group */ - aid = H5Acreate2(gid, ATTR8_NAME, H5T_NATIVE_DOUBLE, sid, H5P_DEFAULT, H5P_DEFAULT); - CHECK(aid, FAIL, "H5Acreate2"); - - ret = H5Aclose(aid); - CHECK(ret, FAIL, "H5Aclose"); - - ret = H5Gclose(gid); - CHECK(ret, FAIL, "H5Gclose"); - - ret = H5Fclose(fid); - CHECK(ret, FAIL, "H5Fclose"); - - /* Re-open file and re-create attributes on first group */ - fid = H5Fopen(FILENAME, H5F_ACC_RDWR, fapl); - CHECK(fid, FAIL, "H5Fopen"); - - /* Re-open first group */ - gid = H5Gopen2(fid, GROUP1_NAME, H5P_DEFAULT); - CHECK(gid, FAIL, "H5Gopen2"); - - /* Delete first attribute */ - ret = H5Adelete(gid, ATTR7_NAME); - CHECK(ret, FAIL, "H5Adelete"); - - /* Re-create first attribute */ - aid = H5Acreate2(gid, ATTR7_NAME, H5T_NATIVE_DOUBLE, sid, H5P_DEFAULT, H5P_DEFAULT); - CHECK(aid, FAIL, "H5Acreate2"); - - ret = H5Aclose(aid); - CHECK(ret, FAIL, "H5Aclose"); - - /* Delete second attribute */ - ret = H5Adelete(gid, ATTR8_NAME); - CHECK(ret, FAIL, "H5Adelete"); - - /* Re-create second attribute */ - aid = H5Acreate2(gid, ATTR8_NAME, H5T_NATIVE_DOUBLE, sid, H5P_DEFAULT, H5P_DEFAULT); - CHECK(aid, FAIL, "H5Acreate2"); - - ret = H5Aclose(aid); - CHECK(ret, FAIL, "H5Aclose"); - - ret = H5Gclose(gid); - CHECK(ret, FAIL, "H5Gclose"); - - ret = H5Fclose(fid); - CHECK(ret, FAIL, "H5Fclose"); - - /* Close dataspace ID */ - ret = H5Sclose(sid); - CHECK(ret, FAIL, "H5Gclose"); -} /* test_attr_bug1() */ - -/**************************************************************** -** -** test_attr_bug2(): Test basic H5A (attribute) code. -** Tests deleting a large number of attributes with the -** intention of creating a null message with a size that -** is too large. This routine deletes every other -** attribute, but the original bug could also be -** reproduced by deleting every attribute except a few to -** keep the chunk open. -** -****************************************************************/ -static void -test_attr_bug2(hid_t fcpl, hid_t fapl) -{ - hid_t fid; /* File ID */ - hid_t gid; /* Group ID */ - hid_t aid; /* Attribute ID */ - hid_t sid; /* Dataspace ID */ - hid_t tid; /* Datatype ID */ - hid_t gcpl; /* Group creation property list */ - hsize_t dims[2] = {10, 100}; /* Attribute dimensions */ - char aname[16]; /* Attribute name */ - unsigned i; /* index */ - herr_t ret; /* Generic return status */ - htri_t tri_ret; /* htri_t return status */ - - /* Output message about test being performed */ - MESSAGE(5, ("Testing Allocating and De-allocating Attributes in Unusual Way\n")); - - /* Create group creation property list */ - gcpl = H5Pcreate(H5P_GROUP_CREATE); - CHECK(gcpl, FAIL, "H5Pcreate"); - - /* Prevent the library from switching to dense attribute storage */ - /* Not doing this with the latest format actually triggers a different bug. - * This will be tested here as soon as it is fixed. -NAF - */ - ret = H5Pset_attr_phase_change(gcpl, BUG2_NATTR + 10, BUG2_NATTR + 5); - CHECK(ret, FAIL, "H5Pset_attr_phase_change"); - - /* Create dataspace ID for attributes */ - sid = H5Screate_simple(2, dims, NULL); - CHECK(sid, FAIL, "H5Screate_simple"); - - /* Create main group to operate on */ - fid = H5Fcreate(FILENAME, H5F_ACC_TRUNC, fcpl, fapl); - CHECK(fid, FAIL, "H5Fcreate"); - - gid = H5Gcreate2(fid, GROUP1_NAME, H5P_DEFAULT, gcpl, H5P_DEFAULT); - CHECK(gid, FAIL, "H5Gcreate2"); - - /* Create attributes on group */ - for (i = 0; i < BUG2_NATTR; i++) { - snprintf(aname, sizeof(aname), "%03u", i); - aid = H5Acreate2(gid, aname, H5T_STD_I32LE, sid, H5P_DEFAULT, H5P_DEFAULT); - CHECK(aid, FAIL, "H5Acreate2"); - - ret = H5Aclose(aid); - CHECK(ret, FAIL, "H5Aclose"); - } - - /* Delete every other attribute */ - for (i = 1; i < BUG2_NATTR; i += 2) { - snprintf(aname, sizeof(aname), "%03u", i); - ret = H5Adelete(gid, aname); - CHECK(ret, FAIL, "H5Adelete"); - } - - /* Close IDs */ - ret = H5Gclose(gid); - CHECK(ret, FAIL, "H5Gclose"); - - ret = H5Fclose(fid); - CHECK(ret, FAIL, "H5Fclose"); - - ret = H5Sclose(sid); - CHECK(ret, FAIL, "H5Sclose"); - - /* Reopen file and group */ - fid = H5Fopen(FILENAME, H5F_ACC_RDONLY, fapl); - CHECK(fid, FAIL, "H5Fopen"); - - gid = H5Gopen2(fid, GROUP1_NAME, H5P_DEFAULT); - CHECK(gid, FAIL, "H5Gopen"); - - /* Open an attribute in the middle */ - i = (BUG2_NATTR / 4) * 2; - snprintf(aname, sizeof(aname), "%03u", i); - aid = H5Aopen(gid, aname, H5P_DEFAULT); - CHECK(aid, FAIL, "H5Aopen"); - - /* Verify that the attribute has the correct datatype */ - tid = H5Aget_type(aid); - CHECK(tid, FAIL, "H5Aget_type"); - - tri_ret = H5Tequal(tid, H5T_STD_I32LE); - VERIFY(tri_ret, true, "H5Tequal"); - - /* Close IDs */ - ret = H5Tclose(tid); - CHECK(ret, FAIL, "H5Tclose"); - - ret = H5Aclose(aid); - CHECK(ret, FAIL, "H5Aclose"); - - ret = H5Gclose(gid); - CHECK(ret, FAIL, "H5Gclose"); - - ret = H5Fclose(fid); - CHECK(ret, FAIL, "H5Fclose"); - - /* Now test a variation on this bug - where either the size of chunk 0 goes - * down a "notch" or two, or chunk 1 becomes completely null at the same - * time that a null message that is too large is formed */ - dims[0] = 25; - dims[1] = 41; /* 1025*4 byte attribute size */ - - /* Create dataspace ID for attributes */ - sid = H5Screate_simple(2, dims, NULL); - CHECK(sid, FAIL, "H5Screate_simple"); - - /* Create main group to operate on */ - fid = H5Fcreate(FILENAME, H5F_ACC_TRUNC, fcpl, fapl); - CHECK(fid, FAIL, "H5Fcreate"); - - gid = H5Gcreate2(fid, GROUP1_NAME, H5P_DEFAULT, gcpl, H5P_DEFAULT); - CHECK(gid, FAIL, "H5Gcreate2"); - - /* Create attributes on group */ - for (i = 0; i < BUG2_NATTR2; i++) { - snprintf(aname, sizeof(aname), "%03u", i); - aid = H5Acreate2(gid, aname, H5T_STD_I32LE, sid, H5P_DEFAULT, H5P_DEFAULT); - CHECK(aid, FAIL, "H5Acreate2"); - - ret = H5Aclose(aid); - CHECK(ret, FAIL, "H5Aclose"); - } - - /* Delete every other attribute */ - for (i = 0; i < BUG2_NATTR2; i++) { - snprintf(aname, sizeof(aname), "%03u", i); - ret = H5Adelete(gid, aname); - CHECK(ret, FAIL, "H5Adelete"); - } - - /* Close IDs */ - ret = H5Gclose(gid); - CHECK(ret, FAIL, "H5Gclose"); - - ret = H5Fclose(fid); - CHECK(ret, FAIL, "H5Fclose"); - - ret = H5Sclose(sid); - CHECK(ret, FAIL, "H5Sclose"); - - ret = H5Pclose(gcpl); - CHECK(ret, FAIL, "H5Pclose"); -} /* test_attr_bug2() */ - -/**************************************************************** -** -** test_attr_bug3(): Test basic H5A (attribute) code. -** Tests creating and deleting attributes which use a -** datatype and/or dataspace stored in the same object -** header. -** -****************************************************************/ -static void -test_attr_bug3(hid_t fcpl, hid_t fapl) -{ - hid_t fid; /* File ID */ - hid_t aid1, aid2; /* Attribute IDs */ - hid_t sid1, sid2; /* Dataspace ID */ - hid_t tid1, tid2; /* Datatype IDs */ - hid_t did; /* Dataset ID */ - hsize_t dims1[2] = {2, 2}, dims2[2] = {3, 3}; /* Dimensions */ - int wdata1[2][2]; - unsigned wdata2[3][3]; /* Write buffers */ - unsigned u, v; /* Local index variables */ - herr_t ret; /* Generic return status */ - - /* Output message about test being performed */ - MESSAGE(5, ("Testing Attributes in the Same Header as their Datatypes\n")); - - /* Create dataspaces */ - sid1 = H5Screate_simple(2, dims1, NULL); - CHECK(sid1, FAIL, "H5Screate_simple"); - sid2 = H5Screate_simple(2, dims2, NULL); - CHECK(sid2, FAIL, "H5Screate_simple"); - - /* Create file to operate on */ - fid = H5Fcreate(FILENAME, H5F_ACC_TRUNC, fcpl, fapl); - CHECK(fid, FAIL, "H5Fcreate"); - - /* Create datatypes and commit tid1 */ - tid1 = H5Tcopy(H5T_STD_I16BE); - CHECK(tid1, FAIL, "H5Tcopy"); - tid2 = H5Tcopy(H5T_STD_U64LE); - CHECK(tid1, FAIL, "H5Tcopy"); - ret = H5Tcommit2(fid, "dtype", tid1, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT); - CHECK(ret, FAIL, "H5Tcommit2"); - - /* Create dataset */ - did = H5Dcreate2(fid, "dset", tid2, sid2, H5P_DEFAULT, dcpl_g, H5P_DEFAULT); - CHECK(did, FAIL, "H5Dcreate2"); - - /* Create attribute on datatype, using that datatype as its datatype */ - aid1 = H5Acreate2(tid1, "attr", tid1, sid1, H5P_DEFAULT, H5P_DEFAULT); - CHECK(aid1, FAIL, "H5Acreate2"); - - /* Create attribute on dataset, using its datatype and dataspace */ - aid2 = H5Acreate2(did, "attr", tid2, sid2, H5P_DEFAULT, H5P_DEFAULT); - CHECK(aid2, FAIL, "H5Acreate2"); - - /* Close attributes */ - ret = H5Aclose(aid1); - CHECK(ret, FAIL, "H5Aclose"); - ret = H5Aclose(aid2); - CHECK(ret, FAIL, "H5Aclose"); - - /* Reopen attributes */ - aid1 = H5Aopen(tid1, "attr", H5P_DEFAULT); - CHECK(aid1, FAIL, "H5Aopen"); - aid2 = H5Aopen(did, "attr", H5P_DEFAULT); - CHECK(aid2, FAIL, "H5Aopen"); - - /* Initialize the write buffers */ - for (u = 0; u < dims1[0]; u++) - for (v = 0; v < dims1[1]; v++) - wdata1[u][v] = (int)((u * dims1[1]) + v); - for (u = 0; u < dims2[0]; u++) - for (v = 0; v < dims2[1]; v++) - wdata2[u][v] = (unsigned)((u * dims2[1]) + v); - - /* Write data to the attributes */ - ret = H5Awrite(aid1, H5T_NATIVE_INT, wdata1); - CHECK(ret, FAIL, "H5Awrite"); - ret = H5Awrite(aid2, H5T_NATIVE_UINT, wdata2); - CHECK(ret, FAIL, "H5Awrite"); - - /* Close attributes */ - ret = H5Aclose(aid1); - CHECK(ret, FAIL, "H5Aclose"); - ret = H5Aclose(aid2); - CHECK(ret, FAIL, "H5Aclose"); - - /* Delete attributes */ - ret = H5Adelete(tid1, "attr"); - CHECK(ret, FAIL, "H5Adelete"); - ret = H5Adelete(did, "attr"); - CHECK(ret, FAIL, "H5Adelete"); - - /* Recreate attributes */ - aid1 = H5Acreate2(tid1, "attr", tid1, sid1, H5P_DEFAULT, H5P_DEFAULT); - CHECK(aid1, FAIL, "H5Acreate2"); - aid2 = H5Acreate2(did, "attr", tid2, sid2, H5P_DEFAULT, H5P_DEFAULT); - CHECK(aid2, FAIL, "H5Acreate2"); - - /* Delete attributes (note they are still open) */ - ret = H5Adelete(tid1, "attr"); - CHECK(ret, FAIL, "H5Adelete"); - ret = H5Adelete(did, "attr"); - CHECK(ret, FAIL, "H5Adelete"); - - /* Close dataspaces and transient datatype */ - ret = H5Sclose(sid1); - CHECK(ret, FAIL, "H5Sclose"); - ret = H5Sclose(sid2); - CHECK(ret, FAIL, "H5Sclose"); - ret = H5Tclose(tid2); - CHECK(ret, FAIL, "H5Tclose"); - - /* Close dataset and committed datatype */ - ret = H5Tclose(tid1); - CHECK(ret, FAIL, "H5Tclose"); - ret = H5Dclose(did); - CHECK(ret, FAIL, "H5Dclose"); - - /* Delete dataset and committed datatype */ - ret = H5Ldelete(fid, "dtype", H5P_DEFAULT); - CHECK(ret, FAIL, "H5Tclose"); - ret = H5Ldelete(fid, "dset", H5P_DEFAULT); - CHECK(ret, FAIL, "H5Dclose"); - - /* Close attributes */ - ret = H5Aclose(aid1); - CHECK(ret, FAIL, "H5Aclose"); - ret = H5Aclose(aid2); - CHECK(ret, FAIL, "H5Aclose"); - - /* Close file */ - ret = H5Fclose(fid); - CHECK(ret, FAIL, "H5Fclose"); -} /* test_attr_bug3() */ - -/**************************************************************** -** -** test_attr_bug4(): Test basic H5A (attribute) code. -** Attempts to trigger a bug which would result in being -** unable to add an attribute to a named datatype. This -** happened when an object header chunk was too small to -** hold a continuation message and could not be extended. -** -****************************************************************/ -static void -test_attr_bug4(hid_t fcpl, hid_t fapl) -{ - hid_t fid; /* File ID */ - hid_t gid; /* Group ID */ - hid_t aid1, aid2, aid3; /* Attribute IDs */ - hid_t sid; /* Dataspace ID */ - hid_t tid; /* Datatype ID */ - hid_t did; /* Dataset ID */ - hsize_t dims[1] = {5}; /* Attribute dimensions */ - herr_t ret; /* Generic return status */ - - /* Output message about test being performed */ - MESSAGE(5, ("Testing that attributes can always be added to named datatypes\n")); - - /* Create dataspace */ - sid = H5Screate_simple(1, dims, NULL); - CHECK(sid, FAIL, "H5Screate_simple"); - - /* Create file */ - fid = H5Fcreate(FILENAME, H5F_ACC_TRUNC, fcpl, fapl); - CHECK(fid, FAIL, "H5Fcreate"); - - /* Open root group */ - gid = H5Gopen2(fid, "/", H5P_DEFAULT); - CHECK(gid, FAIL, "H5Gcreate2"); - - /* Create committed datatype */ - tid = H5Tcopy(H5T_STD_I32LE); - CHECK(tid, FAIL, "H5Tcopy"); - ret = H5Tcommit2(fid, "dtype", tid, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT); - CHECK(ret, FAIL, "H5Tcommit2"); - - /* Create dataset */ - did = H5Dcreate2(fid, "dset", tid, sid, H5P_DEFAULT, dcpl_g, H5P_DEFAULT); - CHECK(did, FAIL, "H5Dcreate2"); - - /* Create attributes on group and dataset */ - aid1 = H5Acreate2(gid, "attr", tid, sid, H5P_DEFAULT, H5P_DEFAULT); - CHECK(aid1, FAIL, "H5Acreate2"); - aid2 = H5Acreate2(did, "attr", tid, sid, H5P_DEFAULT, H5P_DEFAULT); - CHECK(aid2, FAIL, "H5Acreate2"); - - /* Create attribute on datatype (this is the main test) */ - aid3 = H5Acreate2(tid, "attr", tid, sid, H5P_DEFAULT, H5P_DEFAULT); - CHECK(aid3, FAIL, "H5Acreate2"); - - /* Close IDs */ - ret = H5Aclose(aid3); - CHECK(ret, FAIL, "H5Aclose"); - - ret = H5Aclose(aid2); - CHECK(ret, FAIL, "H5Aclose"); - - ret = H5Aclose(aid1); - CHECK(ret, FAIL, "H5Aclose"); - - ret = H5Dclose(did); - CHECK(ret, FAIL, "H5Dclose"); - - ret = H5Tclose(tid); - CHECK(ret, FAIL, "H5Tclose"); - - ret = H5Gclose(gid); - CHECK(ret, FAIL, "H5Gclose"); - - ret = H5Fclose(fid); - CHECK(ret, FAIL, "H5Fclose"); - - ret = H5Sclose(sid); - CHECK(ret, FAIL, "H5Sclose"); -} /* test_attr_bug4() */ - -/**************************************************************** -** -** test_attr_bug5(): Test basic H5A (attribute) code. -** Tests opening an attribute multiple times through -** objects opened through different file handles. -** -****************************************************************/ -static void -test_attr_bug5(hid_t fcpl, hid_t fapl) -{ - hid_t fid1, fid2; /* File IDs */ - hid_t gid1, gid2; /* Group IDs */ - hid_t did1, did2; /* Dataset IDs */ - hid_t tid1, tid2; /* Datatype IDs */ - hid_t aidg1, aidg2, aidd1, aidd2, aidt1, aidt2; /* Attribute IDs */ - hid_t sid; /* Dataspace ID */ - hsize_t dims[1] = {5}; /* Attribute dimensions */ - herr_t ret; /* Generic return status */ - - /* Output message about test being performed */ - MESSAGE(5, ("Testing Opening an Attribute Through Multiple Files Concurrently\n")); - - /* Create dataspace ID for attributes and datasets */ - sid = H5Screate_simple(1, dims, NULL); - CHECK(sid, FAIL, "H5Screate_simple"); - - /* Create file */ - fid1 = H5Fcreate(FILENAME, H5F_ACC_TRUNC, fcpl, fapl); - CHECK(fid1, FAIL, "H5Fcreate"); - - /* Open root group */ - gid1 = H5Gopen2(fid1, "/", H5P_DEFAULT); - CHECK(gid1, FAIL, "H5Gopen2"); - - /* Create and commit datatype */ - tid1 = H5Tcopy(H5T_STD_I32LE); - CHECK(tid1, FAIL, "H5Tcopy"); - ret = H5Tcommit2(fid1, BUG3_DT_NAME, tid1, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT); - CHECK(ret, FAIL, "H5Tcommit2"); - - /* Create dataset */ - did1 = H5Dcreate2(fid1, BUG3_DSET_NAME, tid1, sid, H5P_DEFAULT, dcpl_g, H5P_DEFAULT); - CHECK(did1, FAIL, "H5Dcreate2"); - - /* Create attribute on root group */ - aidg1 = H5Acreate2(gid1, BUG3_ATTR_NAME, tid1, sid, H5P_DEFAULT, H5P_DEFAULT); - CHECK(aidg1, FAIL, "H5Acreate2"); - - /* Create attribute on dataset */ - aidd1 = H5Acreate2(did1, BUG3_ATTR_NAME, tid1, sid, H5P_DEFAULT, H5P_DEFAULT); - CHECK(aidd1, FAIL, "H5Acreate2"); - - /* Create attribute on datatype */ - aidt1 = H5Acreate2(tid1, BUG3_ATTR_NAME, tid1, sid, H5P_DEFAULT, H5P_DEFAULT); - CHECK(aidt1, FAIL, "H5Acreate2"); - - /* Close all IDs */ - ret = H5Aclose(aidt1); - CHECK(ret, FAIL, "H5Aclose"); - ret = H5Aclose(aidd1); - CHECK(ret, FAIL, "H5Aclose"); - ret = H5Aclose(aidg1); - CHECK(ret, FAIL, "H5Aclose"); - ret = H5Dclose(did1); - CHECK(ret, FAIL, "H5Dclose"); - ret = H5Tclose(tid1); - CHECK(ret, FAIL, "H5Tclose"); - ret = H5Gclose(gid1); - CHECK(ret, FAIL, "H5Gclose"); - ret = H5Fclose(fid1); - CHECK(ret, FAIL, "H5Fclose"); - ret = H5Sclose(sid); - CHECK(ret, FAIL, "H5Sclose"); - - /* Open file twice */ - fid1 = H5Fopen(FILENAME, H5F_ACC_RDONLY, fapl); - CHECK(fid1, FAIL, "H5Fopen"); - fid2 = H5Fopen(FILENAME, H5F_ACC_RDONLY, fapl); - CHECK(fid2, FAIL, "H5Fopen"); - - /* Open the root group twice */ - gid1 = H5Gopen2(fid1, "/", H5P_DEFAULT); - CHECK(gid1, FAIL, "H5Gopen2"); - gid2 = H5Gopen2(fid2, "/", H5P_DEFAULT); - CHECK(gid2, FAIL, "H5Gopen2"); - - /* Open the root group attribute twice */ - aidg1 = H5Aopen(gid1, BUG3_ATTR_NAME, H5P_DEFAULT); - CHECK(aidg1, FAIL, "H5Aopen"); - aidg2 = H5Aopen(gid2, BUG3_ATTR_NAME, H5P_DEFAULT); - CHECK(aidg1, FAIL, "H5Aopen"); - - /* Open the dataset twice */ - did1 = H5Dopen2(fid1, BUG3_DSET_NAME, H5P_DEFAULT); - CHECK(did1, FAIL, "H5Dopen2"); - did2 = H5Dopen2(fid2, BUG3_DSET_NAME, H5P_DEFAULT); - CHECK(did2, FAIL, "H5Dopen2"); - - /* Open the dataset attribute twice */ - aidd1 = H5Aopen(did1, BUG3_ATTR_NAME, H5P_DEFAULT); - CHECK(aidd1, FAIL, "H5Aopen"); - aidd2 = H5Aopen(did2, BUG3_ATTR_NAME, H5P_DEFAULT); - CHECK(aidd1, FAIL, "H5Aopen"); - - /* Open the datatype twice */ - tid1 = H5Topen2(fid1, BUG3_DT_NAME, H5P_DEFAULT); - CHECK(tid1, FAIL, "H5Topen2"); - tid2 = H5Topen2(fid2, BUG3_DT_NAME, H5P_DEFAULT); - CHECK(tid2, FAIL, "H5Topen2"); - - /* Open the datatype attribute twice */ - aidt1 = H5Aopen(tid1, BUG3_ATTR_NAME, H5P_DEFAULT); - CHECK(aidt1, FAIL, "H5Aopen"); - aidt2 = H5Aopen(tid2, BUG3_ATTR_NAME, H5P_DEFAULT); - CHECK(aidt2, FAIL, "H5Aopen"); - - /* Close all attributes */ - ret = H5Aclose(aidg1); - CHECK(ret, FAIL, "H5Aclose"); - ret = H5Aclose(aidg2); - CHECK(ret, FAIL, "H5Aclose"); - ret = H5Aclose(aidd1); - CHECK(ret, FAIL, "H5Aclose"); - ret = H5Aclose(aidd2); - CHECK(ret, FAIL, "H5Aclose"); - ret = H5Aclose(aidt1); - CHECK(ret, FAIL, "H5Aclose"); - ret = H5Aclose(aidt2); - CHECK(ret, FAIL, "H5Aclose"); - - /* Close root groups */ - ret = H5Gclose(gid1); - CHECK(ret, FAIL, "H5Gclose"); - ret = H5Gclose(gid2); - CHECK(ret, FAIL, "H5Gclose"); - - /* Close datasets */ - ret = H5Dclose(did1); - CHECK(ret, FAIL, "H5Dclose"); - ret = H5Dclose(did2); - CHECK(ret, FAIL, "H5Dclose"); - - /* Close datatypes */ - ret = H5Tclose(tid1); - CHECK(ret, FAIL, "H5Tclose"); - ret = H5Tclose(tid2); - CHECK(ret, FAIL, "H5Tclose"); - - /* Close files */ - ret = H5Fclose(fid1); - CHECK(ret, FAIL, "H5Fclose"); - ret = H5Fclose(fid2); - CHECK(ret, FAIL, "H5Fclose"); -} /* test_attr_bug5() */ - -/**************************************************************** -** -** test_attr_bug6(): Test basic H5A (attribute) code. -** Tests if reading an empty attribute is OK. -** -****************************************************************/ -static void -test_attr_bug6(hid_t fcpl, hid_t fapl) -{ - hid_t fid; /* File ID */ - hid_t gid; /* Group ID */ - hid_t aid1, aid2; /* Attribute IDs */ - hid_t sid; /* Dataspace ID */ - hsize_t dims[ATTR1_RANK] = {ATTR1_DIM1}; /* Attribute dimensions */ - int intar[ATTR1_DIM1]; /* Data reading buffer */ - herr_t ret; /* Generic return status */ - - /* Output message about test being performed */ - MESSAGE(5, ("Testing that empty attribute can be read\n")); - - /* Create file */ - fid = H5Fcreate(FILENAME, H5F_ACC_TRUNC, fcpl, fapl); - CHECK(fid, FAIL, "H5Fcreate"); - - /* Open root group */ - gid = H5Gopen2(fid, "/", H5P_DEFAULT); - CHECK(gid, FAIL, "H5Gopen2"); - - /* Create dataspace */ - sid = H5Screate_simple(1, dims, NULL); - CHECK(sid, FAIL, "H5Screate_simple"); - - /* Create attribute on group */ - aid1 = H5Acreate2(gid, ATTR1_NAME, H5T_NATIVE_INT, sid, H5P_DEFAULT, H5P_DEFAULT); - CHECK(aid1, FAIL, "H5Acreate2"); - - ret = H5Aclose(aid1); - CHECK(ret, FAIL, "H5Aclose"); - - /* Open the attribute again */ - aid2 = H5Aopen(gid, ATTR1_NAME, H5P_DEFAULT); - CHECK(aid2, FAIL, "H5Aopen"); - - ret = H5Aread(aid2, H5T_NATIVE_INT, intar); - CHECK(ret, FAIL, "H5Aread"); - - /* Close IDs */ - ret = H5Aclose(aid2); - CHECK(ret, FAIL, "H5Aclose"); - - ret = H5Gclose(gid); - CHECK(ret, FAIL, "H5Gclose"); - - ret = H5Fclose(fid); - CHECK(ret, FAIL, "H5Fclose"); - - ret = H5Sclose(sid); - CHECK(ret, FAIL, "H5Sclose"); -} /* test_attr_bug6() */ - -/**************************************************************** -** -** test_attr_bug7(): Test basic H5A (attribute) code. -** (Really tests object header allocation code). -** Tests creating and deleting attributes in such a way as -** to change the size of the "chunk #0 size" field. -** Includes testing "skipping" a possible size of the -** field, i.e. going from 1 to 4 bytes or 4 to 1 byte. -** -****************************************************************/ -#if 0 -static void -test_attr_bug7(hid_t fcpl, hid_t fapl) -{ - hid_t fid; /* File ID */ - hid_t aid; /* Attribute ID */ - hid_t sid; /* Dataspace ID */ - hid_t tid; /* Datatype ID */ - hsize_t dims_s = 140; /* Small attribute dimensions */ - hsize_t dims_l = 65480; /* Large attribute dimensions */ - H5A_info_t ainfo; /* Attribute info */ - herr_t ret; /* Generic return status */ - - /* Output message about test being performed */ - MESSAGE(5, ("Testing adding and deleting large attributes\n")); - - /* Create committed datatype to operate on. Use a committed datatype so that - * there is nothing after the object header and the first chunk can expand and - * contract as necessary. */ - fid = H5Fcreate(FILENAME, H5F_ACC_TRUNC, fcpl, fapl); - CHECK(fid, FAIL, "H5Fcreate"); - tid = H5Tcopy(H5T_STD_I32LE); - CHECK(tid, FAIL, "H5Tcopy"); - ret = H5Tcommit2(fid, TYPE1_NAME, tid, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT); - CHECK(ret, FAIL, "H5Tcommit2"); - - /* - * Create small attribute - */ - sid = H5Screate_simple(1, &dims_s, NULL); - CHECK(sid, FAIL, "H5Screate_simple"); - aid = H5Acreate2(tid, ATTR1_NAME, H5T_STD_I8LE, sid, H5P_DEFAULT, H5P_DEFAULT); - CHECK(aid, FAIL, "H5Acreate2"); - - /* Close file */ - ret = H5Aclose(aid); - CHECK(ret, FAIL, "H5Aclose"); - ret = H5Fclose(fid); - CHECK(ret, FAIL, "H5Fclose"); - ret = H5Tclose(tid); - CHECK(ret, FAIL, "H5Tclose"); - - /* Open file */ - fid = H5Fopen(FILENAME, H5F_ACC_RDWR, fapl); - CHECK(fid, FAIL, "H5Fopen"); - - /* Check attribute */ - tid = H5Topen2(fid, TYPE1_NAME, H5P_DEFAULT); - CHECK(tid, FAIL, "H5Topen2"); - ret = H5Aget_info_by_name(tid, ".", ATTR1_NAME, &ainfo, H5P_DEFAULT); - CHECK(ret, FAIL, "H5Aget_info_by_name"); - if (ainfo.data_size != dims_s) - TestErrPrintf("attribute data size different: data_size=%llu, should be %llu\n", - (long long unsigned)ainfo.data_size, (long long unsigned)dims_s); - - /* - * Create another small attribute. Should cause chunk size field to expand by - * 1 byte (1->2). - */ - aid = H5Acreate2(tid, ATTR2_NAME, H5T_STD_I8LE, sid, H5P_DEFAULT, H5P_DEFAULT); - CHECK(aid, FAIL, "H5Acreate2"); - - /* Close file */ - ret = H5Aclose(aid); - CHECK(ret, FAIL, "H5Aclose"); - ret = H5Fclose(fid); - CHECK(ret, FAIL, "H5Fclose"); - ret = H5Tclose(tid); - CHECK(ret, FAIL, "H5Tclose"); - - /* Open file */ - fid = H5Fopen(FILENAME, H5F_ACC_RDWR, fapl); - CHECK(fid, FAIL, "H5Fopen"); - - /* Check attributes */ - tid = H5Topen2(fid, TYPE1_NAME, H5P_DEFAULT); - CHECK(tid, FAIL, "H5Topen2"); - ret = H5Aget_info_by_name(tid, ".", ATTR1_NAME, &ainfo, H5P_DEFAULT); - CHECK(ret, FAIL, "H5Aget_info_by_name"); - if (ainfo.data_size != dims_s) - TestErrPrintf("attribute data size different: data_size=%llu, should be %llu\n", - (long long unsigned)ainfo.data_size, (long long unsigned)dims_s); - ret = H5Aget_info_by_name(tid, ".", ATTR2_NAME, &ainfo, H5P_DEFAULT); - CHECK(ret, FAIL, "H5Aget_info_by_name"); - if (ainfo.data_size != dims_s) - TestErrPrintf("attribute data size different: data_size=%llu, should be %llu\n", - (long long unsigned)ainfo.data_size, (long long unsigned)dims_s); - - /* - * Create large attribute. Should cause chunk size field to expand by 2 bytes - * (2->4). - */ - ret = H5Sset_extent_simple(sid, 1, &dims_l, NULL); - CHECK(ret, FAIL, "H5Sset_extent_simple"); - aid = H5Acreate2(tid, ATTR3_NAME, H5T_STD_I8LE, sid, H5P_DEFAULT, H5P_DEFAULT); - CHECK(aid, FAIL, "H5Acreate2"); - - /* Close file */ - ret = H5Aclose(aid); - CHECK(ret, FAIL, "H5Aclose"); - ret = H5Fclose(fid); - CHECK(ret, FAIL, "H5Fclose"); - ret = H5Tclose(tid); - CHECK(ret, FAIL, "H5Tclose"); - - /* Open file */ - fid = H5Fopen(FILENAME, H5F_ACC_RDWR, fapl); - CHECK(fid, FAIL, "H5Fopen"); - - /* Check attributes */ - tid = H5Topen2(fid, TYPE1_NAME, H5P_DEFAULT); - CHECK(tid, FAIL, "H5Topen2"); - ret = H5Aget_info_by_name(tid, ".", ATTR1_NAME, &ainfo, H5P_DEFAULT); - CHECK(ret, FAIL, "H5Aget_info_by_name"); - if (ainfo.data_size != dims_s) - TestErrPrintf("attribute data size different: data_size=%llu, should be %llu\n", - (long long unsigned)ainfo.data_size, (long long unsigned)dims_s); - ret = H5Aget_info_by_name(tid, ".", ATTR2_NAME, &ainfo, H5P_DEFAULT); - CHECK(ret, FAIL, "H5Aget_info_by_name"); - if (ainfo.data_size != dims_s) - TestErrPrintf("attribute data size different: data_size=%llu, should be %llu\n", - (long long unsigned)ainfo.data_size, (long long unsigned)dims_s); - ret = H5Aget_info_by_name(tid, ".", ATTR3_NAME, &ainfo, H5P_DEFAULT); - CHECK(ret, FAIL, "H5Aget_info_by_name"); - if (ainfo.data_size != dims_l) - TestErrPrintf("attribute data size different: data_size=%llu, should be %llu\n", - (long long unsigned)ainfo.data_size, (long long unsigned)dims_l); - - /* - * Delete last two attributes - should merge into a null message that is too - * large, causing the chunk size field to shrink by 3 bytes (4->1). - */ - ret = H5Sset_extent_simple(sid, 1, &dims_l, NULL); - CHECK(ret, FAIL, "H5Sset_extent_simple"); - ret = H5Adelete(tid, ATTR2_NAME); - CHECK(ret, FAIL, "H5Adelete"); - ret = H5Adelete(tid, ATTR3_NAME); - CHECK(ret, FAIL, "H5Adelete"); - - /* Close file */ - ret = H5Fclose(fid); - CHECK(ret, FAIL, "H5Fclose"); - ret = H5Tclose(tid); - CHECK(ret, FAIL, "H5Tclose"); - - /* Open file */ - fid = H5Fopen(FILENAME, H5F_ACC_RDWR, fapl); - CHECK(fid, FAIL, "H5Fopen"); - - /* Check attribute */ - tid = H5Topen2(fid, TYPE1_NAME, H5P_DEFAULT); - CHECK(tid, FAIL, "H5Topen2"); - ret = H5Aget_info_by_name(tid, ".", ATTR1_NAME, &ainfo, H5P_DEFAULT); - CHECK(ret, FAIL, "H5Aget_info_by_name"); - if (ainfo.data_size != dims_s) - TestErrPrintf("attribute data size different: data_size=%llu, should be %llu\n", - (long long unsigned)ainfo.data_size, (long long unsigned)dims_s); - - /* - * Create large attribute. Should cause chunk size field to expand by 3 bytes - * (1->4). - */ - aid = H5Acreate2(tid, ATTR2_NAME, H5T_STD_I8LE, sid, H5P_DEFAULT, H5P_DEFAULT); - CHECK(aid, FAIL, "H5Acreate2"); - - /* Close file */ - ret = H5Aclose(aid); - CHECK(ret, FAIL, "H5Aclose"); - ret = H5Fclose(fid); - CHECK(ret, FAIL, "H5Fclose"); - ret = H5Tclose(tid); - CHECK(ret, FAIL, "H5Tclose"); - - /* Open file */ - fid = H5Fopen(FILENAME, H5F_ACC_RDWR, fapl); - CHECK(fid, FAIL, "H5Fopen"); - - /* Check attributes */ - tid = H5Topen2(fid, TYPE1_NAME, H5P_DEFAULT); - CHECK(tid, FAIL, "H5Topen2"); - ret = H5Aget_info_by_name(tid, ".", ATTR1_NAME, &ainfo, H5P_DEFAULT); - CHECK(ret, FAIL, "H5Aget_info_by_name"); - if (ainfo.data_size != dims_s) - TestErrPrintf("attribute data size different: data_size=%llu, should be %llu\n", - (long long unsigned)ainfo.data_size, (long long unsigned)dims_s); - ret = H5Aget_info_by_name(tid, ".", ATTR2_NAME, &ainfo, H5P_DEFAULT); - CHECK(ret, FAIL, "H5Aget_info_by_name"); - if (ainfo.data_size != dims_l) - TestErrPrintf("attribute data size different: data_size=%llu, should be %llu\n", - (long long unsigned)ainfo.data_size, (long long unsigned)dims_l); - - /* Close IDs */ - ret = H5Tclose(tid); - CHECK(ret, FAIL, "H5Tclose"); - ret = H5Sclose(sid); - CHECK(ret, FAIL, "H5Sclose"); - ret = H5Fclose(fid); - CHECK(ret, FAIL, "H5Fclose"); -} /* test_attr_bug7() */ -#endif - -/**************************************************************** -** -** test_attr_bug8(): Test basic H5A (attribute) code. -** (Really tests object header code). -** Tests adding a link and attribute to a group in such a -** way as to cause the "chunk #0 size" field to expand -** when some object header messages are not loaded into -** cache. Before the bug was fixed, this would prevent -** these messages from being shifted to the correct -** position as the expansion algorithm marked them dirty, -** invalidating the raw form, when there was no native -** form to encode. -** -****************************************************************/ -static void -test_attr_bug8(hid_t fcpl, hid_t fapl) -{ - hid_t fid; /* File ID */ - hid_t aid; /* Attribute ID */ - hid_t sid; /* Dataspace ID */ - hid_t gid; /* Group ID */ - hid_t oid; /* Object ID */ - hsize_t dims = 256; /* Attribute dimensions */ - H5O_info2_t oinfo; /* Object info */ - H5A_info_t ainfo; /* Attribute info */ - H5O_token_t root_token; /* Root group token */ - int cmp_value; /* Result from H5Otoken_cmp */ - herr_t ret; /* Generic return status */ - - /* Output message about test being performed */ - MESSAGE(5, ("Testing attribute expanding object header with undecoded messages\n")); - - /* Create committed datatype to operate on. Use a committed datatype so that - * there is nothing after the object header and the first chunk can expand and - * contract as necessary. */ - fid = H5Fcreate(FILENAME, H5F_ACC_TRUNC, fcpl, fapl); - CHECK(fid, FAIL, "H5Fcreate"); - gid = H5Gcreate2(fid, GROUP1_NAME, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT); - CHECK(gid, FAIL, "H5Gcreate2"); - - /* Get root group token */ - ret = H5Oget_info3(fid, &oinfo, H5O_INFO_BASIC); - CHECK(ret, FAIL, "H5Oget_info"); - root_token = oinfo.token; - - /* - * Create link to root group - */ - ret = H5Lcreate_hard(fid, "/", gid, LINK1_NAME, H5P_DEFAULT, H5P_DEFAULT); - CHECK(ret, FAIL, "H5Lcreate_hard"); - - /* Close file */ - ret = H5Fclose(fid); - CHECK(ret, FAIL, "H5Fclose"); - ret = H5Gclose(gid); - CHECK(ret, FAIL, "H5Gclose"); - - /* Open file */ - fid = H5Fopen(FILENAME, H5F_ACC_RDONLY, fapl); - CHECK(fid, FAIL, "H5Fopen"); - - /* Check link */ - gid = H5Gopen2(fid, GROUP1_NAME, H5P_DEFAULT); - CHECK(gid, FAIL, "H5Gopen2"); - oid = H5Oopen(gid, LINK1_NAME, H5P_DEFAULT); - CHECK(oid, FAIL, "H5Oopen"); - ret = H5Oget_info3(oid, &oinfo, H5O_INFO_BASIC); - CHECK(ret, FAIL, "H5Oget_info"); - ret = H5Otoken_cmp(oid, &oinfo.token, &root_token, &cmp_value); - CHECK(ret, FAIL, "H5Otoken_cmp"); - VERIFY(cmp_value, 0, "H5Otoken_cmp"); - - /* Close file */ - ret = H5Fclose(fid); - CHECK(ret, FAIL, "H5Fclose"); - ret = H5Gclose(gid); - CHECK(ret, FAIL, "H5Gclose"); - ret = H5Oclose(oid); - CHECK(ret, FAIL, "H5Oclose"); - - /* Open file */ - fid = H5Fopen(FILENAME, H5F_ACC_RDWR, fapl); - CHECK(fid, FAIL, "H5Fopen"); - - /* - * Create attribute. Should cause chunk size field to expand by 1 byte - * (1->2). - */ - gid = H5Gopen2(fid, GROUP1_NAME, H5P_DEFAULT); - CHECK(gid, FAIL, "H5Gopen2"); - sid = H5Screate_simple(1, &dims, NULL); - CHECK(sid, FAIL, "H5Screate_simple"); - aid = H5Acreate2(gid, ATTR1_NAME, H5T_STD_I8LE, sid, H5P_DEFAULT, H5P_DEFAULT); - CHECK(aid, FAIL, "H5Acreate2"); - - /* Close file */ - ret = H5Aclose(aid); - CHECK(ret, FAIL, "H5Aclose"); - ret = H5Fclose(fid); - CHECK(ret, FAIL, "H5Fclose"); - ret = H5Gclose(gid); - CHECK(ret, FAIL, "H5Gclose"); - - /* Open file */ - fid = H5Fopen(FILENAME, H5F_ACC_RDONLY, fapl); - CHECK(fid, FAIL, "H5Fopen"); - - /* Check link and attribute */ - gid = H5Gopen2(fid, GROUP1_NAME, H5P_DEFAULT); - CHECK(gid, FAIL, "H5Gopen2"); - oid = H5Oopen(gid, LINK1_NAME, H5P_DEFAULT); - CHECK(oid, FAIL, "H5Oopen"); - ret = H5Oget_info3(oid, &oinfo, H5O_INFO_BASIC); - CHECK(ret, FAIL, "H5Oget_info"); - ret = H5Otoken_cmp(oid, &oinfo.token, &root_token, &cmp_value); - CHECK(ret, FAIL, "H5Otoken_cmp"); - VERIFY(cmp_value, 0, "H5Otoken_cmp"); - ret = H5Aget_info_by_name(gid, ".", ATTR1_NAME, &ainfo, H5P_DEFAULT); - CHECK(ret, FAIL, "H5Aget_info_by_name"); - if (ainfo.data_size != dims) - TestErrPrintf("attribute data size different: data_size=%llu, should be %llu\n", - (long long unsigned)ainfo.data_size, (long long unsigned)dims); - - /* Close IDs */ - ret = H5Oclose(oid); - CHECK(ret, FAIL, "H5Oclose"); - ret = H5Gclose(gid); - CHECK(ret, FAIL, "H5Gclose"); - ret = H5Sclose(sid); - CHECK(ret, FAIL, "H5Sclose"); - ret = H5Fclose(fid); - CHECK(ret, FAIL, "H5Fclose"); -} /* test_attr_bug8() */ - -/**************************************************************** -** -** test_attr_bug9(): Test basic H5A (attribute) code. -** (Really tests object header code). -** Tests adding several large attributes to an object until -** they convert to dense storage. The total size of all -** attributes is larger than 64K, causing the internal -** object header code to, after merging the deleted -** messages in to a NULL message, shrink the object header -** chunk. Do this twice: once with only attributes in the -** object header chunk and once with a (small) soft link in -** the chunk as well. In both cases, the shrunk chunk will -** initially be too small and a new NULL message must be -** created. -** -****************************************************************/ -static void -test_attr_bug9(hid_t fcpl, hid_t fapl) -{ - hid_t fid = -1; /* File ID */ - hid_t gid = -1; /* Group ID */ - hid_t aid = -1; /* Attribute ID */ - hid_t sid = -1; /* Dataspace ID */ - hsize_t dims[1] = {32768}; /* Attribute dimensions */ - int create_link; /* Whether to create a soft link */ - unsigned max_compact; /* Setting from fcpl */ - unsigned min_dense; /* Setting from fcpl */ - char aname[11]; /* Attribute name */ - unsigned i; /* Local index variable */ - herr_t ret; /* Generic return status */ - - /* Output message about test being performed */ - MESSAGE(5, ("Testing that attributes can always be added to named datatypes\n")); - - /* Create dataspace */ - sid = H5Screate_simple(1, dims, NULL); - CHECK(sid, FAIL, "H5Screate_simple"); - - /* Obtain attribute phase change settings */ - ret = H5Pget_attr_phase_change(fcpl, &max_compact, &min_dense); - CHECK(ret, FAIL, "H5Pget_attr_phase_change"); - - /* Run with and without the soft link */ - for (create_link = 0; create_link < 2; create_link++) { - /* Create file */ - fid = H5Fcreate(FILENAME, H5F_ACC_TRUNC, fcpl, fapl); - CHECK(fid, FAIL, "H5Fcreate"); - - /* Create second group */ - gid = H5Gcreate2(fid, "group", H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT); - CHECK(gid, FAIL, "H5Gcreate2"); - - /* Close second group */ - ret = H5Gclose(gid); - CHECK(ret, FAIL, "H5Gclose"); - - /* Open root group */ - gid = H5Gopen2(fid, "/", H5P_DEFAULT); - CHECK(gid, FAIL, "H5Gopen2"); - - /* Create enough attributes to cause a change to dense storage */ - for (i = 0; i < max_compact + 1; i++) { - /* Create attribute */ - snprintf(aname, sizeof(aname), "%u", i); - aid = H5Acreate2(gid, aname, H5T_NATIVE_CHAR, sid, H5P_DEFAULT, H5P_DEFAULT); - CHECK(aid, FAIL, "H5Acreate2"); - - /* Close attribute */ - ret = H5Aclose(aid); - CHECK(ret, FAIL, "H5Aclose"); - - /* Create enough soft links that exactly one goes into chunk 1 if - * requested */ - if (i == 0 && create_link) { - ret = H5Lcreate_soft("b", gid, "a", H5P_DEFAULT, H5P_DEFAULT); - CHECK(ret, FAIL, "H5Lcreate_soft"); - ret = H5Lcreate_soft("d", gid, "c", H5P_DEFAULT, H5P_DEFAULT); - CHECK(ret, FAIL, "H5Lcreate_soft"); - ret = H5Lcreate_soft("f", gid, "e", H5P_DEFAULT, H5P_DEFAULT); - CHECK(ret, FAIL, "H5Lcreate_soft"); - } /* end if */ - } /* end for */ - - /* Close IDs */ - ret = H5Gclose(gid); - CHECK(ret, FAIL, "H5Gclose"); - - ret = H5Fclose(fid); - CHECK(ret, FAIL, "H5Fclose"); - } /* end for */ - - /* Close dataspace */ - ret = H5Sclose(sid); - CHECK(ret, FAIL, "H5Sclose"); -} /* test_attr_bug9() */ - -/**************************************************************** -** -** test_attr_bug10(): Test basic H5A (attribute) code. -** Attempts to trigger a bug which would result in a -** segfault. Create a vlen attribute through a file -** handle, then open the same file through a different -** handle, open the same attribute through the second file -** handle, then close the second file and attribute -** handles, then write to the attribute through the first -** handle. -** -****************************************************************/ -static void -test_attr_bug10(hid_t fcpl, hid_t fapl) -{ - hid_t fid1, fid2; /* File IDs */ - hid_t aid1, aid2; /* Attribute IDs */ - hid_t sid; /* Dataspace ID */ - hid_t tid; /* Datatype ID */ - hsize_t dims[1] = {1}; /* Attribute dimensions */ - const char *wbuf[1] = {"foo"}; /* Write buffer */ - herr_t ret; /* Generic return status */ - - /* Output message about test being performed */ - MESSAGE(5, ("Testing that vlen attributes can be written to after a second file handle is closed\n")); - - /* Create dataspace */ - sid = H5Screate_simple(1, dims, NULL); - CHECK(sid, FAIL, "H5Screate_simple"); - - /* Create VL string datatype */ - tid = H5Tcopy(H5T_C_S1); - CHECK(tid, FAIL, "H5Tcreate"); - ret = H5Tset_size(tid, H5T_VARIABLE); - CHECK(ret, FAIL, "H5Tset_size"); - - /* Create file */ - fid1 = H5Fcreate(FILENAME, H5F_ACC_TRUNC, fcpl, fapl); - CHECK(fid1, FAIL, "H5Fcreate"); - - /* Create attribute on root group */ - aid1 = H5Acreate2(fid1, "attr", tid, sid, H5P_DEFAULT, H5P_DEFAULT); - CHECK(aid1, FAIL, "H5Acreate2"); - - /* Open the same file again */ - fid2 = H5Fopen(FILENAME, H5F_ACC_RDWR, fapl); - CHECK(fid2, FAIL, "H5Fcreate"); - - /* Open the same attribute through the second file handle */ - aid2 = H5Aopen(fid2, "attr", H5P_DEFAULT); - CHECK(aid2, FAIL, "H5Aopen"); - - /* Close the second attribute and file handles */ - ret = H5Aclose(aid2); - CHECK(ret, FAIL, "H5Aclose"); - ret = H5Fclose(fid2); - CHECK(ret, FAIL, "H5Fclose"); - - /* Write to the attribute through the first handle */ - ret = H5Awrite(aid1, tid, wbuf); - - /* Close IDs */ - ret = H5Aclose(aid1); - CHECK(ret, FAIL, "H5Aclose"); - - ret = H5Fclose(fid1); - CHECK(ret, FAIL, "H5Fclose"); - - ret = H5Tclose(tid); - CHECK(ret, FAIL, "H5Tclose"); - - ret = H5Sclose(sid); - CHECK(ret, FAIL, "H5Sclose"); -} /* test_attr_bug10() */ - -/**************************************************************** -** -** test_attr_delete_dense(): -** This is to verify the error as described in HDFFV-9277 -** is fixed when deleting the last "large" attribute that -** is stored densely. -** -****************************************************************/ -#if 0 /* Native VOL connector only supports large attributes with latest format */ -static void -test_attr_delete_last_dense(hid_t fcpl, hid_t fapl) -{ - hid_t fid; /* File ID */ - hid_t gid; /* Group ID */ - hid_t aid; /* Attribute ID */ - hid_t sid; /* Dataspace ID */ - hsize_t dim2[2] = {DIM0, DIM1}; /* Dimension sizes */ - int i, j; /* Local index variables */ - double *data = NULL; /* Pointer to the data buffer */ - herr_t ret; /* Generic return status */ - - /* Output message about test being performed */ - MESSAGE(5, ("Testing Deleting the last large attribute stored densely\n")); - - /* Create the file */ - fid = H5Fcreate(FILENAME, H5F_ACC_TRUNC, fcpl, fapl); - CHECK(fid, FAIL, "H5Fcreate"); - - /* Create the group */ - gid = H5Gcreate2(fid, GRPNAME, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT); - CHECK(gid, FAIL, "H5Gcreate"); - - /* Create the dataspace */ - sid = H5Screate_simple(RANK, dim2, NULL); - CHECK(sid, FAIL, "H5Screate_simple"); - - /* Attach the attribute to the group */ - aid = H5Acreate2(gid, ATTRNAME, H5T_IEEE_F64LE, sid, H5P_DEFAULT, H5P_DEFAULT); - CHECK(aid, FAIL, "H5Acreate2"); - - /* Allocate the data buffer */ - data = (double *)malloc((size_t)(DIM0 * DIM1) * sizeof(double)); - CHECK_PTR(data, "malloc"); - - /* Initialize the data */ - for (i = 0; i < DIM0; i++) - for (j = 0; j < DIM1; j++) - *(data + i * DIM1 + j) = i + j; - - /* Write to the attribute */ - ret = H5Awrite(aid, H5T_NATIVE_DOUBLE, data); - CHECK(ret, FAIL, "H5Awrite"); - - /* Closing */ - ret = H5Aclose(aid); - CHECK(ret, FAIL, "H5Aclose"); - ret = H5Sclose(sid); - CHECK(ret, FAIL, "H5Sclose"); - ret = H5Gclose(gid); - CHECK(ret, FAIL, "H5Gclose"); - ret = H5Fclose(fid); - CHECK(ret, FAIL, "H5Fclose"); - - /* Re-open the file */ - fid = H5Fopen(FILENAME, H5F_ACC_RDWR, fapl); - CHECK(fid, FAIL, "H5Fopen"); - - /* Open the group */ - gid = H5Gopen2(fid, GRPNAME, H5P_DEFAULT); - CHECK(gid, FAIL, "H5Gopen"); - - /* Delete the attribute */ - ret = H5Adelete(gid, ATTRNAME); - CHECK(ret, FAIL, "H5Adelete"); - - /* Closing */ - ret = H5Gclose(gid); - CHECK(ret, FAIL, "H5Gclose"); - ret = H5Fclose(fid); - CHECK(ret, FAIL, "H5Fclose"); - - /* Free the data buffer */ - if (data) - free(data); - -} /* test_attr_delete_last_dense() */ -#endif - -/**************************************************************** -** -** test_attr(): Main H5A (attribute) testing routine. -** -****************************************************************/ -void -test_attr(void) -{ - hid_t fapl = (-1), fapl2 = (-1); /* File access property lists */ - hid_t fcpl = (-1), fcpl2 = (-1); /* File creation property lists */ - hid_t dcpl = -1; /* Dataset creation property list */ - unsigned new_format; /* Whether to use the new format or not */ - unsigned use_shared; /* Whether to use shared attributes or not */ - unsigned minimize_dset_oh; /* Whether to use minimized dataset object headers */ - herr_t ret; /* Generic return value */ - - MESSAGE(5, ("Testing Attributes\n")); - - fapl = H5Pcreate(H5P_FILE_ACCESS); - CHECK(fapl, FAIL, "H5Pcreate"); - - /* fapl2 uses "latest version of the format" for creating objects in the file */ - fapl2 = H5Pcopy(fapl); - CHECK(fapl2, FAIL, "H5Pcopy"); - ret = H5Pset_libver_bounds(fapl2, H5F_LIBVER_LATEST, H5F_LIBVER_LATEST); - CHECK(ret, FAIL, "H5Pset_libver_bounds"); - - fcpl = H5Pcreate(H5P_FILE_CREATE); - CHECK(fcpl, FAIL, "H5Pcreate"); - - /* files with fcpl2 make all attributes ( > 1 byte) shared - * (i.e. all of them :-) */ - fcpl2 = H5Pcopy(fcpl); - CHECK(fcpl2, FAIL, "H5Pcopy"); - ret = H5Pset_shared_mesg_nindexes(fcpl2, (unsigned)1); - CHECK_I(ret, "H5Pset_shared_mesg_nindexes"); - ret = H5Pset_shared_mesg_index(fcpl2, (unsigned)0, H5O_SHMESG_ATTR_FLAG, (unsigned)1); - CHECK_I(ret, "H5Pset_shared_mesg_index"); - - dcpl = H5Pcreate(H5P_DATASET_CREATE); - CHECK(dcpl, H5I_INVALID_HID, "H5Pcreate"); - - ret = H5Pset_attr_creation_order(dcpl, H5P_CRT_ORDER_TRACKED); - CHECK(ret, FAIL, ""); - - dcpl_g = dcpl; - - for (minimize_dset_oh = 0; minimize_dset_oh <= 1; minimize_dset_oh++) { - if (minimize_dset_oh != 0) - continue; - -#if 0 - if (minimize_dset_oh == 0) { - MESSAGE(7, ("testing with default dataset object headers\n")); - dcpl_g = H5P_DEFAULT; - } - else { - MESSAGE(7, ("testing with minimzied dataset object headers\n")); - dcpl = H5Pcreate(H5P_DATASET_CREATE); - CHECK(dcpl, FAIL, "H5Pcreate"); - ret = H5Pset_dset_no_attrs_hint(dcpl, true); - CHECK_I(ret, "H5Pset_dset_no_attrs_hint"); - dcpl_g = dcpl; - } -#endif - - for (new_format = false; new_format <= true; new_format++) { - hid_t my_fapl = fapl; - - if (new_format) - continue; - -#if 0 - /* Set the FAPL for the type of format */ - if (new_format) { - MESSAGE(7, ("testing with new file format\n")); - my_fapl = fapl2; - } - else { - MESSAGE(7, ("testing with old file format\n")); - my_fapl = fapl; - } -#endif - - /* These next two tests use the same file information */ - test_attr_basic_write(my_fapl); /* Test basic H5A writing code */ - test_attr_basic_read(my_fapl); /* Test basic H5A reading code */ - - /* These next two tests use their own file information */ - test_attr_flush(my_fapl); /* Test H5A I/O in the presence of H5Fflush calls */ - test_attr_plist(my_fapl); /* Test attribute property lists */ - - /* These next two tests use the same file information */ - test_attr_compound_write(my_fapl); /* Test complex datatype H5A writing code */ - test_attr_compound_read(my_fapl); /* Test complex datatype H5A reading code */ - - /* These next two tests use the same file information */ - test_attr_scalar_write(my_fapl); /* Test scalar dataspace H5A writing code */ - test_attr_scalar_read(my_fapl); /* Test scalar dataspace H5A reading code */ - - /* These next four tests use the same file information */ - test_attr_mult_write(my_fapl); /* Test H5A writing code for multiple attributes */ - test_attr_mult_read(my_fapl); /* Test H5A reading code for multiple attributes */ - test_attr_iterate(my_fapl); /* Test H5A iterator code */ - test_attr_delete(my_fapl); /* Test H5A code for deleting attributes */ - - /* This next test uses its own file information */ - test_attr_dtype_shared(my_fapl); /* Test using shared datatypes in attributes */ - - /* This next test uses its own file information */ - test_attr_duplicate_ids(my_fapl); - - for (use_shared = false; use_shared <= true; use_shared++) { - hid_t my_fcpl; - - if (new_format == true && use_shared) { - MESSAGE(7, ("testing with shared attributes\n")); - my_fcpl = fcpl2; - } - else { - MESSAGE(7, ("testing without shared attributes\n")); - my_fcpl = fcpl; - } - - test_attr_big(my_fcpl, my_fapl); /* Test storing big attribute */ - test_attr_null_space(my_fcpl, my_fapl); /* Test storing attribute with NULL dataspace */ - test_attr_deprec(fcpl, my_fapl); /* Test deprecated API routines */ - test_attr_many(new_format, my_fcpl, my_fapl); /* Test storing lots of attributes */ - test_attr_info_null_info_pointer(my_fcpl, - my_fapl); /* Test passing a NULL attribute info pointer to - H5Aget_info(_by_name/_by_idx) */ - test_attr_rename_invalid_name( - my_fcpl, - my_fapl); /* Test passing a NULL or empty attribute name to H5Arename(_by_name) */ - test_attr_get_name_invalid_buf( - my_fcpl, my_fapl); /* Test passing NULL buffer to H5Aget_name(_by_idx) */ - - /* New attribute API routine tests */ - test_attr_info_by_idx(new_format, my_fcpl, - my_fapl); /* Test querying attribute info by index */ - test_attr_delete_by_idx(new_format, my_fcpl, my_fapl); /* Test deleting attribute by index */ - test_attr_iterate2(new_format, my_fcpl, - my_fapl); /* Test iterating over attributes by index */ - test_attr_open_by_idx(new_format, my_fcpl, my_fapl); /* Test opening attributes by index */ - test_attr_open_by_name(new_format, my_fcpl, my_fapl); /* Test opening attributes by name */ - test_attr_create_by_name(new_format, my_fcpl, my_fapl); /* Test creating attributes by name */ - - /* Tests that address specific bugs */ - test_attr_bug1(my_fcpl, my_fapl); /* Test odd allocation operations */ - test_attr_bug2(my_fcpl, my_fapl); /* Test many deleted attributes */ - test_attr_bug3(my_fcpl, my_fapl); /* Test "self referential" attributes */ - test_attr_bug4(my_fcpl, my_fapl); /* Test attributes on named datatypes */ - test_attr_bug5(my_fcpl, - my_fapl); /* Test opening/closing attributes through different file handles */ - test_attr_bug6(my_fcpl, my_fapl); /* Test reading empty attribute */ - /* test_attr_bug7 is specific to the "new" object header format, - * and in fact fails if used with the old format due to the - * attributes being larger than 64K */ - test_attr_bug8(my_fcpl, - my_fapl); /* Test attribute expanding object header with undecoded messages */ - test_attr_bug9(my_fcpl, my_fapl); /* Test large attributes converting to dense storage */ - test_attr_bug10(my_fcpl, my_fapl); /* Test writing an attribute after opening and closing - through a different file handle */ - - /* tests specific to the "new format" */ - if (new_format == true) { - /* General attribute tests */ - test_attr_dense_create(my_fcpl, my_fapl); /* Test dense attribute storage creation */ - test_attr_dense_open(my_fcpl, my_fapl); /* Test opening attributes in dense storage */ - test_attr_dense_delete(my_fcpl, my_fapl); /* Test deleting attributes in dense storage */ - test_attr_dense_rename(my_fcpl, my_fapl); /* Test renaming attributes in dense storage */ - test_attr_dense_unlink( - my_fcpl, my_fapl); /* Test unlinking object with attributes in dense storage */ - test_attr_dense_limits(my_fcpl, my_fapl); /* Test dense attribute storage limits */ - test_attr_dense_dup_ids(my_fcpl, - my_fapl); /* Test duplicated IDs for dense attribute storage */ - - /* Attribute creation order tests */ - test_attr_corder_create_basic( - my_fcpl, my_fapl); /* Test creating an object w/attribute creation order info */ - test_attr_corder_create_compact(my_fcpl, - my_fapl); /* Test compact attribute storage on an object - w/attribute creation order info */ - test_attr_corder_create_dense(my_fcpl, - my_fapl); /* Test dense attribute storage on an object - w/attribute creation order info */ - test_attr_corder_create_reopen(my_fcpl, - my_fapl); /* Test creating attributes w/reopening file from - using new format to using old format */ - test_attr_corder_transition(my_fcpl, - my_fapl); /* Test attribute storage transitions on an object - w/attribute creation order info */ - test_attr_corder_delete(my_fcpl, my_fapl); /* Test deleting object using dense storage - w/attribute creation order info */ - - /* More complex tests with exclusively both "new format" and "shared" attributes */ - if (use_shared == true) { - test_attr_shared_write( - my_fcpl, - my_fapl); /* Test writing to shared attributes in compact & dense storage */ - test_attr_shared_rename( - my_fcpl, - my_fapl); /* Test renaming shared attributes in compact & dense storage */ - test_attr_shared_delete( - my_fcpl, - my_fapl); /* Test deleting shared attributes in compact & dense storage */ - test_attr_shared_unlink(my_fcpl, my_fapl); /* Test unlinking object with shared - attributes in compact & dense storage */ - } /* if using shared attributes */ - -#if 0 /* Native VOL connector only supports large attributes with latest format */ - test_attr_delete_last_dense(my_fcpl, my_fapl); - - /* test_attr_bug7 is specific to the "new" object header format, - * and in fact fails if used with the old format due to the - * attributes being larger than 64K */ - test_attr_bug7(my_fcpl, - my_fapl); /* Test creating and deleting large attributes in ohdr chunk 0 */ -#endif - - } /* if using "new format" */ - } /* for unshared/shared attributes */ - } /* for old/new format */ - - if (minimize_dset_oh != 0) { - ret = H5Pclose(dcpl); - CHECK(ret, FAIL, "H5Pclose"); - dcpl_g = H5P_DEFAULT; - } - - } /* for default/minimized dataset object headers */ - - ret = H5Pclose(dcpl); - CHECK(ret, FAIL, "H5Pclose"); - - /* Close FCPLs */ - ret = H5Pclose(fcpl); - CHECK(ret, FAIL, "H5Pclose"); - ret = H5Pclose(fcpl2); - CHECK(ret, FAIL, "H5Pclose"); - - /* Close FAPLs */ - ret = H5Pclose(fapl); - CHECK(ret, FAIL, "H5Pclose"); - ret = H5Pclose(fapl2); - CHECK(ret, FAIL, "H5Pclose"); -} /* test_attr() */ - -/*------------------------------------------------------------------------- - * Function: cleanup_attr - * - * Purpose: Cleanup temporary test files - * - * Return: none - *------------------------------------------------------------------------- - */ -void -cleanup_attr(void) -{ - H5Fdelete(FILENAME, H5P_DEFAULT); -} |