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