1/* This is part of the netCDF package.  Copyright 2013 University
2   Corporation for Atmospheric Research/Unidata See COPYRIGHT file for
3   conditions of use.
4
5   This program tests reading HDF5 files that contain scalar attributes and
6   variables, of both string and numeric datatypes.  The netCDF-4 library
7   should allow access to all of these.
8*/
9
10#include <nc_tests.h>
11#include "err_macros.h"
12#include <hdf5.h>
13
14#define FILE_NAME "tst_h_scalar.h5"
15#define VSTR_ATT1_NAME  "vstratt1"
16#define VSTR_ATT2_NAME  "vstratt2"
17#define VSTR_ATT3_NAME  "vstratt3"
18#define VSTR_ATT4_NAME  "vstratt4"
19#define VSTR_VAR1_NAME  "vstrvar1"
20#define VSTR_VAR2_NAME  "vstrvar2"
21#define FSTR_ATT_NAME   "fstratt"
22#define FSTR_VAR_NAME   "fstrvar"
23#define INT_ATT_NAME    "intatt"
24#define INT_VAR_NAME    "intvar"
25
26int
27add_attrs(hid_t objid)
28{
29    hid_t scalar_spaceid = -1;
30    hid_t vlstr_typeid = -1, fixstr_typeid = -1;
31    char *vlstr;
32    hid_t attid = -1;
33
34    /* Create scalar dataspace */
35    if ((scalar_spaceid = H5Screate(H5S_SCALAR)) < 0) ERR_GOTO;
36
37    /* Create string datatypes */
38    if ((vlstr_typeid = H5Tcreate(H5T_STRING, (size_t)H5T_VARIABLE)) < 0) ERR_GOTO;
39    if ((fixstr_typeid = H5Tcreate(H5T_STRING, (size_t)10)) < 0) ERR_GOTO;
40
41
42    /* Create attribute with VL string datatype on object */
43    if ((attid = H5Acreate2(objidVSTR_ATT1_NAMEvlstr_typeidscalar_spaceidH5P_DEFAULTH5P_DEFAULT)) < 0) ERR_GOTO;
44    /* No write, use fill value */
45    if (H5Aclose(attid) < 0) ERR_GOTO;
46
47    /* Create attribute with VL string datatype on object */
48    if ((attid = H5Acreate2(objidVSTR_ATT2_NAMEvlstr_typeidscalar_spaceidH5P_DEFAULTH5P_DEFAULT)) < 0) ERR_GOTO;
49    vlstr = NULL;
50    if (H5Awrite(attidvlstr_typeid, &vlstr) < 0) ERR_GOTO;
51    if (H5Aclose(attid) < 0) ERR_GOTO;
52
53    /* Create attribute with VL string datatype on object */
54    if ((attid = H5Acreate2(objidVSTR_ATT3_NAMEvlstr_typeidscalar_spaceidH5P_DEFAULTH5P_DEFAULT)) < 0) ERR_GOTO;
55    vlstr = malloc(10);
56    *vlstr = '\0';
57    if (H5Awrite(attidvlstr_typeid, &vlstr) < 0) ERR_GOTO;
58    if (H5Aclose(attid) < 0) ERR_GOTO;
59
60    /* Create attribute with VL string datatype on object */
61    if ((attid = H5Acreate2(objidVSTR_ATT4_NAMEvlstr_typeidscalar_spaceidH5P_DEFAULTH5P_DEFAULT)) < 0) ERR_GOTO;
62    strcpy(vlstr, "foo");
63    if (H5Awrite(attidvlstr_typeid, &vlstr) < 0) ERR_GOTO;
64    free(vlstr);
65    if (H5Aclose(attid) < 0) ERR_GOTO;
66
67    /* Create attribute with fixed-length string datatype on object */
68    if ((attid = H5Acreate2(objidFSTR_ATT_NAMEfixstr_typeidscalar_spaceidH5P_DEFAULTH5P_DEFAULT)) < 0) ERR_GOTO;
69    if (H5Aclose(attid) < 0) ERR_GOTO;
70
71    /* Create attribute with native integer datatype on object */
72    if ((attid = H5Acreate2(objidINT_ATT_NAMEH5T_NATIVE_INTscalar_spaceidH5P_DEFAULTH5P_DEFAULT)) < 0) ERR_GOTO;
73    if (H5Aclose(attid) < 0) ERR_GOTO;
74
75
76    /* Clean up objects created */
77    if (H5Sclose(scalar_spaceid) < 0) ERR_GOTO;
78    if (H5Tclose(vlstr_typeid) < 0) ERR_GOTO;
79    if (H5Tclose(fixstr_typeid) < 0) ERR_GOTO;
80
81    return(0);
82
83error:
84    H5E_BEGIN_TRY {
85        H5Aclose(attid);
86        H5Sclose(scalar_spaceid);
87        H5Tclose(vlstr_typeid);
88        H5Tclose(fixstr_typeid);
89    } H5E_END_TRY;
90    return(-1);
91}
92
93int
94check_attrs(int ncid, int obj)
95{
96    int attid;
97    int natts = 0;
98    size_t len;
99    nc_type type;
100    char *vlstr;
101    char fixstr[10];
102    int x;
103
104    /* Check the object's attributes are OK */
105    if (nc_inq_varnatts(ncidobj, &natts )) ERR_GOTO;
106    if (natts != 6) ERR_GOTO;
107
108    if (nc_inq_attid(ncidobjVSTR_ATT1_NAME, &attid)) ERR_GOTO;
109    if (attid != 0) ERR_GOTO;
110    if (nc_inq_atttype(ncidobjVSTR_ATT1_NAME, &type)) ERR_GOTO;
111    if (type != NC_STRINGERR_GOTO;
112    if (nc_inq_attlen(ncidobjVSTR_ATT1_NAME, &len)) ERR_GOTO;
113    if (len != 1) ERR_GOTO;
114    vlstr = NULL;
115    if (nc_get_att(ncidobjVSTR_ATT1_NAME, &vlstr)) ERR_GOTO;
116    if (NULL != vlstrERR_GOTO;
117
118    if (nc_inq_attid(ncidobjVSTR_ATT2_NAME, &attid)) ERR_GOTO;
119    if (attid != 1) ERR_GOTO;
120    if (nc_inq_atttype(ncidobjVSTR_ATT2_NAME, &type)) ERR_GOTO;
121    if (type != NC_STRINGERR_GOTO;
122    if (nc_inq_attlen(ncidobjVSTR_ATT2_NAME, &len)) ERR_GOTO;
123    if (len != 1) ERR_GOTO;
124    vlstr = NULL;
125    if (nc_get_att(ncidobjVSTR_ATT2_NAME, &vlstr)) ERR_GOTO;
126    if (NULL != vlstrERR_GOTO;
127
128    if (nc_inq_attid(ncidobjVSTR_ATT3_NAME, &attid)) ERR_GOTO;
129    if (attid != 2) ERR_GOTO;
130    if (nc_inq_atttype(ncidobjVSTR_ATT3_NAME, &type)) ERR_GOTO;
131    if (type != NC_STRINGERR_GOTO;
132    if (nc_inq_attlen(ncidobjVSTR_ATT3_NAME, &len)) ERR_GOTO;
133    if (len != 1) ERR_GOTO;
134    vlstr = NULL;
135    if (nc_get_att(ncidobjVSTR_ATT3_NAME, &vlstr)) ERR_GOTO;
136    if (strcmp(vlstr, "")) ERR_GOTO;
137    free(vlstr);
138
139    if (nc_inq_attid(ncidobjVSTR_ATT4_NAME, &attid)) ERR_GOTO;
140    if (attid != 3) ERR_GOTO;
141    if (nc_inq_atttype(ncidobjVSTR_ATT4_NAME, &type)) ERR_GOTO;
142    if (type != NC_STRINGERR_GOTO;
143    if (nc_inq_attlen(ncidobjVSTR_ATT4_NAME, &len)) ERR_GOTO;
144    if (len != 1) ERR_GOTO;
145    vlstr = NULL;
146    if (nc_get_att(ncidobjVSTR_ATT4_NAME, &vlstr)) ERR_GOTO;
147    if (strcmp(vlstr, "foo")) ERR_GOTO;
148    free(vlstr);
149
150    if (nc_inq_attid(ncidobjFSTR_ATT_NAME, &attid)) ERR_GOTO;
151    if (attid != 4) ERR_GOTO;
152    if (nc_inq_atttype(ncidobjFSTR_ATT_NAME, &type)) ERR_GOTO;
153    if (type != NC_CHARERR_GOTO;
154    if (nc_inq_attlen(ncidobjFSTR_ATT_NAME, &len)) ERR_GOTO;
155    if (len != 10) ERR_GOTO;
156    memset(fixstr, 1, sizeof(fixstr));
157    if (nc_get_att(ncidobjFSTR_ATT_NAMEfixstr)) ERR_GOTO;
158    if ('\0' != fixstr[0]) ERR_GOTO;
159
160    if (nc_inq_attid(ncidobjINT_ATT_NAME, &attid)) ERR_GOTO;
161    if (attid != 5) ERR_GOTO;
162    if (nc_inq_atttype(ncidobjINT_ATT_NAME, &type)) ERR_GOTO;
163    if (type != NC_INTERR_GOTO;
164    if (nc_inq_attlen(ncidobjINT_ATT_NAME, &len)) ERR_GOTO;
165    if (len != 1) ERR_GOTO;
166    x = -1;
167    if (nc_get_att(ncidobjINT_ATT_NAME, &x)) ERR_GOTO;
168    if (0 != xERR_GOTO;
169
170
171    return(0);
172
173error:
174    return(-1);
175}
176
177int
178main()
179{
180    printf("\n*** Creating file with datasets & attributes that have scalar dataspaces...");
181    {
182 hid_t fileid;
183        hid_t fcplid;
184 hid_t dsetid;
185        hid_t dcplid;
186 hid_t scalar_spaceid;
187        hid_t vlstr_typeidfixstr_typeid;
188 hid_t attid;
189
190        /* Create scalar dataspace */
191 if ((scalar_spaceid = H5Screate(H5S_SCALAR)) < 0) ERR;
192
193        /* Set creation ordering for file, so we can revise its contents later */
194        if ((fcplid = H5Pcreate(H5P_FILE_CREATE)) < 0) ERR;
195        if (H5Pset_link_creation_order(fcplidH5P_CRT_ORDER_TRACKED) < 0) ERR;
196        if (H5Pset_attr_creation_order(fcplidH5P_CRT_ORDER_TRACKED) < 0) ERR;
197
198 /* Create new file, using default properties */
199 if ((fileid = H5Fcreate(FILE_NAMEH5F_ACC_TRUNCfcplidH5P_DEFAULT)) < 0) ERR;
200
201        /* Close file creation property list */
202        if (H5Pclose(fcplid) < 0) ERR;
203
204
205        /* Create variable-length string datatype */
206        if ((vlstr_typeid = H5Tcreate(H5T_STRING, (size_t)H5T_VARIABLE)) < 0) ERR;
207
208        /* Create fixed-length string datatype */
209        if ((fixstr_typeid = H5Tcreate(H5T_STRING, (size_t)10)) < 0) ERR;
210
211
212        /* Set creation ordering for dataset, so we can revise its contents later */
213        if ((dcplid = H5Pcreate(H5P_DATASET_CREATE)) < 0) ERR;
214        if (H5Pset_attr_creation_order(dcplidH5P_CRT_ORDER_TRACKED) < 0) ERR;
215
216
217        /* Create scalar dataset with VL string datatype */
218        if ((dsetid = H5Dcreate2(fileidVSTR_VAR1_NAMEvlstr_typeidscalar_spaceidH5P_DEFAULTdcplidH5P_DEFAULT)) < 0) ERR;
219
220        /* Add attributes to dataset */
221        if (add_attrs(dsetid) < 0) ERR;
222
223        /* Close VL string dataset */
224        if (H5Dclose(dsetid) < 0) ERR;
225
226
227        /* Create scalar dataset with fixed-length string datatype */
228        if ((dsetid = H5Dcreate2(fileidFSTR_VAR_NAMEfixstr_typeidscalar_spaceidH5P_DEFAULTdcplidH5P_DEFAULT)) < 0) ERR;
229
230        /* Add attributes to dataset */
231        if (add_attrs(dsetid) < 0) ERR;
232
233        /* Close fixed-length string dataset */
234        if (H5Dclose(dsetid) < 0) ERR;
235
236
237        /* Create scalar dataset with native integer datatype */
238        if ((dsetid = H5Dcreate2(fileidINT_VAR_NAMEH5T_NATIVE_INTscalar_spaceidH5P_DEFAULTdcplidH5P_DEFAULT)) < 0) ERR;
239
240        /* Add attributes to dataset */
241        if (add_attrs(dsetid) < 0) ERR;
242
243        /* Close native integer dataset */
244        if (H5Dclose(dsetid) < 0) ERR;
245
246
247        /* Add attributes to root group */
248        if (add_attrs(fileid) < 0) ERR;
249
250
251        /* Close dataset creation property list */
252        if (H5Pclose(dcplid) < 0) ERR;
253
254        /* Close string datatypes */
255        if (H5Tclose(vlstr_typeid) < 0) ERR;
256        if (H5Tclose(fixstr_typeid) < 0) ERR;
257
258
259        /* Close rest */
260 if (H5Sclose(scalar_spaceid) < 0) ERR;
261 if (H5Fclose(fileid) < 0) ERR;
262    }
263    SUMMARIZE_ERR;
264
265    printf("*** Checking accessing file through netCDF-4 API...");
266    {
267 int ncidvarid;
268        size_t len;
269        nc_type type;
270        int ndims;
271        char *vlstr;
272        int x;
273
274 if (nc_open(FILE_NAMENC_NOWRITE, &ncid)) ERR;
275
276        /* Check the global attributes are OK */
277        if (check_attrs(ncidNC_GLOBAL) < 0) ERR;
278
279        /* Verify that the VL string dataset is present and OK */
280 if (nc_inq_varid(ncidVSTR_VAR1_NAME, &varid)) ERR;
281        if (varid != 0) ERR;
282 if (nc_inq_vartype(ncidvarid, &type)) ERR;
283 if (type != NC_STRINGERR;
284        if (nc_inq_varndims(ncidvarid, &ndims)) ERR;
285        if (ndims != 0) ERR;
286        vlstr = NULL;
287        if (nc_get_var(ncidvarid, &vlstr)) ERR;
288        if (NULL != vlstrERR;
289
290        /* Check the variable's attributes are OK */
291        if (check_attrs(ncidvarid) < 0) ERR;
292
293        /* Verify that the fixed-length string dataset is present and OK */
294 if (nc_inq_varid(ncidFSTR_VAR_NAME, &varid)) ERR;
295        if (varid != 1) ERR;
296 if (nc_inq_vartype(ncidvarid, &type)) ERR;
297 if (type != NC_STRINGERR;
298        if (nc_inq_varndims(ncidvarid, &ndims)) ERR;
299        if (ndims != 0) ERR;
300        vlstr = NULL;
301        if (nc_get_var(ncidvarid, &vlstr)) ERR;
302        if ('\0' != *vlstrERR;
303        free(vlstr);
304
305        /* Check the variable's attributes are OK */
306        if (check_attrs(ncidvarid) < 0) ERR;
307
308        /* Verify that the integer dataset is present and OK */
309 if (nc_inq_varid(ncidINT_VAR_NAME, &varid)) ERR;
310        if (varid != 2) ERR;
311 if (nc_inq_vartype(ncidvarid, &type)) ERR;
312 if (type != NC_INTERR;
313        if (nc_inq_varndims(ncidvarid, &ndims)) ERR;
314        if (ndims != 0) ERR;
315        x = -1;
316        if (nc_get_var(ncidvarid, &x)) ERR;
317        if (0 != xERR;
318
319        /* Check the variable's attributes are OK */
320        if (check_attrs(ncidvarid) < 0) ERR;
321
322 if (nc_close(ncid)) ERR;
323    }
324    SUMMARIZE_ERR;
325
326    printf("*** Checking revising file through netCDF-4 API...");
327    {
328 int ncidvarid;
329        char *vlstr;
330
331 if (nc_open(FILE_NAMENC_WRITE, &ncid)) ERR;
332
333        /* Write to the VL string variable */
334 if (nc_inq_varid(ncidVSTR_VAR1_NAME, &varid)) ERR;
335        vlstr = NULL;
336        if (nc_put_var(ncidvarid, &vlstr)) ERR;
337
338        vlstr = malloc(10);
339        *vlstr = '\0';
340        if (nc_put_var(ncidvarid, &vlstr)) ERR;
341
342        strcpy(vlstr, "foo");
343        if (nc_put_var(ncidvarid, &vlstr)) ERR;
344        free(vlstr);
345
346
347        /* Write to a VL string attribute */
348        vlstr = NULL;
349        if (nc_put_att(ncidvaridVSTR_ATT1_NAMENC_STRING, 1, &vlstr)) ERR;
350
351        vlstr = malloc(10);
352        *vlstr = '\0';
353        if (nc_put_att(ncidvaridVSTR_ATT1_NAMENC_STRING, 1, &vlstr)) ERR;
354
355        strcpy(vlstr, "foo");
356        if (nc_put_att(ncidvaridVSTR_ATT1_NAMENC_STRING, 1, &vlstr)) ERR;
357        free(vlstr);
358
359
360        /* Define a new VL string variable */
361        if (nc_def_var(ncidVSTR_VAR2_NAME , NC_STRING, 0, NULL, &varid)) ERR;
362
363        /* Write to the variable's fill-value */
364        vlstr = NULL;
365        if (nc_put_att(ncidvarid_FillValueNC_STRING, 1, &vlstr)) ERR;
366
367        vlstr = malloc(10);
368        *vlstr = '\0';
369        if (nc_put_att(ncidvarid_FillValueNC_STRING, 1, &vlstr)) ERR;
370
371        strcpy(vlstr, "foo");
372        if (nc_put_att(ncidvarid_FillValueNC_STRING, 1, &vlstr)) ERR;
373        free(vlstr);
374
375
376 if (nc_close(ncid)) ERR;
377    }
378    SUMMARIZE_ERR;
379
380    FINAL_RESULTS;
381}


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