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;
012:
013: import com.versant.core.common.GenericOID;
014: import com.versant.core.common.OID;
015: import com.versant.core.metadata.ClassMetaData;
016: import com.versant.core.jdbc.metadata.JdbcColumn;
017: import com.versant.core.jdbc.metadata.JdbcField;
018: import com.versant.core.jdbc.metadata.JdbcClass;
019:
020: import java.sql.ResultSet;
021: import java.sql.SQLException;
022: import java.sql.PreparedStatement;
023:
024: /**
025: * Adds JDBC specific methods to GenericOID.
026: */
027: public class JdbcGenericOID extends GenericOID implements JdbcOID {
028:
029: public JdbcGenericOID() {
030: }
031:
032: public JdbcGenericOID(ClassMetaData cmd, boolean resolved) {
033: super (cmd, resolved);
034: }
035:
036: /**
037: * Populate this OID from the given ResultSet. The firstCol parameter
038: * specifies the column index of the first column to read from rs. If
039: * the primary key consists of multiple columns then they will be
040: * present in the same order as defined in the meta data.
041: *
042: * @return False if OID is 'null', true otherwise
043: */
044: public boolean copyKeyFields(ResultSet rs, int firstCol)
045: throws SQLException {
046: JdbcColumn[] pkc = ((JdbcClass) cmd.storeClass).table.pk;
047: for (int i = 0; i < pkc.length; i++) {
048: JdbcColumn c = pkc[i];
049: if (c.converter != null) {
050: pk[i] = c.converter.get(rs, firstCol++, c);
051: } else {
052: pk[i] = JdbcUtils.get(rs, firstCol++, c.javaTypeCode,
053: c.scale);
054: }
055: if (rs.wasNull())
056: return false;
057: }
058: return true;
059: }
060:
061: /**
062: * This is for appId
063: */
064: public boolean copyKeyFields(ResultSet rs, JdbcField[] pks,
065: int[] pkFieldIndexs) throws SQLException {
066: for (int j = 0; j < pkFieldIndexs.length; j++) {
067: JdbcColumn c = pks[pkFieldIndexs[j]].mainTableCols[0];
068: if (c.converter != null) {
069: pk[j] = c.converter.get(rs, pkFieldIndexs[j] + 1, c);
070: } else {
071: pk[j] = JdbcUtils.get(rs, pkFieldIndexs[j] + 1,
072: c.javaTypeCode, c.scale);
073: }
074: if (rs.wasNull())
075: return false;
076: }
077: return true;
078: }
079:
080: /**
081: * Return false if oid is null.
082: */
083: public boolean validateKeyFields(ResultSet rs, int firstCol)
084: throws SQLException {
085: JdbcColumn[] pkc = ((JdbcClass) cmd.storeClass).table.pk;
086: for (int i = 0; i < pkc.length; i++) {
087: JdbcColumn c = pkc[i];
088: if (c.converter != null) {
089: c.converter.get(rs, firstCol++, c);
090: } else {
091: JdbcUtils.get(rs, firstCol++, c.javaTypeCode, c.scale);
092: }
093: if (rs.wasNull())
094: return false;
095: }
096: return true;
097: }
098:
099: /**
100: * Set parameters on a PrepareStatement from this OID. The firstParam
101: * parameter specifies the column index of the first parameter to set.
102: * If the primary key consists of multiple parameters then they must
103: * all be set in the same order as defined in the meta data. The new
104: * firstParam value must be returned i.e. if firstParam started as 3 and
105: * our pk consists of 2 columns then 5 must be returned.
106: */
107: public int setParams(PreparedStatement ps, int firstParam)
108: throws SQLException {
109: JdbcColumn[] pkc = ((JdbcClass) cmd.storeClass).table.pk;
110: for (int i = 0; i < pkc.length; i++) {
111: JdbcColumn c = pkc[i];
112: if (c.converter != null) {
113: c.converter.set(ps, firstParam++, c, pk[i]);
114: } else {
115: JdbcUtils.set(ps, firstParam++, pk[i], c.javaTypeCode,
116: c.jdbcType);
117: }
118: }
119: return firstParam;
120: }
121:
122: /**
123: * Set parameters on a PrepareStatement from this OID. Columns in pkc
124: * that return false from isForUpdate() should be ignored.
125: */
126: public int setParams(PreparedStatement ps, int firstParam,
127: JdbcColumn[] pkc) throws SQLException {
128: for (int i = 0; i < pkc.length; i++) {
129: JdbcColumn c = pkc[i];
130: if (c.isForUpdate()) {
131: if (c.converter != null) {
132: c.converter.set(ps, firstParam++, c, pk[i]);
133: } else {
134: JdbcUtils.set(ps, firstParam++, pk[i],
135: c.javaTypeCode, c.jdbcType);
136: }
137: }
138: }
139: return firstParam;
140: }
141:
142: /**
143: * Util method to 'setNull' for oid param.
144: */
145: public static int setNullParams(PreparedStatement ps,
146: int firstParam, ClassMetaData cmd) throws SQLException {
147: JdbcColumn[] pkc = ((JdbcClass) cmd.storeClass).table.pk;
148: for (int i = 0; i < pkc.length; i++) {
149: ps.setNull(firstParam++, pkc[i].jdbcType);
150: }
151: return firstParam;
152: }
153:
154: protected GenericOID newInstance() {
155: return new JdbcGenericOID();
156: }
157:
158: public String toSString() {
159: StringBuffer s = new StringBuffer();
160: s.append("GenericOID@");
161: s.append(Integer.toHexString(System.identityHashCode(this )));
162: s.append(' ');
163: if (cmd == null) {
164: s.append("classIndex ");
165: s.append(cmd.index);
166: } else {
167: String n = cmd.qname;
168: int i = n.lastIndexOf('.');
169: if (i >= 0)
170: n = n.substring(i + 1);
171: s.append(n);
172: s.append(' ');
173: JdbcColumn[] pkc = ((JdbcClass) cmd.storeClass).table.pk;
174: for (i = 0; i < pkc.length; i++) {
175: JdbcColumn c = pkc[i];
176: s.append(c.name);
177: s.append('=');
178: s.append(pk[i]);
179: }
180: }
181: if (!isResolved())
182: s.append(" NOTRES ");
183: return s.toString();
184: }
185:
186: }
|