diff options
author | Quincey Koziol <koziol@hdfgroup.org> | 2006-12-06 22:19:52 (GMT) |
---|---|---|
committer | Quincey Koziol <koziol@hdfgroup.org> | 2006-12-06 22:19:52 (GMT) |
commit | 7b368f006eea17a8b08cac9e6e79e58977edf864 (patch) | |
tree | 99e0f328dab0a6c3e602684d94aad309f339498d /src/H5A.c | |
parent | 1fa6d7cbf7062f12bdd85f896d40004f562cc439 (diff) | |
download | hdf5-7b368f006eea17a8b08cac9e6e79e58977edf864.zip hdf5-7b368f006eea17a8b08cac9e6e79e58977edf864.tar.gz hdf5-7b368f006eea17a8b08cac9e6e79e58977edf864.tar.bz2 |
[svn-r13028] Description:
Add first pass of "dense" attribute storage to objects. Lots of parts of
this are stubbed out, but all the tests are passing and I'll work on the corner
cases soon.
Eliminated several unused parameters from object header message callback
routines.
Other, miscellaneous code cleanups, etc. (and probably some things I've
forgotten about... :-)
Tested on:
FreeBSD/32 4.11 (sleipnir)
Linux/32 2.4 (heping)
AIX/32 5.? (copper)
Diffstat (limited to 'src/H5A.c')
-rw-r--r-- | src/H5A.c | 213 |
1 files changed, 57 insertions, 156 deletions
@@ -70,7 +70,6 @@ static herr_t H5A_write(H5A_t *attr, const H5T_t *mem_type, const void *buf, hid static herr_t H5A_read(const H5A_t *attr, const H5T_t *mem_type, void *buf, hid_t dxpl_id); static int H5A_get_index(H5O_loc_t *loc, const char *name, hid_t dxpl_id); static hsize_t H5A_get_storage_size(const H5A_t *attr); -static herr_t H5A_rename(H5O_loc_t *loc, const char *old_name, const char *new_name, hid_t dxpl_id); static herr_t H5A_find_idx_by_name(const void *mesg, unsigned idx, void *op_data); @@ -246,8 +245,8 @@ H5Acreate(hid_t loc_id, const char *name, hid_t type_id, hid_t space_id, HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "not a data space") /* Go do the real work for attaching the attribute to the dataset */ - if ((ret_value=H5A_create(&loc, name, type, space, plist_id, H5AC_dxpl_id)) < 0) - HGOTO_ERROR (H5E_ATTR, H5E_CANTINIT, FAIL, "unable to create attribute") + if((ret_value = H5A_create(&loc, name, type, space, plist_id, H5AC_dxpl_id)) < 0) + HGOTO_ERROR(H5E_ATTR, H5E_CANTINIT, FAIL, "unable to create attribute") done: FUNC_LEAVE_API(ret_value) @@ -361,11 +360,11 @@ H5A_create(const H5G_loc_t *loc, const char *name, const H5T_t *type, * SOHM table */ /* Data type */ if(H5SM_try_share(attr->oloc.file, dxpl_id, H5O_DTYPE_ID, attr->dt) <0) - HGOTO_ERROR(H5E_OHDR, H5E_BADMESG, FAIL, "trying to share datatype failed"); + HGOTO_ERROR(H5E_OHDR, H5E_BADMESG, FAIL, "trying to share datatype failed") /* Data space */ if(H5SM_try_share(attr->oloc.file, dxpl_id, H5O_SDSPACE_ID, attr->ds) <0) - HGOTO_ERROR(H5E_OHDR, H5E_BADMESG, FAIL, "trying to share dataspace failed"); + HGOTO_ERROR(H5E_OHDR, H5E_BADMESG, FAIL, "trying to share dataspace failed") /* Compute the size of pieces on disk. This is either the size of the @@ -463,19 +462,19 @@ H5A_find_idx_by_name(const void *_mesg, unsigned idx, void *_op_data) FUNC_ENTER_NOAPI_NOINIT_NOFUNC(H5A_find_idx_by_name) - assert(mesg); - assert(op_data); + HDassert(mesg); + HDassert(op_data); /* * Compare found attribute name to queried name and set the idx in the * callback info if names are the same. */ - if(HDstrcmp(mesg->name,op_data->name)==0) { + if(HDstrcmp(mesg->name, op_data->name) == 0) { op_data->idx = idx; - ret_value=1; + ret_value = H5_ITER_STOP; } /* end if */ else - ret_value=0; + ret_value = H5_ITER_CONT; FUNC_LEAVE_NOAPI(ret_value) } /* H5A_find_idx_by_name() */ @@ -563,7 +562,7 @@ H5Aopen_name(hid_t loc_id, const char *name) HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "no name") /* Look up the attribute for the object */ - if((idx = H5A_get_index(loc.oloc, name, H5AC_dxpl_id)) < 0) + if((idx = H5A_get_index(loc.oloc, name, H5AC_ind_dxpl_id)) < 0) HGOTO_ERROR(H5E_ATTR, H5E_BADVALUE, FAIL, "attribute not found") /* Go do the real work for opening the attribute */ @@ -725,7 +724,7 @@ H5Awrite(hid_t attr_id, hid_t type_id, const void *buf) HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "null attribute buffer") /* Go write the actual data to the attribute */ - if((ret_value = H5A_write(attr,mem_type,buf, H5AC_dxpl_id)) < 0) + if((ret_value = H5A_write(attr, mem_type, buf, H5AC_dxpl_id)) < 0) HGOTO_ERROR(H5E_ATTR, H5E_WRITEERROR, FAIL, "unable to write attribute") done: @@ -753,6 +752,7 @@ static herr_t H5A_write(H5A_t *attr, const H5T_t *mem_type, const void *buf, hid_t dxpl_id) { uint8_t *tconv_buf = NULL; /* datatype conv buffer */ + hbool_t tconv_owned = FALSE; /* Whether the datatype conv buffer is owned by attribute */ uint8_t *bkg_buf = NULL; /* temp conversion buffer */ hssize_t snelmts; /* elements in attribute */ size_t nelmts; /* elements in attribute */ @@ -761,7 +761,6 @@ H5A_write(H5A_t *attr, const H5T_t *mem_type, const void *buf, hid_t dxpl_id) size_t src_type_size; /* size of source type */ size_t dst_type_size; /* size of destination type*/ size_t buf_size; /* desired buffer size */ - int idx; /* index of attribute in object header */ herr_t ret_value = SUCCEED; FUNC_ENTER_NOAPI_NOINIT(H5A_write) @@ -770,11 +769,12 @@ H5A_write(H5A_t *attr, const H5T_t *mem_type, const void *buf, hid_t dxpl_id) HDassert(mem_type); HDassert(buf); - /* Create buffer for data to store on disk */ + /* Get # of elements for attribute's dataspace */ if((snelmts = H5S_GET_EXTENT_NPOINTS(attr->ds)) < 0) HGOTO_ERROR(H5E_ATTR, H5E_CANTCOUNT, FAIL, "dataspace is invalid") H5_ASSIGN_OVERFLOW(nelmts, snelmts, hssize_t, size_t); + /* If there's actually data elements for the attribute, make a copy of the data passed in */ if(nelmts > 0) { /* Get the memory and file datatype sizes */ src_type_size = H5T_get_size(mem_type); @@ -809,27 +809,24 @@ H5A_write(H5A_t *attr, const H5T_t *mem_type, const void *buf, hid_t dxpl_id) /* Set the pointer to the attribute data to the converted information */ attr->data = tconv_buf; + tconv_owned = TRUE; } /* end if */ /* No type conversion necessary */ else { HDassert(dst_type_size == src_type_size); - /* Allocate the attribute buffer, if there isn't one */ - if(attr->data == NULL) - if(NULL == (attr->data = H5FL_BLK_MALLOC(attr_buf, dst_type_size * nelmts))) - HGOTO_ERROR(H5E_RESOURCE, H5E_NOSPACE, FAIL, "memory allocation failed") + /* Allocate the attribute buffer, if there isn't one */ + if(attr->data == NULL) + if(NULL == (attr->data = H5FL_BLK_MALLOC(attr_buf, dst_type_size * nelmts))) + HGOTO_ERROR(H5E_RESOURCE, H5E_NOSPACE, FAIL, "memory allocation failed") - /* Copy the attribute data into the user's buffer */ - HDmemcpy(attr->data, buf, (dst_type_size * nelmts)); + /* Copy the attribute data into the user's buffer */ + HDmemcpy(attr->data, buf, (dst_type_size * nelmts)); } /* end else */ - /* Look up the attribute for the object */ - if((idx = H5A_get_index(&(attr->oloc), attr->name, dxpl_id)) < 0) - HGOTO_ERROR(H5E_ATTR, H5E_BADVALUE, FAIL, "attribute not found") - - /* Modify the attribute data */ - if(H5O_msg_write(&(attr->oloc), H5O_ATTR_ID, idx, 0, H5O_UPDATE_DATA_ONLY|H5O_UPDATE_TIME, attr, dxpl_id) < 0) - HGOTO_ERROR(H5E_ATTR, H5E_CANTINIT, FAIL, "unable to update attribute header messages") + /* Modify the attribute in the object header */ + if(H5O_attr_write(&(attr->oloc), dxpl_id, attr) < 0) + HGOTO_ERROR(H5E_ATTR, H5E_CANTINIT, FAIL, "unable to modify attribute") } /* end if */ /* Indicate the the attribute doesn't need fill-values */ @@ -841,6 +838,8 @@ done: (void)H5I_dec_ref(src_id); if(dst_id >= 0) (void)H5I_dec_ref(dst_id); + if(tconv_buf && !tconv_owned) + tconv_buf = H5FL_BLK_FREE(attr_buf, tconv_buf); if(bkg_buf) bkg_buf = H5FL_BLK_FREE(attr_buf, bkg_buf); @@ -1314,8 +1313,8 @@ H5Arename(hid_t loc_id, const char *old_name, const char *new_name) if(H5G_loc(loc_id, & loc) < 0) HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "not a location") - /* Call private function */ - if(H5A_rename(loc.oloc, old_name, new_name, H5AC_dxpl_id) < 0) + /* Call attribute rename routine */ + if(H5O_attr_rename(loc.oloc, H5AC_dxpl_id, old_name, new_name) < 0) HGOTO_ERROR(H5E_ATTR, H5E_CANTRENAME, FAIL, "can't rename attribute") done: @@ -1323,75 +1322,6 @@ done: } /* H5Arename() */ -/*------------------------------------------------------------------------- - * Function: H5A_rename - * - * Purpose: Private function for H5Arename. Rename an attribute - * - * Return: Success: Non-negative - * Failure: Negative - * - * Programmer: Raymond Lu - * October 23, 2002 - * - *------------------------------------------------------------------------- - */ -static herr_t -H5A_rename(H5O_loc_t *loc, const char *old_name, const char *new_name, hid_t dxpl_id) -{ - int seq, idx = FAIL; /* Index of attribute being querried */ - H5A_t found_attr; /* Attribute with OLD_NAME */ - herr_t ret_value = SUCCEED; /* Return value */ - - FUNC_ENTER_NOAPI_NOINIT(H5A_rename) - - /* Check arguments */ - HDassert(loc); - HDassert(old_name); - HDassert(new_name); - - /* Read in the existing attributes to check for duplicates */ - seq = 0; - while(H5O_msg_read(loc, H5O_ATTR_ID, seq, &found_attr, dxpl_id) != NULL) { - /* - * Compare found attribute name. - */ - if(HDstrcmp(found_attr.name, old_name) == 0) { - idx = seq; - break; - } - if(H5O_msg_reset(H5O_ATTR_ID, &found_attr) < 0) - HGOTO_ERROR(H5E_ATTR, H5E_CANTFREE, FAIL, "can't release attribute info") - seq++; - } /* end while */ - H5E_clear_stack(NULL); - if(idx < 0) - HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "attribute cannot be found") - - /* Copy the attribute name. */ - if(found_attr.name) - HDfree(found_attr.name); - found_attr.name = H5MM_xstrdup(new_name); - if(!found_attr.name) - HGOTO_ERROR(H5E_RESOURCE, H5E_NOSPACE, FAIL, "String copy failed") - - /* Indicate entry is not opened and the attribute doesn't need fill-values. */ - found_attr.obj_opened = FALSE; - found_attr.initialized = TRUE; - - /* Modify the attribute message */ - if(H5O_msg_write(loc, H5O_ATTR_ID, idx, 0, H5O_UPDATE_TIME, &found_attr, dxpl_id) < 0) - HGOTO_ERROR(H5E_ATTR, H5E_CANTINIT, FAIL, "unable to update attribute header messages") - - /* Close the attribute */ - if(H5A_free(&found_attr) < 0) - HGOTO_ERROR(H5E_ATTR, H5E_CANTRELEASE, FAIL, "unable to close renamed attribute") - -done: - FUNC_LEAVE_NOAPI(ret_value) -} /* end H5A_rename() */ - - /*-------------------------------------------------------------------------- NAME H5Aiterate @@ -1431,9 +1361,8 @@ herr_t H5Aiterate(hid_t loc_id, unsigned *attr_num, H5A_operator_t op, void *op_data) { H5G_loc_t loc; /* Object location */ - H5A_t found_attr; - int idx, start_idx; - herr_t ret_value = 0; + unsigned start_idx; /* Index of attribute to start iterating at */ + herr_t ret_value; /* Return value */ FUNC_ENTER_API(H5Aiterate, FAIL) H5TRACE4("e","i*Iuxx",loc_id,attr_num,op,op_data); @@ -1444,35 +1373,10 @@ H5Aiterate(hid_t loc_id, unsigned *attr_num, H5A_operator_t op, void *op_data) if(H5G_loc(loc_id, &loc) < 0) HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "not a location") - /* - * Look up the attribute for the object. Make certain the start point is - * reasonable. - */ - start_idx = idx = (attr_num ? (int)*attr_num : 0); - if(idx < 0) - HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "invalid index specified") - if(idx < H5O_msg_count(loc.oloc, H5O_ATTR_ID, H5AC_dxpl_id)) { - while(H5O_msg_read(loc.oloc, H5O_ATTR_ID, idx++, &found_attr, H5AC_dxpl_id) != NULL) { - /* - * Compare found attribute name to new attribute name reject - * creation if names are the same. - */ - if((ret_value = (op)(loc_id,found_attr.name,op_data)) != 0) { - if(H5O_msg_reset(H5O_ATTR_ID, &found_attr) < 0) - HGOTO_ERROR(H5E_ATTR, H5E_CANTFREE, FAIL, "can't release attribute info") - break; - } /* end if */ - if(H5O_msg_reset(H5O_ATTR_ID, &found_attr) < 0) - HGOTO_ERROR(H5E_ATTR, H5E_CANTFREE, FAIL, "can't release attribute info") - } /* end while */ - H5E_clear_stack(NULL); - } /* end if */ - else - if(start_idx>0) - HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "invalid index specified") - - if(attr_num) - *attr_num = (unsigned)idx; + /* Call attribute iteration routine */ + start_idx = (attr_num ? (unsigned)*attr_num : 0); + if((ret_value = H5O_attr_iterate(loc_id, loc.oloc, H5AC_ind_dxpl_id, start_idx, attr_num, op, op_data)) < 0) + HERROR(H5E_ATTR, H5E_BADITER, "error iterating over attributes"); done: FUNC_LEAVE_API(ret_value) @@ -1576,12 +1480,10 @@ done: * Programmer: Robb Matzke * Thursday, December 4, 1997 * - * Modifications: - * *------------------------------------------------------------------------- */ H5A_t * -H5A_copy(H5A_t *_new_attr, const H5A_t *old_attr, unsigned update_flags) +H5A_copy(H5A_t *_new_attr, const H5A_t *old_attr) { H5A_t *new_attr = NULL; hbool_t allocated_attr = FALSE; /* Whether the attribute was allocated */ @@ -1590,38 +1492,37 @@ H5A_copy(H5A_t *_new_attr, const H5A_t *old_attr, unsigned update_flags) FUNC_ENTER_NOAPI(H5A_copy, NULL) /* check args */ - assert(old_attr); + HDassert(old_attr); - /* get space */ + /* Allocate attribute structure */ if(_new_attr == NULL) { - /* Sanity check - We should not be only updating data if we don'y have anything */ - HDassert(!(update_flags&H5O_UPDATE_DATA_ONLY)); - if(NULL == (new_attr = H5FL_MALLOC(H5A_t))) HGOTO_ERROR(H5E_RESOURCE, H5E_NOSPACE, NULL, "memory allocation failed") allocated_attr = TRUE; } /* end if */ else - new_attr=_new_attr; + new_attr = _new_attr; - if(!(update_flags&H5O_UPDATE_DATA_ONLY)) { - /* Copy the top level of the attribute */ - *new_attr = *old_attr; + /* Copy the top level of the attribute */ + *new_attr = *old_attr; - /* Don't open the object header for a copy */ - new_attr->obj_opened = FALSE; + /* Don't open the object header for a copy */ + new_attr->obj_opened = FALSE; - /* Copy the guts of the attribute */ - new_attr->name = H5MM_xstrdup(old_attr->name); - new_attr->dt = H5T_copy(old_attr->dt, H5T_COPY_ALL); - new_attr->ds = H5S_copy(old_attr->ds, FALSE); - } /* end if */ + /* Copy the guts of the attribute */ + new_attr->name = H5MM_xstrdup(old_attr->name); + new_attr->dt = H5T_copy(old_attr->dt, H5T_COPY_ALL); + new_attr->ds = H5S_copy(old_attr->ds, FALSE); + /* XXX: Copy the object location and group path? -QAK */ + + /* Copy the attribute data, if there is any */ if(old_attr->data) { - if(!(update_flags&H5O_UPDATE_DATA_ONLY) || new_attr->data == NULL) { - if(NULL == (new_attr->data = H5FL_BLK_MALLOC(attr_buf,old_attr->data_size))) - HGOTO_ERROR(H5E_RESOURCE, H5E_NOSPACE, NULL, "memory allocation failed") - } /* end if */ - HDmemcpy(new_attr->data,old_attr->data,old_attr->data_size); + /* Allocate data buffer for new attribute */ + if(NULL == (new_attr->data = H5FL_BLK_MALLOC(attr_buf, old_attr->data_size))) + HGOTO_ERROR(H5E_RESOURCE, H5E_NOSPACE, NULL, "memory allocation failed") + + /* Copy the attribute data */ + HDmemcpy(new_attr->data, old_attr->data, old_attr->data_size); } /* end if */ /* Set the return value */ @@ -1629,12 +1530,12 @@ H5A_copy(H5A_t *_new_attr, const H5A_t *old_attr, unsigned update_flags) done: if(ret_value == NULL) { - if(new_attr!=NULL && allocated_attr) + if(new_attr != NULL && allocated_attr) (void)H5A_close(new_attr); } /* end if */ FUNC_LEAVE_NOAPI(ret_value) -} +} /* end H5A_copy() */ /*------------------------------------------------------------------------- |