1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148
|
/* This is part of the netCDF package. Copyright 2018 University
Corporation for Atmospheric Research/Unidata See COPYRIGHT file for
conditions of use.
Test HDF5 dataset code, even more. These are not intended to be
exhaustive tests, but they use HDF5 the same way that netCDF-4
does, so if these tests don't work, than netCDF-4 won't work
either.
This test does some renames in HDF5 to see how it works.
Ed Hartnett 2/1/19
*/
#include "h5_err_macros.h"
#include <hdf5.h>
#include <H5DSpublic.h>
#define FILE_NAME "tst_h_rename.h5"
#define STR_LEN 255
int
main()
{
printf("\n*** Checking HDF5 variable renaming.\n");
printf("*** Checking HDF5 variable ordering after renames...\n");
#define NUM_ELEMENTS 6
#define MAX_SYMBOL_LEN 2
#define ELEMENTS_NAME "Elements"
{
hid_t did[NUM_ELEMENTS], fapl_id, fcpl_id, gcpl_id;
hsize_t num_obj;
hid_t fileid, grpid, spaceid;
int i;
#if H5_VERSION_GE(1,12,0)
H5O_info2_t obj_info;
#else
H5O_info_t obj_info;
#endif
char names[NUM_ELEMENTS][MAX_SYMBOL_LEN + 1] = {"H", "He", "Li", "Be", "B", "C"};
char names2[NUM_ELEMENTS][MAX_SYMBOL_LEN + 1] = {"h", "He", "Li", "Be", "B", "C"};
char name[MAX_SYMBOL_LEN + 1];
ssize_t size;
/* Create file, setting latest_format in access propertly list
* and H5P_CRT_ORDER_TRACKED in the creation property list. */
if ((fapl_id = H5Pcreate(H5P_FILE_ACCESS)) < 0) ERR;
if (H5Pset_libver_bounds(fapl_id, H5F_LIBVER_LATEST, H5F_LIBVER_LATEST) < 0) ERR;
if ((fcpl_id = H5Pcreate(H5P_FILE_CREATE)) < 0) ERR;
if (H5Pset_link_creation_order(fcpl_id, H5P_CRT_ORDER_TRACKED|H5P_CRT_ORDER_INDEXED) < 0) ERR;
if ((fileid = H5Fcreate(FILE_NAME, H5F_ACC_TRUNC, fcpl_id, fapl_id)) < 0) ERR;
/* Create group, with link_creation_order set in the group
* creation property list. */
if ((gcpl_id = H5Pcreate(H5P_GROUP_CREATE)) < 0) ERR;
if (H5Pset_link_creation_order(gcpl_id, H5P_CRT_ORDER_TRACKED|H5P_CRT_ORDER_INDEXED) < 0) ERR;
if ((grpid = H5Gcreate_anon(fileid, gcpl_id, H5P_DEFAULT)) < 0) ERR;
if ((H5Olink(grpid, fileid, ELEMENTS_NAME, H5P_DEFAULT, H5P_DEFAULT)) < 0) ERR;
/* Create a scalar space. */
if ((spaceid = H5Screate(H5S_SCALAR)) < 0) ERR;
/* Create the variables, one per element. */
for (i = 0; i < NUM_ELEMENTS; i++)
{
if ((did[i] = H5Dcreate1(grpid, names[i], H5T_NATIVE_INT,
spaceid, H5P_DEFAULT)) < 0) ERR;
if (H5Dclose(did[i]) < 0) ERR;
}
if (H5Pclose(fapl_id) < 0 ||
H5Pclose(gcpl_id) < 0 ||
H5Sclose(spaceid) < 0 ||
H5Gclose(grpid) < 0 ||
H5Fclose(fileid) < 0)
ERR;
/* Now reopen the file and check the order. */
if ((fapl_id = H5Pcreate(H5P_FILE_ACCESS)) < 0) ERR;
if (H5Pset_libver_bounds(fapl_id, H5F_LIBVER_LATEST, H5F_LIBVER_LATEST) < 0) ERR;
if ((fileid = H5Fopen(FILE_NAME, H5F_ACC_RDWR, fapl_id)) < 0) ERR;
if ((grpid = H5Gopen1(fileid, ELEMENTS_NAME)) < 0) ERR;
if (H5Gget_num_objs(grpid, &num_obj) < 0) ERR;
if (num_obj != NUM_ELEMENTS) ERR;
printf("Original order:\n");
for (i = 0; i < num_obj; i++)
{
#if H5_VERSION_GE(1,12,0)
if (H5Oget_info_by_idx3(grpid, ".", H5_INDEX_CRT_ORDER, H5_ITER_INC,
i, &obj_info, H5O_INFO_BASIC, H5P_DEFAULT) < 0) ERR;
#else
if (H5Oget_info_by_idx(grpid, ".", H5_INDEX_CRT_ORDER, H5_ITER_INC,
i, &obj_info, H5P_DEFAULT) < 0) ERR;
#endif
if (obj_info.type != H5O_TYPE_DATASET) ERR;
if ((size = H5Lget_name_by_idx(grpid, ".", H5_INDEX_CRT_ORDER, H5_ITER_INC, i,
NULL, 0, H5P_DEFAULT)) < 0) ERR;
H5Lget_name_by_idx(grpid, ".", H5_INDEX_CRT_ORDER, H5_ITER_INC, i,
name, size+1, H5P_DEFAULT);
if (strcmp(name, names[i])) ERR;
printf("name %s\n", name);
}
/* Rename the first dataset. */
if (H5Lmove(grpid, names[0], grpid, names2[0], H5P_DEFAULT, H5P_DEFAULT) < 0)
ERR;
if (H5Pclose(fapl_id) < 0 ||
H5Gclose(grpid) < 0 ||
H5Fclose(fileid) < 0)
ERR;
/* Now reopen the file and check the order again. */
if ((fapl_id = H5Pcreate(H5P_FILE_ACCESS)) < 0) ERR;
if (H5Pset_libver_bounds(fapl_id, H5F_LIBVER_LATEST, H5F_LIBVER_LATEST) < 0) ERR;
if ((fileid = H5Fopen(FILE_NAME, H5F_ACC_RDONLY, fapl_id)) < 0) ERR;
if ((grpid = H5Gopen1(fileid, ELEMENTS_NAME)) < 0) ERR;
if (H5Gget_num_objs(grpid, &num_obj) < 0) ERR;
if (num_obj != NUM_ELEMENTS) ERR;
printf("New order:\n");
for (i = 0; i < num_obj; i++)
{
#if H5_VERSION_GE(1,12,0)
if (H5Oget_info_by_idx3(grpid, ".", H5_INDEX_CRT_ORDER, H5_ITER_INC,
i, &obj_info, H5O_INFO_BASIC, H5P_DEFAULT) < 0) ERR;
#else
if (H5Oget_info_by_idx(grpid, ".", H5_INDEX_CRT_ORDER, H5_ITER_INC,
i, &obj_info, H5P_DEFAULT) < 0) ERR;
#endif
if (obj_info.type != H5O_TYPE_DATASET) ERR;
if ((size = H5Lget_name_by_idx(grpid, ".", H5_INDEX_CRT_ORDER, H5_ITER_INC, i,
NULL, 0, H5P_DEFAULT)) < 0) ERR;
H5Lget_name_by_idx(grpid, ".", H5_INDEX_CRT_ORDER, H5_ITER_INC, i,
name, size+1, H5P_DEFAULT);
printf("name %s\n", name);
/* if (strcmp(name, names2[i])) ERR; */
}
if (H5Pclose(fapl_id) < 0 ||
H5Gclose(grpid) < 0 ||
H5Fclose(fileid) < 0)
ERR;
}
SUMMARIZE_ERR;
FINAL_RESULTS;
}
|