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 }