DUNE-DAQ
DUNE Trigger and Data Acquisition software
Loading...
Searching...
No Matches
oks_dump.cxx File Reference
#include "oks/kernel.hpp"
#include "oks/query.hpp"
#include "oks/exceptions.hpp"
#include <vector>
#include <iostream>
#include <string.h>
#include <stdlib.h>
Include dependency graph for oks_dump.cxx:

Go to the source code of this file.

Enumerations

enum  __OksDumpExitStatus__ {
  __Success__ = 0 , __BadCommandLine__ , __BadOksFile__ , __BadQuery__ ,
  __NoSuchClass__ , __FoundDanglingReferences__ , __ExceptionCaught__
}
 

Functions

static void printUsage (std::ostream &s)
 
static void no_param (const char *s)
 
OksObjectfind_object (char *s, OksKernel &k)
 
int main (int argc, char **argv)
 

Enumeration Type Documentation

◆ __OksDumpExitStatus__

Enumerator
__Success__ 
__BadCommandLine__ 
__BadOksFile__ 
__BadQuery__ 
__NoSuchClass__ 
__FoundDanglingReferences__ 
__ExceptionCaught__ 

Definition at line 24 of file oks_dump.cxx.

24 {
25 __Success__ = 0,
32};
@ __BadCommandLine__
Definition oks_dump.cxx:26
@ __ExceptionCaught__
Definition oks_dump.cxx:31
@ __BadQuery__
Definition oks_dump.cxx:28
@ __FoundDanglingReferences__
Definition oks_dump.cxx:30
@ __BadOksFile__
Definition oks_dump.cxx:27
@ __NoSuchClass__
Definition oks_dump.cxx:29
@ __Success__
Definition oks_dump.cxx:25

Function Documentation

◆ find_object()

OksObject * find_object ( char * s,
OksKernel & k )

Definition at line 90 of file oks_dump.cxx.

91{
92 char * id = s;
93
94 if((s = strchr(id, '@')) == 0) return 0;
95
96 *s = '\0';
97 s++;
98
99 if(OksClass * c = k.find_class(s)) {
100 if(OksObject * o = c->get_object(id)) {
101 return o;
102 }
103 else {
104 Oks::error_msg("oks_dump::find_object()") << "cannot find object \"" << id << '@' << s << "\"\n";
105 }
106 }
107 else {
108 Oks::error_msg("oks_dump::find_object()") << "cannot find class \"" << s << "\"\n";
109 }
110
111 return 0;
112}
The OKS class.
Definition class.hpp:200
OksClass * find_class(const std::string &class_name) const
Find class by name (C++ string).
Definition kernel.hpp:1814
OksObject describes instance of OksClass.
Definition object.hpp:836
static std::ostream & error_msg(const char *)
Definition kernel.cpp:556

◆ main()

int main ( int argc,
char ** argv )

Definition at line 115 of file oks_dump.cxx.

