16 using namespace eckit;
33 o << std::endl <<
"Header " << ++headerCount_ <<
". "
35 <<
", number of rows in block: " << tbl.
rowCount()
36 <<
", byteOrder: " << ((tbl.
byteOrder() == 1) ?
"same" :
"other")
51 o << offset <<
" " << length <<
" " << tbl.
rowCount() <<
" " << tbl.
columnCount() << std::endl;
60 DDLPrinter(
const std::string& path,
const std::string& tableName)
61 : path_(path), tableName_(tableName) {}
65 if (md_.empty() || md_.back() != tbl.
columns())
74 for (
size_t i(0);
i < md_.size(); ++
i)
75 printTable(o, md_[
i], tableName_, path_);
83 case STRING:
return "STRING";
86 case REAL:
return "REAL";
87 case DOUBLE:
return "DOUBLE";
89 throw new Exception(
"unknown type");
95 std::stringstream definition;
96 std::string type_name (typeName(
c));
100 const eckit::sql::BitfieldDef& bd (
c.bitfieldDef());
101 const std::vector<std::string>& fieldNames (bd.first);
102 const std::vector<int>& sizes (bd.second);
104 type_name = stripAtTable(tableName,
c.name()) +
"_at_" + tableName +
"_t";
106 definition <<
"CREATE TYPE " << type_name <<
" AS (";
107 for (
size_t i(0);
i < sizes.size(); ++
i)
108 definition << fieldNames[
i] <<
" bit" << sizes[
i]
109 << ((
i+1 < sizes.size()) ?
", " :
"");
110 definition <<
");\n";
113 return make_pair(definition.str(), type_name);
117 static std::string
stripAtTable(
const std::string& tableName,
const std::string& columnName)
119 std::string
suffix ( std::string(
"@") + tableName );
121 if (columnName.size() >=
suffix.size()
123 return columnName.substr(0, columnName.size() -
suffix.size());
128 static void printTable(std::ostream& s,
const MetaData& md,
const std::string& tableName,
const std::string& path)
130 std::stringstream create_type, create_table;
132 create_table <<
"CREATE TABLE " << tableName <<
" AS (\n";
133 for (
size_t i (0);
i < md.size(); ++
i)
135 std::pair<std::string,std::string> p (typeDefinitionAndName(tableName, *md[
i]));
136 const std::string& def (p.first),
140 create_table <<
" " << stripAtTable(tableName, md[
i]->
name()) <<
" " <<
type <<
",\n";
142 create_table <<
") ON '" << path <<
"';\n";
144 s << create_type.str();
145 s << create_table.str();
149 std::vector<MetaData>
md_;
154 HeaderTool::HeaderTool (
int argc,
char *argv[]) :
Tool(argc, argv) {}
168 std::ostream& o (std::cout);
177 static_cast<MDPrinter*
>(&verbosePrinter)));
181 auto it = reader.
begin();
182 auto end = reader.
end();
184 for(; it != end; ++it)
186 printer.
print(o, *it);
size_t columnCount() const
eckit::Offset nextPosition() const
int32_t byteOrder() const
const MetaData & columns() const
eckit::Offset startPosition() const