1/* This is part of the netCDF package.
2   Copyright 2005 University Corporation for Atmospheric Research/Unidata
3   See COPYRIGHT file for conditions of use.
4
5   Test HDF5 file code. These are not intended to be exhaustive tests,
6   but they use HDF5 the same way that netCDF-4 does, so if these
7   tests don't work, than netCDF-4 won't work either.
8*/
9
10#include "h5_err_macros.h"
11#include <hdf5.h>
12#include <H5DSpublic.h>
13
14#define FILE_NAME "tst_h_files4.h5"
15#define STR_LEN 255
16
17/* Heavy duty test file...*/
18/*#define FILE_NAME "/machine/downloads/T159_1978110112.nc4"*/
19
20herr_t
21obj_iter(hid_t o_id, const char *name, const H5O_info_t *object_info,
22  void *op_data)
23{
24   *(int *)op_data = object_info->type;
25   return 1;
26}
27
28/* This is a callback function for H5Literate().
29
30The parameters of this callback function have the following values or
31meanings:
32
33g_id Group that serves as root of the iteration; same value as the
34H5Lvisit group_id parameter
35
36name Name of link, relative to g_id, being examined at current step of
37the iteration
38
39info H5L_info_t struct containing information regarding that link
40
41op_data User-defined pointer to data required by the application in
42processing the link; a pass-through of the op_data pointer provided
43with the H5Lvisit function call
44
45*/
46herr_t
47op_func (hid_t g_id, const char *name, const H5L_info_t *info,
48  void *op_data)
49{
50   hid_t id;
51   H5I_type_t obj_type;
52
53   strcpy((char *)op_dataname);
54   if ((id = H5Oopen_by_addr(g_idinfo->u.address)) < 0) ERR;
55
56/* Using H5Ovisit is really slow. Use H5Iget_type for a fast
57 * answer. */
58/*    if (H5Ovisit(id, H5_INDEX_CRT_ORDER, H5_ITER_INC, obj_iter,  */
59/*  (void *)&obj_class) != 1) ERR; */
60
61   if ((obj_type = H5Iget_type(id)) < 0) ERR;
62   if (H5Oclose(id) < 0) ERR;
63
64/* Turn this on to learn what type of object you've opened. */
65/*    switch (obj_type) */
66/*    { */
67/*       case H5I_GROUP: */
68/*   printf("group %s\n", name); */
69/*   break; */
70/*       case H5I_DATATYPE: */
71/*   printf("type %s\n", name); */
72/*   break; */
73/*       case H5I_DATASET: */
74/*   printf("data %s\n", name); */
75/*   break; */
76/*       default: */
77/*   printf("unknown class\n"); */
78/*    } */
79   return 1;
80}
81
82int
83main()
84{
85   printf("\n*** Checking HDF5 file functions.\n");
86   printf("*** Creating HDF5 file in the canonical netCDF-4 way...");
87   {
88      hid_t fapl_idfcpl_idfileidgrpidfileid2;
89      hsize_t num_obj;
90
91      /* Create file access and create property lists. */
92      if ((fapl_id = H5Pcreate(H5P_FILE_ACCESS)) < 0) ERR;
93      if ((fcpl_id = H5Pcreate(H5P_FILE_CREATE)) < 0) ERR;
94
95      /* Set latest_format in access propertly list. This ensures that
96       * the latest, greatest, HDF5 versions are used in the file. */
97/*      if (H5Pset_libver_bounds(fapl_id, H5F_LIBVER_LATEST,
98 H5F_LIBVER_LATEST) < 0) ERR;*/
99
100      /* Set H5P_CRT_ORDER_TRACKED in the creation property list. This
101       * turns on HDF5 creation ordering in the file. */
102      if (H5Pset_link_creation_order(fcpl_id, (H5P_CRT_ORDER_TRACKED |
103        H5P_CRT_ORDER_INDEXED)) < 0) ERR;
104      if (H5Pset_attr_creation_order(fcpl_id, (H5P_CRT_ORDER_TRACKED |
105        H5P_CRT_ORDER_INDEXED)) < 0) ERR;
106
107      /* Set close degree. */
108      if (H5Pset_fclose_degree(fapl_idH5F_CLOSE_STRONG)) ERR;
109
110      /* Create the file. */
111      if ((fileid = H5Fcreate(FILE_NAMEH5F_ACC_TRUNCfcpl_idfapl_id)) < 0) ERR;
112
113      /* Open the root group. */
114      if ((grpid = H5Gopen2(fileid, "/", H5P_DEFAULT)) < 0) ERR;
115
116      /* Close up. */
117      if (H5Pclose(fapl_id) < 0 ||
118   H5Pclose(fcpl_id) < 0 ||
119   H5Gclose(grpid) < 0 ||
120   H5Fclose(fileid) < 0)
121  ERR;
122
123      /* Reopen the file and check it. */
124      if ((fapl_id = H5Pcreate(H5P_FILE_ACCESS)) < 0) ERR;
125      if (H5Pset_fclose_degree(fapl_idH5F_CLOSE_STRONG)) ERR;
126
127      if ((fileid = H5Fopen(FILE_NAMEH5F_ACC_RDWRfapl_id)) < 0) ERR;
128      if (H5Gget_num_objs(fileid, &num_obj) < 0) ERR;
129      if (num_objERR;
130
131      /* Open another copy of the same file. Must use the same file
132       * access degree or HDF5 will not open the file. */
133      if ((fileid2 = H5Fopen(FILE_NAMEH5F_ACC_RDWRfapl_id)) < 0) ERR;
134
135      if (H5Fclose(fileid) < 0) ERR;
136      if (H5Fclose(fileid2) < 0) ERR;
137      if (H5Pclose(fapl_id) < 0) ERR;
138   }
139   SUMMARIZE_ERR;
140   printf("*** Opening a HDF5 file with H5Literate...");
141   {
142      hid_t fapl_idfileidgrpid;
143      hsize_t idx = 0;
144      char obj_name[STR_LEN + 1];
145      hsize_t num_obj;
146      int i;
147
148      if ((fapl_id = H5Pcreate(H5P_FILE_ACCESS)) < 0) ERR;
149      if (H5Pset_fclose_degree(fapl_idH5F_CLOSE_STRONG)) ERR;
150      if (H5Pset_cache(fapl_id, 0, CHUNK_CACHE_NELEMSCHUNK_CACHE_SIZE,
151        CHUNK_CACHE_PREEMPTION) < 0) ERR;
152      if ((fileid = H5Fopen(FILE_NAMEH5F_ACC_RDONLYfapl_id)) < 0) ERR;
153      if ((grpid = H5Gopen2(fileid, "/", H5P_DEFAULT)) < 0) ERR;
154
155      if (H5Gget_num_objs(grpid, &num_obj) < 0) ERR;
156      for (i = 0; i < num_obji++)
157      {
158  if (H5Literate(grpidH5_INDEX_CRT_ORDERH5_ITER_INC, &idxop_func,
159 (void *)obj_name) != 1) ERR;
160  printf("encountered object %s\n", obj_name);
161      }
162
163      if (H5Gclose(grpid) < 0) ERR;
164      if (H5Fclose(fileid) < 0) ERR;
165      if (H5Pclose(fapl_id) < 0) ERR;
166   }
167   SUMMARIZE_ERR;
168   printf("*** Opening a HDF5 file in the canonical netCDF-4 way...");
169   {
170      hid_t fapl_idfileidgrpid;
171      H5_index_t idx_field = H5_INDEX_CRT_ORDER;
172      H5O_info_t obj_info;
173      hsize_t num_obj;
174      ssize_t size;
175      char obj_name[STR_LEN + 1];
176      int i;
177
178      if ((fapl_id = H5Pcreate(H5P_FILE_ACCESS)) < 0) ERR;
179      if (H5Pset_fclose_degree(fapl_idH5F_CLOSE_STRONG)) ERR;
180      if (H5Pset_cache(fapl_id, 0, CHUNK_CACHE_NELEMSCHUNK_CACHE_SIZE,
181        CHUNK_CACHE_PREEMPTION) < 0) ERR;
182      if ((fileid = H5Fopen(FILE_NAMEH5F_ACC_RDONLYfapl_id)) < 0) ERR;
183      if ((grpid = H5Gopen2(fileid, "/", H5P_DEFAULT)) < 0) ERR;
184
185      /* How many objects in this group? */
186      if (H5Gget_num_objs(grpid, &num_obj) < 0) ERR;
187      for (i = 0; i < num_obji++)
188      {
189  if (H5Oget_info_by_idx(grpid, ".", H5_INDEX_CRT_ORDERH5_ITER_INC,
190 i, &obj_infoH5P_DEFAULT)) ERR;
191  if ((size = H5Lget_name_by_idx(grpid, ".", idx_fieldH5_ITER_INCi,
192 NULL, 0, H5P_DEFAULT)) < 0) ERR;
193  if (H5Lget_name_by_idx(grpid, ".", idx_fieldH5_ITER_INCi,
194 obj_namesize+1, H5P_DEFAULT) < 0) ERR;
195      }
196
197      if (H5Gclose(grpid) < 0) ERR;
198      if (H5Fclose(fileid) < 0) ERR;
199      if (H5Pclose(fapl_id) < 0) ERR;
200   }
201   SUMMARIZE_ERR;
202   FINAL_RESULTS;
203}


HyperKWIC - Version 7.20DA executed at 11:37 on 27 Oct 2017 | Polyhedron Solutions - INTERNAL USE | COMMERCIAL (Any O/S) SN 4AKIed