13 #include "eckit/filesystem/PathName.h"
14 #include "eckit/log/Log.h"
15 #include "eckit/utils/StringTools.h"
16 #include "eckit/utils/Tokenizer.h"
17 #include "eckit/sql/SQLTypedefs.h"
24 using namespace eckit;
26 typedef eckit::StringTools
S;
33 o <<
"Creates a new file resetting types or values (constants only) of columns.";
38 o <<
name <<
" <update-list> <input.odb> <output.odb>" << endl << endl
40 <<
"\t<update-list> is a comma separated list of expressions of the form:" << endl
41 <<
"\t <column-name> : <type> = <value>" << endl << endl
42 <<
"\t<type> can be one of: integer, real, double, string. If ommited, the existing type of the column will not be changed." << endl
43 <<
"\tBoth type and value are optional; at least one of the two should be present. For example:" << endl
44 <<
"\t odb mdset \"expver=' 0008'\" input.odb patched.odb " << endl;
47 MDSetTool::MDSetTool (
int argc,
char *parameters[]) :
Tool(argc, parameters) { }
62 std::vector<std::string>
columns, types, values;
63 std::vector<eckit::sql::BitfieldDef> bitfieldDefs;
68 for (
auto it = reader.
begin(), end = reader.
end(); it != end; ++it) {
74 Log::info() <<
"" <<
columns[
i] <<
": " <<
c << endl;
77 if (bitfieldDefs[
i].first.size())
c.bitfieldDef(bitfieldDefs[
i]);
78 if (values[
i].size() && values[
i] !=
"NONE")
81 if (codec.
name().find(
"constant") == std::string::npos)
84 ss <<
"Column '" <<
columns[
i] <<
"' is not constant (codec: " << codec.
name() <<
")" << endl;
85 throw UserError(ss.str());
93 size_t sizeOfEncodedData = it->encodedDataSize();
94 eckit::Buffer encodedData(it->readEncodedData());
95 ASSERT(encodedData.size() == sizeOfEncodedData);
100 Log::info() <<
"MDSetTool::run: SAME ORDER " << sizeOfEncodedData << std::endl;
106 outHandle->write(encodedHeader.first, encodedHeader.second);
110 Log::info() <<
"MDSetTool::run: OTHER ORDER " << sizeOfEncodedData << std::endl;
117 outHandle->write(encodedHeader.first, encodedHeader.second);
119 outHandle->write(encodedData.data(), sizeOfEncodedData);
127 std::vector<std::string>&
columns,
128 std::vector<std::string>& types,
129 std::vector<std::string>& values,
130 std::vector<eckit::sql::BitfieldDef>& bitfieldDefs)
132 std::vector<std::string> assignments(S::split(
",", s));
133 for (
size_t i = 0;
i < assignments.size(); ++
i)
135 vector<string> assignment(S::split(
"=", assignments[
i]));
136 string value (assignment.size() == 2 ? assignment[1] :
"NONE");
137 vector<string> columnNameAndType(S::split(
":", assignment[0]));
138 string type (columnNameAndType.size() == 2 ? columnNameAndType[1] :
"NONE");
139 string column (assignment[0]);
141 eckit::sql::BitfieldDef bf;
144 std::vector<std::string> parts(StringTools::split(
";",
type.substr(1,
type.size() - 2)));
145 for (
size_t p = 0; p < parts.size(); ++p)
147 std::vector<std::string> field (S::split(
":", parts[p]));
148 bf.first.push_back(field[0]);
149 bf.second.push_back(atoi(field[1].c_str()));
153 Log::info() <<
"MDSetTool::parseUpdateList: " << column <<
" : " <<
type <<
" = '" << value <<
"'" << std::endl;
156 types.push_back(
type);
157 values.push_back(value);
158 bitfieldDefs.push_back(bf);
160 ASSERT(
columns.size() == types.size());
161 ASSERT(
columns.size() == values.size());
162 ASSERT(
columns.size() == bitfieldDefs.size());
static ODBAPISettings & instance()
const std::string & name() const
const int32_t BYTE_ORDER_INDICATOR