IODA Bundle
ReaderIterator.h
Go to the documentation of this file.
1 /*
2  * (C) Copyright 1996-2012 ECMWF.
3  *
4  * This software is licensed under the terms of the Apache Licence Version 2.0
5  * which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
6  * In applying this licence, ECMWF does not waive the privileges and immunities
7  * granted to it by virtue of its status as an intergovernmental organisation nor
8  * does it submit to any jurisdiction.
9  */
10 
11 ///
12 /// \file ReaderIterator.h
13 ///
14 /// @author Piotr Kuchta, Feb 2009
15 
16 #ifndef ReaderIterator_H
17 #define ReaderIterator_H
18 
19 #include "odc/IteratorProxy.h"
20 
21 #include "odc/core/MetaData.h"
22 
23 namespace eckit { class PathName; }
24 namespace eckit { class DataHandle; }
25 
26 extern "C" {
27  typedef void oda;
28  typedef void oda_read_iterator;
29  typedef void oda_write_iterator;
30  oda_write_iterator* odb_create_write_iterator(oda*, const char *,int *);
31  int odb_read_iterator_get_next_row(oda_read_iterator*, int, double*, int*);
32 }
33 
34 namespace odc {
35  namespace core { class Codec; }
36  namespace sql { class ODATableIterator; }
37 }
38 
39 namespace odc {
40 
41 class Reader;
42 
44 {
45 public:
46  ReaderIterator (Reader &owner);
47  ReaderIterator (Reader &owner, const eckit::PathName&);
48 
49  ~ReaderIterator ();
50 
51  bool isNewDataset();
52  const double* data() const { return lastValues_; }
53  double* data() { return lastValues_; }
54  double& data(size_t);
55 
56  bool operator!=(const ReaderIterator& other);
57 
58  void property(std::string, std::string);
59  std::string property(std::string);
60 
61  const core::Properties& properties() const { return properties_; }
62 
63  const core::MetaData& columns() const { return columns_; }
64  const core::MetaData& columns(const core::MetaData& md) { return columns_ = md; }
65  void setNumberOfColumns(size_t n) { columns_.setSize(n); }
66 
67 #ifdef SWIGPYTHON
68  int setColumn(size_t, const std::string&, api::ColumnType) { NOTIMP; }
69  void writeHeader() { NOTIMP; }
70  int setBitfieldColumn(size_t, const std::string&, api::ColumnType, eckit::sql::BitfieldDef) { NOTIMP; }
71  void missingValue(size_t, double) { NOTIMP; }
72 #endif
73 
74  api::ColumnType columnType(unsigned long index);
75  const std::string& columnName(unsigned long index) const;
76  const std::string& codecName(unsigned long index) const;
77  double columnMissingValue(unsigned long index);
78  const eckit::sql::BitfieldDef& bitfieldDef(unsigned long index);
79 
80  int32_t byteOrder() const { return byteOrder_; }
81  eckit::DataHandle* dataHandle();
82 //protected:
83 
84  int close();
85 
86  bool next();
87 
88  /// The offset of a given column in the doubles[] data array
89  size_t dataOffset(size_t i) const { ASSERT(columnOffsets_); return columnOffsets_[i]; }
90 
91  // Get the number of doubles per row.
92  size_t rowDataSizeDoubles() const { return rowDataSizeDoubles_; }
93 
94 protected:
95  size_t readBuffer(size_t dataSize);
96  size_t rowDataSizeDoublesInternal() const;
97 
98 private:
99 // No copy allowed.
102 
103  void initRowBuffer();
105 
108  double* lastValues_;
109  size_t* columnOffsets_; // in doubles
111  std::vector<core::Codec*> codecs_;
112  unsigned long long nrows_;
114 
115  std::unique_ptr<eckit::DataHandle> f_;
117 
119 
120  eckit::Buffer rowDataBuffer_;
122 
123 public:
124  bool noMore_;
125 private:
126 
127  unsigned long headerCounter_;
128  int32_t byteOrder_;
129 
130 public:
132 
133 protected:
134 
135  friend ::oda_write_iterator* ::odb_create_write_iterator(::oda*, const char *,int *); // for next()
137 
138  friend class odc::Reader;
139  friend class odc::IteratorProxy<odc::ReaderIterator, odc::Reader, const double>;
141 };
142 
143 } // namespace odc
144 
145 #endif
void oda_read_iterator
void oda_write_iterator
int odb_read_iterator_get_next_row(oda_read_iterator *, int, double *, int *)
Definition: odccapi.cc:336
oda_write_iterator * odb_create_write_iterator(oda *, const char *, int *)
Definition: odccapi.cc:387
void oda
int32_t byteOrder() const
std::unique_ptr< eckit::DataHandle > f_
const std::string & codecName(unsigned long index) const
const core::Properties & properties() const
ReaderIterator(Reader &owner)
eckit::Buffer rowDataBuffer_
size_t rowDataSizeDoublesInternal() const
core::MetaData columns_
const std::string & columnName(unsigned long index) const
friend ::oda_write_iterator * odb_create_write_iterator(::oda *, const char *, int *)
bool operator!=(const ReaderIterator &other)
friend class odc::sql::ODATableIterator
std::vector< core::Codec * > codecs_
const eckit::sql::BitfieldDef & bitfieldDef(unsigned long index)
api::ColumnType columnType(unsigned long index)
unsigned long long nrows_
void property(std::string, std::string)
const double * data() const
size_t dataOffset(size_t i) const
The offset of a given column in the doubles[] data array.
unsigned long headerCounter_
size_t readBuffer(size_t dataSize)
core::Properties properties_
const core::MetaData & columns() const
ReaderIterator(Reader &owner, const eckit::PathName &)
size_t rowDataSizeDoubles() const
double columnMissingValue(unsigned long index)
ReaderIterator & operator=(const ReaderIterator &)
core::GeneralDataStream rowDataStream_
eckit::DataHandle * dataHandle()
ReaderIterator(const ReaderIterator &)
void setNumberOfColumns(size_t n)
const core::MetaData & columns(const core::MetaData &md)
void setSize(size_t)
Definition: MetaData.cc:64
std::map< std::string, std::string > Properties
Definition: Header.h:35
Definition: ColumnInfo.h:23
void oda_read_iterator
Definition: odccapi.h:38
void oda_write_iterator
Definition: odccapi.h:42