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