NOTICE: This version of the NSF Unidata web site (archive.unidata.ucar.edu) is no longer being updated.
Current content can be found at unidata.ucar.edu.

To learn about what's going on, see About the Archive Site.

Re: Updated group API changes draft

NOTE: The netcdf-hdf mailing list is no longer active. The list archives are made available for historical reasons.

Quincey,

Naturally you're more familiar with the HDF5 interface than I am. I've
read your documents and just have a couple of comments/questions:

1 - I gather you are using a time-stamp instead of an index. Have you
considered what will happen if two different machines add a
dataset/variable to the same netcdf-4 file, and their clocks are
wrong?  Or lets say I change the time on my machine and then open the
file and add a variable. Did I just break the creation order?

2 - I will never need to go backwards through the list. When I read an
unknown file, I read in all metadata in one pass into internal
netcdf-4 structs. So I only need to go through each group in forward
order.

3 - As I understand it, this applies on a group by group basis. That
is, I will be able to open a group, and cycle through it's objects in
their creation order. Then I can open another group and find *its*
objects, in creation order. Is that correct?

4 - I don't use H5GIterate at all, so it doesn't have to be modified
for me. Below I show the code I use. It's in nc4hdf.c, as are most of
the HDF5 calls in netcdf-4. (Pertinent code is included below).

5 - From the "group access" property list part, I'm getting the idea
that I can write a HDF5 file with a bunch of datasets, then open it,
and by opening the group with the proper "group access" property, I
can get the objects in creation order. In other words, I don't have to
take any special effort in creating the HDF5 file, the creation order
is stored always. Is that correct?

6 - Here's the code I have now. As I understand your design, I will
just have to open the group with the "group access" property list and
this code will work fine, because H5Gget_objtype_by_idx will return
objects in creation order.

      if ((grp->hdf_grpid = H5Gopen(locid, grp->name)) < 0)
         BAIL(NC_EHDFERR);
   }

   /* Find the variables. Read their metadata and attributes. */
   if (H5Gget_num_objs(grp->hdf_grpid, &num_obj) < 0)
      BAIL(NC_EVARMETA);
   for (i=0; i<num_obj; i++)
   {
      /* Get the type (i.e. group, dataset, etc.), and the name of the object. 
*/
      if ((obj_type = H5Gget_objtype_by_idx(grp->hdf_grpid, i)) < 0)
         BAIL(NC_EHDFERR);
      if (H5Gget_objname_by_idx(grp->hdf_grpid, i, obj_name, NC_MAX_HDF5_NAME) 
< 0)
         BAIL(NC_EVARMETA);
      LOG((4, "Encountered: HDF5 object obj_type %d obj_name %s", obj_type, 
obj_name));

      /* Deal with groups and datasets. */
      if (obj_type == H5G_GROUP) 
      {


7 - What about attributes? Can I get them by creation order too? You
make no mention of H5Aopen_idx, but that's what I use. Here's the code
I use to read atts in a group: 

   num_obj = H5Aget_num_attrs(grp->hdf_grpid);
   for (i = 0; i < num_obj; i++)
   {
      if (attid > 0) H5Aclose(attid);
      if ((attid = H5Aopen_idx(grp->hdf_grpid, (unsigned int)i)) < 0)
         BAIL(NC_EATTMETA);
      if (H5Aget_name(attid, NC_MAX_NAME + 1, obj_name) < 0)
         BAIL(NC_EATTMETA);
      LOG((4, "reading attribute of _netCDF group, named %s", obj_name));

Thanks,

Ed

-- 
Ed Hartnett  -- ed@xxxxxxxxxxxxxxxx



  • 2005 messages navigation, sorted by:
    1. Thread
    2. Subject
    3. Author
    4. Date
    5. ↑ Table Of Contents
  • Search the netcdf-hdf archives: