src.com.ziclix.python.sql.handler.InformixDataHandler Maven / Gradle / Ivy
Go to download
Show more of this group Show more artifacts with this name
Show all versions of jython-standalone Show documentation
Show all versions of jython-standalone Show documentation
Jython is an implementation of the high-level, dynamic, object-oriented
language Python written in 100% Pure Java, and seamlessly integrated with
the Java platform. It thus allows you to run Python on any Java platform.
/*
* Jython Database Specification API 2.0
*
*
* Copyright (c) 2001 brian zimmer
*
*/
package com.ziclix.python.sql.handler;
import com.informix.jdbc.IfmxStatement;
import com.ziclix.python.sql.DataHandler;
import com.ziclix.python.sql.FilterDataHandler;
import java.io.InputStream;
import java.sql.Blob;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.sql.Types;
import org.python.core.Py;
import org.python.core.PyFile;
import org.python.core.PyObject;
import org.python.core.PyString;
/**
* Informix specific data handling.
*
* @author brian zimmer
*/
public class InformixDataHandler extends FilterDataHandler {
/**
* Decorator for handling Informix specific issues.
*
* @param datahandler the delegate DataHandler
*/
public InformixDataHandler(DataHandler datahandler) {
super(datahandler);
}
/**
* Returns the serial for the statement.
*
* @param stmt
* @return PyObject
* @throws SQLException
*/
@Override
public PyObject getRowId(Statement stmt) throws SQLException {
if (stmt instanceof IfmxStatement) {
return Py.newInteger(((IfmxStatement) stmt).getSerial());
}
return super.getRowId(stmt);
}
/**
* Provide fixes for Ifx driver.
*
* @param stmt
* @param index
* @param object
* @param type
* @throws SQLException
*/
@Override
public void setJDBCObject(PreparedStatement stmt, int index, PyObject object, int type)
throws SQLException {
if (DataHandler.checkNull(stmt, index, object, type)) {
return;
}
switch (type) {
case Types.LONGVARCHAR:
String varchar;
// Ifx driver can't handle the setCharacterStream() method so use setObject() instead
if (object instanceof PyFile) {
varchar = ((PyFile) object).read().toString();
} else {
varchar = (String) object.__tojava__(String.class);
}
stmt.setObject(index, varchar, type);
break;
case Types.OTHER:
// this is most likely an Informix boolean
stmt.setBoolean(index, object.__nonzero__());
break;
default :
super.setJDBCObject(stmt, index, object, type);
}
}
/**
* Provide fixes for Ifx driver.
*
* @param stmt
* @param index
* @param object
* @throws SQLException
*/
@Override
public void setJDBCObject(PreparedStatement stmt, int index, PyObject object)
throws SQLException {
// there is a bug in the Ifx driver when using setObject() with a String for a
// prepared statement
if (object instanceof PyString) {
super.setJDBCObject(stmt, index, object, Types.VARCHAR);
} else {
super.setJDBCObject(stmt, index, object);
}
}
/**
* Override to handle Informix related issues.
*
* @param set the result set
* @param col the column number
* @param type the SQL type
* @return the mapped Python object
* @throws SQLException thrown for a sql exception
*/
@SuppressWarnings("fallthrough")
@Override
public PyObject getPyObject(ResultSet set, int col, int type) throws SQLException {
PyObject obj = Py.None;
switch (type) {
case Types.OTHER:
try {
// informix returns boolean as OTHERs, so let's give that a try
obj = set.getBoolean(col) ? Py.One : Py.Zero;
} catch (SQLException e) {
obj = super.getPyObject(set, col, type);
}
break;
case Types.BLOB:
int major = set.getStatement().getConnection().getMetaData().getDriverMajorVersion();
int minor = set.getStatement().getConnection().getMetaData().getDriverMinorVersion();
if (major <= 2 && minor <= 11) {
Blob blob = set.getBlob(col);
obj = blob == null ? Py.None : Py.java2py(read(blob.getBinaryStream()));
break;
}
default :
obj = super.getPyObject(set, col, type);
}
return set.wasNull() || obj == null ? Py.None : obj;
}
}