Revert "Remove mysql and oracle resources for anna-ericsson project"
[anna.git] / source / dbms.mysql / OracleTranslator.cpp
diff --git a/source/dbms.mysql/OracleTranslator.cpp b/source/dbms.mysql/OracleTranslator.cpp
new file mode 100644 (file)
index 0000000..4db0d52
--- /dev/null
@@ -0,0 +1,94 @@
+// 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 <ctype.h>
+
+#include <anna/config/defines.hpp>
+
+#include <anna/dbms.mysql/OracleTranslator.hpp>
+
+using namespace std;
+using namespace anna;
+using namespace anna::dbms;
+
+mysql::OracleTranslator mysql::OracleTranslator::st_this;
+
+/*
+ * Pone las sentencias SQL escritas para Oracle en el formato que necesita el
+ * MySQL.
+ *
+ * La sentencia Oracle podría ser algo así como:
+ * insert into foo (a, b, c) values (:x, :y, :zzzz)
+ * update goo set xx=&value where yy=:zzz
+ *
+ * Y Debería quedar algo así:
+ * insert into foo (a, b, c) values (?,?,?)
+ * update goo set xx=? where yy=?
+ */
+const char* mysql::OracleTranslator::apply(const char* statement)
+throw(RuntimeException) {
+  bool makeit = false;
+
+  if(anna_strchr(statement, ':') != NULL)
+    makeit = true;
+  else if(anna_strchr(statement, '&') != NULL)
+    makeit = true;
+
+  if(makeit == false)
+    return statement;
+
+  allocate(statement);
+  enum { Copying, Filtering };
+  int mode(Copying);
+  char* w = a_buffer;
+  char character;
+
+  while((character = *statement) != 0) {
+    switch(mode) {
+    case Copying:
+
+      if(character == ':' || character == '&') {
+        *w ++ = '?';
+        mode = Filtering;
+      } else
+        *w ++ = character;
+
+      break;
+    case Filtering:
+
+      if(character == ',' || character == ')' || isspace(character) || iscntrl(character)) {
+        *w ++ = character;
+        mode = Copying;
+      }
+
+      break;
+    }
+
+    statement ++;
+  }
+
+  *w = 0;
+  return a_buffer;
+}
+
+void mysql::OracleTranslator::allocate(const char* statement)
+throw() {
+  const int size = anna_strlen(statement);
+
+  if(size > a_size) {
+    if(a_size > 0) {
+      delete a_buffer;
+      a_buffer = NULL;
+    }
+
+    a_buffer = new char [a_size = size  + 1];
+  }
+
+  a_buffer [0] = 0;
+}
+