001: package com.quadcap.sql;
002:
003: /* Copyright 1999 - 2003 Quadcap Software. All rights reserved.
004: *
005: * This software is distributed under the Quadcap Free Software License.
006: * This software may be used or modified for any purpose, personal or
007: * commercial. Open Source redistributions are permitted. Commercial
008: * redistribution of larger works derived from, or works which bundle
009: * this software requires a "Commercial Redistribution License"; see
010: * http://www.quadcap.com/purchase.
011: *
012: * Redistributions qualify as "Open Source" under one of the following terms:
013: *
014: * Redistributions are made at no charge beyond the reasonable cost of
015: * materials and delivery.
016: *
017: * Redistributions are accompanied by a copy of the Source Code or by an
018: * irrevocable offer to provide a copy of the Source Code for up to three
019: * years at the cost of materials and delivery. Such redistributions
020: * must allow further use, modification, and redistribution of the Source
021: * Code under substantially the same terms as this license.
022: *
023: * Redistributions of source code must retain the copyright notices as they
024: * appear in each source code file, these license terms, and the
025: * disclaimer/limitation of liability set forth as paragraph 6 below.
026: *
027: * Redistributions in binary form must reproduce this Copyright Notice,
028: * these license terms, and the disclaimer/limitation of liability set
029: * forth as paragraph 6 below, in the documentation and/or other materials
030: * provided with the distribution.
031: *
032: * The Software is provided on an "AS IS" basis. No warranty is
033: * provided that the Software is free of defects, or fit for a
034: * particular purpose.
035: *
036: * Limitation of Liability. Quadcap Software shall not be liable
037: * for any damages suffered by the Licensee or any third party resulting
038: * from use of the Software.
039: */
040:
041: import java.io.IOException;
042:
043: import antlr.Token;
044: import antlr.TokenStream;
045:
046: import com.quadcap.util.Debug;
047:
048: /**
049: * Handle JDBC escape processing as a token stream.
050: *
051: * @author Stan Bailes
052: */
053: public class JdbcEscapeTokenStream implements TokenStream,
054: SQLTokenTypes {
055: TokenStream in;
056: int escCnt = 0;
057:
058: public JdbcEscapeTokenStream(TokenStream in) {
059: this .in = in;
060: }
061:
062: /*{jdbcEscape.xml-10}
063: * <section name="JDBC Escape Processing">
064: *
065: * <p>The following JDBC escape syntax is recognized and translated
066: * to the appropriate underlying SQL syntax.</p>
067: *
068: * <table>
069: * <tgroup cols="3">
070: * <thead>
071: * <row>
072: * <th>JDBC Syntax</th><th>SQL Syntax</th><th>Description</th>
073: * </row>
074: * </thead>
075: * <tbody>
076: * <row>
077: * <entry>{escape '<i>character</i>'}</entry>
078: * <entry>escape '<i>character</i>'</entry>
079: * <entry>Specify the character used to escape '%' and '_'
080: * in SQL <code>LIKE</code> clauses.</entry>
081: *
082: * </row>
083: * <row>
084: * <entry>{fn <i>functionExpression</i>}</entry>
085: * <entry><i>functionExpression</i></entry>
086: * <entry>Use a database scalar function. Since the ODBC CLI functions
087: * specified by JDBC are all directly implemented by QED, this
088: * escape is basically just a pass-through.</entry>
089: *
090: * </row>
091: * <row>
092: * <entry>{d <i>'yyyy-mm-dd'</i>}</entry>
093: * <entry>date <i>'yyyy-mm-dd'</i></entry>
094: * <entry>The JDBC 'd' escape for a date literal is translated into
095: * the SQL92 'date' syntax supported by the database.</entry>
096: *
097: * </row>
098: * <row>
099: * <entry>{t <i>'hh:mm:ss'</i>}</entry>
100: * <entry>time <i>'hh:mm:ss'</i></entry>
101: * <entry>The JDBC 't' escape for a time literal is translated into
102: * the SQL92 'time' syntax supported by the database.</entry>
103: *
104: * </row>
105: * <row>
106: * <entry>{ts <i>'yyyy-mm-dd hh:mm:ss.f . . .'</i>}</entry>
107: * <entry>timestamp <i>'yyyy-mm-dd hh:mm:ss.f . . .'</i></entry>
108: * <entry>The JDBC 'ts' escape for a timestamp literal is translated into
109: * the SQL92 'timestamp' syntax supported by the database.</entry>
110: *
111: * </row>
112: * <row>
113: * <entry>{oj <i>outer-join</i>}</entry>
114: * <entry><i>outer-join</i></entry>
115: * <entry>The JDBC 'oj' escape for a timestamp literal is translated into
116: * the SQL92 'outer join' syntax supported by the database.</entry>
117: *
118: * </row>
119: * </tbody>
120: * </tgroup>
121: * </table>
122: * </section>
123: */
124:
125: public Token nextToken() throws antlr.TokenStreamException {
126: Token t = in.nextToken();
127: int typ = t.getType();
128: while (typ == RCURLY) {
129: if (--escCnt < 0)
130: throw new antlr.TokenStreamException("unexpected '}'");
131: t = in.nextToken();
132: typ = t.getType();
133: }
134: if (typ == LCURLY) {
135: escCnt++;
136: t = in.nextToken();
137: typ = t.getType();
138: if (typ == ID) {
139: String txt = t.getText().toLowerCase();
140: if (txt.equals("fn") || txt.equals("oj")) {
141: t = in.nextToken();
142: } else if (txt.equals("escape")) {
143: } else if (txt.equals("d")) {
144: t = new Token(LITERAL_date, "date");
145: } else if (txt.equals("t")) {
146: t = new Token(LITERAL_time, "time");
147: } else if (txt.equals("ts")) {
148: t = new Token(LITERAL_timestamp, "timestamp");
149: } else {
150: throw new antlr.TokenStreamException(
151: "Unrecognized escape: " + t.getText());
152: }
153: }
154: }
155: //Debug.println("ESC token = " + t);
156: return t;
157: }
158: }
|