001    /*
002     * Licensed to the Apache Software Foundation (ASF) under one
003     * or more contributor license agreements. See the NOTICE file
004     * distributed with this work for additional information
005     * regarding copyright ownership. The ASF licenses this file
006     * to you under the Apache License, Version 2.0 (the  "License");
007     * you may not use this file except in compliance with the License.
008     * You may obtain a copy of the License at
009     *
010     *     http://www.apache.org/licenses/LICENSE-2.0
011     *
012     * Unless required by applicable law or agreed to in writing, software
013     * distributed under the License is distributed on an "AS IS" BASIS,
014     * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
015     * See the License for the specific language governing permissions and
016     * limitations under the License.
017     */
018    /*
019     * $Id: QueryParameter.java 468638 2006-10-28 06:52:06Z minchau $
020     */
021    
022    /* This class holds a parameter definition for a JDBC PreparedStatement or CallableStatement. */
023    
024    package org.apache.xalan.lib.sql;
025    
026    import java.util.Hashtable;
027    import java.sql.PreparedStatement;
028    import java.sql.CallableStatement;
029    import java.sql.Statement;
030    
031    public class QueryParameter
032    {
033      private int     m_type;
034      private String  m_name;
035      private String  m_value;
036      private boolean m_output;
037      private String  m_typeName;
038      private static  Hashtable m_Typetable = null;
039    
040      public QueryParameter()
041      {
042        m_type = -1;
043        m_name = null;
044        m_value = null;
045        m_output = false;
046        m_typeName = null;
047      }
048    
049      /**
050       * @param v The parameter value.
051       * @param t The type of the parameter.
052       */
053      public QueryParameter( String v, String t )
054      {
055        m_name = null;
056        m_value = v;
057        m_output = false;
058        setTypeName(t);
059      }
060    
061      public QueryParameter( String name, String value, String type, boolean out_flag )
062      {
063        m_name = name;
064        m_value = value;
065        m_output = out_flag;
066        setTypeName(type);
067      }
068    
069      /**
070       *
071       */
072      public String getValue( ) {
073        return m_value;
074      }
075    
076      /**
077       * @param newValue
078       *
079       */
080      public void setValue( String newValue ) {
081        m_value = newValue;
082      }
083    
084      /** Used to set the parameter type when the type information is provided in the query.
085       * @param newType The parameter type.
086       *
087       */
088      public void setTypeName( String newType )
089      {
090        m_type = map_type(newType);
091        m_typeName = newType;
092      }
093    
094      /**
095       *
096       */
097      public String getTypeName( )
098      {
099        return m_typeName;
100      }
101    
102      /**
103       *
104       */
105      public int getType( )
106      {
107        return m_type;
108      }
109    
110      /**
111       *
112       */
113      public String getName()
114      {
115        return m_name;
116      }
117    
118      /**
119       * Set Name, this should really be covered in the constructor but the
120       * QueryParser has a State issue where the name is discoverd after the
121       * Parameter object needs to be created
122       */
123      public void setName(String n)
124      {
125        m_name = n;
126      }
127    
128      /**
129      *
130      */
131      public boolean isOutput()
132      {
133        return m_output;
134      }
135    
136      /**
137       * Set Name, this should really be covered in the constructor but the
138       * QueryParser has a State issue where the name is discoverd after the
139       * Parameter object needs to be created
140       */
141      public void setIsOutput(boolean flag)
142      {
143        m_output = flag;
144      }
145    
146      private static int map_type(String typename)
147      {
148        if ( m_Typetable == null )
149        {
150          // Load up the type mapping table.
151          m_Typetable = new Hashtable();
152          m_Typetable.put("BIGINT", new Integer(java.sql.Types.BIGINT));
153          m_Typetable.put("BINARY", new Integer(java.sql.Types.BINARY));
154          m_Typetable.put("BIT", new Integer(java.sql.Types.BIT));
155          m_Typetable.put("CHAR", new Integer(java.sql.Types.CHAR));
156          m_Typetable.put("DATE", new Integer(java.sql.Types.DATE));
157          m_Typetable.put("DECIMAL", new Integer(java.sql.Types.DECIMAL));
158          m_Typetable.put("DOUBLE", new Integer(java.sql.Types.DOUBLE));
159          m_Typetable.put("FLOAT", new Integer(java.sql.Types.FLOAT));
160          m_Typetable.put("INTEGER", new Integer(java.sql.Types.INTEGER));
161          m_Typetable.put("LONGVARBINARY", new Integer(java.sql.Types.LONGVARBINARY));
162          m_Typetable.put("LONGVARCHAR", new Integer(java.sql.Types.LONGVARCHAR));
163          m_Typetable.put("NULL", new Integer(java.sql.Types.NULL));
164          m_Typetable.put("NUMERIC", new Integer(java.sql.Types.NUMERIC));
165          m_Typetable.put("OTHER", new Integer(java.sql.Types.OTHER));
166          m_Typetable.put("REAL", new Integer(java.sql.Types.REAL));
167          m_Typetable.put("SMALLINT", new Integer(java.sql.Types.SMALLINT));
168          m_Typetable.put("TIME", new Integer(java.sql.Types.TIME));
169          m_Typetable.put("TIMESTAMP", new Integer(java.sql.Types.TIMESTAMP));
170          m_Typetable.put("TINYINT", new Integer(java.sql.Types.TINYINT));
171          m_Typetable.put("VARBINARY", new Integer(java.sql.Types.VARBINARY));
172          m_Typetable.put("VARCHAR", new Integer(java.sql.Types.VARCHAR));
173    
174          // Aliases from Xalan SQL extension.
175          m_Typetable.put("STRING", new Integer(java.sql.Types.VARCHAR));
176          m_Typetable.put("BIGDECIMAL", new Integer(java.sql.Types.NUMERIC));
177          m_Typetable.put("BOOLEAN", new Integer(java.sql.Types.BIT));
178          m_Typetable.put("BYTES", new Integer(java.sql.Types.LONGVARBINARY));
179          m_Typetable.put("LONG", new Integer(java.sql.Types.BIGINT));
180          m_Typetable.put("SHORT", new Integer(java.sql.Types.SMALLINT));
181        }
182    
183        Integer type = (Integer) m_Typetable.get(typename.toUpperCase());
184        int rtype;
185        if ( type == null )
186          rtype = java.sql.Types.OTHER;
187        else
188          rtype = type.intValue();
189    
190        return(rtype);
191      }
192    
193      /**
194       * This code was in the XConnection, it is included for reference but it
195       * should not be used.
196       *
197       * @TODO Remove this code as soon as it is determined that its Use Case is
198       * resolved elsewhere.
199       */
200      /**
201       * Set the parameter for a Prepared Statement
202       * @param pos
203       * @param stmt
204       * @param p
205       *
206       * @throws SQLException
207       */
208      /*
209      private void setParameter( int pos, PreparedStatement stmt, QueryParameter p )throws SQLException
210      {
211        String type = p.getType();
212        if (type.equalsIgnoreCase("string"))
213        {
214          stmt.setString(pos, p.getValue());
215        }
216    
217        if (type.equalsIgnoreCase("bigdecimal"))
218        {
219          stmt.setBigDecimal(pos, new BigDecimal(p.getValue()));
220        }
221    
222        if (type.equalsIgnoreCase("boolean"))
223        {
224          Integer i = new Integer( p.getValue() );
225          boolean b = ((i.intValue() != 0) ? false : true);
226          stmt.setBoolean(pos, b);
227        }
228    
229        if (type.equalsIgnoreCase("bytes"))
230        {
231          stmt.setBytes(pos, p.getValue().getBytes());
232        }
233    
234        if (type.equalsIgnoreCase("date"))
235        {
236          stmt.setDate(pos, Date.valueOf(p.getValue()));
237        }
238    
239        if (type.equalsIgnoreCase("double"))
240        {
241          Double d = new Double(p.getValue());
242          stmt.setDouble(pos, d.doubleValue() );
243        }
244    
245        if (type.equalsIgnoreCase("float"))
246        {
247          Float f = new Float(p.getValue());
248          stmt.setFloat(pos, f.floatValue());
249        }
250    
251        if (type.equalsIgnoreCase("long"))
252        {
253          Long l = new Long(p.getValue());
254          stmt.setLong(pos, l.longValue());
255        }
256    
257        if (type.equalsIgnoreCase("short"))
258        {
259          Short s = new Short(p.getValue());
260          stmt.setShort(pos, s.shortValue());
261        }
262    
263        if (type.equalsIgnoreCase("time"))
264        {
265          stmt.setTime(pos, Time.valueOf(p.getValue()) );
266        }
267    
268        if (type.equalsIgnoreCase("timestamp"))
269        {
270    
271          stmt.setTimestamp(pos, Timestamp.valueOf(p.getValue()) );
272        }
273    
274      }
275      */
276    
277    }
278    
279