116{
117 if(argc == 1) {
118 printUsage(std::cerr);
119 return __BadCommandLine__;
120 }
121
122 OksKernel kernel;
124
125 try {
126
127 int dump_files_only = 0; // 0 - none, 12 - data, 1 - schema, 2 - schema & data
128 const char * class_name = 0;
129 const char * query = 0;
130 const char * object_from = 0;
131 const char * path_query = 0;
132 long recursion_depth = 0;
133 bool print_referenced_by = false;
134 const char * ref_by_rel_name = "*";
135 std::vector<std::string> ref_classes;
136 bool input_from_files = false;
137 bool print_files_stat = false;
138
139 for(int i = 1; i < argc; i++) {
140 const char * cp = argv[i];
141
142 if(!strcmp(cp, "-h") || !strcmp(cp, "--help")) {
143 printUsage(std::cout);
144 return __Success__;
145 }
146 else if(!strcmp(cp, "-v") || !strcmp(cp, "--version")) {
147 std::cout << "OKS kernel version " << OksKernel::GetVersion() << std::endl;
148 return __Success__;
149 }
150 else if(!strcmp(cp, "-a") || !strcmp(cp, "--allow-duplicated-objects-via-inheritance")) {
152 }
153 else if(!strcmp(cp, "-f") || !strcmp(cp, "--files-only")) {
154 dump_files_only = 2;
155 }
156 else if(!strcmp(cp, "-F") || !strcmp(cp, "--files-stat-only")) {
157 dump_files_only = 2;
158 print_files_stat = true;
159 }
160 else if(!strcmp(cp, "-s") || !strcmp(cp, "--schema-files-only")) {
161 dump_files_only = 1;
162 }
163 else if(!strcmp(cp, "-S") || !strcmp(cp, "--schema-files-stat-only")) {
164 dump_files_only = 1;
165 print_files_stat = true;
166 }
167 else if(!strcmp(cp, "-d") || !strcmp(cp, "--data-files-only")) {
168 dump_files_only = 12;
169 }
170 else if(!strcmp(cp, "-D") || !strcmp(cp, "--data-files-stat-only")) {
171 dump_files_only = 12;
172 print_files_stat = true;
173 }
174 else if(!strcmp(cp, "-c") || !strcmp(cp, "--class")) {
175 if(++i == argc) { no_param(cp); } else { class_name = argv[i]; }
176 }
177 else if(!strcmp(cp, "-q") || !strcmp(cp, "--query")) {
178 if(++i == argc) { no_param(cp); } else { query = argv[i]; }
179 }
180 else if(!strcmp(cp, "-i") || !strcmp(cp, "--input-from-files")) {
181 input_from_files = true;
182 }
183 else if(!strcmp(cp, "-r") || !strcmp(cp, "--print-references")) {
184 if(++i == argc) { no_param(cp); } else { recursion_depth = atol(argv[i]); }
185 int j = 0;
186 for(; j < argc - i - 1; ++j) {
187 if(argv[i+1+j][0] != '-') { ref_classes.push_back(argv[i+1+j]); } else { break; }
188 }
189 i += j;
190 }
191 else if(!strcmp(cp, "-b") || !strcmp(cp, "--print-referenced_by")) {
192 print_referenced_by = true;
193 if((i+1) < argc && argv[i+1][0] != '-') {
194 ref_by_rel_name = argv[++i];
195 }
196 }
197 else if(!strcmp(cp, "-p") || !strcmp(cp, "--path")) {
198 if(++i > argc - 1) { no_param(cp); } else { object_from = argv[i]; path_query = argv[++i];}
199 }
200 else if(strcmp(cp, "--")) {
201 if(input_from_files) {
202 std::ifstream f(cp);
203 if(f.good()) {
204 while(f.good() && !f.eof()) {
205 std::string file_name;
206 std::getline(f, file_name);
207 if(!file_name.empty() && kernel.load_file(file_name) == 0) {
208 Oks::error_msg("oks_dump") << "\tCan not load file \"" << file_name << "\", exiting...\n";
209 return __BadOksFile__;
210 }
211 }
212 }
213 else {
214 Oks::error_msg("oks_dump") << "\tCan not open file \"" << cp << "\" for reading, exiting...\n";
215 return __BadCommandLine__;
216 }
217 }
218 else {
219 if(kernel.load_file(cp) == 0) {
220 Oks::error_msg("oks_dump") << "\tCan not load file \"" << cp << "\", exiting...\n";
221 return __BadOksFile__;
222 }
223 }
224 }
225 }
226
227 if(kernel.schema_files().empty()) {
228 Oks::error_msg("oks_dump") << "\tAt least one oks file have to be provided, exiting...\n";
229 return __BadCommandLine__;
230 }
231
232 if(query && !class_name) {
233 Oks::error_msg("oks_dump") << "\tQuery can only be executed when class name is provided (use -c option), exiting...\n";
234 return __BadCommandLine__;
235 }
236
237 if(dump_files_only) {
238 long total_size = 0;
239 long total_items = 0;
240 const OksFile::Map * files [2] = {&kernel.schema_files(), &kernel.data_files()};
241 for(int j = (dump_files_only / 10); j < (dump_files_only % 10); ++j) {
242 if(!files[j]->empty()) {
243 for(OksFile::Map::const_iterator i = files[j]->begin(); i != files[j]->end(); ++i) {
244 if(print_files_stat) {
245 total_size += i->second->get_size();
246 total_items += i->second->get_number_of_items();
247 std::cout << *(i->first) << " (" << i->second->get_number_of_items() << " items, " << i->second->get_size() << " bytes)" << std::endl;
248 }
249 else {
250 std::cout << *(i->first) << std::endl;
251 }
252 }
253 }
254 }
255
256 if(print_files_stat) {
257 std::cout << "Total number of items: " << total_items << "\n"
258 "Total size of files: " << total_size << " bytes" << std::endl;
259 }
260 }
261 else if(class_name && *class_name) {
262 if(OksClass * c = kernel.find_class(class_name)) {
263 if(query && *query) {
264 OksQuery * q = new OksQuery(c, query);
265 if(q->good()) {
266 OksObject::List * objs = c->execute_query(q);
267 size_t num = (objs ? objs->size() : 0);
268 std::cout << "Found " << num << " matching query \"" << query << "\" in class \"" << class_name << "\"";
269 if(num) {
270 std::cout << ':' << std::endl;
271 while(!objs->empty()) {
272 OksObject * o = objs->front();
273 objs->pop_front();
274
275 if(recursion_depth > 0 || print_referenced_by) {
276 if(recursion_depth) {
277 ClassSet all_ref_classes;
278 kernel.get_all_classes(ref_classes, all_ref_classes);
279 OksObject::FSet refs;
280 o->references(refs, recursion_depth, false, &all_ref_classes);
281 std::cout << o << " references " << refs.size() << " object(s)" << std::endl;
282 for(OksObject::FSet::const_iterator i = refs.begin(); i != refs.end(); ++i) {
283 std::cout << " - " << *i << std::endl;
284 }
285 }
287 if(OksObject::FList * ref_by_objs = o->get_all_rels(ref_by_rel_name)) {
288 std::cout << o << " is referenced by " << ref_by_objs->size() << " object(s) via relationship \"" << ref_by_rel_name << "\":" << std::endl;
289
290 for(OksObject::FList::const_iterator i = ref_by_objs->begin(); i != ref_by_objs->end(); ++i) {
291 std::cout << " - " << *i << std::endl;
292 }
293
294 delete ref_by_objs;
295 }
296 else {
297 std::cout << o << " is not referenced by any object via relationship \"" << ref_by_rel_name << '\"' << std::endl;
298 }
299 }
300 }
301 else {
302 std::cout << *o << std::endl;
303 }
304 }
305 delete objs;
306 }
307 else {
308 std::cout << std::endl;
309 }
310 }
311 else {
312 Oks::error_msg("oks_dump") << "\tFailed to parse query \"" << query << "\" in class \"" << class_name << "\"\n";
313 return __BadQuery__;
314 }
315 delete q;
316 }
317 else {
318 std::cout << *c << std::endl;
319 }
320 }
321 else {
322 Oks::error_msg("oks_dump") << "\tCan not find class \"" << class_name << "\"\n";
323 return __NoSuchClass__;
324 }
325 }
326 else if(object_from && *object_from && path_query && *path_query) {
327 OksObject * obj_from = find_object((char *)object_from, kernel);
328 try {
329 QueryPath q(path_query, kernel);
330 OksObject::List * objs = obj_from->find_path(q);
331
332 size_t num = (objs ? objs->size() : 0);
333 std::cout << "Found " << num << " objects in the path \"" << q << "\" from object " << obj_from << ":" << std::endl;
334
335 if(num) {
336 while(!objs->empty()) {
337 OksObject * o = objs->front();
338 objs->pop_front();
339 std::cout << *o << std::endl;
340 }
341 delete objs;
342 }
343 }
344 catch ( bad_query_syntax& e ) {
345 Oks::error_msg("oks_dump") << "\tFailed to parse query: " << e.what() << std::endl;
346 return __BadQuery__;
347 }
348 }
349 else {
350 std::cout << kernel;
351 }
352
353 if(!kernel.get_bind_classes_status().empty())
354 {
355 Oks::error_msg("oks_dump") << "The schema contains dangling references to non-loaded classes:\n" << kernel.get_bind_classes_status();
356 }
357
358 if(!kernel.get_bind_objects_status().empty())
359 {
360 Oks::error_msg("oks_dump") << "\tThe data contain dangling references to non-loaded objects\n";
361 }
362
363 if(!kernel.get_bind_classes_status().empty() || !kernel.get_bind_objects_status().empty())
364 {
366 }
367 }
368 catch (exception & ex) {
369 std::cerr << "Caught oks exception:\n" << ex << std::endl;
370 return __ExceptionCaught__;
371 }
372 catch (std::exception & e) {
373 std::cerr << "Caught standard C++ exception: " << e.what() << std::endl;
374 return __ExceptionCaught__;
375 }
376 catch (...) {
377 std::cerr << "Caught unknown exception" << std::endl;
378 return __ExceptionCaught__;
379 }
380
381 return __Success__;
382}
std::map< const std::string *, OksFile *, SortByName > Map
Definition file.hpp:367
Provides interface to the OKS kernel.
Definition kernel.hpp:577
OksFile * load_file(const std::string &name, bool bind=true)
Load OKS database file.
Definition kernel.cpp:1788
const OksFile::Map & data_files() const
Get all data files.
Definition kernel.hpp:1493
const std::string & get_bind_classes_status() const noexcept
Return status of oks classes binding.
Definition kernel.hpp:2007
void set_test_duplicated_objects_via_inheritance_mode(const bool b)
Set status of test inherited duplicated objects mode. To switch 'On'/'Off' use the method's parameter...
Definition kernel.hpp:756
const std::string & get_bind_objects_status() const noexcept
Return status of oks objects binding.
Definition kernel.hpp:1995
static const char * GetVersion()
Get OKS version. The method returns string containing CVS tag and date of OKS build.
Definition kernel.cpp:297
const OksFile::Map & schema_files() const
Get all schema files.
Definition kernel.hpp:1223
void get_all_classes(const std::vector< std::string > &names_in, ClassSet &classes_out) const
The method searches all classes including subclasses for given names.
Definition kernel.cpp:4675
std::list< OksObject * > List
Definition object.hpp:875
std::unordered_set< OksObject *, oks::hash_obj_ptr, oks::equal_obj_ptr > FSet
Definition object.hpp:866
void references(OksObject::FSet &refs, unsigned long recursion_depth, bool add_self=false, oks::ClassSet *classes=0) const
Definition object.cpp:3110
FList * get_all_rels(const std::string &name="*") const
Return objects referencing this one via relationship with given name.
Definition object.cpp:3129
OksObject::List * find_path(const oks::QueryPath &query) const
Definition query.cpp:936
std::list< OksObject *, boost::fast_pool_allocator< OksObject * > > FList
Definition object.hpp:877
OKS query class.
Definition query.hpp:36
bool good() const
Definition query.hpp:51
virtual const char * what() const noexcept
Definition query.hpp:323
static void print_referenced_by(const ConfigObject &obj, const char *prefix)
std::unordered_set< const OksClass *, oks::hash_class_ptr, oks::equal_class_ptr > ClassSet
Definition object.hpp:820
OksObject * find_object(char *s, OksKernel &k)
Definition oks_dump.cxx:90
static void no_param(const char *s)
Definition oks_dump.cxx:83
static void printUsage(std::ostream &s)
Definition oks_dump.cxx:36

