libdap Updated for version 3.21.1
libdap4 is an implementation of OPeNDAP's DAP protocol.
DDS.h
Go to the documentation of this file.
1// -*- mode: c++; c-basic-offset:4 -*-
2
3// This file is part of libdap, A C++ implementation of the OPeNDAP Data
4// Access Protocol.
5
6// Copyright (c) 2002,2003 OPeNDAP, Inc.
7// Author: James Gallagher <jgallagher@opendap.org>
8//
9// This library is free software; you can redistribute it and/or
10// modify it under the terms of the GNU Lesser General Public
11// License as published by the Free Software Foundation; either
12// version 2.1 of the License, or (at your option) any later version.
13//
14// This library is distributed in the hope that it will be useful,
15// but WITHOUT ANY WARRANTY; without even the implied warranty of
16// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
17// Lesser General Public License for more details.
18//
19// You should have received a copy of the GNU Lesser General Public
20// License along with this library; if not, write to the Free Software
21// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
22//
23// You can contact OPeNDAP, Inc. at PO Box 112, Saunderstown, RI. 02874-0112.
24
25// (c) COPYRIGHT URI/MIT 1994-1999
26// Please read the full copyright statement in the file COPYRIGHT_URI.
27//
28// Authors:
29// jhrg,jimg James Gallagher <jgallagher@gso.uri.edu>
30
31// Provide access to the DDS. This class is used to parse DDS text files, to
32// produce a printed representation of the in-memory variable table, and to
33// update the table on a per-variable basis.
34//
35// jhrg 9/8/94
36
37#ifndef _dds_h
38#define _dds_h 1
39
40#include <cstdio>
41#include <iostream>
42#include <string>
43#include <vector>
44
45#ifndef _basetype_h
46#include "BaseType.h"
47#endif
48
49#ifndef _constructor_h
50#include "Constructor.h"
51#endif
52
53#ifndef base_type_factory_h
54#include "BaseTypeFactory.h"
55#endif
56
57#ifndef _das_h
58#include "DAS.h"
59#endif
60
61#ifndef A_DapObj_h
62#include "DapObj.h"
63#endif
64
65#ifndef XMLWRITER_H_
66#include "XMLWriter.h"
67#endif
68
69namespace libdap {
70
73
175
176class DDS : public DapObj {
177private:
178 BaseTypeFactory *d_factory;
179
180 string d_name; // The dataset d_name
181 string d_filename; // File d_name (or other OS identifier) for
182 string d_container_name; // d_name of container structure
183 Structure *d_container; // current container for container d_name
184 // dataset or part of dataset.
185
186 int d_dap_major; // The protocol major version number
187 int d_dap_minor; // ... and minor version number
188 string d_dap_version; // String version of the protocol
189 string d_request_xml_base;
190 string d_namespace;
191
192 AttrTable d_attr; // Global attributes.
193
194 vector<BaseType *> vars; // Variables at the top level
195
196 int d_timeout; // alarm time in seconds. If greater than
197 // zero, raise the alarm signal if more than
198 // d_timeout seconds are spent reading data.
199
200 uint64_t d_max_response_size_kb; // In kilobytes...
201
202 friend class DDSTest;
203
204protected:
205 void duplicate(const DDS &dds);
206 BaseType *leaf_match(const string &name, BaseType::btp_stack *s = 0);
207 BaseType *exact_match(const string &name, BaseType::btp_stack *s = 0);
208
209public:
210 typedef std::vector<BaseType *>::const_iterator Vars_citer;
211 typedef std::vector<BaseType *>::iterator Vars_iter;
212 typedef std::vector<BaseType *>::reverse_iterator Vars_riter;
213
214 DDS(BaseTypeFactory *factory, const string &name = "");
215 DDS(BaseTypeFactory *factory, const string &name, const string &version);
216 DDS(const DDS &dds);
217
218 virtual ~DDS();
219
220 DDS &operator=(const DDS &rhs);
221
222 virtual void transfer_attributes(DAS *das);
223
224 string get_dataset_name() const;
225 void set_dataset_name(const string &n);
226
231 BaseTypeFactory *get_factory() const { return d_factory; }
232
240 BaseTypeFactory *t = d_factory;
241 d_factory = factory;
242 return t;
243 }
244
245 virtual AttrTable &get_attr_table();
246
247 string filename() const;
248 void filename(const string &fn);
249
251 int get_dap_major() const { return d_dap_major; }
253 int get_dap_minor() const { return d_dap_minor; }
254
255 void set_dap_version(const string &version_string = "2.0");
256 string get_dap_version() const { return d_dap_version; }
257 string get_dmr_version() const { return "1.0"; }
258
260 void set_dap_major(int p);
262 void set_dap_minor(int p);
264 void set_dap_version(double d);
265
267 string get_request_xml_base() const { return d_request_xml_base; }
268
270 void set_request_xml_base(const string &xb) { d_request_xml_base = xb; }
271
273 string get_namespace() const { return d_namespace; }
274
276 void set_namespace(const string &ns) { d_namespace = ns; }
277
279 long get_response_limit() { return (long)(d_max_response_size_kb * 1024); }
280
285 uint64_t get_response_limit_kb() const { return d_max_response_size_kb; }
286
292 void set_response_limit(long size) { d_max_response_size_kb = size; }
293
299 void set_response_limit_kb(uint64_t size) { d_max_response_size_kb = size; }
300
304 bool too_big() { return d_max_response_size_kb != 0 && get_request_size_kb(true) > d_max_response_size_kb; }
305
307 int get_request_size(bool constrained);
308
310 uint64_t get_request_size_kb(bool constrained);
311
312 string container_name();
313 void container_name(const string &cn);
315
316 void add_var(BaseType *bt);
317 void add_var_nocopy(BaseType *bt);
318
320 void del_var(const string &n);
321
322 BaseType *var(const string &n, BaseType::btp_stack &s);
323 BaseType *var(const string &n, BaseType::btp_stack *s = 0);
324 int num_var();
325
331 const vector<BaseType *> &variables() const { return vars; }
332
336 Vars_iter var_begin() { return vars.begin(); }
338 Vars_riter var_rbegin() { return vars.rbegin(); }
339
341 Vars_iter var_end() { return vars.end(); }
343 Vars_riter var_rend() { return vars.rend(); }
344
346 Vars_iter get_vars_iter(int i) { return vars.begin() + i; }
348 BaseType *get_var_index(int i) { return *(vars.begin() + i); }
349
351 void insert_var(Vars_iter i, BaseType *ptr);
354 void del_var(Vars_iter i);
356 void del_var(Vars_iter i1, Vars_iter i2);
357
363 void timeout_on();
364 void timeout_off();
365 void set_timeout(int t);
366 int get_timeout();
368
369 // These parse the DAP2 curly-brace document and make a C++ object.
370 void parse(string fname);
371 void parse(int fd);
372 void parse(FILE *in = stdin);
373
374 // These print the Binary object in either the curly-brace or XML reps
375 void print(FILE *out);
376 void print_constrained(FILE *out);
377 void print_xml(FILE *out, bool constrained, const string &blob = "");
378
379 // Same as above, but using C++ i/o streams
380 void print(ostream &out);
381 void print_constrained(ostream &out);
382 void print_xml(ostream &out, bool constrained, const string &blob = "");
383
384 // Print the XML using libxml2; the other print_xml methods use this impl.
385 void print_xml_writer(ostream &out, bool constrained, const string &blob = "");
386
387 // Print the DAP4 DMR 'object'
388 void print_dmr(ostream &out, bool constrained);
389
390 void print_das(ostream &out);
391 DAS *get_das();
392 void get_das(DAS *das);
393
394 void mark_all(bool state);
395 bool mark(const string &name, bool state);
396 bool check_semantics(bool all = false);
397
399
400 bool is_dap4_projected(std::vector<string> &inventory);
401
402 virtual void dump(ostream &strm) const;
403};
404
405} // namespace libdap
406
407#endif // _dds_h
Contains the attributes for a dataset.
Definition AttrTable.h:150
The basic data type for the DODS DAP types.
Definition BaseType.h:118
stack< BaseType * > btp_stack
Definition BaseType.h:149
Hold attribute data for a DAP2 dataset.
Definition DAS.h:119
void set_dataset_name(const string &n)
Definition DDS.cc:271
void set_dap_major(int p)
Definition DDS.cc:296
void mark_all(bool state)
Definition DDS.cc:1381
void print_dmr(ostream &out, bool constrained)
Print the DAP4 DMR object using a DDS.
Definition DDS.cc:1228
virtual ~DDS()
Definition DDS.cc:202
void add_var_nocopy(BaseType *bt)
Adds the variable to the DDS.
Definition DDS.cc:504
bool check_semantics(bool all=false)
Check the semantics of each of the variables represented in the DDS.
Definition DDS.cc:1300
void set_namespace(const string &ns)
Set the namespace for this DDS/DDX object/response.
Definition DDS.h:276
string filename() const
Definition DDS.cc:287
virtual AttrTable & get_attr_table()
Definition DDS.cc:276
void set_request_xml_base(const string &xb)
Definition DDS.h:270
std::vector< BaseType * >::const_iterator Vars_citer
Definition DDS.h:210
void set_response_limit(long size)
Definition DDS.h:292
string get_dap_version() const
Definition DDS.h:256
uint64_t get_request_size_kb(bool constrained)
Get the estimated response size in kilobytes.
Definition DDS.cc:463
int get_timeout()
Definition DDS.cc:721
virtual void transfer_attributes(DAS *das)
Definition DDS.cc:231
BaseType * leaf_match(const string &name, BaseType::btp_stack *s=0)
Definition DDS.cc:608
void set_dap_minor(int p)
Definition DDS.cc:313
string get_namespace() const
Get the namespace associated with the DDS - likely set only by DDX responses.
Definition DDS.h:273
int num_var()
Returns the number of variables in the DDS.
Definition DDS.cc:685
void print(FILE *out)
Print the entire DDS to the specified file.
Definition DDS.cc:812
BaseType * get_var_index(int i)
Get a variable.
Definition DDS.h:348
int get_request_size(bool constrained)
Get the estimated response size in bytes.
Definition DDS.cc:438
bool is_dap4_projected(std::vector< string > &inventory)
Definition DDS.cc:1391
Vars_riter var_rbegin()
Return a reverse iterator.
Definition DDS.h:338
BaseTypeFactory * set_factory(BaseTypeFactory *factory)
Definition DDS.h:239
string get_dataset_name() const
Definition DDS.cc:268
void timeout_off()
Definition DDS.cc:695
bool too_big()
Definition DDS.h:304
BaseType * exact_match(const string &name, BaseType::btp_stack *s=0)
Definition DDS.cc:642
void del_var(const string &n)
Removes a variable from the DDS.
Definition DDS.cc:523
void parse(string fname)
Parse a DDS from a file with the given d_name.
Definition DDS.cc:740
BaseType * var(const string &n, BaseType::btp_stack &s)
Definition DDS.cc:575
void print_xml(FILE *out, bool constrained, const string &blob="")
Definition DDS.cc:1113
void insert_var(Vars_iter i, BaseType *ptr)
Insert a variable before the referenced element.
Definition DDS.cc:673
void duplicate(const DDS &dds)
Definition DDS.cc:117
bool mark(const string &name, bool state)
Mark the send_p flag of the named variable to state.
Definition DDS.cc:1342
std::vector< BaseType * >::reverse_iterator Vars_riter
Definition DDS.h:212
void timeout_on()
Definition DDS.cc:687
int get_dap_minor() const
Get the DAP minor version as sent by the client.
Definition DDS.h:253
friend class DDSTest
Definition DDS.h:202
uint64_t get_response_limit_kb() const
The maximum allowed response size, in kilobytes. Zero indicates no limit (default).
Definition DDS.h:285
DDS(BaseTypeFactory *factory, const string &name="")
Definition DDS.cc:160
void tag_nested_sequences()
Traverse DDS, set Sequence leaf nodes.
Definition DDS.cc:730
BaseTypeFactory * get_factory() const
Definition DDS.h:231
DAS * get_das()
Get a DAS object.
Definition DDS.cc:957
Vars_iter var_begin()
Definition DDS.h:336
void print_constrained(FILE *out)
Print a constrained DDS to the specified file.
Definition DDS.cc:1071
string container_name()
Definition DDS.cc:395
Vars_riter var_rend()
Return a reverse iterator.
Definition DDS.h:343
string get_dmr_version() const
Definition DDS.h:257
void insert_var_nocopy(Vars_iter i, BaseType *ptr)
Definition DDS.cc:682
string get_request_xml_base() const
Get the URL that will return this DDS/DDX/DataThing.
Definition DDS.h:267
void set_response_limit_kb(uint64_t size)
Set the maximum response size, in kilobytes. The size is given in kilobytes..
Definition DDS.h:299
void set_timeout(int t)
Definition DDS.cc:714
Vars_iter var_end()
Return an iterator.
Definition DDS.h:341
int get_dap_major() const
Get the DAP major version as sent by the client.
Definition DDS.h:251
const vector< BaseType * > & variables() const
Definition DDS.h:331
void set_dap_version(const string &version_string="2.0")
Definition DDS.cc:328
Structure * container()
Definition DDS.cc:422
void add_var(BaseType *bt)
Adds a copy of the variable to the DDS. Using the ptr_duplicate() method, perform a deep copy on the ...
Definition DDS.cc:482
Vars_iter get_vars_iter(int i)
Get an iterator.
Definition DDS.h:346
std::vector< BaseType * >::iterator Vars_iter
Definition DDS.h:211
void print_xml_writer(ostream &out, bool constrained, const string &blob="")
Definition DDS.cc:1148
long get_response_limit()
Get the maximum response size, in bytes. Zero indicates no limit.
Definition DDS.h:279
DDS & operator=(const DDS &rhs)
Definition DDS.cc:211
void print_das(ostream &out)
write the DAS response given the attribute information in the DDS
Definition DDS.cc:942
virtual void dump(ostream &strm) const
dumps information about this object
Definition DDS.cc:1406
libdap base object for common functionality of libdap objects
Definition DapObj.h:49
Holds a structure (aggregate) type.
Definition Structure.h:82
const char * version
Definition getdap.cc:65
top level DAP object to house generic methods
Definition AISConnect.cc:30
bool has_dap2_attributes(AttrTable &a)
Definition DDS.cc:838