64int main(
int argc,
char *argv[])
69 int verbose_level = 1;
70 std::string connect_string;
73 std::string working_schema;
74 std::string schema_file;
75 std::string data_file;
77 std::string class_name;
79 int schema_version = -1;
80 int data_version = -1;
81 bool remove_schema_file =
false;
82 bool remove_data_file =
false;
84 for(
int i = 1; i < argc; i++) {
85 const char * cp = argv[i];
87 if(!strcmp(cp,
"-h") || !strcmp(cp,
"--help")) {
89 return (EXIT_SUCCESS);
91 else if(!strcmp(cp,
"-v") || !strcmp(cp,
"--verbose-level")) {
92 if(++i == argc) {
no_param(cp);
return (EXIT_FAILURE); }
else { verbose_level = atoi(argv[i]); }
94 else if(!strcmp(cp,
"-e") || !strcmp(cp,
"--head-data-version")) {
95 if(data_version > 0) {
96 std::cerr <<
"ERROR: use either explicit data version (parameter -n) or HEAD version for provided release name (parameter -e ...)\n";
101 if(argc > (i+1) && argv[i+1][0] !=
'-') {++i; release = argv[i]; }
103 else if(!strcmp(cp,
"-t") || !strcmp(cp,
"--tag")) {
104 if(++i == argc) {
no_param(cp);
return (EXIT_FAILURE); }
else { tag = argv[i];}
106 else if(!strcmp(cp,
"-s") || !strcmp(cp,
"--schema-version")) {
107 if(++i == argc) {
no_param(cp);
return (EXIT_FAILURE); }
else { schema_version = atoi(argv[i]); }
109 else if(!strcmp(cp,
"-n") || !strcmp(cp,
"--data-version")) {
110 if(++i == argc) {
no_param(cp);
return (EXIT_FAILURE); }
else {
111 if(!release.empty()) {
112 std::cerr <<
"ERROR: use either explicit data version (parameter -n) or HEAD version for provided release name (parameter -e ...)\n";
116 data_version = atoi(argv[i]);
119 else if(!strcmp(cp,
"-c") || !strcmp(cp,
"--connect-string")) {
120 if(++i == argc) {
no_param(cp);
return (EXIT_FAILURE); }
else { connect_string = argv[i]; }
122 else if(!strcmp(cp,
"-w") || !strcmp(cp,
"--working-schema")) {
123 if(++i == argc) {
no_param(cp);
return (EXIT_FAILURE); }
else { working_schema = argv[i]; }
125 else if(!strcmp(cp,
"-m") || !strcmp(cp,
"--out-schema-file")) {
126 if(++i == argc) {
no_param(cp);
return (EXIT_FAILURE); }
else { schema_file = argv[i]; }
128 else if(!strcmp(cp,
"-f") || !strcmp(cp,
"--out-data-file")) {
129 if(++i == argc) {
no_param(cp);
return (EXIT_FAILURE); }
else { data_file = argv[i]; }
131 else if(!strcmp(cp,
"-q") || !strcmp(cp,
"--query")) {
132 if(i >= argc-2) {
no_param(cp);
return (EXIT_FAILURE); }
else { class_name = argv[++i]; query = argv[++i];}
134 else if(!strcmp(cp,
"-r") || !strcmp(cp,
"--reference-level")) {
135 if(++i == argc) {
no_param(cp);
return (EXIT_FAILURE); }
else { ref_level = atoi(argv[i]); }
138 std::cerr <<
"ERROR: Unexpected parameter: \"" << cp <<
"\"\n\n";
140 return (EXIT_FAILURE);
144 if(data_version == -1 && tag.empty()) {
145 std::cerr <<
"ERROR: the data version or tag is required\n";
149 else if(data_version > 0 && schema_version <= 0) {
150 std::cerr <<
"ERROR: an explicit data version cannot be used without schema version\n";
154 else if(data_version != -1 && !tag.empty()) {
155 std::cerr <<
"ERROR: both schema version and tag are defined; only one can be used\n";
160 if(connect_string.empty()) {
161 std::cerr <<
"ERROR: the connect string is required\n";
166 if(working_schema.empty()) {
167 std::cerr <<
"ERROR: the working schema is required\n";
183 if(schema_file.empty()) {
184 schema_file = kernel.get_tmp_file(
"/tmp/unknown.schema.xml");
185 VerboseMsg2(
"The name of output schema file was not provided.\n * use file \'" << schema_file <<
'\'');
186 remove_schema_file =
true;
190 ::OksFile * fh1 = kernel.new_schema(schema_file);
195 if(data_file.empty()) {
196 data_file = kernel.get_tmp_file(
"/tmp/unknown.data.xml");
197 VerboseMsg2(
"The name of output data file was not provided.\n * use file \'" << data_file <<
'\'');
198 remove_data_file =
true;
202 ::OksFile * fh2 = kernel.new_data(data_file);
205 std::unique_ptr<coral::ConnectionService> connection;
209 if(!tag.empty() || data_version <= 0 || schema_version < 0) {
211 if(data_version <= 0 || schema_version < 0) {
212 throw std::runtime_error( (data_version == 0) ?
"Cannot get head data" :
"Cannot get given data" );
219 session->transaction().commit();
231 OksObject::FSet objects;
233 if(OksClass * c = kernel.find_class(class_name)) {
234 OksQuery q(c, query);
237 OksObject::List * l = c->execute_query(&q);
238 if(l && !l->empty()) {
239 for(OksObject::List::iterator i = l->begin(); i != l->end(); ++i) {
242 (*i)->references(objects,
static_cast<unsigned long>(ref_level));
247 std::cerr <<
"ERROR: failed to find any object of class \"" << class_name <<
"\" satisfying query \"" << query <<
"\", exiting...\n";
248 unlink(schema_file.c_str());
249 unlink(data_file.c_str());
250 return (EXIT_FAILURE);
254 std::cerr <<
"ERROR: failed to parse query \"" << query <<
"\" for class class \"" << class_name <<
"\", exiting...\n";
255 unlink(schema_file.c_str());
256 unlink(data_file.c_str());
257 return (EXIT_FAILURE);
261 std::cerr <<
"ERROR: cannot find class \"" << class_name <<
"\", exiting...\n";
262 unlink(schema_file.c_str());
263 unlink(data_file.c_str());
264 return (EXIT_FAILURE);
267 if(verbose_level > 2) {
268 std::cout << objects.size() <<
" objects to be saved as defined by query and reference-level parameters:\n";
270 for(OksObject::FSet::const_iterator i = objects.begin(); i != objects.end(); ++i) {
271 std::cout <<
" " << *i << std::endl;
275 std::string trash_data_file = kernel.get_tmp_file(
"/tmp/trash.data.xml");
276 OksFile * fh3 = kernel.new_data(trash_data_file);
279 std::cerr <<
"ERROR: failed to create oks data file \'" << trash_data_file <<
"\'\n";
280 unlink(schema_file.c_str());
281 unlink(data_file.c_str());
282 return (EXIT_FAILURE);
285 VerboseMsg3(
"Filter out objects not satisfying query...");
286 for(OksObject::Set::const_iterator i = kernel.objects().begin(); i != kernel.objects().end(); ++i) {
287 if(objects.find(*i) == objects.end()) {
293 unlink(trash_data_file.c_str());
298 if(remove_schema_file) {
299 VerboseMsg2(
"Removing temporal schema file \'" << schema_file <<
"\'...");
300 unlink(schema_file.c_str());
304 kernel.save_schema(fh1);
305 fh2->add_include_file(schema_file);
308 if(remove_data_file) {
309 VerboseMsg2(
"Removing temporal data file \'" << data_file <<
"\'...");
310 unlink(data_file.c_str());
314 kernel.save_data(fh2,
true);
320 catch ( coral::Exception& e ) {
321 std::cerr <<
"CORAL exception: " << e.what() << std::endl;
325 catch ( oks::exception & ex) {
326 std::cerr <<
"OKS exception:\n" << ex << std::endl;
330 catch ( std::exception& e ) {
331 std::cerr <<
"Standard C++ exception : " << e.what() << std::endl;
336 std::cerr <<
"Exception caught (...)" << std::endl;
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.