1 /*
2 * CsvJdbc - a JDBC driver for CSV files
3 * Copyright (C) 2001 Jonathan Ackerman
4 * This library is free software; you can redistribute it and/or
5 * modify it under the terms of the GNU Lesser General Public
6 * License as published by the Free Software Foundation; either
7 * version 2.1 of the License, or (at your option) any later version.
8 * This library is distributed in the hope that it will be useful,
9 * but WITHOUT ANY WARRANTY; without even the implied warranty of
10 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
11 * Lesser General Public License for more details.
12 * You should have received a copy of the GNU Lesser General Public
13 * License along with this library; if not, write to the Free Software
14 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
15 */
16 package org.relique.jdbc.csv;
17
18 import java.util.Vector;
19 import java.util.StringTokenizer;
20
21 /***
22 *This is a very crude and SQL simple parser used by the Csv JDBC driver. It
23 * only handles SELECT statements in the format "SELECT xxx,yyy,zzz FROM fffff"
24 *
25 * @author Jonathan Ackerman
26 * @created 25 November 2001
27 * @version $Id: SqlParser.html,v 1.1 2003/05/12 16:19:47 sinisa Exp $
28 */
29 public class SqlParser
30 {
31 /***
32 *Description of the Field
33 *
34 * @since
35 */
36
37
38 public static final String CREATE_TABLE = "create_table";
39 public static final String INSERT = "insert";
40 public static final String UPDATE = "update";
41 public static final String SELECT = "select";
42
43
44 public String tableName;
45
46 public String whereStatement;
47
48 public String sqlType;;
49
50 /***
51 *Description of the Field
52 *
53 * @since
54 */
55
56
57 public String[] columnNames;
58
59 public String[] columnValues;
60
61 public String[] columnWhereNames;
62
63 public String[] columnWhereValues;
64
65
66 /***
67 *Gets the tableName attribute of the SqlParser object
68 *
69 * @return The tableName value
70 * @since
71 */
72 public String getTableName()
73 {
74 return tableName;
75 }
76
77
78 /***
79 *Gets the columnNames attribute of the SqlParser object
80 *
81 * @return The columnNames value
82 * @since
83 */
84 public String[] getColumnNames()
85 {
86 return columnNames;
87 }
88
89 public String[] getWhereColumnNames()
90 {
91 return columnWhereNames;
92 }
93
94
95 public String[] getWhereColumnValues()
96 {
97 return columnWhereValues;
98 }
99
100
101 /***
102 *Description of the Method
103 *
104 * @param sql Description of Parameter
105 * @exception Exception Description of Exception
106 * @since
107 */
108 public void parse(String sql) throws Exception
109 {
110 tableName = null;
111 columnNames = new String[0];
112 columnValues = new String[0];
113 columnWhereNames = new String[0];
114 columnWhereValues = new String[0];
115 whereStatement=null;
116 sqlType=null;
117 sql=sql.trim();
118
119 String upperSql = sql.toUpperCase();
120
121 if (!upperSql.startsWith("SELECT "))
122 {
123 if (!upperSql.startsWith("INSERT ")) {
124 if (!upperSql.startsWith("UPDATE ")) {
125 if (upperSql.indexOf("CREATE TABLE ")==1)
126 throw new Exception("Malformed SQL. Wrong SQL statement.");
127 else {
128 sqlType=CREATE_TABLE;
129 int createPos = upperSql.indexOf("CREATE TABLE");
130 int tableStartPos = upperSql.indexOf("(");
131 int tableEndPos = upperSql.lastIndexOf(")");
132 tableName = sql.substring(createPos+12, tableStartPos).trim();
133 String createString = sql.substring(tableStartPos+1, tableEndPos).trim();
134 StringTokenizer tokenizerCreate = new StringTokenizer(createString.toUpperCase(), "\n");
135 Vector setColumnNames = new Vector();
136
137 while (tokenizerCreate.hasMoreTokens())
138 {
139 String strToken = tokenizerCreate.nextToken().trim();
140 int delimiter = strToken.indexOf(" ");
141 if(strToken.toUpperCase().indexOf("CONSTRAINT")==-1) {
142 setColumnNames.add(strToken.substring(0,delimiter).trim());
143 }
144 }
145 columnNames = new String[setColumnNames.size()];
146 setColumnNames.copyInto(columnNames);
147 }
148 }
149 else{
150 if (upperSql.lastIndexOf(" SET ") == -1)
151 throw new Exception("Malformed SQL. Missing SET statement.");
152 sqlType=UPDATE;
153 int updatePos = upperSql.indexOf("UPDATE");
154 int setPos = upperSql.indexOf(" SET ");
155 int equalPos = upperSql.indexOf("=");
156 int wherePos = upperSql.indexOf(" WHERE ");
157 tableName = sql.substring(updatePos + 6, setPos).trim();
158
159 String setString = sql.substring(setPos+5, wherePos);
160 // int lastBracketPos = upperSql.indexOf(")");
161 StringTokenizer tokenizerSet = new StringTokenizer(setString.toUpperCase(), ",");
162 Vector setNames = new Vector();
163 Vector setValues = new Vector();
164
165 while (tokenizerSet.hasMoreTokens())
166 {
167 String strToken = tokenizerSet.nextToken();
168 int delimiter = strToken.indexOf("=");
169 setNames.add(strToken.substring(0,delimiter).trim());
170 setValues.add(strToken.substring(delimiter+1).trim());
171 }
172
173
174 columnNames = new String[setNames.size()];
175 columnValues = new String[setValues.size()];
176 setNames.copyInto(columnNames);
177 setValues.copyInto(columnValues);
178
179 if(wherePos!=-1)
180 {
181 String strWhere=sql.substring(wherePos+6).trim();
182 Vector whereCols = new Vector();
183 Vector whereValues = new Vector();
184 StringTokenizer tokenizerWhere = new StringTokenizer(strWhere, ",");
185
186 while (tokenizerWhere.hasMoreTokens())
187 {
188 String strToken = tokenizerWhere.nextToken();
189 if(strToken.toLowerCase().indexOf(" and ")!=-1) {
190 String temp=strToken;
191 int andPos=0;
192 out:
193 do
194 {
195 andPos = temp.toLowerCase().indexOf(" and ");
196 String strTokenAdd;
197 if(andPos!=-1)
198 strTokenAdd = temp.substring(0,andPos).trim();
199 else
200 strTokenAdd = temp.trim();
201 int delimiter2 = strTokenAdd.indexOf("=");
202 if(delimiter2!=-1) {
203 String valueAdd = strTokenAdd.substring(delimiter2+1).trim();
204 if((valueAdd.indexOf("'")!=-1) ||(valueAdd.indexOf("\"")!=-1))
205 valueAdd=valueAdd.trim().substring(1,valueAdd.trim().length()-1);
206 whereCols.add(strTokenAdd.substring(0,delimiter2).trim());
207 whereValues.add(valueAdd);
208 }
209 else {
210 int delimiter3 = strTokenAdd.toLowerCase().indexOf(" is ");
211 whereCols.add(strTokenAdd.substring(0,delimiter3).trim());
212 whereValues.add(null);
213 }
214 temp=temp.substring(andPos+5);
215 if(temp.toLowerCase().indexOf(" and ")==-1) {
216 strTokenAdd = temp.trim();
217 int delimiter4 = strTokenAdd.indexOf("=");
218 if(delimiter4!=-1) {
219 String valueAdd = strTokenAdd.substring(delimiter4+1).trim();
220 if((valueAdd.indexOf("'")!=-1) ||(valueAdd.indexOf("\"")!=-1))
221 valueAdd=valueAdd.trim().substring(1,valueAdd.trim().length()-1);
222 whereCols.add(strTokenAdd.substring(0,delimiter4).trim());
223 whereValues.add(valueAdd);
224 }
225 else {
226 int delimiter3 = strTokenAdd.toLowerCase().indexOf(" is ");
227 whereCols.add(strTokenAdd.substring(0,delimiter3).trim());
228 whereValues.add(null);
229 }
230 break out;
231 }
232
233
234 }while(true);
235
236 }
237 else {
238 int delimiter = strToken.indexOf("=");
239 if(delimiter!=-1) {
240 String value = strToken.substring(delimiter+1).trim();
241 if((value.indexOf("'")!=-1) ||(value.indexOf("\"")!=-1))
242 value=value.trim().substring(1,value.trim().length()-1);
243 whereCols.add(strToken.substring(0,delimiter).trim());
244 whereValues.add(value);
245 }
246 else {
247 int delimiter1 = strToken.toLowerCase().indexOf(" is ");
248 whereCols.add(strToken.substring(0,delimiter1).trim());
249 whereValues.add(null);
250 }
251 }
252 }
253 columnWhereNames = new String[whereCols.size()];
254 columnWhereValues = new String[whereValues.size()];
255 whereCols.copyInto(columnWhereNames);
256 whereValues.copyInto(columnWhereValues);
257
258
259 }
260
261 }
262
263 }
264 else {
265 if (upperSql.lastIndexOf(" VALUES") == -1) {
266 throw new Exception("Malformed SQL. Missing VALUES statement.");
267 }
268 sqlType=INSERT;
269 int intoPos = 0;
270 if(upperSql.indexOf(" INTO ")!=-1)
271 intoPos = upperSql.indexOf(" INTO ")+6;
272 else
273 intoPos = upperSql.indexOf("INSERT ")+7;
274 int bracketPos = upperSql.indexOf("(");
275 int lastBracketPos = upperSql.indexOf(")");
276 tableName = sql.substring(intoPos, bracketPos).trim();
277
278 Vector cols = new Vector();
279 StringTokenizer tokenizer = new StringTokenizer(upperSql.substring(bracketPos+1,lastBracketPos), ",");
280 while (tokenizer.hasMoreTokens())
281 {
282 cols.add(tokenizer.nextToken().trim());
283 }
284 columnNames = new String[cols.size()];
285 cols.copyInto(columnNames);
286
287 int valuesPos = upperSql.indexOf("VALUES");
288 String endStatement = sql.substring(valuesPos+6).trim();
289 bracketPos = endStatement.indexOf("(");
290 lastBracketPos = endStatement.lastIndexOf(")");
291 Vector values = new Vector();
292 StringTokenizer tokenizer2 = new StringTokenizer(endStatement.substring(bracketPos+1,lastBracketPos), ",");
293 while (tokenizer2.hasMoreTokens())
294 {
295 values.add(tokenizer2.nextToken().trim());
296 }
297 columnValues = new String[values.size()];
298 values.copyInto(columnValues);
299
300 }
301 }
302 else {
303 if (upperSql.lastIndexOf(" FROM ") == -1)
304 {
305 throw new Exception("Malformed SQL. Missing FROM statement.");
306 }
307
308 sqlType=SELECT;
309 int fromPos = upperSql.lastIndexOf(" FROM ");
310 int wherePos=upperSql.lastIndexOf(" WHERE ");
311 if(wherePos==-1)
312 tableName = sql.substring(fromPos + 6).trim();
313 else
314 tableName = sql.substring(fromPos + 6, wherePos).trim();
315
316 Vector cols = new Vector();
317 StringTokenizer tokenizer = new StringTokenizer(upperSql.substring(7, fromPos), ",");
318
319 while (tokenizer.hasMoreTokens())
320 {
321 cols.add(tokenizer.nextToken().trim());
322 }
323
324 columnNames = new String[cols.size()];
325 cols.copyInto(columnNames);
326 if(wherePos!=-1)
327 {
328 String strWhere=sql.substring(wherePos+7);
329 Vector whereCols = new Vector();
330 Vector whereValues = new Vector();
331 StringTokenizer tokenizerWhere = new StringTokenizer(strWhere, ",");
332
333 while (tokenizerWhere.hasMoreTokens())
334 {
335 String strToken = tokenizerWhere.nextToken();
336 if(strToken.toLowerCase().indexOf(" and ")!=-1) {
337 String temp=strToken;
338 int andPos=0;
339 out:
340 do
341 {
342 andPos = temp.toLowerCase().indexOf(" and ");
343 String strTokenAdd;
344 if(andPos!=-1)
345 strTokenAdd = temp.substring(0,andPos).trim();
346 else
347 strTokenAdd = temp.trim();
348 int delimiter2 = strTokenAdd.indexOf("=");
349 if(delimiter2!=-1) {
350 String valueAdd = strTokenAdd.substring(delimiter2+1).trim();
351 if((valueAdd.indexOf("'")!=-1) ||(valueAdd.indexOf("\"")!=-1))
352 valueAdd=valueAdd.trim().substring(1,valueAdd.trim().length()-1);
353 whereCols.add(strTokenAdd.substring(0,delimiter2).trim());
354 whereValues.add(valueAdd);
355 }
356 else {
357 int delimiter3 = strTokenAdd.toLowerCase().indexOf(" is ");
358 whereCols.add(strTokenAdd.substring(0,delimiter3).trim());
359 whereValues.add(null);
360 }
361 temp=temp.substring(andPos+5);
362 if(temp.toLowerCase().indexOf(" and ")==-1) {
363 strTokenAdd = temp.trim();
364 int delimiter4 = strTokenAdd.indexOf("=");
365 if(delimiter4!=-1) {
366 String valueAdd = strTokenAdd.substring(delimiter4+1).trim();
367 if((valueAdd.indexOf("'")!=-1) ||(valueAdd.indexOf("\"")!=-1))
368 valueAdd=valueAdd.trim().substring(1,valueAdd.trim().length()-1);
369 whereCols.add(strTokenAdd.substring(0,delimiter4).trim());
370 whereValues.add(valueAdd);
371 }
372 else {
373 int delimiter3 = strTokenAdd.toLowerCase().indexOf(" is ");
374 whereCols.add(strTokenAdd.substring(0,delimiter3).trim());
375 whereValues.add(null);
376 }
377 break out;
378 }
379
380
381 }while(true);
382
383 }
384 else {
385 int delimiter = strToken.indexOf("=");
386 if(delimiter!=-1) {
387 String value = strToken.substring(delimiter+1).trim();
388 if((value.indexOf("'")!=-1) ||(value.indexOf("\"")!=-1))
389 value=value.trim().substring(1,value.trim().length()-1);
390 whereCols.add(strToken.substring(0,delimiter).trim());
391 whereValues.add(value);
392 }
393 else {
394 int delimiter1 = strToken.toLowerCase().indexOf(" is ");
395 whereCols.add(strToken.substring(0,delimiter1).trim());
396 whereValues.add(null);
397 }
398 }
399 }
400 columnWhereNames = new String[whereCols.size()];
401 columnWhereValues = new String[whereValues.size()];
402 whereCols.copyInto(columnWhereNames);
403 whereValues.copyInto(columnWhereValues);
404
405
406 }
407
408 }
409 }
410 }
This page automatically generated by Maven