ANNA Suite  2020b
Multipurpose development suite for Telco applications
Statement.hpp
Go to the documentation of this file.
1 // ANNA - Anna is Not Nothingness Anymore //
2 // //
3 // (c) Copyright 2005-2015 Eduardo Ramos Testillano & Francisco Ruiz Rayo //
4 // //
5 // See project site at http://redmine.teslayout.com/projects/anna-suite //
6 // See accompanying file LICENSE or copy at http://www.teslayout.com/projects/public/anna.LICENSE //
7 
8 
9 #ifndef anna_dbms_Statement_hpp
10 #define anna_dbms_Statement_hpp
11 
12 #include <vector>
13 
15 #include <anna/core/mt/Mutex.hpp>
18 
20 #include <anna/dbms/ResultCode.hpp>
21 
22 namespace anna {
23 
24 namespace xml {
25 class Node;
26 }
27 
28 namespace dbms {
29 
30 class Database;
31 class Connection;
32 class InputBind;
33 class OutputBind;
34 class Data;
35 
43 class Statement : public Mutex {
44 public:
45  typedef std::vector <InputBind*>::iterator input_iterator;
46  typedef std::vector <OutputBind*>::iterator output_iterator;
47 
51  virtual ~Statement();
52 
57  const std::string& getName() const { return a_name; }
58 
63  const std::string& getExpression() const { return a_expression; }
64 
72  bool isCritical() const { return a_isCritical; }
73 
78  Database& getDatabase() const { return a_database; }
79 
100  void bindInput(const char* name, Data& data) ;
101 
127  const dbms::OutputBind* bindOutput(const char* name, Data& data) ;
128 
133  void setRequiresCommit(const bool requiresCommit) { a_requiresCommit = requiresCommit; }
134 
141  bool requiresCommit() const { return (a_requiresCommit == true) || (a_outputBinds.empty() == true); }
142 
147  input_iterator input_begin() { return a_inputBinds.begin(); }
148 
153  input_iterator input_end() { return a_inputBinds.end(); }
154 
159  int input_size() const { return a_inputBinds.size(); }
160 
165  output_iterator output_begin() { return a_outputBinds.begin(); }
166 
171  output_iterator output_end() { return a_outputBinds.end(); }
172 
177  int output_size() const { return a_outputBinds.size(); }
178 
184  virtual xml::Node* asXML(xml::Node* parent) const ;
185 
190  virtual std::string asString() const ;
191 
199  virtual bool fetch() noexcept(false) = 0;
200 
205  static Data& input(input_iterator& ii) ;
206 
211  static Data& output(output_iterator& ii) ;
212 
213 protected:
224  Statement(Database& database, const char* name, const char* expression, const bool isCritical) :
225  a_database(database),
226  a_name(name),
227  a_expression(expression),
228  a_prepared(false),
229  a_isCritical(isCritical),
230  a_measureTiming("Timing", "us"),
231  a_requiresCommit(false) {
232  }
233 
245  Statement(Database& database, const char* name, const std::string& expression, const bool isCritical) :
246  a_database(database),
247  a_name(name),
248  a_expression(expression),
249  a_prepared(false),
250  a_isCritical(isCritical),
251  a_measureTiming("Timing", "us"),
252  a_requiresCommit(false) {
253  }
254 
259  static InputBind* inputBind(input_iterator& ii) { return *ii; }
260 
265  static OutputBind* outputBind(output_iterator& ii) { return *ii; }
266 
267 private:
268  Database& a_database;
269  const std::string a_name;
270  std::string a_expression;
271  std::vector <InputBind*> a_inputBinds;
272  std::vector <OutputBind*> a_outputBinds;
273  bool a_prepared;
274  const bool a_isCritical;
275  Average <Microsecond> a_measureTiming;
276  bool a_requiresCommit;
277 
278  Statement(const Statement&);
279  void measureTiming(const Microsecond & init, const Microsecond & end) { a_measureTiming += (end - init); }
280 
281  virtual void prepare(Connection* connection) noexcept(false) = 0;
282  virtual ResultCode execute(Connection* connection) noexcept(false) = 0;
283 
284  friend class Connection;
285  friend class Database;
286 };
287 
288 }
289 }
290 
291 #endif
int input_size() const
Definition: Statement.hpp:159
std::vector< InputBind * >::iterator input_iterator
Definition: Statement.hpp:45
Database & getDatabase() const
Definition: Statement.hpp:78
Definition: Connection.hpp:38
Definition: Average.hpp:24
Definition: Node.hpp:56
Definition: Statement.hpp:43
input_iterator input_begin()
Definition: Statement.hpp:147
bool isCritical() const
Definition: Statement.hpp:72
Definition: Database.hpp:37
Definition: Data.hpp:27
const std::string & getExpression() const
Definition: Statement.hpp:63
Definition: OutputBind.hpp:26
output_iterator output_begin()
Definition: Statement.hpp:165
std::vector< OutputBind * >::iterator output_iterator
Definition: Statement.hpp:46
static OutputBind * outputBind(output_iterator &ii)
Definition: Statement.hpp:265
bool requiresCommit() const
Definition: Statement.hpp:141
Statement(Database &database, const char *name, const std::string &expression, const bool isCritical)
Definition: Statement.hpp:245
xml::Node Node
Definition: Node.hpp:21
static InputBind * inputBind(input_iterator &ii)
Definition: Statement.hpp:259
output_iterator output_end()
Definition: Statement.hpp:171
Definition: app.hpp:12
int output_size() const
Definition: Statement.hpp:177
void setRequiresCommit(const bool requiresCommit)
Definition: Statement.hpp:133
Definition: Mutex.hpp:41
Statement(Database &database, const char *name, const char *expression, const bool isCritical)
Definition: Statement.hpp:224
const std::string & getName() const
Definition: Statement.hpp:57
Definition: ResultCode.hpp:29
Definition: Microsecond.hpp:22
Definition: InputBind.hpp:18
input_iterator input_end()
Definition: Statement.hpp:153