IODA Bundle
TestOdaCAPI.cc
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 #include "eckit/eckit.h"
12 #include "eckit/exception/Exceptions.h"
13 #include "eckit/log/Log.h"
14 #include "eckit/log/Timer.h"
15 #include "odc/Writer.h"
16 #include "TestCase.h"
17 
18 #include "odc/odccapi.h"
19 
20 #include "TestOdaCAPI.h"
21 
22 using namespace std;
23 using namespace eckit;
24 using namespace odc;
25 
26 namespace odc {
27 namespace tool {
28 namespace test {
29 
30 int test_odacapi_setup_in_C(int argc, char* argv[])
31 {
32  const char *filename = "test.odb";
33  int err = 0;
34 
36  ASSERT(writer);
37 
39  ASSERT(wi);
40 
41  ASSERT(0 == odb_write_iterator_set_no_of_columns(wi, 2));
42  ASSERT(0 == odb_write_iterator_set_column(wi, 0, odc::api::INTEGER, "ifoo"));
43  ASSERT(0 == odb_write_iterator_set_column(wi, 1, odc::api::REAL, "nbar"));
44 
45  ASSERT(0 == odb_write_iterator_write_header(wi));
46 
47  double data[2];
48  for (int i = 1; i <= 10; i++)
49  {
50  data[0] = i;
51  data[1] = i;
52 
53  ASSERT(0 == odb_write_iterator_set_next_row(wi, data, 2));
54  }
55 
56  ASSERT(0 == odb_write_iterator_destroy(wi));
57  ASSERT(0 == odb_writer_destroy(writer));
58  return 0;
59 }
60 
61 int test_odacapi_setup(int argc, char* argv[])
62 {
63  Timer t("Writing test.odb");
64  odc::Writer<> oda("test.odb");
65 
67  writer->setNumberOfColumns(2);
68 
69  writer->setColumn(0, "ifoo", odc::api::INTEGER);
70  writer->setColumn(1, "nbar", odc::api::REAL);
71 
72  writer->writeHeader();
73 
74  for (int i = 1; i <= 10; i++)
75  {
76  writer->data()[0] = i; // col 0
77  writer->data()[1] = i; // col 1
78  ++writer;
79  }
80  //writer->close();
81  return 0;
82 }
83 
84 int test_odacapi1(int argc, char* argv[])
85 {
86  std::cout << "UnitTest odacapi..." << std::endl;
87 
88  int err;
89 
90  std::cout << "Calling oda_create..." << std::endl;
91 
92  oda_ptr oh = odb_read_create("", &err);
93 
94  oda_read_iterator* it = odb_create_read_iterator(oh, "test.odb", &err);
95  ASSERT(0 == err);
96  ASSERT(0 != it);
97 
98  int nCols;
99  ASSERT(0 == odb_read_iterator_get_no_of_columns(it, &nCols));
100  ASSERT(nCols == 2);
101 
102  int type0;
103  ASSERT(0 == odb_read_iterator_get_column_type(it, 0, &type0));
104  ASSERT(type0 == 1 /*INTEGER*/);
105 
106  int type1;
107  ASSERT(0 == odb_read_iterator_get_column_type(it, 1, &type1));
108  ASSERT(type1 == 2 /*REAL*/);
109 
110  char *name0;
111  int name0size;
112  ASSERT(0 == odb_read_iterator_get_column_name(it, 0, &name0, &name0size));
113 
114  char *name1;
115  int name1size;
116  ASSERT(0 == odb_read_iterator_get_column_name(it, 1, &name1, &name1size));
117 
118  double buffer[2];
119  double* data = buffer;
120  int newDataset = 0;
121  int nRows = 0;
122  while (0 == odb_read_iterator_get_next_row(it, 2, data, &newDataset))
123  {
124  ++nRows;
125  int v0 = int(data[0]);
126 
127  std::cout << "Read row " << nRows << std::endl;
128 
129  ASSERT(v0 == nRows);
130  }
131 
132  ASSERT(0 == odb_read_iterator_destroy(it));
133  ASSERT(0 == odb_read_destroy(oh));
134  std::cout << "OK" << std::endl;
135  return 0;
136 }
137 
138 int test_odacapi2(int argc, char* argv[])
139 {
140  std::cout << "UnitTest odacapi 2..." << std::endl;
141 
142  int err;
143 
144  std::cout << "Calling odb_start_with_args..." << std::endl;
145  odb_start_with_args(argc, argv);
146 
147  std::cout << "Calling odb_create..." << std::endl;
148 
149  oda_ptr oh = odb_select_create("", &err);
150 
151  Log::info() << "Log::info initialised properly." << std::endl;
152 
153  oda_select_iterator* it = odb_create_select_iterator(oh, "select * from \"test.odb\";", &err);
154  ASSERT(0 == err);
155  ASSERT(0 != it);
156 
157  int nCols;
158  ASSERT(0 == odb_select_iterator_get_no_of_columns(it, &nCols));
159  ASSERT(nCols == 2);
160 
161  int type0;
162  ASSERT(0 == odb_select_iterator_get_column_type(it, 0, &type0));
163  ASSERT(type0 == 1 /*INTEGER*/);
164 
165  int type1;
166  ASSERT(0 == odb_select_iterator_get_column_type(it, 1, &type1));
167  ASSERT(type1 == 2 /*REAL*/);
168 
169  char *name0;
170  int name0size;
171  ASSERT(0 == odb_select_iterator_get_column_name(it, 0, &name0, &name0size));
172 
173  char *name1;
174  int name1size;
175  ASSERT(0 == odb_select_iterator_get_column_name(it, 1, &name1, &name1size));
176 
177  double buffer[2];
178  double* data = buffer;
179  int newDataset = 0;
180  int nRows = 0;
181  while (0 == odb_select_iterator_get_next_row(it, 2, data, &newDataset))
182  {
183  ++nRows;
184  int v0 = int(data[0]);
185 
186  std::cout << "Read row " << nRows << std::endl;
187 
188  ASSERT(v0 == nRows);
189  }
190 
191  ASSERT(0 == odb_select_iterator_destroy(it));
192  ASSERT(0 == odb_read_destroy(oh));
193  std::cout << "OK" << std::endl;
194  return 0;
195 }
196 
197 int test_odacapi3(int argc, char* argv[])
198 {
199  std::cout << "UnitTest ODB C API append to file functionality..." << std::endl;
200 
201  const char *filename = "test.odb";
202  int err = 0;
203 
204  double n = odb_count(filename);
205  std::cout << "test_odacapi3: number of rows = " << n << std::endl;
206  ASSERT(n == 10);
207 
209  ASSERT(writer);
210 
212  ASSERT(wi);
213  ASSERT(0 == err);
214  ASSERT(0 != wi);
215 
216  ASSERT(0 == odb_write_iterator_set_no_of_columns(wi, 2));
217  ASSERT(0 == odb_write_iterator_set_column(wi, 0, odc::api::INTEGER, "ifoo"));
218  ASSERT(0 == odb_write_iterator_set_column(wi, 1, odc::api::REAL, "nbar"));
219 
220  ASSERT(0 == odb_write_iterator_write_header(wi));
221 
222  double data[2];
223  for (int i = 1; i <= 10; i++)
224  {
225  data[0] = i;
226  data[1] = i;
227 
228  ASSERT(0 == odb_write_iterator_set_next_row(wi, data, 2));
229  }
230 
231  ASSERT(0 == odb_write_iterator_destroy(wi));
232  ASSERT(0 == odb_writer_destroy(writer));
233 
234 
235  n = odb_count(filename);
236  std::cout << "test_odacapi3: number of rows = " << n << std::endl;
237  ASSERT(n == 20);
238 
239  return 0;
240 }
241 
242 int test_odacapi(int argc, char* argv[])
243 {
244  std::cout << "Calling odb_init..." << std::endl;
245  odb_start_with_args(argc, argv);
246  Log::info() << "Log::info initialised properly." << std::endl;
247 
248  //return test_odacapi_setup()
249  return test_odacapi_setup_in_C(argc, argv)
250  || test_odacapi1(argc, argv)
251  || test_odacapi2(argc, argv)
252  || test_odacapi3(argc, argv);
253 }
254 
255 } // namespace test
256 } // namespace tool
257 } // namespace odc
258 
void oda
int test_odacapi_setup(int argc, char *argv[])
Definition: TestOdaCAPI.cc:61
int test_odacapi3(int argc, char *argv[])
Definition: TestOdaCAPI.cc:197
int test_odacapi(int argc, char *argv[])
Definition: TestOdaCAPI.cc:242
int test_odacapi2(int argc, char *argv[])
Definition: TestOdaCAPI.cc:138
int test_odacapi_setup_in_C(int argc, char *argv[])
Definition: TestOdaCAPI.cc:30
int test_odacapi1(int argc, char *argv[])
Definition: TestOdaCAPI.cc:84
Definition: ColumnInfo.h:23
Definition: encode.cc:30
oda_read_iterator_ptr odb_create_read_iterator(oda_ptr co, const char *filename, int *err)
Definition: odccapi.cc:198
int odb_write_iterator_write_header(oda_write_iterator_ptr wi)
Definition: odccapi.cc:514
int odb_read_iterator_destroy(oda_read_iterator_ptr it)
Definition: odccapi.cc:252
int odb_read_iterator_get_no_of_columns(oda_read_iterator_ptr it, int *numberOfColumns)
Definition: odccapi.cc:264
double odb_count(const char *filename)
Definition: odccapi.cc:90
int odb_select_iterator_destroy(oda_select_iterator_ptr it)
Definition: odccapi.cc:258
int odb_write_iterator_set_column(oda_write_iterator_ptr wi, int index, int type, const char *name)
Definition: odccapi.cc:412
oda_ptr odb_read_create(const char *config, int *err)
Definition: odccapi.cc:144
oda_ptr odb_select_create(const char *config, int *err)
Definition: odccapi.cc:157
int odb_select_iterator_get_next_row(oda_select_iterator_ptr it, int count, double *data, int *new_dataset)
Definition: odccapi.cc:358
int odb_write_iterator_set_no_of_columns(oda_write_iterator_ptr wi, int n)
Definition: odccapi.cc:405
oda_writer_ptr odb_writer_create(const char *config, int *err)
Definition: odccapi.cc:167
int odb_writer_destroy(oda_writer_ptr o)
Definition: odccapi.cc:192
int odb_read_iterator_get_column_type(oda_select_iterator_ptr it, int n, int *type)
Definition: odccapi.cc:306
int odb_write_iterator_set_next_row(oda_write_iterator_ptr wi, double *data, int count)
Definition: odccapi.cc:521
int odb_select_iterator_get_column_type(oda_select_iterator_ptr it, int n, int *type)
Definition: odccapi.cc:313
oda_write_iterator_ptr odb_create_write_iterator(oda_ptr co, const char *filename, int *err)
Definition: odccapi.cc:387
int odb_select_iterator_get_no_of_columns(oda_select_iterator_ptr it, int *numberOfColumns)
Definition: odccapi.cc:285
oda_write_iterator_ptr odb_create_append_iterator(oda_ptr co, const char *filename, int *err)
Definition: odccapi.cc:375
oda_select_iterator_ptr odb_create_select_iterator(oda_ptr co, const char *sql, int *err)
Definition: odccapi.cc:215
void odb_start_with_args(int argc, char *argv[])
Definition: odccapi.cc:85
int odb_read_iterator_get_column_name(oda_read_iterator_ptr it, int n, char **name, int *size_name)
Definition: odccapi.cc:320
int odb_write_iterator_destroy(oda_write_iterator_ptr wi)
Definition: odccapi.cc:399
int odb_read_destroy(oda_ptr o)
Definition: odccapi.cc:175
int odb_select_iterator_get_column_name(oda_select_iterator_ptr it, int n, char **name, int *size_name)
Definition: odccapi.cc:328
int odb_read_iterator_get_next_row(oda_read_iterator_ptr it, int count, double *data, int *new_dataset)
Definition: odccapi.cc:336
void oda_writer
Definition: odccapi.h:41
void oda_read_iterator
Definition: odccapi.h:38
void oda_select_iterator
Definition: odccapi.h:39
void * oda_ptr
Definition: odccapi.h:30
void oda_write_iterator
Definition: odccapi.h:42