--- /dev/null
+// ANNA - Anna is Not Nothingness Anymore //
+// //
+// (c) Copyright 2005-2015 Eduardo Ramos Testillano & Francisco Ruiz Rayo //
+// //
+// See project site at http://redmine.teslayout.com/projects/anna-suite //
+// See accompanying file LICENSE or copy at http://www.teslayout.com/projects/public/anna.LICENSE //
+
+
+#include <anna/core/tracing/TraceMethod.hpp>
+
+#include <anna/xml/Node.hpp>
+#include <anna/xml/Attribute.hpp>
+
+#include <anna/dbms/Statement.hpp>
+#include <anna/dbms/InputBind.hpp>
+#include <anna/dbms/OutputBind.hpp>
+#include <anna/dbms/Database.hpp>
+
+using namespace std;
+using namespace anna;
+using namespace anna::dbms;
+
+Statement::~Statement() {
+ InputBind* ibind;
+ OutputBind* obind;
+
+ for(input_iterator ii = input_begin(), maxii = input_end(); ii != maxii; ii ++) {
+ ibind = inputBind(ii);
+ ibind->release(this);
+ a_database.deallocate(ibind);
+ }
+
+ for(output_iterator ii = output_begin(), maxii = output_end(); ii != maxii; ii ++) {
+ obind = outputBind(ii);
+ obind->release(this);
+ a_database.deallocate(obind);
+ }
+}
+
+string Statement::asString() const
+throw() {
+ string result("dbms::Statement { Nombre: ");
+ result += a_name;
+ result += functions::asText(" | Var.Entrada: ", input_size());
+ result += functions::asText(" | Var.Salida: ", output_size());
+ result += " | ";
+ result += a_measureTiming.asString();
+ result += " | Expresion: ";
+ result += a_expression;
+ return result += " }";
+}
+
+xml::Node* dbms::Statement::asXML(xml::Node* parent) const
+throw() {
+ xml::Node* result = parent->createChild("dbms.Statement");
+ result->createAttribute("Name", a_name);
+ xml::Node* node = result->createChild("Timing");
+ node->createAttribute("N", a_measureTiming.size());
+ node->createAttribute("Accumulator", a_measureTiming.getAccumulator());
+ node->createAttribute("Timing", a_measureTiming.asString());
+ result->createChild("Expression")->createText(a_expression);
+ return result;
+}
+
+void Statement::bindInput(const char* name, Data& data)
+throw() {
+ a_inputBinds.push_back(a_database.allocateInputBind(name, data));
+}
+
+const OutputBind* Statement::bindOutput(const char* name, Data& i)
+throw() {
+ OutputBind* result = a_database.allocateOutputBind(name, i);
+ a_outputBinds.push_back(result);
+ return result;
+}
+
+Data& Statement::input(input_iterator& ii)
+throw() {
+ return (*ii)->getData();
+}
+
+Data& Statement::output(output_iterator& ii)
+throw() {
+ return (*ii)->getData();
+}
+