NOTE: The netcdf-hdf
mailing list is no longer active. The list archives are made available for historical reasons.
Hi all, I've spent some time updating my previous draft of changes to the group API as a result of the changes necessary to provide "creation order" support for users. I've attached the original version and the updated 2nd draft below. Please send me feedback, as I'll be starting coding on this soon. Quincey
NOTE #1: These changes are mainly ramifications from the addition of an [optional] index that allows applications to access objects in a group according to the order they were created. NOTE #2: We still need to decide on scheme for re-naming existing functions when their parameters change. Existing API routine changes: ============================ Old Name: Purpose: Change: ========= ======== ====== H5Gcreate Create new group Will need to drop 'size_hint' parameter and acquire "group creation" and "group access" property lists H5Gopen Open an existing Add "group access" property group list H5Gclose Close a group ID <none> H5Gset_comment Set a "comment" on a <none> (deprecated) group H5Gget_comment Get the "comment" on a <none> (deprecated) group H5Glink/H5Glink2 Creates a link to an <none> object in another group by name in the other group H5Gmode/H5Gmove2 Renames a link to an <none> object in current group by name H5Giterate Iterate through objects Change to allow choice of which in a group, with user index to use (and direction?). callback routine H5Gget_objinfo Retrieve information Update H5G_stat_t with any new about an object in a information. Possibly add group H5Gget_objinfo_by_idx routine? Absorb H5Gget_<foo>_by_idx routines? H5Gget_num_objs Retrieve number of <none> objects in a group H5Gget_objname_by_idx Retrieve name of n'th Needs a "type of index" object in a group, parameter, in order to choose according to link name index to use to compute the order "n'th object" of. H5Gget_objtype_by_idx Retrieve type of n'th Needs a "type of index" object in a group, parameter, in order to choose according to link name index to use to compute the order "n'th object" of. Added API routines: ================== Name: Purpose: ========= ======= H5Glink_order Create a link to an object in another group by creation order in the other group. H5Gunlink_order Remove the n'th object (by creation order) in a group. H5Gchange_time Change the creation time of an object in a group, potentially changing its position in creation order. H5Gget_linkval_by_idx Retrieve the link information about a soft link, using the order with an index. H5Gopen_by_idx Open the n'th object in a group, accordding to the order with an index. New property lists: ================== Name: Purpose: ===== ======= "Group Creation" Control various parameters of a group, like it's B-tree properties and whether it has an index allowing it track the order that objects are created. Possibly other parameters as well. "Group Access" Control various parameters of accessing a group, like possibly the default index to use for various operations, etc.
NOTE #1: These changes are mainly ramifications from the addition of an [optional] index that allows applications to access objects in a group according to the time the object (or link) was created. NOTE #1a: We will track creation order as the offset into an index on the creation time of an object/link. The creation time of an object/link will be encoded as three parts: the number of seconds since the UNIX epoch when the object was created (as a signed 64-bit number), the number of nanoseconds since the second (as an unsigned 32-bit number) and a "counter" field (as an unsigned 32-bit number). The counter field is needed due to the lack of actual nanosecond granularity of most system clocks which could allow objects to appear be created at the same second/nanosecond. If the same second/nanosecond would be used to create a new link, the counter value will be incremented until a unique second/nanosecond/counter triplet is arrived at. NOTE #1b: We could create create a little API for these unique timestamps, that used the algorithm above. This might be nice for users who want to timestamp various events that occur. However, we will have to do some additional work to make this work in parallel. Additionally, this may be a problem for us, since users will want to store these in a file and would assume that we should provide a datatype for them, etc. NOTE #2: If a multiple indices are active in a group when objects are created in that group (with H5Dcreate(), etc.), they will automatically be updated to include the newly created object. NOTE #3: We still need to decide on scheme for re-naming existing functions when their parameters change. ===================== Existing API routines: ===================== -------------------------------------------------------------------------------- Current Name: H5Gclose Prototype: herr_t H5Gclose(hid_t group_id); Purpose: Close a group ID from H5Gcreate() or H5Gopen() API Change: <none> Behavior Change: <none> -------------------------------------------------------------------------------- Current Name: H5Gcreate Prototype: hid_t H5Gcreate(hid_t loc_id, const char *name, size_t size_hint); Purpose: Create new group API Change: Will need to drop 'size_hint' parameter and acquire "group creation" and "group access" property list ID parameters. Behavior Change: Property list settings will determine behavior changes. -------------------------------------------------------------------------------- Current Name: H5Gget_comment Prototype: int H5Gget_comment(hid_t loc_id, const char *name, size_t bufsize, char *buf); Purpose: Get the "comment" on a group. API Change: <none> Behavior Change: <none> (deprecated) -------------------------------------------------------------------------------- Current Name: H5Gget_linkval Prototype: herr_t H5Gget_linkval(hid_t loc_id, const char *name, size_t size, char *buf/*out*/); Purpose: Retrieves the "link value" for a soft link in a group API Change: <none> Behavior Change: Will need to retrieve the "link value" of new "external" link type Possibly add H5Gget_linkval_by_idx routine? -------------------------------------------------------------------------------- Current Name: H5Gget_num_objs Prototype: herr_t H5Gget_num_objs(hid_t loc_id, hsize_t *num_objs); Purpose: Retrieve number of objects in a group API Change: <none> Behavior Change: <none> -------------------------------------------------------------------------------- Current Name: H5Gget_objinfo Prototype: herr_t H5Gget_objinfo(hid_t loc_id, const char *name, hbool_t follow_link, H5G_stat_t *statbuf/*out*/); Purpose: Retrieve information about a link in a group API Change: Update H5G_stat_t with any new information. (Including creation time, etc) Behavior Change: Possibly add H5Gget_objinfo_by_idx routine? (Absorb H5Gget_<foo>_by_idx routines, if so?) -------------------------------------------------------------------------------- Current Name: H5Gget_objname_by_idx Prototype: ssize_t H5Gget_objname_by_idx(hid_t loc_id, hsize_t idx, char* name, size_t size); Purpose: Retrieve name of n'th object in a group. API Change: <none> Behavior Change: Choice of which index to use (and direction of use) will be determined by group access property list used in group create or open call. -------------------------------------------------------------------------------- Current Name: H5Gget_objtype_by_idx Prototype: H5G_obj_t H5Gget_objtype_by_idx(hid_t loc_id, hsize_t idx); Purpose: Retrieve type of n'th object in a group. API Change: <none> Behavior Change: Choice of which index to use (and direction of use) will be determined by group access property list used in group create or open call. -------------------------------------------------------------------------------- Current Name: H5Giterate Prototype: herr_t H5Giterate(hid_t loc_id, const char *name, int *idx, H5G_iterate_t op, void *op_data); Purpose: Iterate through objects in a group, with user callback routine. API Change: Change "int *idx" to "hsize_t *idx". Change to iterating over the objects in the "loc_id" instead of the objects in the object pointed to by loc_id/name (and drop the "name" parameter). Behavior Change: Choice of which index to use (and direction of use) will be determined by group access property list used in group create or open call. Possibly allow recursive iteration through groups within current group? (Which would require an API change) Possibly allow use of regex for determining which objects to iterate over? (Maybe with a new API routine?) -------------------------------------------------------------------------------- Current Name: H5Glink/H5Glink2 Prototype: herr_t H5Glink(hid_t src_loc, const char *cur_name, H5G_link_t type, const char *new_name); herr_t H5Glink2(hid_t src_loc, const char *src_name, H5G_link_t type, hid_t dst_loc, const char *dst_name); Purpose: Creates a link to an object in another group, using names (as opposed to another type of index). API Change: H5G_link_t will need to be expanded to include new "external" link type. We could add a property list to this routine to allow future link information (access control information, etc.) to be set for the new link. Behavior Change: This routine will need to create the new "external" link type, which allows links to point to objects in other HDF5 files. The new link will automatically be assigned a creation time and inserted into the creation time index (if a creation time index is active for the group) when the new link is created. -------------------------------------------------------------------------------- Current Name: H5Gmove/H5Gmove2 Prototype: herr_t H5Gmove(hid_t src_loc, const char *src, const char *dst); herr_t H5Gmove2(hid_t src_loc, const char *src, hid_t dst_loc, const char *dst); Purpose: Renames a link to an object in current group, using names (as opposed to another type of index). API Change: <none> We could add a property list to this routine to control how other link information (creation time and other link information/behavior we haven't thought of yet) will be set/modified for this link as it is moved. Behavior Change: When a link is moved (ie. renamed) within a group, it's creation time is _not_ changed (and thus it's offset in the creation time index for that group is the same). If the link is moved to another group, the link's creation time "counter" field may be modifed if existing object(s) in the destination group have duplicate creation second/nanosecond values. The counter field of the new link will be modified in that case to be a value one greater than the highest counter for any object with that second/nanosecond. The link will be inserted into the destination group's creation time index (if a creation time index is active for that group). Generally speaking, moving a link within a group or to another group should not modify any other aspect of the link information aside from the name of the link. -------------------------------------------------------------------------------- Current Name: H5Gopen Prototype: hid_t H5Gopen(hid_t loc_id, const char *name); Purpose: Open an existing group API Change: Add "group access" property list parameter Behavior Change: Property list settings will determine behavior changes. -------------------------------------------------------------------------------- Current Name: H5Gset_comment Prototype: herr_t H5Gset_comment(hid_t loc_id, const char *name, const char *comment); Purpose: Set a "comment" on a group. API Change: <none> Behavior Change: <none> (deprecated) -------------------------------------------------------------------------------- Current Name: H5Gunlink Prototype: herr_t H5Gunlink(hid_t loc_id, const char *name); Purpose: Removes a link from a group to an object API Change: <none> Behavior Change: <none> -------------------------------------------------------------------------------- ================== Added API routines: ================== -------------------------------------------------------------------------------- Current Name: H5Gset_create_time Prototype: herr_t H5Gset_create_time(hid_t loc_id, const char *name, int64_t new_seconds, uint32_t new_nanoseconds); Purpose: Change the creation time of a link in a group (which may cause its location in a creation time index to change). If a creation time second/nanosecond is chosen which is already used by another link in the group, the counter field is used to internally disambiguate the two links. This routine is analogous to H5Gmove2, only operating on the creation time index instead of the name index. -------------------------------------------------------------------------------- Current Name: H5Glink_by_idx Prototype: herr_t H5Glink_by_idx(hid_t src_loc, const char *src_name, H5G_link_t type, hid_t dst_loc, hsize_t dst_idx); Purpose: Create a link to an object in another group by index order. Is this routine useful? -------------------------------------------------------------------------------- Current Name: H5Gunlink_by_idx Prototype: herr_t H5Gunlink(hid_t loc_id, hsize_t idx); Purpose: Remove the n'th object (by current index order) in a group. -------------------------------------------------------------------------------- Current Name: H5Gopen_by_idx Prototype: herr_t H5Gopen_by_idx(hid_t loc_id, hsize_t idx); Purpose: Open the n'th object in a group, according to the order with an index. Or, should this be H5Dopen_by_idx, etc? (Which is how our APIs currently work) -------------------------------------------------------------------------------- Current Name: H5Gget_num_indices Prototype: herr_t H5Gget_num_indices(hid_t loc_id, unsigned *num_idx); Purpose: Determine the number of indices available on links of a group -------------------------------------------------------------------------------- Current Name: H5Gget_index_type Prototype: herr_t H5Gget_index_type(hid_t loc_id, unsigned idx, H5G_index_t *type); Purpose: Determine the type of the n'th index on links of a group -------------------------------------------------------------------------------- New property lists: ================== Name: Purpose: ===== ======= "Group Creation" Control various parameters of a group, like it's B-tree properties and whether it has an index allowing it track the order that objects are created. Possibly other parameters as well. "Group Access" Control various parameters of accessing a group, like the default index to use for various operations, etc. Interesting ideas: ================= - Make routines that operate on key of index more generic? - Accept name if index is on names, accept creation time if index is on creation time, etc. We would do this by accepting a "void *" instead of a "char *" and interpreting the value pointed to as a string or a time, based on the index chosen for that group ID. - Affected routines: - H5Gget_linkval - H5Gget_objinfo - H5Giterate (?) - H5Glink/H5Glink2 (?) - H5Gmove/H5Gmove2 (?) - H5Gopen - H5Gunlink - Allow which group is the "root" group to be changed
netcdf-hdf
archives: