From 140c0c9db2992989b9a0cb6b20589efdcc9c2184 Mon Sep 17 00:00:00 2001 From: Quincey Koziol Date: Fri, 9 Feb 2007 10:32:51 -0500 Subject: [svn-r13274] Description: Relax restriction on the "location ID" for attribute operations to allow file IDs to be used as the location ID. If a file ID is used, the attribute operations will occur on the file's root group. Tested on: FreeBSD/32 6.2 (duty) --- release_docs/RELEASE.txt | 4 ++++ src/H5A.c | 16 ++++++++-------- test/tattr.c | 31 +++++++++++++++++++++++++++---- 3 files changed, 39 insertions(+), 12 deletions(-) diff --git a/release_docs/RELEASE.txt b/release_docs/RELEASE.txt index fbe3f8f..49c9a5a 100644 --- a/release_docs/RELEASE.txt +++ b/release_docs/RELEASE.txt @@ -172,6 +172,10 @@ New Features Library: -------- + - Relaxed restrictions on attribute operations to allow a file ID to + be used as the "location ID". If a file ID is used, the attribute + operation will occur on the root group of the file. + - QAK - 2007/02/09 - Enabled the CORE driver to read an existing file depending on the setting of the backing_store for H5Pset_fapl_core and file open flags. - SLU - 2006/11/30 diff --git a/src/H5A.c b/src/H5A.c index 28e9813..116ee9e 100644 --- a/src/H5A.c +++ b/src/H5A.c @@ -239,7 +239,7 @@ H5Acreate(hid_t loc_id, const char *name, hid_t type_id, hid_t space_id, H5TRACE5("i", "isiii", loc_id, name, type_id, space_id, plist_id); /* check arguments */ - if(H5I_FILE == H5I_get_type(loc_id) || H5I_ATTR == H5I_get_type(loc_id)) + if(H5I_ATTR == H5I_get_type(loc_id)) HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "location is not valid for an attribute") if(H5G_loc(loc_id, &loc) < 0) HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "not a location") @@ -447,7 +447,7 @@ H5Aopen_name(hid_t loc_id, const char *name) H5TRACE2("i", "is", loc_id, name); /* check arguments */ - if(H5I_FILE == H5I_get_type(loc_id) || H5I_ATTR == H5I_get_type(loc_id)) + if(H5I_ATTR == H5I_get_type(loc_id)) HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "location is not valid for an attribute") if(H5G_loc(loc_id, &loc) < 0) HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "not a location") @@ -502,7 +502,7 @@ H5Aopen_idx(hid_t loc_id, unsigned idx) H5TRACE2("i", "iIu", loc_id, idx); /* check arguments */ - if(H5I_FILE == H5I_get_type(loc_id) || H5I_ATTR == H5I_get_type(loc_id)) + if(H5I_ATTR == H5I_get_type(loc_id)) HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "location is not valid for an attribute") if(H5G_loc(loc_id, &loc) < 0) HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "not a location") @@ -1296,7 +1296,7 @@ H5Aget_info(hid_t loc_id, const char *name, H5A_info_t *ainfo) FUNC_ENTER_API(H5Aget_info, FAIL) /* Check args */ - if(H5I_FILE == H5I_get_type(loc_id) || H5I_ATTR == H5I_get_type(loc_id)) + if(H5I_ATTR == H5I_get_type(loc_id)) HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "location is not valid for an attribute") if(H5G_loc(loc_id, &loc) < 0) HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "not a location") @@ -1347,7 +1347,7 @@ H5Aget_info_by_idx(hid_t loc_id, H5_index_t idx_type, H5_iter_order_t order, FUNC_ENTER_API(H5Aget_info_by_idx, FAIL) /* Check args */ - if(H5I_FILE == H5I_get_type(loc_id) || H5I_ATTR == H5I_get_type(loc_id)) + if(H5I_ATTR == H5I_get_type(loc_id)) HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "location is not valid for an attribute") if(H5G_loc(loc_id, &loc) < 0) HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "not a location") @@ -1438,7 +1438,7 @@ H5Arename(hid_t loc_id, const char *old_name, const char *new_name) /* check arguments */ if(!old_name || !new_name) HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "name is nil") - if(H5I_FILE == H5I_get_type(loc_id) || H5I_ATTR == H5I_get_type(loc_id)) + if(H5I_ATTR == H5I_get_type(loc_id)) HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "location is not valid for an attribute") if(H5G_loc(loc_id, & loc) < 0) HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "not a location") @@ -1501,7 +1501,7 @@ H5Aiterate(hid_t loc_id, unsigned *attr_num, H5A_operator_t op, void *op_data) H5TRACE4("e", "i*Iuxx", loc_id, attr_num, op, op_data); /* check arguments */ - if(H5I_FILE == H5I_get_type(loc_id) || H5I_ATTR == H5I_get_type(loc_id)) + if(H5I_ATTR == H5I_get_type(loc_id)) HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "location is not valid for an attribute") if(H5G_loc(loc_id, &loc) < 0) HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "not a location") @@ -1549,7 +1549,7 @@ H5Adelete(hid_t loc_id, const char *name) H5TRACE2("e", "is", loc_id, name); /* check arguments */ - if(H5I_FILE == H5I_get_type(loc_id) || H5I_ATTR == H5I_get_type(loc_id)) + if(H5I_ATTR == H5I_get_type(loc_id)) HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "location is not valid for an attribute") if(H5G_loc(loc_id, &loc) < 0) HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "not a location") diff --git a/test/tattr.c b/test/tattr.c index b95c9f0..a444ea5 100644 --- a/test/tattr.c +++ b/test/tattr.c @@ -164,9 +164,31 @@ test_attr_basic_write(hid_t fapl) sid2 = H5Screate_simple(ATTR1_RANK, dims2, NULL); CHECK(sid2, FAIL, "H5Screate_simple"); - /* Try to create an attribute on the file (should fail) */ - ret=H5Acreate(fid1,ATTR1_NAME,H5T_NATIVE_INT,sid2,H5P_DEFAULT); - VERIFY(ret, FAIL, "H5Acreate"); + + /* Try to create an attribute on the file (should create an attribute on root group) */ + attr = H5Acreate(fid1, ATTR1_NAME, H5T_NATIVE_INT, sid2, H5P_DEFAULT); + CHECK(attr, FAIL, "H5Acreate"); + + /* Close attribute */ + ret = H5Aclose(attr); + CHECK(ret, FAIL, "H5Aclose"); + + /* Open the root group */ + group = H5Gopen(fid1, "/"); + CHECK(group, FAIL, "H5Gopen"); + + /* Open attribute again */ + attr = H5Aopen_name(group, ATTR1_NAME); + CHECK(attr, FAIL, "H5Aopen_name"); + + /* 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=H5Acreate(dataset,ATTR1_NAME,H5T_NATIVE_INT,sid2,H5P_DEFAULT); @@ -384,7 +406,8 @@ test_attr_basic_read(hid_t fapl) CHECK(ret, FAIL, "H5Dclose"); /* Open the group */ - group=H5Gopen(fid1,GROUP1_NAME); + group = H5Gopen(fid1,GROUP1_NAME); + CHECK(group, FAIL, "H5Gopen"); /* Verify the correct number of attributes */ ret=H5Aget_num_attrs(group); -- cgit v0.12