Normalize xml processing
[anna.git] / source / dbms.mysql / OracleTranslator.cpp
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 #include <ctype.h>
10
11 #include <anna/config/defines.hpp>
12
13 #include <anna/dbms.mysql/OracleTranslator.hpp>
14
15 using namespace std;
16 using namespace anna;
17 using namespace anna::dbms;
18
19 mysql::OracleTranslator mysql::OracleTranslator::st_this;
20
21 /*
22  * Pone las sentencias SQL escritas para Oracle en el formato que necesita el
23  * MySQL.
24  *
25  * La sentencia Oracle podría ser algo así como:
26  * insert into foo (a, b, c) values (:x, :y, :zzzz)
27  * update goo set xx=&value where yy=:zzz
28  *
29  * Y Debería quedar algo así:
30  * insert into foo (a, b, c) values (?,?,?)
31  * update goo set xx=? where yy=?
32  */
33 const char* mysql::OracleTranslator::apply(const char* statement)
34 throw(RuntimeException) {
35   bool makeit = false;
36
37   if(anna_strchr(statement, ':') != NULL)
38     makeit = true;
39   else if(anna_strchr(statement, '&') != NULL)
40     makeit = true;
41
42   if(makeit == false)
43     return statement;
44
45   allocate(statement);
46   enum { Copying, Filtering };
47   int mode(Copying);
48   char* w = a_buffer;
49   char character;
50
51   while((character = *statement) != 0) {
52     switch(mode) {
53     case Copying:
54
55       if(character == ':' || character == '&') {
56         *w ++ = '?';
57         mode = Filtering;
58       } else
59         *w ++ = character;
60
61       break;
62     case Filtering:
63
64       if(character == ',' || character == ')' || isspace(character) || iscntrl(character)) {
65         *w ++ = character;
66         mode = Copying;
67       }
68
69       break;
70     }
71
72     statement ++;
73   }
74
75   *w = 0;
76   return a_buffer;
77 }
78
79 void mysql::OracleTranslator::allocate(const char* statement)
80 throw() {
81   const int size = anna_strlen(statement);
82
83   if(size > a_size) {
84     if(a_size > 0) {
85       delete a_buffer;
86       a_buffer = NULL;
87     }
88
89     a_buffer = new char [a_size = size  + 1];
90   }
91
92   a_buffer [0] = 0;
93 }
94