001: package org.apache.ojb.broker.platforms;
002:
003: /* Copyright 2002-2005 The Apache Software Foundation
004: *
005: * Licensed under the Apache License, Version 2.0 (the "License");
006: * you may not use this file except in compliance with the License.
007: * You may obtain a copy of the License at
008: *
009: * http://www.apache.org/licenses/LICENSE-2.0
010: *
011: * Unless required by applicable law or agreed to in writing, software
012: * distributed under the License is distributed on an "AS IS" BASIS,
013: * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
014: * See the License for the specific language governing permissions and
015: * limitations under the License.
016: */
017:
018: import java.io.ByteArrayInputStream;
019: import java.math.BigDecimal;
020: import java.sql.PreparedStatement;
021: import java.sql.ResultSet;
022: import java.sql.SQLException;
023: import java.sql.Statement;
024: import java.sql.Types;
025:
026: import org.apache.ojb.broker.query.LikeCriteria;
027: import org.apache.ojb.broker.util.logging.LoggerFactory;
028:
029: /**
030: * @author <a href="mailto:jbraeuchi@gmx.ch">Jakob Braeuchi</a>
031: * @version $Id: PlatformMsAccessImpl.java,v 1.11.2.1 2005/12/21 22:26:39 tomdz Exp $
032: */
033: public class PlatformMsAccessImpl extends PlatformDefaultImpl {
034: /**
035: * @see Platform#setObjectForStatement(PreparedStatement, int, Object, int)
036: */
037: public void setObjectForStatement(PreparedStatement ps, int index,
038: Object value, int sqlType) throws SQLException {
039: if (sqlType == Types.DECIMAL) {
040: ps.setBigDecimal(index, (BigDecimal) value);
041: } else if (sqlType == Types.FLOAT) {
042: // this is because in repository_junit.xml price field is a double in the Article class
043: // but repository maps it to a sql type of FLOAT (any my ODBC/JDBC bridge/driver cannot
044: // cope with this conversion...possibility of a truncation error heer as well...
045: if (value instanceof Double) {
046: ps.setDouble(index, ((Double) value).doubleValue());
047: } else {
048: super .setObjectForStatement(ps, index, value, sqlType);
049: }
050: }
051: // patch by Ralph Brandes to allow writing to memo fields
052: else if (sqlType == Types.LONGVARCHAR) {
053: if (value instanceof String) {
054: String s = (String) value;
055: // ps.setCharacterStream(index, new StringReader(s), s.length());
056: // for MSACCESS :
057: byte[] bytes = s.getBytes();
058: ByteArrayInputStream bais = new ByteArrayInputStream(
059: bytes);
060: ps.setAsciiStream(index, bais, bytes.length);
061: } else {
062: super .setObjectForStatement(ps, index, value, sqlType);
063: }
064: }
065: // patch by Tino Schöllhorn
066: // Current ODBC-Implementation for Access (I use ODBC 4.0.xxxx) does not
067: // support the conversion of LONG values.
068: // Error is : "Optional feature not implemented"
069: // So I try to pass the LONG-value as an Integer even though it might be possible
070: // that the conversion fails - but I don't think that is an issues with Access anyway.
071: else if (value instanceof Long) {
072: ps.setInt(index, ((Long) value).intValue());
073: } else {
074: super .setObjectForStatement(ps, index, value, sqlType);
075: }
076: }
077:
078: /**
079: * @see Platform#beforeStatementClose(Statement stmt, ResultSet rs)
080: */
081: public void beforeStatementClose(Statement stmt, ResultSet rs)
082: throws PlatformException {
083: if (rs != null) {
084: try {
085: rs.close();
086: } catch (SQLException e) {
087: LoggerFactory
088: .getDefaultLogger()
089: .warn(
090: "Resultset closing failed (can be ignored for MsAccess)");
091: }
092: }
093: }
094:
095: /**
096: * Answer the Character for Concatenation
097: */
098: protected String getConcatenationCharacter() {
099: return "&";
100: }
101:
102: /**
103: * @see org.apache.ojb.broker.platforms.Platform#getEscapeClause(org.apache.ojb.broker.query.LikeCriteria)
104: */
105: public String getEscapeClause(LikeCriteria aCriteria) {
106: // TODO: implement ms-access escaping
107: return "";
108: }
109: }
|