View Javadoc

1   package uba.db.jdbc;
2   
3   import java.sql.SQLException;
4   
5   
6   /***
7    * @version $Revision: 1.1.1.1 $
8    */
9   public class JdbcEscapedSqlSentence {
10      private String sql;
11  
12      public JdbcEscapedSqlSentence(String sql) {
13          this.sql = sql;
14      }
15  
16      public String asNativeSQL() throws SQLException {
17          if (sql.indexOf('{') == -1) {
18              return sql;
19          }
20  
21          char    s[]     = sql.toCharArray();
22          boolean changed = false;
23          int     state   = 0;
24          int     len     = s.length;
25  
26          for (int i = 0; i < len; i++) {
27              char c = s[i];
28  
29              switch (state) {
30  
31                  case 0 :    // normal
32                      if (c == '\'') {
33                          state = 1;
34                      } else if (c == '"') {
35                          state = 2;
36                      } else if (c == '{') {
37                          s[i]    = ' ';
38                          changed = true;
39  
40                          String sub = sql.substring(i + 1).toUpperCase();
41  
42                          if (sub.startsWith("?=")) {
43                              throw new StoredProceduresUnsupportedException();
44                              // i += 2;
45                          } else if (sub.startsWith("CALL")) {
46                              throw new StoredProceduresUnsupportedException();
47                              // i += 4;
48                          } else if (sub.startsWith("ESCAPE")) {
49                              i += 6;
50                          } else if (sub.startsWith("D")) {
51                              throw new DateDatatypeUnsupportedException();
52                          }
53  
54                          state = 3;
55                      }
56                      break;
57  
58                  case 1 :    // inside ' '
59                  case 5 :    // inside { } and ' '
60                      if (c == '\'') {
61                          state -= 1;
62                      }
63                      break;
64  
65                  case 2 :    // inside " "
66                  case 6 :    // inside { } and " "
67                      if (c == '"') {
68                          state -= 2;
69                      }
70                      break;
71  
72                  case 3 :    // inside { } before whitespace
73                      if (c == ' ') {
74                          state = 4;
75                      } else {
76                          s[i]    = ' ';
77                          changed = true;
78                      }
79                      break;
80  
81                  case 4 :    // inside { } after whitespace
82                      if (c == '\'') {
83                          state = 5;
84                      } else if (c == '"') {
85                          state = 6;
86                      } else if (c == '}') {
87                          s[i]    = ' ';
88                          changed = true;
89                          state   = 0;
90                      }
91              }
92          }
93  
94          if (changed) {
95              sql = new String(s);
96          }
97  
98          return sql;
99      }
100 }