◆ no_param()

static void no_param ( const char * s)
static

Definition at line 83 of file oks_dump.cxx.

84{
85 Oks::error_msg("oks_dump") << "no parameter(s) for command line argument \'" << s << "\' provided\n\n";
86 exit(EXIT_FAILURE);
87}

◆ printUsage()

static void printUsage ( std::ostream & s)
static

Definition at line 36 of file oks_dump.cxx.

37{
38 s << "Usage: oks_dump\n"
39 " [--files-only | --files-stat-only | --schema-files-only | --schema-files-stat-only | --data-files-only | --data-files-stat-only]\n"
40 " [--class name-of-class [--query query [--print-references recursion-depth [class-name*] [--]] [--print-referenced_by [name] [--]]]]\n"
41 " [--path object-from object-to query]\n"
42 " [--allow-duplicated-objects-via-inheritance]\n"
43 " [--version]\n"
44 " [--help]\n"
45 " [--input-from-files] database-file [database-file(s)]\n"
46 "\n"
47 "Options:\n"
48 " -f | --files-only print list of oks files names\n"
49 " -F | --files-stat-only print list of oks files with statistic details (size, number of items\n"
50 " -s | --schema-files-only print list of schema oks files names\n"
51 " -S | --schema-files-stat-only print list of oks schema files with statistic details\n"
52 " -d | --data-files-only print list of data oks files names\n"
53 " -D | --data-files-stat-only print list of oks data files with statistic details\n"
54 " -c | --class class_name dump given class (all objects or matching some query)\n"
55 " -q | --query query print objects matching query (can only be used with class)\n"
56 " -r | --print-references N C1 C2 ... CX print objects referenced by found objects (can only be used with query), where:\n"
57 " * the parameter N defines recursion depth for referenced objects (> 0)\n"
58 " * the optional set of names {C1 .. CX} defines [sub-]classes for above objects\n"
59 " -b | --print-referenced_by [name] print objects referencing found objects (can only be used with query), where:\n"
60 " * the optional parameter name defines name of relationship\n"
61 " -p | --path obj query print path from object \'obj\' to object of query expression\n"
62 " -i | --input-from-files read oks files to be loaded from file(s) instead of command line\n"
63 " (to avoid problems with long command line, when there is huge number of files)\n"
64 " -a | --allow-duplicated-objects-via-inheritance do not stop if there are duplicated object via inheritance hierarchy\n"
65 " -v | --version print version\n"
66 " -h | --help print this text\n"
67 "\n"
68 "Description:\n"
69 " Dumps contents of the OKS database.\n"
70 "\n"
71 "Return Status:\n"
72 " 0 - no problems found\n"
73 " 1 - bad command line parameter\n"
74 " 2 - bad oks file(s)\n"
75 " 3 - bad query passed via -q or -p options\n"
76 " 4 - cannot find class passed via -c option\n"
77 " 5 - loaded objects have dangling references\n"
78 " 6 - caught an exception\n"
79 "\n";
80}