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   $Id: tst_h_dimscales3.c,v 1.2 2010/06/01 15:34:51 ed Exp $
10*/
11#include "h5_err_macros.h"
12#include <hdf5.h>
13#include <H5DSpublic.h>
14#include <hdf5.h>
15#include <ncdimscale.h>
16
17#define FILE_NAME "tst_h_dimscales3.h5"
18#define DIMSCALE_NAME "dimscale"
19#define VAR1_NAME "var1"
20#define NDIMS 1
21#define DIM1_LEN 3
22#define NAME_ATTRIBUTE "dimscale_name_attribute"
23#define DIMSCALE_LABEL "dimscale_label"
24#define STR_LEN 255
25
26herr_t alien_visitor(hid_t did, unsigned dimhid_t dsid,
27      void *visitor_data)
28{
29   char name1[STR_LEN];
30   H5G_stat_t statbuf;
31   HDF5_OBJID_T *objid = visitor_data;
32
33   /* This should get "/var1", the name of the dataset that the scale
34    * is attached to. */
35   if (H5Iget_name(didname1STR_LEN) < 0) ERR;
36   if (strcmp(&name1[1], VAR1_NAME)) ERR;
37
38   /* Get more info on the dimscale object.*/
39   if (H5Gget_objinfo(dsid, ".", 1, &statbuf) < 0) ERR;
40   objid->fileno[0] = statbuf.fileno[0];
41   objid->objno[0] = statbuf.objno[0];
42   objid->fileno[1] = statbuf.fileno[1];
43   objid->objno[1] = statbuf.objno[1];
44
45   return 0;
46}
47
48herr_t alien_visitor2(hid_t did, unsigned dimhid_t dsid, void *visitor_data)
49{
50   H5G_stat_t statbuf;
51   HDF5_OBJID_T *objid = visitor_data;
52
53   /* Get obj id of the dimscale object. THis will be used later to
54    * match dimensions to dimscales. */
55   if (H5Gget_objinfo(dsid, ".", 1, &statbuf) < 0) ERR;
56   objid->fileno[0] = statbuf.fileno[0];
57   objid->objno[0] = statbuf.objno[0];
58   objid->fileno[1] = statbuf.fileno[1];
59   objid->objno[1] = statbuf.objno[1];
60
61   return 0;
62}
63
64int
65main()
66{
67   printf("\n*** Checking HDF5 phony, secret, and underhanded dimscales. Shhh! Don't tell anyone!\n");
68   printf("*** Creating a phony dimscale...");
69
70   {
71      hid_t fileidspaceiddatasetiddimscaleidcparmsid;
72      hsize_t dims[NDIMS] = {DIM1_LEN}, maxdims[NDIMS] = {H5S_UNLIMITED};
73
74      /* Create file. */
75      if ((fileid = H5Fcreate(FILE_NAMEH5F_ACC_TRUNCH5P_DEFAULT,
76       H5P_DEFAULT)) < 0) ERR;
77
78      /* Create the space that will be used both for the dimscale and
79       * the 1D dataset that will attach it. */
80      if ((spaceid = H5Screate_simple(NDIMSdimsmaxdims)) < 0) ERR;
81
82      /* Modify dataset creation properties, i.e. enable chunking. */
83      dims[0] = 1;
84      if ((cparmsid = H5Pcreate(H5P_DATASET_CREATE)) < 0) ERR;
85      if (H5Pset_chunk(cparmsidNDIMSdims) < 0) ERR;
86
87      /* Create our dimension scale, as an unlimited dataset. */
88      if ((dimscaleid = H5Dcreate(fileidDIMSCALE_NAMEH5T_NATIVE_INT,
89   spaceidcparmsid)) < 0) ERR;
90      if (H5DSset_scale(dimscaleidNAME_ATTRIBUTE) < 0) ERR;
91
92      /* Create a variable which uses it. */
93      if ((datasetid = H5Dcreate(fileidVAR1_NAMEH5T_NATIVE_INT,
94  spaceidcparmsid)) < 0) ERR;
95      if (H5DSattach_scale(datasetiddimscaleid, 0) < 0) ERR;
96      if (H5DSset_label(datasetid, 0, DIMSCALE_LABEL) < 0) ERR;
97
98      /* Fold up our tents. */
99      if (H5Dclose(dimscaleid) < 0 ||
100   H5Dclose(datasetid) < 0 ||
101   H5Sclose(spaceid) < 0 ||
102   H5Fclose(fileid) < 0) ERR;
103
104      {
105  hid_t fileidspaceid = 0, datasetid = 0;
106  hsize_t num_obji;
107  int obj_class;
108  char obj_name[STR_LEN + 1];
109  char dimscale_name[STR_LEN+1];
110  htri_t is_scale;
111  char label[STR_LEN+1];
112  int num_scales;
113  hsize_t dims[1], maxdims[1];
114  H5G_stat_t statbuf;
115  HDF5_OBJID_T dimscale_objvars_dimscale_obj;
116
117  /* Open the file. */
118  if ((fileid = H5Fopen(FILE_NAMEH5F_ACC_RDWRH5P_DEFAULT)) < 0) ERR;
119
120  /* Loop through objects in the root group. */
121  if (H5Gget_num_objs(fileid, &num_obj) < 0) ERR;
122  for (i=0; i<num_obji++)
123  {
124     /* Get the type (i.e. group, dataset, etc.), and the name of
125      * the object. */
126     if ((obj_class = H5Gget_objtype_by_idx(fileidi)) < 0) ERR;
127     if (H5Gget_objname_by_idx(fileidiobj_nameSTR_LEN) < 0) ERR;
128
129     /* Deal with object based on its obj_class. */
130     switch(obj_class)
131     {
132        case H5G_GROUP:
133   break;
134        case H5G_DATASET:
135   /* Open the dataset. */
136   if ((datasetid = H5Dopen(fileidobj_name)) < 0) ERR;
137
138   /* This should be an unlimited dataset. */
139   if ((spaceid = H5Dget_space(datasetid)) < 0) ERR;
140   if (H5Sget_simple_extent_dims(spaceiddimsmaxdims) < 0) ERR;
141   if (maxdims[0] != H5S_UNLIMITEDERR;
142
143   /* Is this a dimscale? */
144   if ((is_scale = H5DSis_scale(datasetid)) < 0) ERR;
145   if (is_scale && strcmp(obj_nameDIMSCALE_NAME)) ERR;
146   if (is_scale)
147   {
148      /* A dimscale comes with a NAME attribute, in
149       * addition to its real name. */
150      if (H5DSget_scale_name(datasetiddimscale_nameSTR_LEN) < 0) ERR;
151      if (strcmp(dimscale_nameNAME_ATTRIBUTE)) ERR;
152
153      /* fileno and objno uniquely identify an object and a
154       * HDF5 file. */
155      if (H5Gget_objinfo(datasetid, ".", 1, &statbuf) < 0) ERR;
156      dimscale_obj.fileno[0] = statbuf.fileno[0];
157      dimscale_obj.objno[0] = statbuf.objno[0];
158      dimscale_obj.fileno[1] = statbuf.fileno[1];
159      dimscale_obj.objno[1] = statbuf.objno[1];
160   }
161   else
162   {
163      /* Here's how to get the number of scales attached
164       * to the dataset's dimension 0. */
165      if ((num_scales = H5DSget_num_scales(datasetid, 0)) < 0) ERR;
166      if (num_scales != 1) ERR;
167
168      /* Go through all dimscales for this var and learn about them. */
169      if (H5DSiterate_scales(datasetid, 0, NULLalien_visitor,
170      &vars_dimscale_obj) < 0) ERR;
171      if (vars_dimscale_obj.fileno[0] != dimscale_obj.fileno[0] ||
172      vars_dimscale_obj.objno[0] != dimscale_obj.objno[0] ||
173      vars_dimscale_obj.fileno[1] != dimscale_obj.fileno[1] ||
174      vars_dimscale_obj.objno[1] != dimscale_obj.objno[1]) ERR;
175
176      /* There's also a label for dimension 0. */
177      if (H5DSget_label(datasetid, 0, labelSTR_LEN) < 0) ERR;
178   }
179   if (H5Dclose(datasetid) < 0) ERR;
180   break;
181        case H5G_TYPE:
182   break;
183        case H5G_LINK:
184   break;
185        default:
186   printf("Unknown object class %d!", obj_class);
187     }
188  }
189
190  /* Close up the shop. */
191  if (H5Sclose(spaceid) < 0 ||
192  H5Fclose(fileid) < 0) ERR;
193      }
194   }
195
196   SUMMARIZE_ERR;
197   FINAL_RESULTS;
198}
199


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