DUNE-DAQ
DUNE Trigger and Data Acquisition software
Loading...
Searching...
No Matches
oks_get_data.cxx File Reference
#include <iostream>
#include <stdexcept>
#include <unistd.h>
#include "CoralBase/Exception.h"
#include "CoralKernel/Context.h"
#include "RelationalAccess/ConnectionService.h"
#include "RelationalAccess/ISessionProxy.h"
#include "RelationalAccess/ITransaction.h"
#include "oks/kernel.hpp"
#include "oks/ral.hpp"
Include dependency graph for oks_get_data.cxx:

Go to the source code of this file.

Functions

static void usage ()
static void no_param (const char *s)
int main (int argc, char *argv[])

Function Documentation

◆ main()

int main ( int argc,
char * argv[] )

Definition at line 66 of file oks_get_data.cxx.

67{
68
69 // parse and check command line
70
71 int verbose_level = 1;
72 std::string connect_string;
73 std::string release;
74 std::string tag;
75 std::string working_schema;
76 std::string schema_file;
77 std::string data_file;
78 std::string query;
79 std::string class_name;
80 long ref_level = 0;
81 int schema_version = -1;
82 int data_version = -1;
83 bool remove_schema_file = false;
84 bool remove_data_file = false;
85
86 for (int i = 1; i < argc; i++) {
87 const char* cp = argv[i];
88
89 if (!strcmp(cp, "-h") || !strcmp(cp, "--help")) {
90 usage();
91 return (EXIT_SUCCESS);
92 } else if (!strcmp(cp, "-v") || !strcmp(cp, "--verbose-level")) {
93 if (++i == argc) {
94 no_param(cp);
95 return (EXIT_FAILURE);
96 } else {
97 verbose_level = atoi(argv[i]);
98 }
99 } else if (!strcmp(cp, "-e") || !strcmp(cp, "--head-data-version")) {
100 if (data_version > 0) {
101 std::cerr << "ERROR: use either explicit data version (parameter -n) or HEAD version for provided release name "
102 "(parameter -e ...)\n";
103 usage();
104 return EXIT_FAILURE;
105 }
106 data_version = 0;
107 if (argc > (i + 1) && argv[i + 1][0] != '-') {
108 ++i;
109 release = argv[i];
110 }
111 } else if (!strcmp(cp, "-t") || !strcmp(cp, "--tag")) {
112 if (++i == argc) {
113 no_param(cp);
114 return (EXIT_FAILURE);
115 } else {
116 tag = argv[i];
117 }
118 } else if (!strcmp(cp, "-s") || !strcmp(cp, "--schema-version")) {
119 if (++i == argc) {
120 no_param(cp);
121 return (EXIT_FAILURE);
122 } else {
123 schema_version = atoi(argv[i]);
124 }
125 } else if (!strcmp(cp, "-n") || !strcmp(cp, "--data-version")) {
126 if (++i == argc) {
127 no_param(cp);
128 return (EXIT_FAILURE);
129 } else {
130 if (!release.empty()) {
131 std::cerr << "ERROR: use either explicit data version (parameter -n) or HEAD version for provided release "
132 "name (parameter -e ...)\n";
133 usage();
134 return EXIT_FAILURE;
135 }
136 data_version = atoi(argv[i]);
137 }
138 } else if (!strcmp(cp, "-c") || !strcmp(cp, "--connect-string")) {
139 if (++i == argc) {
140 no_param(cp);
141 return (EXIT_FAILURE);
142 } else {
143 connect_string = argv[i];
144 }
145 } else if (!strcmp(cp, "-w") || !strcmp(cp, "--working-schema")) {
146 if (++i == argc) {
147 no_param(cp);
148 return (EXIT_FAILURE);
149 } else {
150 working_schema = argv[i];
151 }
152 } else if (!strcmp(cp, "-m") || !strcmp(cp, "--out-schema-file")) {
153 if (++i == argc) {
154 no_param(cp);
155 return (EXIT_FAILURE);
156 } else {
157 schema_file = argv[i];
158 }
159 } else if (!strcmp(cp, "-f") || !strcmp(cp, "--out-data-file")) {
160 if (++i == argc) {
161 no_param(cp);
162 return (EXIT_FAILURE);
163 } else {
164 data_file = argv[i];
165 }
166 } else if (!strcmp(cp, "-q") || !strcmp(cp, "--query")) {
167 if (i >= argc - 2) {
168 no_param(cp);
169 return (EXIT_FAILURE);
170 } else {
171 class_name = argv[++i];
172 query = argv[++i];
173 }
174 } else if (!strcmp(cp, "-r") || !strcmp(cp, "--reference-level")) {
175 if (++i == argc) {
176 no_param(cp);
177 return (EXIT_FAILURE);
178 } else {
179 ref_level = atoi(argv[i]);
180 }
181 } else {
182 std::cerr << "ERROR: Unexpected parameter: \"" << cp << "\"\n\n";
183 usage();
184 return (EXIT_FAILURE);
185 }
186 }
187
188 if (data_version == -1 && tag.empty()) {
189 std::cerr << "ERROR: the data version or tag is required\n";
190 usage();
191 return EXIT_FAILURE;
192 } else if (data_version > 0 && schema_version <= 0) {
193 std::cerr << "ERROR: an explicit data version cannot be used without schema version\n";
194 usage();
195 return EXIT_FAILURE;
196 } else if (data_version != -1 && !tag.empty()) {
197 std::cerr << "ERROR: both schema version and tag are defined; only one can be used\n";
198 usage();
199 return EXIT_FAILURE;
200 }
201
202 if (connect_string.empty()) {
203 std::cerr << "ERROR: the connect string is required\n";
204 usage();
205 return EXIT_FAILURE;
206 }
207
208 if (working_schema.empty()) {
209 std::cerr << "ERROR: the working schema is required\n";
210 usage();
211 return EXIT_FAILURE;
212 }
213
214 // create oks kernel
215
216 VerboseMsg2("Creating OKS kernel...");
217 ::OksKernel kernel;
218
219 try {
220
221 // create oks schema file
222
223 if (schema_file.empty()) {
224 schema_file = kernel.get_tmp_file("/tmp/unknown.schema.xml");
225 VerboseMsg2("The name of output schema file was not provided.\n * use file \'" << schema_file << '\'');
226 remove_schema_file = true;
227 }
228
229 VerboseMsg3("Creating OKS schema file...");
230 ::OksFile* fh1 = kernel.new_schema(schema_file);
231
232 // create oks data file
233
234 if (data_file.empty()) {
235 data_file = kernel.get_tmp_file("/tmp/unknown.data.xml");
236 VerboseMsg2("The name of output data file was not provided.\n * use file \'" << data_file << '\'');
237 remove_data_file = true;
238 }
239
240 VerboseMsg3("Creating OKS data file...");
241 ::OksFile* fh2 = kernel.new_data(data_file);
242
243 {
244 std::unique_ptr<coral::ConnectionService> connection;
245 {
246 std::unique_ptr<coral::ISessionProxy> session(
247 oks::ral::start_coral_session(connect_string, coral::ReadOnly, connection, verbose_level));
248
249 if (!tag.empty() || data_version <= 0 || schema_version < 0) {
251 session.get(), working_schema, tag, schema_version, data_version, release.c_str(), verbose_level);
252 if (data_version <= 0 || schema_version < 0) {
253 throw std::runtime_error((data_version == 0) ? "Cannot get head data" : "Cannot get given data");
254 }
255 }
256
257 oks::ral::get_data(kernel, session.get(), working_schema, schema_version, data_version, verbose_level);
258
259 VerboseMsg2("Committing...");
260 session->transaction().commit();
261
262 VerboseMsg2("Ending user session..."); // delete session by unique_ptr<>
263 }
264
265 VerboseMsg2("Disconnecting..."); // delete connection by unique_ptr<>
266 }
267
268 if (!query.empty()) {
269
270 // compute data, if there is an explicit query
271
272 OksObject::FSet objects;
273
274 if (OksClass* c = kernel.find_class(class_name)) {
275 OksQuery q(c, query);
276
277 if (q.good()) {
278 OksObject::List* l = c->execute_query(&q);
279 if (l && !l->empty()) {
280 for (OksObject::List::iterator i = l->begin(); i != l->end(); ++i) {
281 objects.insert(*i);
282 if (ref_level > 0) {
283 (*i)->references(objects, static_cast<unsigned long>(ref_level));
284 }
285 }
286 } else {
287 std::cerr << "ERROR: failed to find any object of class \"" << class_name << "\" satisfying query \""
288 << query << "\", exiting...\n";
289 unlink(schema_file.c_str());
290 unlink(data_file.c_str());
291 return (EXIT_FAILURE);
292 }
293 } else {
294 std::cerr << "ERROR: failed to parse query \"" << query << "\" for class class \"" << class_name
295 << "\", exiting...\n";
296 unlink(schema_file.c_str());
297 unlink(data_file.c_str());
298 return (EXIT_FAILURE);
299 }
300 } else {
301 std::cerr << "ERROR: cannot find class \"" << class_name << "\", exiting...\n";
302 unlink(schema_file.c_str());
303 unlink(data_file.c_str());
304 return (EXIT_FAILURE);
305 }
306
307 if (verbose_level > 2) {
308 std::cout << objects.size() << " objects to be saved as defined by query and reference-level parameters:\n";
309
310 for (OksObject::FSet::const_iterator i = objects.begin(); i != objects.end(); ++i) {
311 std::cout << " " << *i << std::endl;
312 }
313 }
314
315 std::string trash_data_file = kernel.get_tmp_file("/tmp/trash.data.xml");
316 OksFile* fh3 = kernel.new_data(trash_data_file);
317
318 if (!fh3) {
319 std::cerr << "ERROR: failed to create oks data file \'" << trash_data_file << "\'\n";
320 unlink(schema_file.c_str());
321 unlink(data_file.c_str());
322 return (EXIT_FAILURE);
323 }
324
325 VerboseMsg3("Filter out objects not satisfying query...");
326 for (OksObject::Set::const_iterator i = kernel.objects().begin(); i != kernel.objects().end(); ++i) {
327 if (objects.find(*i) == objects.end()) {
328 (*i)->set_file(fh3);
329 VerboseMsg3(" - filter out object " << *i);
330 }
331 }
332
333 unlink(trash_data_file.c_str());
334 }
335
336 VerboseMsg5("Dump data:\n" << kernel);
337
338 if (remove_schema_file) {
339 VerboseMsg2("Removing temporal schema file \'" << schema_file << "\'...");
340 unlink(schema_file.c_str());
341 } else {
342 VerboseMsg2("Saving oks schema...");
343 kernel.save_schema(fh1);
344 fh2->add_include_file(schema_file);
345 }
346
347 if (remove_data_file) {
348 VerboseMsg2("Removing temporal data file \'" << data_file << "\'...");
349 unlink(data_file.c_str());
350 } else {
351 VerboseMsg2("Saving oks data...");
352 kernel.save_data(fh2, true);
353 }
354
355 VerboseMsg2("Exiting...");
356 }
357
358 catch (coral::Exception& e) {
359 std::cerr << "CORAL exception: " << e.what() << std::endl;
360 return 1;
361 }
362
363 catch (oks::exception& ex) {
364 std::cerr << "OKS exception:\n" << ex << std::endl;
365 return 2;
366 }
367
368 catch (std::exception& e) {
369 std::cerr << "Standard C++ exception : " << e.what() << std::endl;
370 return 3;
371 }
372
373 catch (...) {
374 std::cerr << "Exception caught (...)" << std::endl;
375 return 4;
376 }
377
378 return 0;
379}
static void usage(const char *s)
static void no_param(const char *s)
coral::ISessionProxy * start_coral_session(const std::string &connect_string, int mode, std::unique_ptr< coral::ConnectionService > &connection, int verbose_level)
Start coral session.
void get_data_version(coral::ISessionProxy *session, const std::string &schema, const std::string &tag, int &schema_version, int &data_version, const char *release=0, int verbose_level=1, const char *dx="")
Get data version by tag.
unsigned long get_data(OksKernel &kernel, coral::ISessionProxy *session, const std::string &schema, int schema_version, int data_version, int verbose_level, const OksClass::Map *pattern=0)
Get data by version numbers.
#define VerboseMsg2(MSG)
Definition ral.hpp:25
#define VerboseMsg5(MSG)
Definition ral.hpp:43
#define VerboseMsg3(MSG)
Definition ral.hpp:31

