56{
57
58
59
60 int verbose_level = 1;
61 std::string connect_string;
62 std::string working_schema;
63 std::string password;
65 std::string release;
66 int schema_version = -1;
67 bool remove_file = false;
68
69 for(int i = 1; i < argc; i++) {
70 const char * cp = argv[i];
71
72 if(!strcmp(cp, "-h") || !strcmp(cp, "--help")) {
74 return (EXIT_SUCCESS);
75 }
76 else if(!strcmp(cp, "-v") || !strcmp(cp, "--verbose-level")) {
77 if(++i == argc) {
no_param(cp);
return (EXIT_FAILURE); }
else { verbose_level = atoi(argv[i]); }
78 }
79 else if(!strcmp(cp, "-n") || !strcmp(cp, "--schema-version")) {
80 if(++i == argc) {
no_param(cp);
return (EXIT_FAILURE); }
else { schema_version = atoi(argv[i]); }
81 }
82 else if(!strcmp(cp, "-e") || !strcmp(cp, "--head-schema-version")) {
83 schema_version = 0;
84 if(argc > (i+1) && argv[i+1][0] != '-') {++i; release = argv[i]; }
85 }
86 else if(!strcmp(cp, "-c") || !strcmp(cp, "--connect-string")) {
87 if(++i == argc) {
no_param(cp);
return (EXIT_FAILURE); }
else { connect_string = argv[i]; }
88 }
89 else if(!strcmp(cp, "-w") || !strcmp(cp, "--working-schema")) {
90 if(++i == argc) {
no_param(cp);
return (EXIT_FAILURE); }
else { working_schema = argv[i]; }
91 }
92 else if(!strcmp(cp, "-f") || !strcmp(cp, "--out-file")) {
93 if(++i == argc) {
no_param(cp);
return (EXIT_FAILURE); }
else {
file = argv[i]; }
94 }
95 else {
96 std::cerr << "ERROR: Unexpected parameter: \"" << cp << "\"\n\n";
98 return (EXIT_FAILURE);
99 }
100 }
101
102 if(schema_version == -1) {
103 std::cerr << "ERROR: specify schema version or use -e parameter to get HEAD schema version\n";
105 return EXIT_FAILURE;
106 }
107
108 if(connect_string.empty()) {
109 std::cerr << "ERROR: the connect string is required\n";
111 return EXIT_FAILURE;
112 }
113
114 if(working_schema.empty()) {
115 std::cerr << "ERROR: the working schema is required\n";
117 return EXIT_FAILURE;
118 }
119
120
121
122
124
125 ::OksKernel kernel;
126
127
128 try {
129
130
132 file = kernel.get_tmp_file(
"/tmp/unknown.schema.xml");
133 VerboseMsg2(
"The name of output schema file was not provided.\n * use file \'" << file <<
'\'');
134 remove_file = true;
135 }
136
138 ::OksFile * fh = kernel.new_schema(file);
139
140
141 {
142 std::unique_ptr<coral::ConnectionService> connection;
143 {
145
146 if(schema_version == 0) {
148 if(schema_version < 0) {
149 throw std::runtime_error( (schema_version == 0) ? "Cannot get head schema" : "Cannot get given schema" );
150 }
151 }
152
154
156
158 session->transaction().commit();
159
161 }
162
164 }
165
166 if(remove_file) {
167 VerboseMsg2(
"Removing temporal schema file \'" << file <<
"\'...");
168 unlink(
file.c_str());
169 }
170 else {
172 kernel.save_schema(fh);
173 }
174
176
177 }
178
179 catch ( coral::Exception& e ) {
180 std::cerr << "CORAL exception: " << e.what() << std::endl;
181 return 1;
182 }
183
184 catch ( oks::exception & ex) {
185 std::cerr << "OKS exception:\n" << ex << std::endl;
186 return 2;
187 }
188
189 catch ( std::exception& e ) {
190 std::cerr << "Standard C++ exception : " << e.what() << std::endl;
191 return 3;
192 }
193
194 catch ( ... ) {
195 std::cerr << "Exception caught (...)" << std::endl;
196 return 4;
197 }
198
199 return 0;
200}
void get_schema(OksKernel &kernel, coral::ISessionProxy *session, const std::string &schema, int version, bool read_methods, int verbose_level)
Get schema by version number.
coral::ISessionProxy * start_coral_session(const std::string &connect_string, int mode, std::unique_ptr< coral::ConnectionService > &connection, int verbose_level)
Start coral session.
int get_head_schema_version(coral::ISessionProxy *session, const std::string &schema, const char *release=0, int verbose_level=1, const char *dx="")
Get HEAD schema version number.
static void no_param(const char *s)