Hi Quincey, On Wed, Dec 14, 2011 at 3:56 PM, Quincey Koziol <[email protected]> wrote: > On Dec 14, 2011, at 9:46 AM, Darren Dale wrote: >> I probably should have been more explicit: the >> example illustrates that the problem is isolated to Datasets, Groups >> are not effected. > > Whoops, sorry, yes, you are right. > >> H5py does not do any explicit name tracking. It delegates that task >> completely to hdf5: for both Datasets and Groups, h5py simply calls >> H5Iget_name. It seems to me that open dataset ids are not getting >> their information updated, but open group ids are. Now that I think >> about it, aren't there other issues with copying open datasets in >> <hdf5-1.8.9? Perhaps the issues extend to moving open datasets as >> well. > > That's pretty weird (that it would only affect datasets), since the > H5Iget_name code doesn't depend on the object type. Can you > replicate this with a short C program?
Yes. See the attached modified version of one of the hdf5 examples. After I move group1 from "old_loc" to "new_loc", the names of the nodes contained in that group werereported by hdf5-1.8.8 to be: /new_loc/group /old_loc/dataset Darren
/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * Copyright by The HDF Group. * * Copyright by the Board of Trustees of the University of Illinois. * * All rights reserved. * * * * This file is part of HDF5. The full HDF5 copyright notice, including * * terms governing use, modification, and redistribution, is contained in * * the files COPYING and Copyright.html. COPYING can be found at the root * * of the source code distribution tree; Copyright.html can be found at the * * root level of an installed copy of the electronic HDF5 document set and * * is linked from the top-level documents page. It can also be found at * * http://hdfgroup.org/HDF5/doc/Copyright.html. If you do not have * * access to either file, you may request a copy from [email protected]. * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ /* * This example writes data to the HDF5 file. * Data conversion is performed during write operation. */ #include<stdlib.h> #include<stdio.h> #include "hdf5.h" #define H5FILE_NAME "SDS.h5" #define NX 5 /* dataset dimensions */ #define NY 6 #define RANK 2 int main (void) { hid_t file, dataset; /* file and dataset handles */ hid_t g1_id, g2_id; hid_t datatype, dataspace; /* handles */ hsize_t dimsf[2]; /* dataset dimensions */ herr_t status; int data[NX][NY]; /* data to write */ int i, j; ssize_t dset_name_len, group_name_len; char* dset_name; char* group_name; /* * Data and output buffer initialization. */ for(j = 0; j < NX; j++) for(i = 0; i < NY; i++) data[j][i] = i + j; /* * 0 1 2 3 4 5 * 1 2 3 4 5 6 * 2 3 4 5 6 7 * 3 4 5 6 7 8 * 4 5 6 7 8 9 */ /* * Create a new file using H5F_ACC_TRUNC access, * default file creation properties, and default file * access properties. */ file = H5Fcreate(H5FILE_NAME, H5F_ACC_TRUNC, H5P_DEFAULT, H5P_DEFAULT); g1_id = H5Gcreate2(file, "/old_loc", H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT); g2_id = H5Gcreate2(g1_id, "group", H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT); /* * Describe the size of the array and create the data space for fixed * size dataset. */ dimsf[0] = NX; dimsf[1] = NY; dataspace = H5Screate_simple(RANK, dimsf, NULL); /* * Define datatype for the data in the file. * We will store little endian INT numbers. */ datatype = H5Tcopy(H5T_NATIVE_INT); status = H5Tset_order(datatype, H5T_ORDER_LE); /* * Create a new dataset within the file using defined dataspace and * datatype and default dataset creation properties. */ dataset = H5Dcreate2(g1_id, "dataset", datatype, dataspace, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT); /* * Write the data to the dataset using default transfer properties. */ status = H5Dwrite(dataset, H5T_NATIVE_INT, H5S_ALL, H5S_ALL, H5P_DEFAULT, data); status = H5Gmove2(file, "/old_loc", file, "/new_loc"); dset_name_len = H5Iget_name(dataset, NULL, 0)+1; dset_name = (char*)malloc(sizeof(char)*(dset_name_len)); H5Iget_name(dataset, dset_name, dset_name_len); group_name_len = H5Iget_name(g2_id, NULL, 0)+1; group_name = (char*)malloc(sizeof(char)*(group_name_len)); H5Iget_name(g2_id, group_name, group_name_len); printf("Group: %s\n", group_name); printf("Dataset: %s", dset_name); /* * Close/release resources. */ H5Sclose(dataspace); H5Tclose(datatype); H5Dclose(dataset); H5Gclose(g1_id); H5Gclose(g2_id); H5Fclose(file); return 0; }
_______________________________________________ Hdf-forum is for HDF software users discussion. [email protected] http://mail.hdfgroup.org/mailman/listinfo/hdf-forum_hdfgroup.org
