66main(
int argc,
char* argv[])
71 int verbose_level = 1;
72 std::string connect_string;
75 std::string working_schema;
76 std::string schema_file;
77 std::string data_file;
79 std::string class_name;
81 int schema_version = -1;
82 int data_version = -1;
83 bool remove_schema_file =
false;
84 bool remove_data_file =
false;
86 for (
int i = 1; i < argc; i++) {
87 const char* cp = argv[i];
89 if (!strcmp(cp,
"-h") || !strcmp(cp,
"--help")) {
91 return (EXIT_SUCCESS);
92 }
else if (!strcmp(cp,
"-v") || !strcmp(cp,
"--verbose-level")) {
95 return (EXIT_FAILURE);
97 verbose_level = atoi(argv[i]);
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";
107 if (argc > (i + 1) && argv[i + 1][0] !=
'-') {
111 }
else if (!strcmp(cp,
"-t") || !strcmp(cp,
"--tag")) {
114 return (EXIT_FAILURE);
118 }
else if (!strcmp(cp,
"-s") || !strcmp(cp,
"--schema-version")) {
121 return (EXIT_FAILURE);
123 schema_version = atoi(argv[i]);
125 }
else if (!strcmp(cp,
"-n") || !strcmp(cp,
"--data-version")) {
128 return (EXIT_FAILURE);
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";
136 data_version = atoi(argv[i]);
138 }
else if (!strcmp(cp,
"-c") || !strcmp(cp,
"--connect-string")) {
141 return (EXIT_FAILURE);
143 connect_string = argv[i];
145 }
else if (!strcmp(cp,
"-w") || !strcmp(cp,
"--working-schema")) {
148 return (EXIT_FAILURE);
150 working_schema = argv[i];
152 }
else if (!strcmp(cp,
"-m") || !strcmp(cp,
"--out-schema-file")) {
155 return (EXIT_FAILURE);
157 schema_file = argv[i];
159 }
else if (!strcmp(cp,
"-f") || !strcmp(cp,
"--out-data-file")) {
162 return (EXIT_FAILURE);
166 }
else if (!strcmp(cp,
"-q") || !strcmp(cp,
"--query")) {
169 return (EXIT_FAILURE);
171 class_name = argv[++i];
174 }
else if (!strcmp(cp,
"-r") || !strcmp(cp,
"--reference-level")) {
177 return (EXIT_FAILURE);
179 ref_level = atoi(argv[i]);
182 std::cerr <<
"ERROR: Unexpected parameter: \"" << cp <<
"\"\n\n";
184 return (EXIT_FAILURE);
188 if (data_version == -1 && tag.empty()) {
189 std::cerr <<
"ERROR: the data version or tag is required\n";
192 }
else if (data_version > 0 && schema_version <= 0) {
193 std::cerr <<
"ERROR: an explicit data version cannot be used without schema version\n";
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";
202 if (connect_string.empty()) {
203 std::cerr <<
"ERROR: the connect string is required\n";
208 if (working_schema.empty()) {
209 std::cerr <<
"ERROR: the working schema is required\n";
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;
230 ::OksFile* fh1 = kernel.new_schema(schema_file);
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;
241 ::OksFile* fh2 = kernel.new_data(data_file);
244 std::unique_ptr<coral::ConnectionService> connection;
246 std::unique_ptr<coral::ISessionProxy>
session(
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");
260 session->transaction().commit();
268 if (!query.empty()) {
272 OksObject::FSet objects;
274 if (OksClass* c = kernel.find_class(class_name)) {
275 OksQuery q(c, query);
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) {
283 (*i)->references(objects,
static_cast<unsigned long>(ref_level));
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);
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);
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);
307 if (verbose_level > 2) {
308 std::cout << objects.size() <<
" objects to be saved as defined by query and reference-level parameters:\n";
310 for (OksObject::FSet::const_iterator i = objects.begin(); i != objects.end(); ++i) {
311 std::cout <<
" " << *i << std::endl;
315 std::string trash_data_file = kernel.get_tmp_file(
"/tmp/trash.data.xml");
316 OksFile* fh3 = kernel.new_data(trash_data_file);
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);
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()) {
333 unlink(trash_data_file.c_str());
338 if (remove_schema_file) {
339 VerboseMsg2(
"Removing temporal schema file \'" << schema_file <<
"\'...");
340 unlink(schema_file.c_str());
343 kernel.save_schema(fh1);
344 fh2->add_include_file(schema_file);
347 if (remove_data_file) {
348 VerboseMsg2(
"Removing temporal data file \'" << data_file <<
"\'...");
349 unlink(data_file.c_str());
352 kernel.save_data(fh2,
true);
358 catch (coral::Exception& e) {
359 std::cerr <<
"CORAL exception: " << e.what() << std::endl;
363 catch (oks::exception& ex) {
364 std::cerr <<
"OKS exception:\n" << ex << std::endl;
368 catch (std::exception& e) {
369 std::cerr <<
"Standard C++ exception : " << e.what() << std::endl;
374 std::cerr <<
"Exception caught (...)" << std::endl;
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.