bes Updated for version 3.21.1
The Backend Server (BES) is the lower two tiers of the Hyrax data server
h5dmr.h
Go to the documentation of this file.
1
2// This file is part of hdf5_handler a HDF5 file handler for the OPeNDAP
3// data server.
4
5// Copyright (c) 2007-2023 The HDF Group, Inc. and OPeNDAP, Inc.
6//
7// This is free software; you can redistribute it and/or modify it under the
8// terms of the GNU Lesser General Public License as published by the Free
9// Software Foundation; either version 2.1 of the License, or (at your
10// option) any later version.
11//
12// This software is distributed in the hope that it will be useful, but
13// WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
14// or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public
15// License for more details.
16//
17// You should have received a copy of the GNU Lesser General Public
18// License along with this library; if not, write to the Free Software
19// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
20//
21// You can contact OPeNDAP, Inc. at PO Box 112, Saunderstown, RI. 02874-0112.
22// You can contact The HDF Group, Inc. at 410 E University Ave,
23// Suite 200, Champaign, IL 61820
24
39
40
41#ifndef _h5dmr_H
42#define _h5dmr_H
43#include <unordered_map>
44#include <unordered_set>
45#include <map>
46
47#include <H5Gpublic.h>
48#include <H5Fpublic.h>
49#include <H5Ipublic.h>
50#include <H5Tpublic.h>
51#include <H5Spublic.h>
52#include <H5Apublic.h>
53#include <H5public.h>
54
55#include <libdap/DDS.h>
56#include <libdap/D4Group.h>
57#include <libdap/D4Attributes.h>
58#include <HE5Grid.h>
59#include <HE5Var.h>
60#include <HE5GridPara.h>
61
62// This struct stores the link object address and the shortest path link.
63// Note: if it is necessary to retrieve all the link paths, uncomment
64// vector<string>link_paths and change corresponding code.
65
66#if (H5_VERS_MAJOR == 1 && ((H5_VERS_MINOR == 12) || (H5_VERS_MINOR == 13)) || (H5_VERS_MINOR == 14))
67typedef struct {
68 H5O_token_t link_addr;
69 string slink_path;
70 //vector<string> link_paths;
72#else
73typedef struct {
74 haddr_t link_addr;
75 string slink_path;
77#endif
78
79enum class HE5_TYPE {SW,GD,ZA};
80
81typedef struct {
82
83 std::string xdim_fqn;
84 std::string ydim_fqn;
85 int xdim_size;
86 int ydim_size;
87
93 double point_left;
96
97 // The following pixel registration, grid origin, and projection code
98 // are defined in include/HE5_HdfEosDef.h that can be found in the
99 // HDF-EOS5 library distribution.
100
101 // PixelRegistration
102 // These are actually EOS5 constants, but we define these
103 // since we do not depend on the HDF-EOS5 library.
104 EOS5GridPRType pixelregistration; // either _HE5_HDFE_(CENTER|CORNER)
105
106 // GridOrigin
107 EOS5GridOriginType gridorigin; // one of HE5_HDFE_GD_(U|L)(L|R)
108
109 // ProjectionCode
110 EOS5GridPCType projection;
111
112 // Projection parameters
113 double param[13];
114
115 // zone (may only be applied to UTM)
116 int zone;
117
118 // sphere
119 int sphere;
120
122
123typedef struct {
124 std::string dpath0;
125 std::string dpath1;
127
128typedef struct {
129 std::string vpath0;
130 std::string vpath1;
131 std::string cf_gmap_path;
133
134typedef struct {
135 std::unordered_map<std::string,std::vector<std::string>> varpath_to_dims;
136 std::unordered_map<std::string,std::vector<HE5Dim>> grppath_to_dims;
137 std::unordered_map<std::string,eos5_grid_info_t> gridname_to_info;
138 std::vector<std::pair<eos5_dname_info_t,eos5_cname_info_t>> dimpath_to_cvpath;
140
141
142bool breadth_first(hid_t, hid_t, const char *, libdap::D4Group* par_grp, const char *,bool,bool,
143 std::vector<link_info_t>&, eos5_dim_info_t & ,std::vector<std::string> &);
144void obtain_hdf5_object_name(hid_t pid, hsize_t obj_index, const char *gname, std::vector<char> &oname);
145bool check_soft_external_links(libdap::D4Group *par_grp, hid_t pid, int & slinkindex, const char *gname,
146 const std::vector<char> &oname, bool handle_softlink);
147void handle_actual_dataset(libdap::D4Group *par_grp, hid_t pid, const string &full_path_name, const string &fname,
148 bool use_dimscale, bool is_eos5, eos5_dim_info_t &eos5_dim_info);
149void handle_pure_dimension(libdap::D4Group *par_grp, hid_t pid, const std::vector<char>& oname, bool is_eos5,
150 const std::string &full_path_name);
151void handle_eos5_datasets(libdap::D4Group* par_grp, const char *gname, eos5_dim_info_t &eos5_dim_info);
152void handle_child_grp(hid_t file_id, hid_t pid, const char *gname, libdap::D4Group* par_grp, const char *fname,
153 bool use_dimscale, bool is_eos5,std::vector<link_info_t> & hdf5_hls,
154 eos5_dim_info_t & eos5_dim_info, std::vector<std::string> & handled_cv_names,
155 const std::vector<char>& oname);
156
157void read_objects(libdap::D4Group* d4_grp,hid_t, const std::string & varname, const std::string & filename, hid_t, bool, bool,
159void read_objects_base_type(libdap::D4Group* d4_grp,hid_t, const std::string & varname, const std::string & filename, hid_t,
160 bool, bool, eos5_dim_info_t &);
161void read_objects_basetype_attr_hl(const std::string &varname, libdap::BaseType *bt, hid_t dset_id, bool is_eos5);
162
163void read_objects_structure(libdap::D4Group* d4_grp,const std::string & varname, const std::string & filename,
164 hid_t, bool, bool);
165void read_objects_structure_arrays(libdap::D4Group *d4_grp, libdap::Structure *structure, const std::string & varname,
166 const std::string &newvarname, const std::string &filename, hid_t dset_id,
167 bool is_eos5);
168void read_objects_structure_scalar(libdap::D4Group *d4_grp, libdap::Structure *structure, const std::string & varname,
169 hid_t dset_id, bool is_eos5);
170
171std::string obtain_new_varname(const std::string &varname, bool use_dimscale, bool is_eos5);
172
173std::string get_hardlink_dmr(hid_t, const std::string &);
174void get_softlink(libdap::D4Group* par_grp, hid_t, const std::string &, int,size_t);
175void map_h5_dset_hardlink_to_d4(hid_t h5_objid,const std::string & full_path, libdap::BaseType* d4b,
176 libdap::Structure * d4s,int flag);
177
179void map_h5_attrs_to_dap4(hid_t oid,libdap::D4Group* d4g, libdap::BaseType* d4b, libdap::Structure * d4s,int flag);
181void map_h5_varpath_to_dap4_attr(libdap::D4Group* d4g,libdap::BaseType* d4b,libdap::Structure * d4s,
182 const std::string &,short flag);
183
185void add_dap4_coverage_default(libdap::D4Group* d4_grp,const std::vector<std::string>& handled_coord_names);
186void add_dap4_coverage_default_internal(libdap::D4Group* d4_grp, std::unordered_map<std::string,libdap::Array*> &,
187 std::unordered_map<std::string,libdap::Array*> &);
188void obtain_ds_name_array_maps(libdap::D4Group*, std::unordered_map<std::string,libdap::Array*> &,
189 const std::vector<std::string>& handled_coord_names);
190void obtain_ds_name_array_maps_internal(libdap::BaseType *v, std::unordered_map<string,libdap::Array*>&dsn_array_maps,
191 const std::vector<std::string>& handled_all_cv_names);
192void obtain_coord_names(libdap::Array*, std::vector<std::string>& coord_names);
193void obtain_multi_string_coord_names(libdap::D4Attribute *d4_attr, std::vector<std::string> & coord_names);
194void make_coord_names_fpath(libdap::D4Group*, std::vector<std::string>& coord_names);
195bool obtain_no_path_cv(libdap::D4Group*, std::string &coord_name);
196void handle_absolute_path_cv(const libdap::D4Group*, std::string &coord_name);
197void handle_relative_path_cv(const libdap::D4Group*, std::string &coord_name);
198void handle_relative_path_cvname_internal(const libdap::D4Group *d4_grp, std::string &coord_name,
199 unsigned short sep_count);
200
201void remove_empty_coord_names(std::vector<std::string>&);
202void obtain_handled_dim_names(libdap::Array*, std::unordered_set<std::string> & handled_dim_names);
203void add_coord_maps(libdap::D4Group*, libdap::Array*, std::vector<std::string> &coord_name,
204 std::unordered_map<std::string,libdap::Array*> & coname_array_maps, std::unordered_set<std::string>&);
205void add_dimscale_maps(libdap::Array*, std::unordered_map<std::string,libdap::Array*> & dc_array_maps,
206 const std::unordered_set<std::string> & handled_dim_names);
207void reorder_vars(libdap::D4Group*, const std::map<std::string,libdap::Array*> &coname_array_maps,
208 const std::map<std::string,libdap::Array*> & dc_array_maps);
209void reorder_vars_internal(libdap::D4Group* d4_grp, const std::vector<int> &cv_pos,
210 const std::vector<libdap::BaseType *> &cv_obj_ptr,int stop_index);
211void reorder_vars_internal_final_phase(libdap::D4Group* d4_grp, const std::vector<int> &mov_cv_pos,
212 const std::vector<int> &mov_front_pos,
213 const std::vector<libdap::BaseType *> &mov_front_vptr,
214 const std::vector<libdap::BaseType *> &mov_cv_ptr);
215#if 0
216bool is_cvar(const libdap::BaseType*, const std::unordered_map<std::string,libdap::Array*> &coname_array_maps, const std::unordered_map<std::string,libdap::Array*> & dc_array_maps);
217#endif
218
220string read_struct_metadata(hid_t s_file_id);
221void obtain_struct_metadata_info(hid_t ecs_grp_id, std::vector<std::string> &s_oname, std::vector<bool> &smetatype,
222 int &strmeta_num_total, bool &strmeta_no_suffix, hsize_t nelems) ;
223int obtain_struct_metadata_value(hid_t ecs_grp_id, const std::vector<std::string> &s_oname,
224 const std::vector<bool> &smetatype, hsize_t nelems,
225 std::vector<std::string> &strmeta_value, std::string &total_strmeta_value) ;
226int obtain_struct_metadata_value_internal(hid_t ecs_grp_id, const vector<string> &s_oname,
227 vector<string> &strmeta_value, string &total_strmeta_value,
228 const string &finstr, hsize_t i);
229int get_strmetadata_num(const string & meta_str);
230
231void obtain_eos5_dims(hid_t fileid, eos5_dim_info_t &);
232void build_var_dim_path(const std::string & eos5_obj_name, const std::vector<HE5Var>& var_list,
233 std::unordered_map<std::string, std::vector<std::string>>& varpath_to_dims,
234 HE5_TYPE eos5_type, bool is_geo);
235void build_grp_dim_path(const std::string & eos5_obj_name, const std::vector<HE5Dim>& dim_list,
236 std::unordered_map<std::string, std::vector<HE5Dim>>& grppath_to_dims, HE5_TYPE eos5_type);
237bool obtain_eos5_dim(const std::string & varname, const std::unordered_map<std::string,
238 vector<std::string>>& varpath_to_dims, vector<std::string> & dimnames);
239bool obtain_eos5_grp_dim(const std::string & varname, const std::unordered_map<std::string,
240 vector<HE5Dim>>& grppath_to_dims, vector<std::string> & dimnames);
241
242void add_possible_eos5_grid_vars(libdap::D4Group*, eos5_dim_info_t &);
243void add_eos5_grid_vars_geo(libdap::D4Group* d4_grp, const eos5_grid_info_t & eg_info);
244void add_eos5_grid_vars_non_geo(libdap::D4Group* d4_grp, eos5_dim_info_t &eos5_dim_info, const eos5_grid_info_t & eg_info);
245bool no_eos5_grid_vars_in_grp(libdap::D4Group *d4_group, const eos5_grid_info_t &eg_info);
246
247void build_gd_info(const HE5Grid &gd,std::unordered_map<std::string,eos5_grid_info_t>& gridname_to_info);
248bool is_eos5_grid_grp(libdap::D4Group *,const eos5_dim_info_t &eos5_dim_info, eos5_grid_info_t &);
249
250// Pure dimensions etc. handling
251hsize_t obtain_unlim_pure_dim_size(hid_t pid, const std::string &dname);
252hsize_t obtain_unlim_pure_dim_size_internal(hid_t dset_id, const std::string &dname, const std::string &reference_name);
253hsize_t obtain_unlim_pure_dim_size_internal_value(hid_t dset_id, hid_t attr_id, hid_t atype_id,
254 const std::string &reference_name, const std::string &dname);
255void add_ps_cf_grid_mapping_attrs(libdap::BaseType *dummy_proj_cf, const eos5_grid_info_t &);
256void add_lamaz_cf_grid_mapping_attrs(libdap::BaseType *dummy_proj_cf, const eos5_grid_info_t &);
257void add_possible_var_cv_info(libdap::BaseType *, const eos5_dim_info_t &eos5_dim_info);
258void make_attributes_to_cf(libdap::BaseType *, const eos5_dim_info_t &eos5_dim_info);
259
260#endif
STL class.
void read_objects(DAS &das, const string &varname, hid_t oid, int num_attr)
Definition h5das.cc:299
void map_h5_attrs_to_dap4(hid_t oid, libdap::D4Group *d4g, libdap::BaseType *d4b, libdap::Structure *d4s, int flag)
A function that maps HDF5 attributes to DAP4.
void get_softlink(libdap::D4Group *par_grp, hid_t, const std::string &, int, size_t)
Definition h5dmr.cc:1069
string read_struct_metadata(hid_t s_file_id)
EOS5 handling.
Definition h5dmr.cc:1177
void map_h5_varpath_to_dap4_attr(libdap::D4Group *d4g, libdap::BaseType *d4b, libdap::Structure *d4s, const std::string &, short flag)
A function that maps HDF5 object full path as an attribute to DAP4.
bool breadth_first(hid_t, hid_t, const char *, libdap::D4Group *par_grp, const char *, bool, bool, std::vector< link_info_t > &, eos5_dim_info_t &, std::vector< std::string > &)
Definition h5dmr.cc:116
void read_objects_structure(libdap::D4Group *d4_grp, const std::string &varname, const std::string &filename, hid_t, bool, bool)
Definition h5dmr.cc:696
void read_objects_base_type(libdap::D4Group *d4_grp, hid_t, const std::string &varname, const std::string &filename, hid_t, bool, bool, eos5_dim_info_t &)
Definition h5dmr.cc:576
void add_dap4_coverage_default(libdap::D4Group *d4_grp, const std::vector< std::string > &handled_coord_names)
Add DAP4 coverage.
Definition h5dmr.cc:1937
double point_right
The rightmost coordinate value of a Grid.
Definition h5dmr.h:95
double point_upper
The top coordinate value of a Grid.
Definition h5dmr.h:91
double point_lower
The bottom coordinate value of a Grid.
Definition h5dmr.h:89
double point_left
The leftmost coordinate value of a Grid.
Definition h5dmr.h:93