11 #include "eckit/io/FileHandle.h"
12 #include "eckit/log/Timer.h"
18 using namespace eckit;
25 o <<
"Merges rows from files";
30 o <<
name <<
" -o <output-file.odb> <input1.odb> <input2.odb> ..." << std::endl
32 <<
"\t or " << std::endl
34 <<
name <<
"\t -S -o <output-file.odb> <input1.odb> <sql-select1> <input2.odb> <sql-select2> ..." << std::endl;
37 MergeTool::MergeTool (
int ac,
char *av[])
54 if (o ==
"<no-default>")
55 UserError(
"Output file is obligatory (option -o)");
76 Timer t(std::string(
"Merging files '") + s.str() +
"' into '" +
outputFile_ +
"'");
83 template <
typename T,
typename I>
84 void doMerge(std::vector<std::pair<I, I> >& iterators,
const PathName& outputFile)
89 for (
size_t i = 0;
i < iterators.size(); ++
i)
95 throw eckit::UserError(std::string(
"Column '") +
columns[
i]->
name()
96 +
"' occurs in more than one input file of merge.");
104 Log::info() <<
"MergeTool::merge: output metadata: " << out->
columns() << std::endl;
108 for (
size_t i = 0, ii = 0; ii < iterators.size(); ++ii)
110 I& in(iterators[ii].first);
111 I& inEnd(iterators[ii].second);
113 return (
void) (Log::info() <<
"Input file number " << ii <<
" ended." << std::endl);
115 for (
size_t cn = 0; cn < in->columns().size(); ++cn)
117 ASSERT(i < out->
columns().size());
118 out->
data(
i++) = (*in)[cn];
127 template <
typename T>
128 struct AutoR :
public std::vector<T*> {
~AutoR() {
for (
size_t i = 0;
i < this->size(); ++
i)
delete this->at(
i); } };
130 void MergeTool::merge(
const std::vector<PathName>& inputFiles,
const PathName& outputFile)
133 typedef R::iterator I;
136 std::vector<std::pair<I, I> > iterators;
138 for (
size_t i = 0;
i < inputFiles.size(); ++
i)
141 iterators.push_back(std::make_pair(readers[
i]->begin(), readers[
i]->end()));
143 doMerge<R, I>(iterators, outputFile);
146 void MergeTool::merge(
const std::vector<PathName>& inputFiles,
const std::vector<std::string>& sqls,
const PathName& outputFile)
150 AutoR<eckit::FileHandle> fhs;
151 std::vector<std::pair<S::iterator, S::iterator> > iterators;
152 for (
size_t i = 0;
i < inputFiles.size(); ++
i)
154 FileHandle* fh =
new FileHandle(inputFiles[
i]);
157 readers.push_back(
new S(sqls[
i], *fhs[
i]));
158 iterators.push_back(std::make_pair(readers[
i]->begin(), readers[
i]->end()));
160 doMerge<S, S::iterator>(iterators, outputFile);
const core::MetaData & columns() const