mirror of
https://github.com/HDFGroup/hdf5.git
synced 2025-04-18 17:40:55 +08:00
[svn-r12681] Description:
Encode/decode object references in portable way. Tested on: Solaris/64 2.9 (shanti)
This commit is contained in:
parent
c77e39522b
commit
2d009f860c
358
src/H5O.c
358
src/H5O.c
@ -5048,6 +5048,186 @@ done:
|
||||
FUNC_LEAVE_NOAPI(ret_value)
|
||||
} /* end H5O_copy_header() */
|
||||
|
||||
|
||||
/*-------------------------------------------------------------------------
|
||||
* Function: H5O_copy_obj_by_ref
|
||||
*
|
||||
* Purpose: Copy the object pointed by _src_ref.
|
||||
*
|
||||
* Return: Non-negative on success/Negative on failure
|
||||
*
|
||||
* Programmer: Peter Cao
|
||||
* Aug 7 2006
|
||||
*
|
||||
*-------------------------------------------------------------------------
|
||||
*/
|
||||
static herr_t
|
||||
H5O_copy_obj_by_ref(H5O_loc_t *src_oloc, hid_t dxpl_id, H5O_loc_t *dst_oloc,
|
||||
H5G_loc_t *dst_root_loc, H5O_copy_t *cpy_info)
|
||||
{
|
||||
herr_t ret_value = SUCCEED;
|
||||
|
||||
FUNC_ENTER_NOAPI(H5O_copy_obj_by_ref, FAIL)
|
||||
|
||||
HDassert(src_oloc);
|
||||
HDassert(dst_oloc);
|
||||
|
||||
/* Perform the copy, or look up existing copy */
|
||||
if((ret_value = H5O_copy_header_map(src_oloc, dst_oloc, dxpl_id, cpy_info, FALSE)) < 0)
|
||||
HGOTO_ERROR(H5E_OHDR, H5E_CANTCOPY, FAIL, "unable to copy object")
|
||||
|
||||
/* Check if a new valid object is copied to the destination */
|
||||
if(H5F_addr_defined(dst_oloc->addr) && (ret_value > SUCCEED)) {
|
||||
char tmp_obj_name[80];
|
||||
H5G_name_t new_path;
|
||||
H5O_loc_t new_oloc;
|
||||
H5G_loc_t new_loc;
|
||||
|
||||
/* Set up group location for new object */
|
||||
new_loc.oloc = &new_oloc;
|
||||
new_loc.path = &new_path;
|
||||
H5G_loc_reset(&new_loc);
|
||||
new_oloc.file = dst_oloc->file;
|
||||
new_oloc.addr = dst_oloc->addr;
|
||||
|
||||
/* Pick a default name for the new object */
|
||||
sprintf(tmp_obj_name, "~obj_pointed_by_%llu", (unsigned long_long)dst_oloc->addr);
|
||||
|
||||
/* Create a link to the newly copied object */
|
||||
if(H5L_link(dst_root_loc, tmp_obj_name, &new_loc, H5P_DEFAULT, H5P_DEFAULT, dxpl_id) < 0)
|
||||
HGOTO_ERROR(H5E_DATATYPE, H5E_CANTINIT, FAIL, "unable to insert link")
|
||||
|
||||
H5G_loc_free(&new_loc);
|
||||
} /* if (H5F_addr_defined(dst_oloc.addr)) */
|
||||
|
||||
done:
|
||||
FUNC_LEAVE_NOAPI(ret_value)
|
||||
} /* end H5O_copy_obj_by_ref() */
|
||||
|
||||
|
||||
/*-------------------------------------------------------------------------
|
||||
* Function: H5O_copy_expand_ref
|
||||
*
|
||||
* Purpose: Copy the object pointed by _src_ref.
|
||||
*
|
||||
* Return: Non-negative on success/Negative on failure
|
||||
*
|
||||
* Programmer: Peter Cao
|
||||
* Aug 7 2006
|
||||
*
|
||||
*-------------------------------------------------------------------------
|
||||
*/
|
||||
herr_t
|
||||
H5O_copy_expand_ref(H5F_t *file_src, void *_src_ref, hid_t dxpl_id,
|
||||
H5F_t *file_dst, void *_dst_ref, size_t ref_count, H5R_type_t ref_type,
|
||||
H5O_copy_t *cpy_info)
|
||||
{
|
||||
H5O_loc_t dst_oloc; /* Copied object object location */
|
||||
H5O_loc_t src_oloc; /* Temporary object location for source object */
|
||||
H5G_loc_t dst_root_loc; /* The location of root group of the destination file */
|
||||
uint8_t *p; /* Pointer to OID to store */
|
||||
size_t i; /* Local index variable */
|
||||
herr_t ret_value = SUCCEED;
|
||||
|
||||
FUNC_ENTER_NOAPI(H5O_copy_expand_ref, FAIL)
|
||||
|
||||
/* Sanity checks */
|
||||
HDassert(file_src);
|
||||
HDassert(_src_ref);
|
||||
HDassert(file_dst);
|
||||
HDassert(_dst_ref);
|
||||
HDassert(ref_count);
|
||||
HDassert(cpy_info);
|
||||
|
||||
/* Initialize object locations */
|
||||
H5O_loc_reset(&src_oloc);
|
||||
H5O_loc_reset(&dst_oloc);
|
||||
src_oloc.file = file_src;
|
||||
dst_oloc.file = file_dst;
|
||||
|
||||
/* Set up the root group in the destination file */
|
||||
if(NULL == (dst_root_loc.oloc = H5G_oloc(H5G_rootof(file_dst))))
|
||||
HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "unable to get object location for root group")
|
||||
if(NULL == (dst_root_loc.path = H5G_nameof(H5G_rootof(file_dst))))
|
||||
HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "unable to get path for root group")
|
||||
|
||||
/* Copy object references */
|
||||
if(H5R_OBJECT == ref_type) {
|
||||
hobj_ref_t *src_ref = (hobj_ref_t *)_src_ref;
|
||||
hobj_ref_t *dst_ref = (hobj_ref_t *)_dst_ref;
|
||||
|
||||
/* Making equivalent references in the destination file */
|
||||
for(i = 0; i < ref_count; i++) {
|
||||
/* Set up for the object copy for the reference */
|
||||
p = (uint8_t *)(&src_ref[i]);
|
||||
H5F_addr_decode(src_oloc.file, (const uint8_t **)&p, &(src_oloc.addr));
|
||||
dst_oloc.addr = HADDR_UNDEF;
|
||||
|
||||
/* Attempt to copy object from source to destination file */
|
||||
if(H5O_copy_obj_by_ref(&src_oloc, dxpl_id, &dst_oloc, &dst_root_loc, cpy_info) < 0)
|
||||
HGOTO_ERROR(H5E_OHDR, H5E_CANTCOPY, FAIL, "unable to copy object")
|
||||
|
||||
/* Set the object reference info for the destination file */
|
||||
p = (uint8_t *)(&dst_ref[i]);
|
||||
H5F_addr_encode(dst_oloc.file, &p, dst_oloc.addr);
|
||||
} /* end for */
|
||||
} /* end if */
|
||||
/* Copy region references */
|
||||
else if(H5R_DATASET_REGION == ref_type) {
|
||||
hdset_reg_ref_t *src_ref = (hdset_reg_ref_t *)_src_ref;
|
||||
hdset_reg_ref_t *dst_ref = (hdset_reg_ref_t *)_dst_ref;
|
||||
uint8_t *buf; /* Buffer to store serialized selection in */
|
||||
H5HG_t hobjid; /* Heap object ID */
|
||||
size_t buf_size; /* Length of object in heap */
|
||||
|
||||
/* Making equivalent references in the destination file */
|
||||
for(i = 0; i < ref_count; i++) {
|
||||
/* Get the heap ID for the dataset region */
|
||||
p = (uint8_t *)(&src_ref[i]);
|
||||
H5F_addr_decode(src_oloc.file, (const uint8_t **)&p, &(hobjid.addr));
|
||||
INT32DECODE(p, hobjid.idx);
|
||||
|
||||
/* Get the dataset region from the heap (allocate inside routine) */
|
||||
if((buf = H5HG_read(src_oloc.file, dxpl_id, &hobjid, NULL, &buf_size)) == NULL)
|
||||
HGOTO_ERROR(H5E_REFERENCE, H5E_READERROR, FAIL, "Unable to read dataset region information")
|
||||
|
||||
/* Get the object oid for the dataset */
|
||||
p = (uint8_t *)buf;
|
||||
H5F_addr_decode(src_oloc.file, (const uint8_t **)&p, &(src_oloc.addr));
|
||||
dst_oloc.addr = HADDR_UNDEF;
|
||||
|
||||
/* copy the object pointed by the ref to the destination */
|
||||
if(H5O_copy_obj_by_ref(&src_oloc, dxpl_id, &dst_oloc, &dst_root_loc, cpy_info) < 0) {
|
||||
H5MM_xfree(buf);
|
||||
HGOTO_ERROR(H5E_OHDR, H5E_CANTCOPY, FAIL, "unable to copy object")
|
||||
} /* end if */
|
||||
|
||||
/* Serialize object ID */
|
||||
p = (uint8_t *)buf;
|
||||
H5F_addr_encode(dst_oloc.file, &p, dst_oloc.addr);
|
||||
|
||||
/* Save the serialized buffer to the destination */
|
||||
if(H5HG_insert(dst_oloc.file, dxpl_id, buf_size, buf, &hobjid) < 0) {
|
||||
H5MM_xfree(buf);
|
||||
HGOTO_ERROR(H5E_OHDR, H5E_CANTCOPY, FAIL, "Unable to write dataset region information")
|
||||
} /* end if */
|
||||
|
||||
/* Set the dataset region reference info for the destination file */
|
||||
p = (uint8_t *)(&dst_ref[i]);
|
||||
H5F_addr_encode(dst_oloc.file, &p, hobjid.addr);
|
||||
INT32ENCODE(p, hobjid.idx);
|
||||
|
||||
/* Free the buffer allocated in H5HG_read() */
|
||||
H5MM_xfree(buf);
|
||||
} /* end for */
|
||||
} /* end if */
|
||||
else
|
||||
HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "invalid reference type")
|
||||
|
||||
done:
|
||||
FUNC_LEAVE_NOAPI(ret_value)
|
||||
} /* end H5O_copy_expand_ref() */
|
||||
|
||||
|
||||
/*-------------------------------------------------------------------------
|
||||
* Function: H5O_debug_id
|
||||
@ -5265,184 +5445,6 @@ done:
|
||||
FUNC_LEAVE_NOAPI(ret_value)
|
||||
} /* end H5O_debug_real() */
|
||||
|
||||
|
||||
/*-------------------------------------------------------------------------
|
||||
* Function: H5O_copy_obj_by_ref
|
||||
*
|
||||
* Purpose: Copy the object pointed by _src_ref.
|
||||
*
|
||||
* Return: Non-negative on success/Negative on failure
|
||||
*
|
||||
* Programmer: Peter Cao
|
||||
* Aug 7 2006
|
||||
*
|
||||
*-------------------------------------------------------------------------
|
||||
*/
|
||||
static herr_t
|
||||
H5O_copy_obj_by_ref(H5O_loc_t *src_oloc, hid_t dxpl_id, H5O_loc_t *dst_oloc,
|
||||
H5G_loc_t *dst_root_loc, H5O_copy_t *cpy_info)
|
||||
{
|
||||
herr_t ret_value = SUCCEED;
|
||||
|
||||
FUNC_ENTER_NOAPI(H5O_copy_obj_by_ref, FAIL)
|
||||
|
||||
HDassert(src_oloc);
|
||||
HDassert(dst_oloc);
|
||||
|
||||
/* Perform the copy, or look up existing copy */
|
||||
if((ret_value = H5O_copy_header_map(src_oloc, dst_oloc, dxpl_id, cpy_info, FALSE)) < 0)
|
||||
HGOTO_ERROR(H5E_OHDR, H5E_CANTCOPY, FAIL, "unable to copy object")
|
||||
|
||||
/* Check if a new valid object is copied to the destination */
|
||||
if(H5F_addr_defined(dst_oloc->addr) && (ret_value > SUCCEED)) {
|
||||
char tmp_obj_name[80];
|
||||
H5G_name_t new_path;
|
||||
H5O_loc_t new_oloc;
|
||||
H5G_loc_t new_loc;
|
||||
|
||||
/* Set up group location for new object */
|
||||
new_loc.oloc = &new_oloc;
|
||||
new_loc.path = &new_path;
|
||||
H5G_loc_reset(&new_loc);
|
||||
new_oloc.file = dst_oloc->file;
|
||||
new_oloc.addr = dst_oloc->addr;
|
||||
|
||||
/* Pick a default name for the new object */
|
||||
sprintf(tmp_obj_name, "~obj_pointed_by_%llu", (unsigned long_long)dst_oloc->addr);
|
||||
|
||||
/* Create a link to the newly copied object */
|
||||
if(H5L_link(dst_root_loc, tmp_obj_name, &new_loc, H5P_DEFAULT, H5P_DEFAULT, dxpl_id) < 0)
|
||||
HGOTO_ERROR(H5E_DATATYPE, H5E_CANTINIT, FAIL, "unable to insert link")
|
||||
|
||||
H5G_loc_free(&new_loc);
|
||||
} /* if (H5F_addr_defined(dst_oloc.addr)) */
|
||||
|
||||
done:
|
||||
FUNC_LEAVE_NOAPI(ret_value)
|
||||
} /* end H5O_copy_obj_by_ref() */
|
||||
|
||||
|
||||
/*-------------------------------------------------------------------------
|
||||
* Function: H5O_copy_expand_ref
|
||||
*
|
||||
* Purpose: Copy the object pointed by _src_ref.
|
||||
*
|
||||
* Return: Non-negative on success/Negative on failure
|
||||
*
|
||||
* Programmer: Peter Cao
|
||||
* Aug 7 2006
|
||||
*
|
||||
*-------------------------------------------------------------------------
|
||||
*/
|
||||
herr_t
|
||||
H5O_copy_expand_ref(H5F_t *file_src, void *_src_ref, hid_t dxpl_id,
|
||||
H5F_t *file_dst, void *_dst_ref, size_t ref_count, H5R_type_t ref_type,
|
||||
H5O_copy_t *cpy_info)
|
||||
{
|
||||
H5O_loc_t dst_oloc; /* Copied object object location */
|
||||
H5O_loc_t src_oloc; /* Temporary object location for source object */
|
||||
H5G_loc_t dst_root_loc; /* The location of root group of the destination file */
|
||||
size_t i; /* Local index variable */
|
||||
herr_t ret_value = SUCCEED;
|
||||
|
||||
FUNC_ENTER_NOAPI(H5O_copy_expand_ref, FAIL)
|
||||
|
||||
/* Sanity checks */
|
||||
HDassert(file_src);
|
||||
HDassert(_src_ref);
|
||||
HDassert(file_dst);
|
||||
HDassert(_dst_ref);
|
||||
HDassert(ref_count);
|
||||
HDassert(cpy_info);
|
||||
|
||||
/* Initialize object locations */
|
||||
H5O_loc_reset(&src_oloc);
|
||||
H5O_loc_reset(&dst_oloc);
|
||||
src_oloc.file = file_src;
|
||||
dst_oloc.file = file_dst;
|
||||
|
||||
/* Set up the root group in the destination file */
|
||||
if(NULL == (dst_root_loc.oloc = H5G_oloc(H5G_rootof(file_dst))))
|
||||
HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "unable to get object location for root group")
|
||||
if(NULL == (dst_root_loc.path = H5G_nameof(H5G_rootof(file_dst))))
|
||||
HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "unable to get path for root group")
|
||||
|
||||
/* Copy object references */
|
||||
if(H5R_OBJECT == ref_type) {
|
||||
hobj_ref_t *src_ref = (hobj_ref_t *)_src_ref;
|
||||
hobj_ref_t *dst_ref = (hobj_ref_t *)_dst_ref;
|
||||
|
||||
/* Making equivalent references in the destination file */
|
||||
for(i = 0; i < ref_count; i++) {
|
||||
/* Set up for the object copy for the reference */
|
||||
src_oloc.addr = src_ref[i];
|
||||
dst_oloc.addr = HADDR_UNDEF;
|
||||
|
||||
/* Attempt to copy object from source to destination file */
|
||||
if(H5O_copy_obj_by_ref(&src_oloc, dxpl_id, &dst_oloc, &dst_root_loc, cpy_info) < 0)
|
||||
HGOTO_ERROR(H5E_OHDR, H5E_CANTCOPY, FAIL, "unable to copy object")
|
||||
|
||||
/* Set the object reference info for the destination file */
|
||||
dst_ref[i] = dst_oloc.addr;
|
||||
} /* end for */
|
||||
} /* end if */
|
||||
/* Copy region references */
|
||||
else if(H5R_DATASET_REGION == ref_type) {
|
||||
hdset_reg_ref_t *src_ref = (hdset_reg_ref_t *)_src_ref;
|
||||
hdset_reg_ref_t *dst_ref = (hdset_reg_ref_t *)_dst_ref;
|
||||
uint8_t *buf; /* Buffer to store serialized selection in */
|
||||
uint8_t *p; /* Pointer to OID to store */
|
||||
H5HG_t hobjid; /* Heap object ID */
|
||||
size_t buf_size; /* Length of object in heap */
|
||||
|
||||
/* Making equivalent references in the destination file */
|
||||
for(i = 0; i < ref_count; i++) {
|
||||
/* Get the heap ID for the dataset region */
|
||||
p = (uint8_t *)(&src_ref[i]);
|
||||
H5F_addr_decode(src_oloc.file, (const uint8_t **)&p, &(hobjid.addr));
|
||||
INT32DECODE(p, hobjid.idx);
|
||||
|
||||
/* Get the dataset region from the heap (allocate inside routine) */
|
||||
if((buf = H5HG_read(src_oloc.file, dxpl_id, &hobjid, NULL, &buf_size)) == NULL)
|
||||
HGOTO_ERROR(H5E_REFERENCE, H5E_READERROR, FAIL, "Unable to read dataset region information")
|
||||
|
||||
/* Get the object oid for the dataset */
|
||||
p = (uint8_t *)buf;
|
||||
H5F_addr_decode(src_oloc.file, (const uint8_t **)&p, &(src_oloc.addr));
|
||||
dst_oloc.addr = HADDR_UNDEF;
|
||||
|
||||
/* copy the object pointed by the ref to the destination */
|
||||
if(H5O_copy_obj_by_ref(&src_oloc, dxpl_id, &dst_oloc, &dst_root_loc, cpy_info) < 0) {
|
||||
H5MM_xfree(buf);
|
||||
HGOTO_ERROR(H5E_OHDR, H5E_CANTCOPY, FAIL, "unable to copy object")
|
||||
} /* end if */
|
||||
|
||||
/* Serialize object ID */
|
||||
p = (uint8_t *)buf;
|
||||
H5F_addr_encode(dst_oloc.file, &p, dst_oloc.addr);
|
||||
|
||||
/* Save the serialized buffer to the destination */
|
||||
if(H5HG_insert(dst_oloc.file, dxpl_id, buf_size, buf, &hobjid) < 0) {
|
||||
H5MM_xfree(buf);
|
||||
HGOTO_ERROR(H5E_OHDR, H5E_CANTCOPY, FAIL, "Unable to write dataset region information")
|
||||
} /* end if */
|
||||
|
||||
/* Set the dataset region reference info for the destination file */
|
||||
p = (uint8_t *)(&dst_ref[i]);
|
||||
H5F_addr_encode(dst_oloc.file, &p, hobjid.addr);
|
||||
INT32ENCODE(p, hobjid.idx);
|
||||
|
||||
/* Free the buffer allocated in H5HG_read() */
|
||||
H5MM_xfree(buf);
|
||||
} /* end for */
|
||||
} /* end if */
|
||||
else
|
||||
HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "invalid reference type")
|
||||
|
||||
done:
|
||||
FUNC_LEAVE_NOAPI(ret_value)
|
||||
} /* end H5O_copy_expand_ref() */
|
||||
|
||||
|
||||
/*-------------------------------------------------------------------------
|
||||
* Function: H5O_debug
|
||||
|
Loading…
x
Reference in New Issue
Block a user