1 package net.sourceforge.backpedal.kodo;
2
3 import net.mikehogan.veggie.exceptions.VeggieSystemException;
4 import net.sourceforge.backpedal.api.core.BackpedalFactory;
5 import net.sourceforge.backpedal.api.core.ParsedStatement;
6 import net.sourceforge.backpedal.api.core.StatementParser;
7 import net.sourceforge.backpedal.impl.AbstractComponent;
8
9 import java.util.ArrayList;
10 import java.util.Collection;
11 import java.util.Collections;
12 import java.util.StringTokenizer;
13
14 public class KodoStatementParser extends AbstractComponent implements StatementParser {
15 private final BackpedalFactory backpedalFactory;
16
17 public KodoStatementParser(BackpedalFactory backpedalFactory) {
18 this.backpedalFactory = backpedalFactory;
19 }
20
21 public ParsedStatement parseInsertStatement(final String statement) {
22 final StringTokenizer tokenizer = new StringTokenizer(statement, " (),");
23 final Collection changedColumnNames = new ArrayList();
24 final String mainKeyword = "INSERT";
25 parse(mainKeyword, tokenizer);
26 parse("INTO", tokenizer);
27 final String tableName = tokenizer.nextToken();
28 String token = tokenizer.nextToken();
29 do {
30 changedColumnNames.add(token);
31 token = tokenizer.nextToken();
32 } while (!"VALUES".equals(token));
33 return createParsedStatement(statement, Collections.EMPTY_LIST, changedColumnNames, mainKeyword, tableName);
34 }
35
36 public ParsedStatement parseDeleteStatement(String sql) {
37 final StringTokenizer tokenizer = new StringTokenizer(sql, " (),=?");
38 final Collection columnNames = new ArrayList();
39 final String mainKeyword = "DELETE";
40 parse(mainKeyword, tokenizer);
41 parse("FROM", tokenizer);
42 final String tableName = tokenizer.nextToken();
43 parse("WHERE", tokenizer);
44 while (tokenizer.hasMoreTokens()) {
45 final String token = tokenizer.nextToken();
46 if (!"AND".equals(token)) {
47 columnNames.add(token);
48 }
49 }
50 return createParsedStatement(sql, columnNames, Collections.EMPTY_LIST, mainKeyword, tableName);
51 }
52
53 private ParsedStatement createParsedStatement(final String originalSql, final Collection whereColumnNames, final Collection changedColumnNames, final String mainKeyword, final String tableName) {
54 String[] whereCols = new String[whereColumnNames.size()];
55 whereCols = (String[]) whereColumnNames.toArray(whereCols);
56 String[] changedCols = new String[changedColumnNames.size()];
57 changedCols = (String[]) changedColumnNames.toArray(changedCols);
58 return backpedalFactory.createParsedStatement(originalSql, mainKeyword, whereCols, changedCols, tableName);
59 }
60
61 private void parse(String expectedToken, StringTokenizer tokenizer) {
62 final String nextToken = tokenizer.nextToken();
63 if (!expectedToken.equals(nextToken)) {
64 throw new VeggieSystemException("Expected token " + expectedToken + ", got " + nextToken);
65 }
66 }
67
68 public ParsedStatement parseUpdateStatement(String sql) {
69 final StringTokenizer tokenizer = new StringTokenizer(sql, " (),=?");
70 final Collection whereColumnNames = new ArrayList();
71 final Collection changedColumnNames = new ArrayList();
72 final String mainKeyword = "UPDATE";
73 parse(mainKeyword, tokenizer);
74 final String tableName = tokenizer.nextToken();
75 parse("SET", tokenizer);
76 String token = tokenizer.nextToken();
77 while (!"WHERE".equals(token)) {
78 changedColumnNames.add(token);
79 token = tokenizer.nextToken();
80 }
81 while (tokenizer.hasMoreTokens()) {
82 token = tokenizer.nextToken();
83 if (!"AND".equals(token)) {
84 whereColumnNames.add(token);
85 }
86 }
87 return createParsedStatement(sql, whereColumnNames, changedColumnNames, mainKeyword, tableName);
88 }
89 }
This page was automatically generated by Maven