1 package org.apache.torque.adapter;
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22 import java.sql.Connection;
23 import java.sql.SQLException;
24 import java.sql.Statement;
25 import java.util.HashSet;
26 import java.util.ListIterator;
27 import java.util.Set;
28
29 import org.apache.commons.logging.Log;
30 import org.apache.commons.logging.LogFactory;
31 import org.apache.torque.sql.Query;
32 import org.apache.torque.util.UniqueList;
33
34
35
36
37
38
39
40
41
42
43 public class OracleAdapter extends AbstractAdapter
44 {
45
46
47
48 private static final long serialVersionUID = 8966976210230241194L;
49
50
51 private static final Log log = LogFactory.getLog(OracleAdapter.class);
52
53
54
55
56 protected OracleAdapter()
57 {
58
59 }
60
61
62
63
64
65
66
67 @Override
68 public String toUpperCase(String in)
69 {
70 return new StringBuffer("UPPER(").append(in).append(")").toString();
71 }
72
73
74
75
76
77
78
79 @Override
80 public String ignoreCase(String in)
81 {
82 return new StringBuffer("UPPER(").append(in).append(")").toString();
83 }
84
85
86
87
88 @Override
89 public IDMethod getIDMethodType()
90 {
91 return IDMethod.SEQUENCE;
92 }
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107 @Override
108 public String getIDMethodSQL(Object sequenceName)
109 {
110 return ("select " + sequenceName + ".nextval from dual");
111 }
112
113
114
115
116
117
118
119
120 @Override
121 public void lockTable(Connection con, String table) throws SQLException
122 {
123 Statement statement = null;
124 try
125 {
126 statement = con.createStatement();
127 statement.execute("SELECT * FROM " + table + " FOR UPDATE");
128 }
129 finally
130 {
131 if (statement != null)
132 {
133 try
134 {
135 statement.close();
136 }
137 catch (Exception e)
138 {
139 log.warn("Colud not close lock statement", e);
140 }
141 }
142 }
143 }
144
145
146
147
148
149
150
151
152 @Override
153 public void unlockTable(Connection con, String table) throws SQLException
154 {
155
156
157 con.commit();
158 }
159
160
161
162
163
164 @Override
165 public boolean supportsNativeLimit()
166 {
167 return true;
168 }
169
170
171
172
173
174 @Override
175 public boolean supportsNativeOffset()
176 {
177 return true;
178 }
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197 @Override
198 public void generateLimits(Query query, long offset, int limit)
199 {
200 StringBuffer preLimit = new StringBuffer()
201 .append("SELECT B.* FROM ( ")
202 .append("SELECT A.*, rownum AS TORQUE$ROWNUM FROM ( ");
203
204 StringBuffer postLimit = new StringBuffer()
205 .append(" ) A ")
206 .append(" ) B WHERE ");
207
208 if (offset > 0)
209 {
210 postLimit.append(" B.TORQUE$ROWNUM > ")
211 .append(offset);
212
213 if (limit >= 0)
214 {
215 postLimit.append(" AND B.TORQUE$ROWNUM <= ")
216 .append(offset + limit);
217 }
218 }
219 else
220 {
221 postLimit.append(" B.TORQUE$ROWNUM <= ")
222 .append(limit);
223 }
224
225 query.setPreLimit(preLimit.toString());
226 query.setPostLimit(postLimit.toString());
227 query.setLimit(null);
228
229
230
231
232 UniqueList<String> selectColumns = query.getSelectClause();
233 int replacementSuffix = 0;
234 Set<String> columnNames = new HashSet<String>();
235
236
237
238
239 for (ListIterator<String> columnIt = selectColumns.listIterator();
240 columnIt.hasNext();)
241 {
242 String selectColumn = columnIt.next();
243
244
245 if ((selectColumn.indexOf('(') != -1)
246 || (selectColumn.indexOf(')') != -1))
247 {
248
249 continue;
250 }
251
252
253 int spacePos = selectColumn.lastIndexOf(' ');
254 if (spacePos == -1)
255 {
256
257 continue;
258 }
259
260 String aliasName = selectColumn.substring(spacePos + 1);
261 columnNames.add(aliasName);
262 }
263
264
265 for (ListIterator<String> columnIt = selectColumns.listIterator();
266 columnIt.hasNext();)
267 {
268 String selectColumn = columnIt.next();
269
270
271 if ((selectColumn.indexOf('(') != -1)
272 || (selectColumn.indexOf(')') != -1))
273 {
274
275 continue;
276 }
277
278 {
279 int spacePos = selectColumn.lastIndexOf(' ');
280 if (spacePos != -1)
281 {
282
283 continue;
284 }
285 }
286
287 String column;
288 {
289 int dotPos = selectColumn.lastIndexOf('.');
290 if (dotPos != -1)
291 {
292 column = selectColumn.substring(dotPos + 1);
293 }
294 else
295 {
296 column = selectColumn;
297 }
298 }
299 if (columnNames.contains(column))
300 {
301
302
303 String aliasName;
304 do
305 {
306 aliasName = "a" + replacementSuffix;
307 ++replacementSuffix;
308 }
309 while (columnNames.contains(aliasName));
310
311 selectColumn = selectColumn + " " + aliasName;
312 columnIt.set(selectColumn);
313 columnNames.add(aliasName);
314 }
315 else
316 {
317 columnNames.add(column);
318 }
319 }
320 }
321
322
323
324
325
326
327
328
329 @Override
330 public boolean escapeText()
331 {
332 return false;
333 }
334
335
336
337
338
339
340
341
342
343
344 @Override
345 public boolean useEscapeClauseForLike()
346 {
347 return true;
348 }
349 }