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.
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
netcdf-hdf
archives: