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