89bool depth_first(hid_t pid,
const char *gname, DDS & dds,
const char *fname)
94 <<
" gname: " << gname
95 <<
" fname: " << fname
101 if(H5Gget_info(pid,&g_info) <0) {
103 "h5_dds handler: counting hdf5 group elements error for ";
105 throw InternalErr(__FILE__, __LINE__, msg);
108 nelems = g_info.nlinks;
111 for (hsize_t i = 0; i < nelems; i++) {
117 H5Lget_name_by_idx(pid,
".",H5_INDEX_NAME,H5_ITER_NATIVE,i,
nullptr,
119 if (oname_size <= 0) {
120 string msg =
"h5_dds handler: Error getting the size of the hdf5 object from the group: ";
122 throw InternalErr(__FILE__, __LINE__, msg);
126 oname.resize((
size_t) oname_size + 1);
128 if (H5Lget_name_by_idx(pid,
".",H5_INDEX_NAME,H5_ITER_NATIVE,i,oname.data(),
129 (
size_t)(oname_size+1), H5P_DEFAULT) < 0){
131 "h5_dds handler: Error getting the hdf5 object name from the group: ";
133 throw InternalErr(__FILE__, __LINE__, msg);
138 if (H5Lget_info(pid,oname.data(),&linfo,H5P_DEFAULT)<0) {
139 string msg =
"hdf5 link name error from: ";
141 throw InternalErr(__FILE__, __LINE__, msg);
145 if(linfo.type == H5L_TYPE_EXTERNAL)
149 if(linfo.type == H5L_TYPE_SOFT)
155 if (H5OGET_INFO_BY_IDX(pid,
".", H5_INDEX_NAME, H5_ITER_NATIVE,
156 i, &oinfo, H5P_DEFAULT)<0) {
157 string msg =
"h5_dds handler: Error obtaining the info for the object";
158 msg += string(oname.begin(),oname.end());
159 throw InternalErr(__FILE__, __LINE__, msg);
162 H5O_type_t obj_type = oinfo.type;
169 string full_path_name =
170 string(gname) + string(oname.begin(),oname.end()-1) +
"/";
172 BESDEBUG(
"h5",
"=depth_first():H5G_GROUP " << full_path_name
176 t_fpn.resize(full_path_name.length()+1);
177 copy(full_path_name.begin(),full_path_name.end(),t_fpn.begin());
179 t_fpn[full_path_name.length()] =
'\0';
181 hid_t cgroup = H5Gopen(pid, t_fpn.data(),H5P_DEFAULT);
183 throw InternalErr(__FILE__, __LINE__,
"h5_dds handler: H5Gopen() failed.");
199 if (H5Gclose(cgroup) < 0){
200 throw InternalErr(__FILE__, __LINE__,
"Could not close the group.");
205 case H5O_TYPE_DATASET:
209 string full_path_name = string(gname) + string(oname.begin(),oname.end()-1);
224 case H5O_TYPE_NAMED_DATATYPE:
233 BESDEBUG(
"h5",
"<depth_first() " << endl);
314 const string & filename)
316 dds_table.set_dataset_name(name_path(filename));
318 Structure *structure = Get_structure(varname, varname,filename, dt_inst.
type,
false);
322 BESDEBUG(
"h5",
"=read_objects_structure(): Dimension is "
323 << dt_inst.
ndims << endl);
325 if (dt_inst.
ndims != 0) {
326 BESDEBUG(
"h5",
"=read_objects_structure(): array of size " <<
328 BESDEBUG(
"h5",
"=read_objects_structure(): memory needed = " <<
329 dt_inst.
need << endl);
330 auto ar =
new HDF5Array(varname, filename, structure);
331 delete structure; structure =
nullptr;
333 ar->set_memneed(dt_inst.
need);
334 ar->set_numdim(dt_inst.
ndims);
335 ar->set_numelm((
int) (dt_inst.
nelmts));
336 ar->set_length((
int) (dt_inst.
nelmts));
338 for (
int dim_index = 0; dim_index < dt_inst.
ndims; dim_index++) {
339 ar->append_dim(dt_inst.
size[dim_index]);
340 BESDEBUG(
"h5",
"=read_objects_structure(): append_dim = " <<
341 dt_inst.
size[dim_index] << endl);
344 dds_table.add_var(ar);
345 delete ar; ar =
nullptr;
354 dds_table.add_var(structure);
355 delete structure; structure =
nullptr;
377read_objects(DDS & dds_table,
const string &varname,
const string &filename)
380 switch (H5Tget_class(dt_inst.
type)) {
389 H5Tclose(dt_inst.
type);
390 throw InternalErr(__FILE__, __LINE__,
"Currently don't support accessing data of Array datatype when array datatype is not inside the compound.");
397 if(H5Tclose(dt_inst.
type)<0) {
398 throw InternalErr(__FILE__, __LINE__,
"Cannot close the HDF5 datatype.");