View Javadoc
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