/**************************************************************** ** ** Giterate(): Group iteration routine. ** ****************************************************************/ PyObject *Giterate(hid_t parent_id, hid_t loc_id, const char *name) { hsize_t i=0; PyObject *t, *tgroup, *tleave, *tlink, *tunknown; PyObject *info[4]; info[0] = tgroup = PyList_New(0); info[1] = tleave = PyList_New(0); info[2] = tlink = PyList_New(0); info[3] = tunknown = PyList_New(0); /* Iterate over all the childs behind loc_id (parent_id+loc_id). * NOTE: using H5_INDEX_CRT_ORDER instead of H5_INDEX_NAME causes failures * in the test suite */ H5Literate_by_name(parent_id, name, H5_INDEX_NAME, H5_ITER_NATIVE, &i, litercb, info, H5P_DEFAULT); /* Create the tuple with the list of Groups and Datasets */ t = PyTuple_New(4); PyTuple_SetItem(t, 0, tgroup); PyTuple_SetItem(t, 1, tleave); PyTuple_SetItem(t, 2, tlink); PyTuple_SetItem(t, 3, tunknown); return t; }
/* * Class: hdf_hdf5lib_H5 * Method: H5Literate_by_name * Signature: (JLjava/lang/String;IIJLjava/lang/Object;Ljava/lang/Object;J)I */ JNIEXPORT jint JNICALL Java_hdf_hdf5lib_H5_H5Literate_1by_1name (JNIEnv *env, jclass clss, jlong grp_id, jstring name, jint idx_type, jint order, jlong idx, jobject callback_op, jobject op_data, jlong access_id) { hsize_t start_idx = (hsize_t)idx; herr_t status = -1; const char *lName; ENVPTR->GetJavaVM(ENVPAR &jvm); cb_wrapper wrapper = {callback_op, op_data}; if ((op_data == NULL) || (callback_op == NULL)) { h5nullArgument(env, "H5Literate_by_name: op_data or callback_op is NULL"); } /* end if */ else { PIN_JAVA_STRING(name, lName); if (lName != NULL) { status = H5Literate_by_name((hid_t)grp_id, lName, (H5_index_t)idx_type, (H5_iter_order_t)order, (hsize_t*)&start_idx, (H5L_iterate_t)H5L_iterate_cb, (void*)&wrapper, (hid_t)access_id); UNPIN_JAVA_STRING(name, lName); if (status < 0) h5libraryError(env); } } /* end else */ return status; } /* end Java_hdf_hdf5lib_H5_H5Literate_1by_1name */
herr_t op_func_group (hid_t loc_id, const char* objname, const H5L_info_t* /*info*/, void* /*ppar*/) { //struct param glopar; struct param* ppar; ppar = &glopar; int err; hid_t h5fi; hid_t h5fo; hid_t gid; H5G_stat_t statbuf; err = H5Gget_objinfo (loc_id, objname, 0, &statbuf); CHKERR(err); /* if object is group, open containers, create group, iterate over datasets, close */ if (statbuf.type == H5G_GROUP) { h5fi = H5Fopen(((struct param *)ppar)->conti, H5F_ACC_RDONLY, H5P_DEFAULT); CHKRTN(h5fi < 0, FILEERR); h5fo = H5Fopen(((struct param *)ppar)->conto, H5F_ACC_RDWR, H5P_DEFAULT); CHKRTN(h5fo < 0, FILEERR); gid = H5Gcreate(h5fo, objname, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT); CHKRTN(gid < 0, ERR); strncpy(((struct param *)ppar)->grupi, objname, sizeof(((struct param *)ppar)->grupi) - 1); strncpy(((struct param *)ppar)->grupo, objname, sizeof(((struct param *)ppar)->grupo) - 1); err = H5Literate_by_name (h5fi, objname, H5_INDEX_NAME, H5_ITER_NATIVE, NULL, op_func_dset, (void *) ppar, NULL); CHKERR(err); err = H5Fclose(h5fo); CHKERR(err); err = H5Fclose(h5fi); CHKERR(err); } return EXIT_SUCCESS; }
/*------------------------------------------------------------------------- * Function: traverse * * Purpose: Iterate over all the objects/links in a file. Conforms to the * "visitor" pattern. * * Return: 0 on success, -1 on failure * * Programmer: Quincey Koziol, [email protected] * * Date: September 1, 2007 * *------------------------------------------------------------------------- */ static int traverse(hid_t file_id, const char *grp_name, hbool_t visit_start, hbool_t recurse, const trav_visitor_t *visitor) { H5O_info_t oinfo; /* Object info for starting group */ /* Get info for starting object */ if(H5Oget_info_by_name(file_id, grp_name, &oinfo, H5P_DEFAULT) < 0) return -1; /* Visit the starting object */ if(visit_start && visitor->visit_obj) (*visitor->visit_obj)(grp_name, &oinfo, NULL, visitor->udata); /* Go visiting, if the object is a group */ if(oinfo.type == H5O_TYPE_GROUP) { trav_addr_t seen; /* List of addresses seen */ trav_ud_traverse_t udata; /* User data for iteration callback */ /* Init addresses seen */ seen.nused = seen.nalloc = 0; seen.objs = NULL; /* Check for multiple links to top group */ if(oinfo.rc > 1) trav_addr_add(&seen, oinfo.addr, grp_name); /* Set up user data structure */ udata.seen = &seen; udata.visitor = visitor; udata.is_absolute = (*grp_name == '/'); udata.base_grp_name = grp_name; /* Check for iteration of links vs. visiting all links recursively */ if(recurse) { /* Visit all links in group, recursively */ if(H5Lvisit_by_name(file_id, grp_name, trav_index_by, trav_index_order, traverse_cb, &udata, H5P_DEFAULT) < 0) return -1; } /* end if */ else { /* Iterate over links in group */ if(H5Literate_by_name(file_id, grp_name, trav_index_by, trav_index_order, NULL, traverse_cb, &udata, H5P_DEFAULT) < 0) return -1; } /* end else */ /* Free visited addresses table */ if(seen.objs) { size_t u; /* Local index variable */ /* Free paths to objects */ for(u = 0; u < seen.nused; u++) HDfree(seen.objs[u].path); HDfree(seen.objs); } /* end if */ } /* end if */ return 0; }
int convertimagebatch(param par) { //struct param glopar; int err; hid_t h5fi = -1; hid_t h5fo = -1; /* open source container */ h5fi = H5Fopen(par.conti, H5F_ACC_RDONLY, H5P_DEFAULT); CHKRTN(h5fi < 0, FILEERR); /* create empty container. TRUNC overwrite it if exists. */ h5fo = H5Fcreate(par.conto, H5F_ACC_TRUNC, H5P_DEFAULT, H5P_DEFAULT); /* iterate over groups */ glopar = par; err = H5Literate_by_name (h5fi, ".", H5_INDEX_NAME, H5_ITER_NATIVE, NULL, op_func_group, (void *) &par, NULL); CHKERR(err); /* close containers */ err = H5Fclose(h5fi); CHKERR(err); return EXIT_SUCCESS; }
value hdf5_h5l_iterate_by_name(value loc_v, value group_name_v, value index_type_v, value order_v, value idx_v, value op_v, value lapl_v, value op_data_v) { CAMLparam5(loc_v, group_name_v, index_type_v, order_v, idx_v); CAMLxparam3(op_v, lapl_v, op_data_v); CAMLlocal1(exception); struct operator_data op_data; hsize_t idx, ret; op_data.callback = &op_v; op_data.operator_data = &op_data_v; op_data.exception = &exception; idx = Is_block(idx_v) ? Int_val(Field(Field(idx_v, 0), 0)) : 0; exception = Val_unit; ret = H5Literate_by_name(Hid_val(loc_v), String_val(group_name_v), H5_index_val(index_type_v), H5_iter_order_val(order_v), Is_block(idx_v) ? &idx : NULL, hdf5_h5l_operator, &op_data, H5P_opt_val(lapl_v)); if (Is_block(idx_v)) Store_field(Field(idx_v, 0), 0, Val_int(idx)); if (exception != Val_unit) caml_raise(exception); CAMLreturn(Val_h5_iter(ret)); }
int main (void) { hid_t file; hid_t grp; hid_t dataset, dataspace; hid_t plist; herr_t status; hsize_t dims[2]; hsize_t cdims[2]; int idx_f, idx_g; /* * Create a file. */ file = H5Fcreate(H5FILE_NAME, H5F_ACC_TRUNC, H5P_DEFAULT, H5P_DEFAULT); /* * Create a group in the file. */ grp = H5Gcreate(file, "/Data", H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT); /* * Create dataset "Compressed Data" in the group using absolute * name. Dataset creation property list is modified to use * GZIP compression with the compression effort set to 6. * Note that compression can be used only when dataset is chunked. */ dims[0] = 1000; dims[1] = 20; cdims[0] = 20; cdims[1] = 20; dataspace = H5Screate_simple(RANK, dims, NULL); plist = H5Pcreate(H5P_DATASET_CREATE); H5Pset_chunk(plist, 2, cdims); H5Pset_deflate( plist, 6); dataset = H5Dcreate(file, "/Data/Compressed_Data", H5T_NATIVE_INT, dataspace, H5P_DEFAULT, plist, H5P_DEFAULT); /* * Close the first dataset . */ H5Sclose(dataspace); H5Dclose(dataset); /* * Create the second dataset. */ dims[0] = 500; dims[1] = 20; dataspace = H5Screate_simple(RANK, dims, NULL); dataset = H5Dcreate(file, "/Data/Float_Data", H5T_NATIVE_FLOAT, dataspace, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT); /* *Close the second dataset and file. */ H5Sclose(dataspace); H5Dclose(dataset); H5Pclose(plist); H5Gclose(grp); H5Fclose(file); /* * Now reopen the file and group in the file. */ file = H5Fopen(H5FILE_NAME, H5F_ACC_RDWR, H5P_DEFAULT); grp = H5Gopen(file, "Data", H5P_DEFAULT); /* * Access "Compressed_Data" dataset in the group. */ dataset = H5Dopen(grp, "Compressed_Data", H5P_DEFAULT); if( dataset < 0) printf(" Dataset 'Compressed-Data' is not found. \n"); printf("\"/Data/Compressed_Data\" dataset is open \n"); /* * Close the dataset. */ status = H5Dclose(dataset); /* * Create hard link to the Data group. */ status = H5Lcreate_hard(file, "Data", H5L_SAME_LOC, "Data_new", H5P_DEFAULT, H5P_DEFAULT); /* * We can access "Compressed_Data" dataset using created * hard link "Data_new". */ dataset = H5Dopen(file, "/Data_new/Compressed_Data", H5P_DEFAULT); if( dataset < 0) printf(" Dataset is not found. \n"); printf("\"/Data_new/Compressed_Data\" dataset is open \n"); /* * Close the dataset. */ status = H5Dclose(dataset); /* * Use iterator to see the names of the objects in the root group. */ idx_f = H5Literate(file, H5_INDEX_NAME, H5_ITER_INC, NULL, file_info, NULL); /* * Unlink name "Data" and use iterator to see the names * of the objects in the file root direvtory. */ if(H5Ldelete(file, "Data", H5P_DEFAULT) < 0) printf(" H5Ldelete failed \n"); else printf("\"Data\" is unlinked \n"); idx_f = H5Literate(file, H5_INDEX_NAME, H5_ITER_INC, NULL, file_info, NULL); /* * Use iterator to see the names of the objects in the group * /Data_new. */ idx_g = H5Literate_by_name(grp, "/Data_new", H5_INDEX_NAME, H5_ITER_INC, NULL, group_info, NULL, H5P_DEFAULT); /* * Close the file. */ H5Gclose(grp); H5Fclose(file); return 0; }
herr_t op_func (hid_t loc_id, const char *name, const H5L_info_t *info, void *operator_data) { herr_t status, return_val = 0; H5O_info_t infobuf; struct opdata *od = (struct opdata *) operator_data; unsigned spaces = 2*(od->recurs+1); FILE* pfile; pfile = fopen(filePathJson.toStdString().c_str(), "a"); if (!pfile) { throw GenericExc(QObject::tr("Ошибка открытия json файла")); } status = H5Oget_info_by_name (loc_id, name, &infobuf, H5P_DEFAULT); if (status < 0) { throw GenericExc(QObject::tr("Ошибка получения информации о файле")); } switch (infobuf.type) { case H5O_TYPE_GROUP: { if (countGroup != 0) { fprintf (pfile, "{\n"); fprintf (pfile, "%*s", spaces, ""); } fprintf (pfile, "\"%s\" : ", name); countGroup++; if ( group_check (od, infobuf.addr) ) { } else { struct opdata nextod; nextod.recurs = od->recurs + 1; nextod.prev = od; nextod.addr = infobuf.addr; fclose(pfile); return_val = H5Literate_by_name (loc_id, name, H5_INDEX_NAME, H5_ITER_NATIVE, NULL, op_func, (void *) &nextod, H5P_DEFAULT); } pfile = fopen(filePathJson.toStdString().c_str(), "a"); if (!pfile) { throw GenericExc(QObject::tr("Ошибка открытия json файла")); } if (count == 0) { fprintf (pfile, "%*s}\n", spaces, ""); } else { fprintf (pfile, "\n%*s]\n", spaces, ""); count = 0; } break; } case H5O_TYPE_DATASET: if (count == 0) { fprintf (pfile, "[\n"); } else { fprintf(pfile, ",\n"); } fprintf (pfile, "%*s", spaces, ""); fprintf (pfile, "\"%s\"", name); count++; countGroup = 0; break; default: break; } fclose(pfile); return return_val; }