/*****************************************************************************
* Copyright (C) 2008 EnterpriseDB Corporation.
* Copyright (C) 2011 Stado Global Development Group.
*
* This file is part of Stado.
*
* Stado is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* Stado is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with Stado. If not, see <http://www.gnu.org/licenses/>.
*
* You can find Stado at http://www.stado.us
*
****************************************************************************/
package org.postgresql.driver.core;
import java.sql.*;
/*
*/
public class Field
{
//The V3 protocol defines two constants for the format of data
public static final int TEXT_FORMAT = 0;
public static final int BINARY_FORMAT = 1;
private final int length; // Internal Length of this field
private final int oid; // OID of the type
private final int mod; // type modifier of this field
private final String columnLabel; // Column label
private String columnName; // Column name; null if undetermined
private Integer nullable; // Is this column nullable? null if undetermined.
private Boolean autoIncrement; // Is this column automatically numbered?
private int format = TEXT_FORMAT; // In the V3 protocol each field has a format
// 0 = text, 1 = binary
// In the V2 protocol all fields in a
// binary cursor are binary and all
// others are text
private final int tableOid; // OID of table ( zero if no table )
private final int positionInTable;
// cache-fields
/*
* Construct a field based on the information fed to it.
*
* @param name the name (column name and label) of the field
* @param oid the OID of the field
* @param len the length of the field
*/
public Field(String name, int oid, int length, int mod)
{
this(name, name, oid, length, mod, 0, 0);
}
/*
* Constructor without mod parameter.
*
* @param name the name (column name and label) of the field
* @param oid the OID of the field
* @param len the length of the field
*/
public Field(String name, int oid)
{
this(name, oid, 0, -1);
}
/*
* Construct a field based on the information fed to it.
*
* @param columnLabel the column label of the field
* @param columnName the column label the name of the field
* @param oid the OID of the field
* @param length the length of the field
* @param tableOid the OID of the columns' table
* @param positionInTable the position of column in the table (first column is 1, second column is 2, etc...)
*/
public Field(String columnLabel, String columnName, int oid, int length, int mod, int tableOid, int positionInTable)
{
this.columnLabel = columnLabel;
this.columnName = columnName;
this.oid = oid;
this.length = length;
this.mod = mod;
this.tableOid = tableOid;
this.positionInTable = positionInTable;
}
/*
* @return the oid of this Field's data type
*/
public int getOID()
{
return oid;
}
/*
* @return the mod of this Field's data type
*/
public int getMod()
{
return mod;
}
/*
* @return the column label of this Field's data type
*/
public String getColumnLabel()
{
return columnLabel;
}
/*
* @return the length of this Field's data type
*/
public int getLength()
{
return length;
}
/*
* @return the format of this Field's data (text=0, binary=1)
*/
public int getFormat()
{
return format;
}
/*
* @param format the format of this Field's data (text=0, binary=1)
*/
public void setFormat(int format)
{
this.format = format;
}
/*
* @return the columns' table oid, zero if no oid available
*/
public int getTableOid()
{
return tableOid;
}
public int getPositionInTable()
{
return positionInTable;
}
public int getNullable(Connection con) throws SQLException
{
if (nullable != null)
return nullable.intValue();
if (tableOid == 0 || positionInTable == 0)
{
nullable = new Integer(ResultSetMetaData.columnNullableUnknown);
return nullable.intValue();
}
ResultSet res = null;
PreparedStatement ps = null;
try
{
ps = con.prepareStatement("SELECT attnotnull FROM pg_catalog.pg_attribute WHERE attrelid = ? AND attnum = ?;");
ps.setInt(1, tableOid);
ps.setInt(2, positionInTable);
res = ps.executeQuery();
int nullResult = ResultSetMetaData.columnNullableUnknown;
if (res.next())
nullResult = res.getBoolean(1) ? ResultSetMetaData.columnNoNulls : ResultSetMetaData.columnNullable;
nullable = new Integer(nullResult);
return nullResult;
}
finally
{
if (res != null)
res.close();
if (ps != null)
ps.close();
}
}
public boolean getAutoIncrement(Connection con) throws SQLException
{
if (autoIncrement != null)
return autoIncrement.booleanValue();
if (tableOid == 0 || positionInTable == 0)
{
autoIncrement = Boolean.FALSE;
return autoIncrement.booleanValue();
}
ResultSet res = null;
PreparedStatement ps = null;
try
{
final String sql = "SELECT 1 "
+ " FROM pg_catalog.pg_attrdef "
+ " WHERE adrelid = ? AND adnum = ? "
+ " AND pg_catalog.pg_get_expr(adbin, adrelid) "
+ " LIKE '%nextval(%'";
ps = con.prepareStatement(sql);
ps.setInt(1, tableOid);
ps.setInt(2, positionInTable);
res = ps.executeQuery();
if (res.next())
{
autoIncrement = Boolean.TRUE;
}
else
{
autoIncrement = Boolean.FALSE;
}
return autoIncrement.booleanValue();
}
finally
{
if (res != null)
res.close();
if (ps != null)
ps.close();
}
}
public String getColumnName(Connection con) throws SQLException
{
if (columnName != null)
return columnName;
columnName = "";
if (tableOid == 0 || positionInTable == 0)
{
return columnName;
}
ResultSet res = null;
PreparedStatement ps = null;
try
{
ps = con.prepareStatement("SELECT attname FROM pg_catalog.pg_attribute WHERE attrelid = ? AND attnum = ?");
ps.setInt(1, tableOid);
ps.setInt(2, positionInTable);
res = ps.executeQuery();
if (res.next())
columnName = res.getString(1);
return columnName;
}
finally
{
if (res != null)
res.close();
if (ps != null)
ps.close();
}
}
}