001: /*
002: * Copyright (c) 1998 - 2005 Versant Corporation
003: * All rights reserved. This program and the accompanying materials
004: * are made available under the terms of the Eclipse Public License v1.0
005: * which accompanies this distribution, and is available at
006: * http://www.eclipse.org/legal/epl-v10.html
007: *
008: * Contributors:
009: * Versant Corporation - initial API and implementation
010: */
011: package com.versant.core.jdbc.sql.exp;
012:
013: import com.versant.core.util.CharBuf;
014: import com.versant.core.jdbc.sql.SqlDriver;
015:
016: import java.util.Map;
017:
018: import com.versant.core.common.BindingSupportImpl;
019:
020: /**
021: * Inline SQL with parameter replacement for argument column names.
022: */
023: public class InlineSqlExp extends SqlExp {
024:
025: private String template;
026:
027: public InlineSqlExp(String template, SqlExp children) {
028: super (children);
029: this .template = template;
030: }
031:
032: public InlineSqlExp() {
033: }
034:
035: public SqlExp createInstance() {
036: return new InlineSqlExp();
037: }
038:
039: public SqlExp getClone(SqlExp clone, Map cloneMap) {
040: super .getClone(clone, cloneMap);
041:
042: ((InlineSqlExp) clone).template = template;
043:
044: return clone;
045: }
046:
047: /**
048: * Append SQL for this node to s.
049: *
050: * @param driver The driver being used
051: * @param s Append the SQL here
052: * @param leftSibling
053: */
054: public void appendSQLImp(SqlDriver driver, CharBuf s,
055: SqlExp leftSibling) {
056: int n = template.length();
057: int state = 0;
058: for (int i = 0; i < n; i++) {
059: char c = template.charAt(i);
060: int pn;
061: switch (state) {
062: case 0:
063: if (c == '$')
064: state = '$';
065: else
066: s.append(c);
067: break;
068: case '$':
069: pn = 0;
070: switch (c) {
071: default:
072: s.append('$');
073: case '$':
074: s.append(c);
075: break;
076: case '1':
077: pn = 1;
078: break;
079: case '2':
080: pn = 2;
081: break;
082: case '3':
083: pn = 3;
084: break;
085: case '4':
086: pn = 4;
087: break;
088: case '5':
089: pn = 5;
090: break;
091: case '6':
092: pn = 6;
093: break;
094: case '7':
095: pn = 7;
096: break;
097: case '8':
098: pn = 8;
099: break;
100: case '9':
101: pn = 9;
102: break;
103: case '0':
104: pn = 10;
105: break;
106: }
107: if (pn > 0)
108: get(pn).appendSQL(driver, s, null);
109: state = 0;
110: break;
111: default:
112: throw BindingSupportImpl.getInstance().internal(
113: "Unknown state: " + state);
114: }
115: }
116: if (state == '$')
117: s.append('$');
118: }
119:
120: /**
121: * Get the n'th entry in list with the first having index 1.
122: */
123: private SqlExp get(int idx) {
124: SqlExp list = childList;
125: for (int n = idx; list != null && --n > 0; list = list.next)
126: ;
127: if (list == null) {
128: throw BindingSupportImpl.getInstance().invalidOperation(
129: "Invalid expression index: $"
130: + (idx == 10 ? "0 (10)" : Integer
131: .toString(idx)) + " in '"
132: + template + "'");
133: }
134: return list;
135: }
136:
137: }
|