165{
166 s <<
" // *** this file is generated by oksdalgen ***\n"
167 "\n"
168 "#include \"conffwk/ConfigObject.hpp\"\n"
169 "#include \""
170 << conf_header << "\"\n\n";
171
172
173 for (const auto& i : class_names) {
174 std::string hname(cpp_hdr_dir);
175 if (!hname.empty())
176 hname += '/';
177 hname += i;
178 s <<
"#include \"" << hname <<
".hpp\"\n";
179 }
180
181 if (headres_prologue && *headres_prologue) {
182 s <<
"\n // db implementation-specific headrers prologue\n\n" << headres_prologue <<
"\n";
183 }
184
186 "\n"
187 "static void usage(const char * s)\n"
188 "{\n"
189 " std::cout << s << \" -d db-name -c class-name [-q query | -i object-id] [-t]\\n\"\n"
190 " \"\\n\"\n"
191 " \"Options/Arguments:\\n\"\n"
192 " \" -d | --data db-name mandatory name of the database\\n\"\n"
193 " \" -c | --class-name class-name mandatory name of class\\n\"\n"
194 " \" -q | --query query optional query to select class objects\\n\"\n"
195 " \" -i | --object-id object-id optional identity to select one object\\n\"\n"
196 " \" -t | --init-children all referenced objects are initialized (is used\\n\"\n"
197 " \" for debug purposes and performance measurements)\\n\"\n"
198 " \" -h | --help print this message\\n\"\n"
199 " \"\\n\"\n"
200 " \"Description:\\n\"\n"
201 " \" The program prints out object(s) of given class.\\n\"\n"
202 " \" If no query or object id is provided, all objects of the class are printed.\\n\"\n"
203 " \" It is automatically generated by oksdalgen utility.\\n\"\n"
204 " \"\\n\";\n"
205 "}\n"
206 "\n"
207 "static void no_param(const char * s)\n"
208 "{\n"
209 " std::cerr << \"ERROR: the required argument for option \\\'\" << s << \"\\\' is missing\\n\\n\";\n"
210 " exit (EXIT_FAILURE);\n"
211 "}\n"
212 "\n"
213 "int main(int argc, char *argv[])\n"
214 "{\n";
215
216 if (main_function_prologue && *main_function_prologue) {
217 s <<
" // db implementation-specific main function prologue\n\n " << main_function_prologue <<
"\n\n";
218 }
219
220 s <<
" // parse parameters\n"
221 "\n"
222 " const char * db_name = nullptr;\n"
223 " const char * object_id = nullptr;\n"
224 " const char * query = \"\";\n"
225 " std::string class_name;\n"
226 " bool init_children = false;\n"
227 "\n"
228 " for(int i = 1; i < argc; i++) {\n"
229 " const char * cp = argv[i];\n"
230 " if(!strcmp(cp, \"-h\") || !strcmp(cp, \"--help\")) {\n"
231 " usage(argv[0]);\n"
232 " return 0;\n"
233 " }\n"
234 " if(!strcmp(cp, \"-t\") || !strcmp(cp, \"--init-children\")) {\n"
235 " init_children = true;\n"
236 " }\n"
237 " else if(!strcmp(cp, \"-d\") || !strcmp(cp, \"--data\")) {\n"
238 " if(++i == argc || argv[i][0] == '-') { no_param(cp); } else { db_name = argv[i]; }\n"
239 " }\n"
240 " else if(!strcmp(cp, \"-c\") || !strcmp(cp, \"--class-name\")) {\n"
241 " if(++i == argc || argv[i][0] == '-') { no_param(cp); } else { class_name = argv[i]; }\n"
242 " }\n"
243 " else if(!strcmp(cp, \"-i\") || !strcmp(cp, \"--object-id\")) {\n"
244 " if(++i == argc || argv[i][0] == '-') { no_param(cp); } else { object_id = argv[i]; }\n"
245 " }\n"
246 " else if(!strcmp(cp, \"-q\") || !strcmp(cp, \"--query\")) {\n"
247 " if(++i == argc || argv[i][0] == '-') { no_param(cp); } else { query = argv[i]; }\n"
248 " }\n"
249 " else {\n"
250 " std::cerr << \"ERROR: bad parameter \" << cp << std::endl;\n"
251 " usage(argv[0]);\n"
252 " return (EXIT_FAILURE);\n"
253 " }\n"
254 " }\n"
255 "\n"
256 " if(db_name == nullptr) {\n"
257 " std::cerr << \"ERROR: no database name provided\\n\";\n"
258 " return (EXIT_FAILURE);\n"
259 " }\n"
260 "\n"
261 " if(class_name.empty()) {\n"
262 " std::cerr << \"ERROR: no class name provided\\n\";\n"
263 " return (EXIT_FAILURE);\n"
264 " }\n"
265 "\n"
266 " if(*query != 0 && object_id != nullptr) {\n"
267 " std::cerr << \"ERROR: only one parameter -i or -q can be provided\\n\";\n"
268 " return (EXIT_FAILURE);\n"
269 " }\n"
270 "\n"
271 "\n"
272 "std::cout << std::boolalpha;\n"
273 "\n";
274
275 if (conf_name) {
276 s <<
" " << conf_name
277 << " impl_conf;\n"
278 "\n"
279 " {\n"
280 " dunedaq::conffwk::Configuration conf(db_name, &impl_conf);\n";
281 } else {
283 " dunedaq::conffwk::Configuration conf(db_name);\n";
284 }
285
287 " if(!conf.loaded()) {\n"
288 " std::cerr << \"Can not load database: \" << db_name << std::endl;\n"
289 " return (EXIT_FAILURE);\n"
290 " }\n"
291 " \n"
292 " std::vector< dunedaq::conffwk::ConfigObject > objects;\n"
293 " \n"
294 " if(object_id) {\n"
295 " dunedaq::conffwk::ConfigObject obj;\n"
296 " try {\n"
297 " conf.get(class_name, object_id, obj, 1);\n"
298 " }\n"
299 " catch (dunedaq::conffwk::NotFound & ex) {\n"
300 " std::cerr << \"Can not get object \\'\" << object_id << \"\\' of class \\'\" << class_name << "
301 "\"\\':\\n\" << ex << std::endl;\n"
302 " return (EXIT_FAILURE);\n"
303 " }\n"
304 " objects.push_back(obj);\n"
305 " }\n"
306 " else {\n"
307 " try {\n"
308 " conf.get(class_name, objects, query, 1);\n"
309 " }\n"
310 " catch (dunedaq::conffwk::NotFound & ex) {\n"
311 " std::cerr << \"Can not get objects of class \\'\" << class_name << \"\\':\\n\" << ex << std::endl;\n"
312 " return (EXIT_FAILURE);\n"
313 " }\n"
314 " }\n"
315 " \n"
316 " struct SortByUId {\n"
317 " bool operator() (const dunedaq::conffwk::ConfigObject * o1, const dunedaq::conffwk::ConfigObject * o2) "
318 "const {\n"
319 " return (o1->UID() < o2->UID());\n"
320 " };\n"
321 " };\n"
322 " \n"
323 " std::set< dunedaq::conffwk::ConfigObject *, SortByUId > sorted_objects;\n"
324 " \n"
325 " for(auto& i : objects)\n"
326 " sorted_objects.insert(&i);\n"
327 " \n"
328 " for(auto& i : sorted_objects) {\n";
329
330 for (std::list<std::string>::iterator i = class_names.begin(); i != class_names.end(); ++i) {
331 const char* op = (i == class_names.begin() ? "if" : "else if");
332 std::string cname(cpp_ns_name);
333
334 if (!cname.empty())
335 cname += "::";
336
337 cname += *i;
338
339 s <<
" " << op <<
"(class_name == \"" << *i
340 << "\") {\n"
341 " std::cout << *conf.get<"
342 << cname
343 << ">(*i, init_children) << std::endl;\n"
344 " }\n";
345 }
346
348 " std::cerr << \"ERROR: do not know how to dump object of \" << class_name << \" class\\n\";\n"
349 " return (EXIT_FAILURE);\n"
350 " }\n"
351 " }\n"
352 " }\n"
353 " catch (dunedaq::conffwk::Exception & ex) {\n"
354 " std::cerr << \"Caught \" << ex << std::endl;\n"
355 " return (EXIT_FAILURE);\n"
356 " }\n"
357 "\n"
358 " return 0;\n"
359 "}\n";
360}