1 // This is brl/bpro/bprb/bprb_batch_process_manager.cxx
2 #include <iostream>
3 #include <cstdio>
4 #include <cstdlib>
5 #include "bprb_batch_process_manager.h"
6 //:
7 // \file
8 #include <brdb/brdb_database_manager.h>
9 #include <brdb/brdb_relation.h>
10 #include <brdb/brdb_selection.h>
11 #include <brdb/brdb_query.h>
12 #include <brdb/brdb_tuple.h>
13 #include <bprb/bprb_process.h>
14 #include <bprb/bprb_null_process.h>
15 #include <bprb/bprb_parameters.h>
16
17 #ifdef _MSC_VER
18 # include "vcl_msvc_warnings.h"
19 #endif
20
21 //: Constructor
bprb_batch_process_manager()22 bprb_batch_process_manager::bprb_batch_process_manager() : current_process_(nullptr),
23 verbose_(true)
24 {
25 }
26
27 //: Destructor
28 bprb_batch_process_manager::~bprb_batch_process_manager()
29 = default;
30
clear()31 bool bprb_batch_process_manager::clear()
32 {
33 return true;
34 }
35
init_process(std::string const & process_name)36 bool bprb_batch_process_manager::init_process(std::string const& process_name)
37 {
38 bprb_process_sptr p = get_process_by_name(process_name);
39 if (p) {
40 if (verbose_)
41 std::cout << "Process: " << p->name() << std::endl;
42 current_process_ = p;
43 return true;
44 }
45 std::cout << "ERROR!!!! Process: " << process_name << " is not FOUND\n";
46 return false;
47 }
48
49 //: print the default values of the process into the specified XML file
print_default_params(std::string const & process_name,std::string const & params_XML)50 bool bprb_batch_process_manager::print_default_params(std::string const & process_name, std::string const& params_XML)
51 {
52 bprb_process_sptr p = get_process_by_name(process_name);
53 if (p) {
54 std::cout << "Printing default params for process: " << p->name() << std::endl;
55 (p->parameters())->print_def_XML(p->name(), params_XML);
56 return true;
57 }
58 return false;
59 }
60
61 //: read and set the parameters from an XML file for the current process
set_params(std::string const & params_XML)62 bool bprb_batch_process_manager::set_params(std::string const& params_XML)
63 {
64 if (!current_process_) {
65 std::cout << "In bprb_batch_process_manager::set_params(.) - null process\n";
66 return false;
67 }
68 if (!current_process_->parse_params_XML(params_XML)) {
69 std::cout << "In bprb_batch_process_manager::set_params(.) - not able to parse the XML file: "
70 << params_XML << std::endl;
71 return false;
72 }
73 return true;
74 }
75
76 //: set the parameters from another parameter instance for the current process
set_params(const bprb_parameters_sptr & params)77 bool bprb_batch_process_manager::set_params(const bprb_parameters_sptr& params)
78 {
79 if (!current_process_) {
80 std::cout << "In bprb_batch_process_manager::set_params(.) - null process\n";
81 return false;
82 }
83 current_process_->set_parameters(params);
84 return true;
85 }
86
87 //: set primitive data type input on current process
88 bool bprb_batch_process_manager::
set_input(unsigned i,brdb_value_sptr const & input)89 set_input(unsigned i, brdb_value_sptr const& input)
90 {
91 if (!current_process_) {
92 std::cout << "In bprb_batch_process_manager::set_input(.) - null process\n";
93 return false;
94 }
95 return current_process_->set_input(i, input);
96 }
97
98 //: set input from the database
set_input_from_db(unsigned i,unsigned id,const std::string & type)99 bool bprb_batch_process_manager::set_input_from_db(unsigned i,
100 unsigned id,
101 const std::string& type)
102 {
103 if (!current_process_)
104 return false;
105
106 // construct the name of the relation
107 std::string relation_name = type + "_data";
108 // query to get the data
109 brdb_query_aptr Q = brdb_query_comp_new("id", brdb_query::EQ, id);
110
111 brdb_selection_sptr selec = DATABASE->select(relation_name, std::move(Q));
112 if (selec->size()!=1) {
113 std::cout << "in bprb_batch_process_manager::set_input_from_db(.) - no selections\n";
114 return false;
115 }
116 brdb_value_sptr value;
117 if (!selec->get_value(std::string("value"), value)) {
118 std::cout << "in bprb_batch_process_manager::set_input_from_db(.) - didn't get value\n";
119 return false;
120 }
121 if (!value) {
122 std::cout << "in bprb_batch_process_manager::set_input_from_db(.) - null value\n";
123 return false;
124 }
125 if (!current_process_->set_input(i, value)){
126 std::cout << "in bprb_batch_process_manager::set_input_from_db(.) - can't set input on process\n";
127 return false;
128 }
129 return true;
130 }
131
132 //: set input from the database
set_input_from_db(unsigned i,unsigned id)133 bool bprb_batch_process_manager::set_input_from_db(unsigned i,
134 unsigned id)
135 {
136 if (!current_process_)
137 return false;
138 std::string type = current_process_->input_type(i);
139 // construct the name of the relation
140 std::string relation_name = type + "_data";
141
142 // query to get the data
143 brdb_query_aptr Q = brdb_query_comp_new("id", brdb_query::EQ, id);
144
145 brdb_selection_sptr selec = DATABASE->select(relation_name, std::move(Q));
146 if (!selec||selec->size()!=1) {
147 std::cout << "in bprb_batch_process_manager::set_input_from_db(.) - no selections\n";
148 return false;
149 }
150 brdb_value_sptr value;
151 if (!selec->get_value(std::string("value"), value)) {
152 std::cout << "in bprb_batch_process_manager::set_input_from_db(.) - didn't get value\n";
153 return false;
154 }
155 if (!value) {
156 std::cout << "in bprb_batch_process_manager::set_input_from_db(.) - null value\n";
157 return false;
158 }
159 if (!current_process_->set_input(i, value)){
160 std::cout << "in bprb_batch_process_manager::set_input_from_db(.) - can't set input on process\n";
161 return false;
162 }
163 return true;
164 }
165
166 //: put the output into the database
commit_output(unsigned i,unsigned & id)167 bool bprb_batch_process_manager::commit_output(unsigned i, unsigned& id)
168 {
169 std::string type;
170 return commit_output(i, id, type);
171 }
172
173 //: put the output into the database
commit_output(unsigned i,unsigned & id,std::string & type)174 bool bprb_batch_process_manager::commit_output(unsigned i, unsigned& id, std::string &type)
175 {
176 if (!current_process_)
177 return false;
178 /*std::string */type = current_process_->output_type(i);
179 // construct the name of the relation
180 std::string relation_name = type + "_data";
181 // construct the tuple
182 id = brdb_database_manager::id();
183 brdb_value_sptr vid = new brdb_value_t<unsigned>(id);
184 brdb_value_sptr value = current_process_->output(i);
185 if (!value) {
186 std::cout << "bprb_batch_process_manager::commit_output(.) - null process output\n";
187 return false;
188 }
189 brdb_tuple_sptr t = new brdb_tuple();
190 t->add_value(vid); t->add_value(value);
191 if (!DATABASE->add_tuple(relation_name, t)) {
192 std::cout << "bprb_batch_process_manager::commit_output(.) - failed to add tuple to relation "
193 << relation_name << std::endl;
194 return false;
195 }
196 return true;
197 }
198
commit_all_outputs(std::vector<unsigned> & ids)199 bool bprb_batch_process_manager::commit_all_outputs(std::vector<unsigned>& ids)
200 {
201 if (!current_process_)
202 return false;
203 ids.clear();
204 for (unsigned i = 0; i<current_process_->n_outputs(); ++i){
205 unsigned id;
206 std::string type;
207 if (!this->commit_output(i, id, type))
208 return false;
209 else
210 ids.push_back(id);
211 }
212 return true;
213 }
214
215 //: remove data from the database
remove_data(unsigned id)216 bool bprb_batch_process_manager::remove_data(unsigned id)
217 {
218 bool removed = false;
219 std::set<std::string> names = DATABASE->get_all_relation_names();
220 for (auto nit = names.begin();
221 nit != names.end()&&!removed; ++nit) {
222 // query to get the data
223 brdb_query_aptr Q = brdb_query_comp_new("id", brdb_query::EQ, id);
224
225 brdb_selection_sptr selec = DATABASE->select(*nit, std::move(Q));
226 if (selec->size()!=1)
227 continue;
228 selec->delete_tuples();
229 removed = true;
230 }
231 return removed;
232 }
233
234 //: initialize before execution
process_init()235 bool bprb_batch_process_manager::process_init()
236 {
237 bool to_return = false;
238 if (!current_process_)
239 return to_return;
240 if (verbose_)
241 std::cout << "Initializing process: " << current_process_->name()
242 << std::endl;
243
244 to_return = current_process_->init();
245
246 return to_return;
247 }
248
249 //: Run a process on the current frame
run_process()250 bool bprb_batch_process_manager::run_process()
251 {
252 bool to_return = false;
253 if (!current_process_)
254 return to_return;
255 if (verbose_)
256 std::cout << "Running process: " << current_process_->name() << std::endl;
257 // EXECUTE ///////////////////////////////////////////////
258 to_return = current_process_->execute();
259 //////////////////////////////////////////////////////////
260
261 // RETURN VALUE //////////////////////////////////////////
262 return to_return;
263 //////////////////////////////////////////////////////////
264 }
265
finish_process()266 bool bprb_batch_process_manager::finish_process()
267 {
268 bool to_return = false;
269 if (!current_process_)
270 return to_return;
271 if (verbose_)
272 std::cout << "Finish process: " << current_process_->name() << std::endl;
273 // EXECUTE ///////////////////////////////////////////////
274 to_return = current_process_->finish();
275 //////////////////////////////////////////////////////////
276
277 // RETURN VALUE //////////////////////////////////////////
278 return to_return;
279 //////////////////////////////////////////////////////////
280 }
281
print_db()282 void bprb_batch_process_manager::print_db()
283 {
284 DATABASE->print();
285 }
286
287
set_stdout(const std::string & file)288 bool bprb_batch_process_manager::set_stdout(const std::string& file)
289 {
290 return std::freopen (file.c_str(),"a",stdout) != nullptr;
291 }
292
293
reset_stdout()294 bool bprb_batch_process_manager::reset_stdout()
295 {
296 #ifdef WIN32
297 return std::fclose(stdout) == 0 && std::freopen("CON","w",stdout) != NULL;
298 #else
299 return std::fclose(stdout) == 0 && std::freopen("/dev/tty","w",stdout) != nullptr;
300 #endif
301 }
302
303
b_write_db(const std::string & path)304 void bprb_batch_process_manager::b_write_db(const std::string& path)
305 {
306 brdb_database_manager::save_database(path);
307 }
308
b_read_db(const std::string & path)309 void bprb_batch_process_manager::b_read_db(const std::string& path)
310 {
311 brdb_database_manager::load_database(path);
312 }
313