001: /*
002: * sqlc 1
003: * SQL Compiler
004: * Copyright (C) 2003 Hammurapi Group
005: *
006: * This program is free software; you can redistribute it and/or
007: * modify it under the terms of the GNU Lesser General Public
008: * License as published by the Free Software Foundation; either
009: * version 2 of the License, or (at your option) any later version.
010: *
011: * This program is distributed in the hope that it will be useful,
012: * but WITHOUT ANY WARRANTY; without even the implied warranty of
013: * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
014: * Lesser General Public License for more details.
015: *
016: * You should have received a copy of the GNU Lesser General Public
017: * License along with this library; if not, write to the Free Software
018: * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
019: *
020: * URL: http://www.hammurapi.biz/products/sqlc/index.html
021: * e-Mail: support@hammurapi.biz
022: */
023: package biz.hammurapi.sqlc;
024:
025: import java.sql.PreparedStatement;
026: import java.sql.ResultSet;
027: import java.sql.SQLException;
028: import java.util.Collection;
029: import java.util.HashMap;
030: import java.util.Iterator;
031: import java.util.Map;
032:
033: import org.apache.tools.ant.BuildException;
034:
035: import biz.hammurapi.sql.Parameterizer;
036: import biz.hammurapi.sql.Projector;
037: import biz.hammurapi.sql.PropertyProjector;
038: import biz.hammurapi.sql.SQLProcessor;
039: import biz.hammurapi.xml.dom.AbstractDomObject;
040:
041: /**
042: * @ant.element name="dbstatements"
043: * @author Pavel Vlasov
044: * @version $Revision: 1.4 $
045: */
046: public class DbStatementsEntry extends AbstractDomObject {
047: private String statementsQuery;
048: private String columnsQuery;
049: private String parametersQuery;
050:
051: private static Map columnMap = new HashMap();
052:
053: static {
054: columnMap.put("COLUMN_TYPE", "TYPE");
055: columnMap.put("PARAMETER_POSITION", "POSITION");
056: columnMap.put("PARAMETER_TYPE", "TYPE");
057:
058: }
059:
060: /**
061: *
062: */
063: public void getStatements(final SQLProcessor processor,
064: final StatementCompilerTask task, Collection receiver) {
065: try {
066: processor.project(statementsQuery, null, new Projector() {
067: private void addParameters(final ResultSet rs,
068: StatementEntry ret) {
069: if (parametersQuery != null) {
070: Iterator it = processor.project(
071: parametersQuery,
072: new Parameterizer() {
073: public void parameterize(
074: PreparedStatement ps)
075: throws SQLException {
076: ps.setString(1, rs
077: .getString("NAME"));
078: }
079: },
080: new PropertyProjector(ParamType.class,
081: null, columnMap)).iterator();
082: while (it.hasNext()) {
083: ret.addConfiguredParameter((ParamType) it
084: .next());
085: }
086: }
087: }
088:
089: private void addColumns(final ResultSet rs,
090: QueryEntry ret) {
091: if (columnsQuery != null) {
092: Iterator it = processor.project(
093: columnsQuery,
094: new Parameterizer() {
095: public void parameterize(
096: PreparedStatement ps)
097: throws SQLException {
098: ps.setString(1, rs
099: .getString("NAME"));
100: }
101: },
102: new PropertyProjector(ColumnType.class,
103: null, columnMap)).iterator();
104: while (it.hasNext()) {
105: ret.addConfiguredColumn((ColumnType) it
106: .next());
107: }
108: }
109: }
110:
111: Projector queryProjector = new PropertyProjector(
112: QueryEntry.class, null, null) {
113: public Object project(final ResultSet rs)
114: throws SQLException {
115: QueryEntry ret = (QueryEntry) super .project(rs);
116: addParameters(rs, ret);
117: addColumns(rs, ret);
118: ret.setTask(task);
119: return ret;
120: }
121: };
122:
123: Projector updateProjector = new PropertyProjector(
124: UpdateEntry.class, null, null) {
125: public Object project(final ResultSet rs)
126: throws SQLException {
127: UpdateEntry ret = (UpdateEntry) super
128: .project(rs);
129: addParameters(rs, ret);
130: ret.setTask(task);
131: return ret;
132: }
133: };
134:
135: public Object project(ResultSet rs) throws SQLException {
136: return ("TRUE".equals(rs.getString("IS_UPDATE")) ? updateProjector
137: : queryProjector).project(rs);
138: }
139: }, receiver);
140: } catch (SQLException e) {
141: throw new BuildException(
142: "Could not read statements from the database: " + e,
143: e);
144: }
145: }
146:
147: /**
148: * Query to execute to retrieve column specifications for a statement.
149: * The query shall take on string parameter - statement name and return the following columns: <UL>
150: * <LI>NAME - Column name. String.</LI>
151: * <LI>TYPE - Column type. String.</LI>
152: * <LI>SKIP - String, 'TRUE' for <b>true</b>, anything else for <b>false</b></LI>
153: * </UL>
154: * @ant.non-required
155: */
156: public void setColumnsQuery(String columnsQuery) {
157: this .columnsQuery = columnsQuery;
158: }
159:
160: /**
161: * Query to execute to retrieve statements to compile from the database itself.
162: * The query shall return the following columns: <UL>
163: * <LI>POSITION - Parameter position. Number.</LI>
164: * <LI>TYPE - Parameter type. String.</LI>
165: * </UL>
166: * @ant.non-required
167: */
168: public void setParametersQuery(String parametersQuery) {
169: this .parametersQuery = parametersQuery;
170: }
171:
172: /**
173: * Query to execute to retrieve statements to compile from the database itself.
174: * The query shall return the following columns: <UL>
175: * <LI>IS_SINGLE_ROW - String, 'TRUE' for <b>true</b>, anything else for <b>false</b></LI>
176: * <LI>HAS_NULLABLE_PARAMETERS - String, same as IS_SINGLE_ROW</LI>
177: * <LI>GENERATE_MUTATORS - String, same as IS_SINGLE_ROW</LI>
178: * <LI>STATEMENT_TEXT - String</LI>
179: * <LI>NAME - String</LI>
180: * <LI>DESCRIPTION - String</LI>
181: * <LI>IS_UPDATE - String, same as IS_SINGLE_ROW</LI>
182: * </UL>
183: * @ant.required
184: */
185: public void setStatementsQuery(String statementsQuery) {
186: this.statementsQuery = statementsQuery;
187: }
188: }
|