summaryrefslogtreecommitdiffstats
path: root/src/H5Glink.c
diff options
context:
space:
mode:
authorQuincey Koziol <koziol@hdfgroup.org>2006-11-14 02:29:15 (GMT)
committerQuincey Koziol <koziol@hdfgroup.org>2006-11-14 02:29:15 (GMT)
commit0b1bb5bda1296bb89d48c7542883ea25a5fb2174 (patch)
tree563f70f8b154cb91adeb3026932a93dd1cea4e41 /src/H5Glink.c
parentf494ab7674dc39225deb4a06ba211f82f3e9df5e (diff)
downloadhdf5-0b1bb5bda1296bb89d48c7542883ea25a5fb2174.zip
hdf5-0b1bb5bda1296bb89d48c7542883ea25a5fb2174.tar.gz
hdf5-0b1bb5bda1296bb89d48c7542883ea25a5fb2174.tar.bz2
[svn-r12907] Description:
Finish refactoring internal link deletion code, to make it possible to wrap up the H5Ldelete_by_idx() coding. Tested on: Linxu/32 2.6 (chicago) Linxu/64 2.6 (chicago2)
Diffstat (limited to 'src/H5Glink.c')
-rw-r--r--src/H5Glink.c81
1 files changed, 45 insertions, 36 deletions
diff --git a/src/H5Glink.c b/src/H5Glink.c
index 9144096..0bcf5b9 100644
--- a/src/H5Glink.c
+++ b/src/H5Glink.c
@@ -237,7 +237,7 @@ H5G_link_convert(H5F_t *f, hid_t dxpl_id, H5O_link_t *lnk, haddr_t lheap_addr,
/* Object is a symbolic or hard link */
if(ent->type == H5G_CACHED_SLINK) {
const char *s; /* Pointer to link value */
- const H5HL_t *heap; /* Pointer to local heap for group */
+ H5HL_t *heap; /* Pointer to local heap for group */
/* Lock the local heap */
if(NULL == (heap = H5HL_protect(f, dxpl_id, lheap_addr)))
@@ -437,50 +437,59 @@ done:
*-------------------------------------------------------------------------
*/
herr_t
-H5G_link_obj_type(H5F_t *file, hid_t dxpl_id, const H5O_link_t *lnk,
- H5G_obj_t *obj_type)
+H5G_link_name_replace(H5F_t *file, hid_t dxpl_id, H5RS_str_t *grp_full_path_r,
+ const char *lnk_name, H5L_type_t lnk_type, haddr_t lnk_addr)
{
+ H5RS_str_t *obj_path_r = NULL; /* Full path for link being removed */
+ H5G_obj_t obj_type; /* Type of link/object being deleted */
herr_t ret_value = SUCCEED; /* Return value */
- FUNC_ENTER_NOAPI(H5G_link_obj_type, FAIL)
+ FUNC_ENTER_NOAPI(H5G_link_name_replace, FAIL)
/* check arguments */
HDassert(file);
- HDassert(lnk);
- /* Check if we are able to retrieve the object's type */
- if(obj_type) {
- /* Look up the object type for each type of link */
- switch(lnk->type) {
- case H5L_TYPE_HARD:
- {
- H5O_loc_t tmp_oloc; /* Temporary object location */
-
- /* Build temporary object location */
- tmp_oloc.file = file;
- tmp_oloc.addr = lnk->u.hard.addr;
-
- /* Get the type of the object */
- /* Note: no way to check for error :-( */
- *obj_type = H5O_obj_type(&tmp_oloc, dxpl_id);
- }
- break;
-
- case H5L_TYPE_SOFT:
- /* Get the object's type */
- *obj_type = H5G_LINK;
- break;
-
- default: /* User-defined link */
- if(lnk->type < H5L_TYPE_UD_MIN)
- HGOTO_ERROR(H5E_SYM, H5E_BADVALUE, FAIL, "unknown link type")
-
- /* Get the object's type */
- *obj_type = H5G_UDLINK;
- } /* end switch */
+ /* Look up the object type for each type of link */
+ switch(lnk_type) {
+ case H5L_TYPE_HARD:
+ {
+ H5O_loc_t tmp_oloc; /* Temporary object location */
+
+ /* Build temporary object location */
+ tmp_oloc.file = file;
+ tmp_oloc.addr = lnk_addr;
+
+ /* Get the type of the object */
+ if(H5G_UNKNOWN == (obj_type = H5O_obj_type(&tmp_oloc, dxpl_id)))
+ HGOTO_ERROR(H5E_SYM, H5E_CANTGET, FAIL, "unable to determine object type")
+ }
+ break;
+
+ case H5L_TYPE_SOFT:
+ /* Get the object's type */
+ obj_type = H5G_LINK;
+ break;
+
+ default: /* User-defined link */
+ if(lnk_type < H5L_TYPE_UD_MIN)
+ HGOTO_ERROR(H5E_SYM, H5E_BADVALUE, FAIL, "unknown link type")
+
+ /* Get the object's type */
+ obj_type = H5G_UDLINK;
+ } /* end switch */
+
+ /* Search the open IDs and replace names for unlinked object */
+ if(grp_full_path_r) {
+ obj_path_r = H5G_build_fullpath_refstr_str(grp_full_path_r, lnk_name);
+ if(H5G_name_replace(obj_type, file, obj_path_r,
+ NULL, NULL, NULL, H5G_NAME_DELETE) < 0)
+ HGOTO_ERROR(H5E_SYM, H5E_CANTDELETE, FAIL, "unable to replace name")
} /* end if */
done:
+ if(obj_path_r)
+ H5RS_decr(obj_path_r);
+
FUNC_LEAVE_NOAPI(ret_value)
-} /* end H5G_link_obj_type() */
+} /* end H5G_link_name_replace() */