16 #include "eckit/runtime/Main.h"
30 using namespace eckit;
39 template <
typename T,
typename I>
42 char** bitfield_names,
43 char** bitfield_sizes,
47 I* iter =
reinterpret_cast<I*
>(it);
48 const eckit::sql::BitfieldDef& bitfieldDef(iter->columns()[index]->bitfieldDef());
49 eckit::sql::FieldNames fieldNames(bitfieldDef.first);
50 eckit::sql::Sizes sizes(bitfieldDef.second);
52 std::stringstream ns, ss;
53 for (
size_t i = 0;
i < fieldNames.size(); ++
i)
55 ns << fieldNames[
i] <<
":";
56 ss << sizes[
i] <<
":";
59 std::string names(ns.str());
60 std::string ssizes(ss.str());
64 *bitfield_names = strdup(names.c_str());
65 *bitfield_sizes = strdup(ssizes.c_str());
67 *nSize = names.size();
68 *sSize = ssizes.size();
76 static const char *argv[2] = {
"odb_start", 0};
87 eckit::Main::initialise(argc, argv);
94 PathName path = filename;
96 for (
auto it(mdReader.
begin()), end(mdReader.
end()); it != end; ++it) {
102 int get_blocks_offsets(
const char* fileName,
size_t* numberOfBlocks, off_t** offsets,
size_t** sizes)
109 for (
const auto& table : reader) {
110 offs.push_back(table.startPosition());
111 lengths.push_back(table.nextPosition() - table.startPosition());
114 ASSERT(offs.size() == lengths.size());
115 size_t n = offs.size();
118 *offsets =
new off_t[n];
119 *sizes =
new size_t[n];
121 for (
size_t i = 0;
i < n; ++
i) {
122 (*offsets)[
i] = offs[
i];
123 (*sizes)[
i] = lengths[
i];
177 delete reinterpret_cast<Reader *
>(o);
188 delete reinterpret_cast<Select *
>(o);
194 delete reinterpret_cast<Writer<> *
>(o);
201 std::string fileName (filename);
202 PathName fn (fileName);
223 catch (eckit::CantOpenFile e)
228 catch (eckit::ReadError e)
233 catch (eckit::Exception& e) {
244 std::string full_sql (std::string(sql) +
" from \"" + std::string(filename) +
"\"");
267 *numberOfColumns = iter->
columns().size();
274 *size = iter->
columns()[n]->dataSizeDoubles();
288 *numberOfColumns = iter->
columns().size();
295 *size = iter->
columns()[n]->dataSizeDoubles();
323 *
name =
const_cast<char*
>(iter->
columns()[n]->name().c_str());
324 *size_name = iter->
columns()[n]->name().length();
331 *
name =
const_cast<char*
>(iter->
columns()[n]->name().c_str());
332 *size_name = iter->
columns()[n]->name().length();
364 if (!iter->
next())
return 1;
378 eckit::Length estimatedLength(0);
379 DataHandle *fh = ODBAPISettings::instance().appendToFile(PathName(std::string(filename)), estimatedLength,
true);
390 eckit::Length estimatedLength(0);
391 DataHandle *fh = ODBAPISettings::instance().writeToFile(PathName(std::string(filename)), estimatedLength,
true);
408 w->setNumberOfColumns(n);
420 std::string bnames (bitfieldNames);
421 std::string bsizes (bitfieldSizes);
422 eckit::sql::FieldNames (bitfield_names);
423 eckit::sql::Sizes (bitfield_sizes);
427 for (
size_t i (0);
i < bnames.size();
i++)
429 if (bnames[
i] ==
':')
431 std::string
name (bnames.substr(iprev,
i-iprev));
433 bitfield_names.push_back(
name);
438 for (
size_t i (0);
i < bsizes.size();
i++)
440 if (bsizes[
i] ==
':')
442 std::string
name (bsizes.substr(iprev,
i-iprev));
443 size_t size (atof(
name.c_str()));
445 bitfield_sizes.push_back(size);
449 eckit::sql::BitfieldDef bitfieldType(make_pair(bitfield_names, bitfield_sizes));
452 std::string columnName(
name);
454 int rc (w->setBitfieldColumn(index, columnName,
ColumnType(
type), bitfieldType));
461 w->columns()[n]->dataSizeDoubles(size);
468 *size = w->rowDataSizeDoubles();
475 *offset = w->dataOffset(n);
482 if (index < 0 ||
long(r->
columns().size()) < index)
484 std::stringstream ss;
485 ss <<
"odb_read_iterator_get_missing_value: index " << index
486 <<
" out of range, should be between 0 and " << r->
columns().size();
487 throw UserError(ss.str());
489 *value = r->
columns()[index]->missingValue();
510 w->missingValue(index, value);
524 return w->writeRow(data,
count);
529 char** bitfield_names,
530 char** bitfield_sizes,
533 {
return get_bitfield<oda_read_iterator_ptr,ReaderIterator>(it, index, bitfield_names, bitfield_sizes, nSize, sSize); }
537 char** bitfield_names,
538 char** bitfield_sizes,
541 {
return get_bitfield<oda_select_iterator_ptr,SelectIterator>(it, index, bitfield_names, bitfield_sizes, nSize, sSize); }
static void count(void *counter, const double *data, size_t n)
int odc_vcs_version(const char **sha1)
static unsigned int formatVersionMinor()
static unsigned int formatVersionMajor()
const double * data() const
size_t dataOffset(size_t i) const
The offset of a given column in the doubles[] data array.
const core::MetaData & columns() const
size_t rowDataSizeDoubles() const
SelectIterator * createSelectIterator(const std::string &)
size_t rowDataSizeDoubles() const
const core::MetaData & columns() const
void setOutputRowBuffer(double *data, size_t count=0)
Set an output buffer for retrieving the next row(s)
size_t dataOffset(size_t i) const
The offset of a given column in the doubles[] data array.
char * dummyCommandLineArgs[]
oda_read_iterator_ptr odb_create_read_iterator(oda_ptr co, const char *filename, int *err)
int odb_write_iterator_write_header(oda_write_iterator_ptr wi)
int odb_read_iterator_destroy(oda_read_iterator_ptr it)
int odb_read_iterator_get_no_of_columns(oda_read_iterator_ptr it, int *numberOfColumns)
int odb_select_destroy(oda_ptr o)
double odb_count(const char *filename)
int odb_select_iterator_destroy(oda_select_iterator_ptr it)
int odb_write_iterator_set_column(oda_write_iterator_ptr wi, int index, int type, const char *name)
oda_ptr odb_read_create(const char *config, int *err)
oda_ptr odb_select_create(const char *config, int *err)
int odb_read_iterator_get_missing_value(oda_read_iterator_ptr ri, int index, double *value)
int get_blocks_offsets(const char *fileName, size_t *numberOfBlocks, off_t **offsets, size_t **sizes)
void odb_set_setvbufferSize(unsigned int n)
int odb_select_iterator_get_next_row(oda_select_iterator_ptr it, int count, double *data, int *new_dataset)
int odb_write_iterator_set_no_of_columns(oda_write_iterator_ptr wi, int n)
oda_writer_ptr odb_writer_create(const char *config, int *err)
int release_blocks_sizes(size_t **sizes)
int odb_select_iterator_get_bitfield(oda_select_iterator_ptr it, int index, char **bitfield_names, char **bitfield_sizes, int *nSize, int *sSize)
int odb_writer_destroy(oda_writer_ptr o)
int odb_read_iterator_get_column_type(oda_select_iterator_ptr it, int n, int *type)
int odc_git_sha1(const char **o)
int odb_write_iterator_set_next_row(oda_write_iterator_ptr wi, double *data, int count)
int odb_read_iterator_get_bitfield(oda_read_iterator_ptr it, int index, char **bitfield_names, char **bitfield_sizes, int *nSize, int *sSize)
int odb_select_iterator_get_column_offset(oda_select_iterator_ptr it, int n, int *offset)
int odb_select_iterator_get_column_type(oda_select_iterator_ptr it, int n, int *type)
oda_write_iterator_ptr odb_create_write_iterator(oda_ptr co, const char *filename, int *err)
int odb_select_iterator_get_no_of_columns(oda_select_iterator_ptr it, int *numberOfColumns)
unsigned int odb_get_headerBufferSize()
oda_write_iterator_ptr odb_create_append_iterator(oda_ptr co, const char *filename, int *err)
unsigned int odc_format_version_major()
int release_blocks_offsets(off_t **offsets)
oda_select_iterator_ptr odb_create_select_iterator(oda_ptr co, const char *sql, int *err)
int odb_select_iterator_get_row_buffer_size_doubles(oda_select_iterator_ptr ri, int *size)
int get_bitfield(T it, int index, char **bitfield_names, char **bitfield_sizes, int *nSize, int *sSize)
oda_select_iterator_ptr odb_create_select_iterator_from_file(oda_ptr co, const char *sql, const char *filename, int *err)
void odb_start_with_args(int argc, char *argv[])
int odb_read_iterator_get_column_name(oda_read_iterator_ptr it, int n, char **name, int *size_name)
int odb_write_iterator_set_column_size_doubles(oda_write_iterator_ptr wi, int n, int size)
oda_ptr odb_create(const char *config, int *err)
int odb_destroy(oda_ptr o)
unsigned int odb_get_setvbufferSize()
unsigned int odc_format_version_minor()
int odb_read_iterator_get_row_buffer_size_doubles(oda_read_iterator_ptr ri, int *size)
int odb_write_iterator_set_missing_value(oda_write_iterator_ptr wi, int index, double value)
int odb_write_iterator_destroy(oda_write_iterator_ptr wi)
int odb_write_iterator_get_column_offset(oda_write_iterator_ptr wi, int n, int *offset)
int odb_read_destroy(oda_ptr o)
int odb_read_iterator_get_column_offset(oda_read_iterator_ptr it, int n, int *offset)
int odb_select_iterator_get_column_size_doubles(oda_select_iterator_ptr it, int n, int *size)
int odb_write_iterator_get_row_buffer_size_doubles(oda_write_iterator_ptr wi, int *size)
int odb_write_iterator_set_bitfield(oda_write_iterator_ptr wi, int index, int type, const char *name, const char *bitfieldNames, const char *bitfieldSizes)
void odb_set_headerBufferSize(unsigned int n)
int odb_read_iterator_get_column_size_doubles(oda_read_iterator_ptr it, int n, int *size)
int odb_select_iterator_get_column_name(oda_select_iterator_ptr it, int n, char **name, int *size_name)
int odb_read_iterator_get_next_row(oda_read_iterator_ptr it, int count, double *data, int *new_dataset)
void * oda_write_iterator_ptr
void * oda_read_iterator_ptr
void * oda_select_iterator_ptr