◆ no_param()

void no_param ( const char * s)
static

Definition at line 60 of file oks_get_data.cxx.

61{
62 std::cerr << "ERROR: no parameter for " << s << " provided\n\n";
63}

◆ usage()

void usage ( )
static

Definition at line 22 of file oks_get_data.cxx.

23{
24 std::cout
25 << "usage: oks_get_data\n"
26 " -c | --connect-string connect_string\n"
27 " -w | --working-schema schema_name\n"
28 " [-t | --tag data_tag]\n"
29 " [-e | --head-data-version [release-name]]\n"
30 " [-s | --schema-version schema_version]\n"
31 " [-n | --data-version data_version]\n"
32 " [-m | --out-schema-file schema_file]\n"
33 " [-f | --out-data-file data_file]\n"
34 " [-q | --query class oks-query [-r | --reference-level ref-level]]\n"
35 " [-v | --verbose-level verbosity_level]\n"
36 " [-h | --help]\n"
37 "\n"
38 "Options/Arguments:\n"
39 " -c connect_string database connection string\n"
40 " -w schema_name name of working schema\n"
41 " -t data_tag get data by tag\n"
42 " -e [release-name] get HEAD data version (cannot be used with -n);\n"
43 " if there is no -s, then for schema HEAD version of \'" TDAQ_CMT_RELEASE
44 "\' or the explicit release\n"
45 " -s schema_version get data for given schema version (extra -n or -e to get HEAD data version is "
46 "required)\n"
47 " -n data_version get data by version (extra -s is required, but cannot be used with -e)\n"
48 " -m out_schema_file name for output schema file\n"
49 " -f out_data_file name for output data file\n"
50 " -q class query only get objects of given class satisfying query\n"
51 " -r ref-level also get objects referencing above objects with given recursion level\n"
52 " -v verbosity_level set verbose output level (0 - silent, 1 - normal, 2 - extended, 3 - debug, ...)\n"
53 " -h print this message\n"
54 "\n"
55 "Description:\n"
56 " The utility creates oks files for given version of data stored in relational database.\n\n";
57}