001: /*
002: * Copyright (c) 1998-2008 Caucho Technology -- all rights reserved
003: *
004: * This file is part of Resin(R) Open Source
005: *
006: * Each copy or derived work must preserve the copyright notice and this
007: * notice unmodified.
008: *
009: * Resin Open Source is free software; you can redistribute it and/or modify
010: * it under the terms of the GNU General Public License as published by
011: * the Free Software Foundation; either version 2 of the License, or
012: * (at your option) any later version.
013: *
014: * Resin Open Source is distributed in the hope that it will be useful,
015: * but WITHOUT ANY WARRANTY; without even the implied warranty of
016: * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE, or any warranty
017: * of NON-INFRINGEMENT. See the GNU General Public License for more
018: * details.
019: *
020: * You should have received a copy of the GNU General Public License
021: * along with Resin Open Source; if not, write to the
022: *
023: * Free Software Foundation, Inc.
024: * 59 Temple Place, Suite 330
025: * Boston, MA 02111-1307 USA
026: *
027: * @author Rodrigo Westrupp
028: */
029:
030: package com.caucho.quercus.lib.db;
031:
032: import com.caucho.quercus.env.Value;
033: import com.caucho.util.L10N;
034:
035: import java.sql.CallableStatement;
036: import java.util.HashMap;
037: import java.util.logging.Logger;
038:
039: /**
040: * Oracle statement class. Since Oracle has no object oriented API,
041: * this is essentially a JdbcStatementResource.
042: */
043: public class OracleStatement extends JdbcStatementResource {
044: private static final Logger log = Logger
045: .getLogger(OracleStatement.class.getName());
046: private static final L10N L = new L10N(OracleStatement.class);
047:
048: // Oracle statement has a notion of number of fetched rows
049: // (See also: OracleModule.oci_num_rows)
050: private int _fetchedRows;
051:
052: // Binding variables for Oracle statements
053: private HashMap<String, Integer> _bindingVariables = new HashMap<String, Integer>();
054: private OracleOciLob _outParameter;
055:
056: // Oracle internal result buffer
057: private Value _resultBuffer;
058:
059: // Binding variables for Oracle statements with define_by_name (TOTALLY DIFFERENT FROM ?)
060: //
061: // Example:
062: //
063: // $stmt = oci_parse($conn, "SELECT empno, ename FROM emp");
064: //
065: // /* the define MUST be done BEFORE oci_execute! */
066: //
067: // oci_define_by_name($stmt, "EMPNO", $empno);
068: // oci_define_by_name($stmt, "ENAME", $ename);
069: //
070: // oci_execute($stmt);
071: //
072: // while (oci_fetch($stmt)) {
073: // echo "empno:" . $empno . "\n";
074: // echo "ename:" . $ename . "\n";
075: // }
076: //
077: private HashMap<String, Value> _byNameVariables = new HashMap<String, Value>();
078:
079: /**
080: * Constructs an OracleStatement
081: *
082: * @param conn Oracle connection
083: */
084: OracleStatement(Oracle conn) {
085: super (conn);
086: _fetchedRows = 0;
087: _outParameter = null;
088: }
089:
090: /**
091: * Assigns a variable name to the corresponding index
092: *
093: * @param name the variable name
094: * @param value the corresponding index
095: */
096: public void putBindingVariable(String name, Integer value) {
097: _bindingVariables.put(name, value);
098: }
099:
100: /**
101: * Returns a binding variable index
102: *
103: * @param name the variable name
104: * @return the binding variable index
105: */
106: public Integer getBindingVariable(String name) {
107: return _bindingVariables.get(name);
108: }
109:
110: /**
111: * Removes a binding variable
112: *
113: * @param name the binding variable name
114: * @return the binding variable index
115: */
116: public Integer removeBindingVariable(String name) {
117: return _bindingVariables.remove(name);
118: }
119:
120: /**
121: * Returns all binding variables
122: *
123: * @return a HashMap of variable name to index values
124: */
125: public HashMap<String, Integer> getBindingVariables() {
126: return _bindingVariables;
127: }
128:
129: /**
130: * Removes all binding variables
131: */
132: public void resetBindingVariables() {
133: _bindingVariables = new HashMap<String, Integer>();
134: }
135:
136: /**
137: * Sets the internal result buffer
138: */
139: public void setResultBuffer(Value resultBuffer) {
140: _resultBuffer = resultBuffer;
141: }
142:
143: /**
144: * Returns the internal result buffer
145: *
146: * @return the result buffer
147: */
148: public Value getResultBuffer() {
149: return _resultBuffer;
150: }
151:
152: /**
153: * Assigns a value to a variable
154: *
155: * @param name a variable name
156: * @param value the variable value
157: */
158: public void putByNameVariable(String name, Value value) {
159: _byNameVariables.put(name, value);
160: }
161:
162: /**
163: * Returns the variable value by name
164: *
165: * @param name the variable name
166: * @return the variable value
167: */
168: public Value getByNameVariable(String name) {
169: return _byNameVariables.get(name);
170: }
171:
172: /**
173: * Removes a variable given the corresponding name
174: *
175: * @param name the variable name
176: * @return the variable value
177: */
178: public Value removeByNameVariable(String name) {
179: return _byNameVariables.remove(name);
180: }
181:
182: /**
183: * Returns all variable names and corresponding values
184: *
185: * @return a HashMap of variable names to corresponding values
186: */
187: public HashMap<String, Value> getByNameVariables() {
188: return _byNameVariables;
189: }
190:
191: /**
192: * Removes all variables
193: */
194: public void resetByNameVariables() {
195: _byNameVariables = new HashMap<String, Value>();
196: }
197:
198: /**
199: * Increases the number of fetched rows.
200: *
201: * @return the new number of fetched rows
202: */
203: protected int increaseFetchedRows() {
204: return ++_fetchedRows;
205: }
206:
207: /**
208: * Gets the underlying callable statement.
209: */
210: protected CallableStatement getCallableStatement() {
211: return (CallableStatement) getPreparedStatement();
212: }
213:
214: /**
215: * Gets the number of fetched rows.
216: *
217: * @return the number of fetched rows
218: */
219: protected int getFetchedRows() {
220: return _fetchedRows;
221: }
222:
223: /**
224: * Gets the out parameter.
225: *
226: * @return the out parameter
227: */
228: protected OracleOciLob getOutParameter() {
229: return _outParameter;
230: }
231:
232: /**
233: * Sets the out parameter.
234: *
235: * @param outParameter the new out parameter
236: */
237: protected void setOutParameter(OracleOciLob outParameter) {
238: _outParameter = outParameter;
239: }
240: }
|