/FileExtraction/Java_unseen/dlitz_resin/modules/quercus/src/com/caucho/quercus/lib/db/JdbcColumnMetaData.java
/*
 * Copyright (c) 1998-2011 Caucho Technology -- all rights reserved
 *
 * This file is part of Resin(R) Open Source
 *
 * Each copy or derived work must preserve the copyright notice and this
 * notice unmodified.
 *
 * Resin Open Source 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 2 of the License, or
 * (at your option) any later version.
 *
 * Resin Open Source 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, or any warranty
 * of NON-INFRINGEMENT.  See the GNU General Public License for more
 * details.
 *
 * You should have received a copy of the GNU General Public License
 * along with Resin Open Source; if not, write to the
 *
 *   Free Software Foundation, Inc.
 *   59 Temple Place, Suite 330
 *   Boston, MA 02111-1307  USA
 *
 * @author Scott Ferguson
 */

package com.caucho.quercus.lib.db;

import java.sql.DatabaseMetaData;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Types;
import java.util.Locale;

/**
 * Represents a JDBC column metadata
 */
public class JdbcColumnMetaData {
  private final JdbcTableMetaData _table;

  private final String _name;

  private final int _jdbcType;

  private final int _length;

  private final boolean _isNotNull;
  private final boolean _isUnsigned;
  private final boolean _isZeroFill;

  private boolean _isPrimaryKey;
  private boolean _isIndex;
  private boolean _isUnique;

  /**
   * @param rs the ResultSet from a DatabaseMetaData.getColumns call
   */
  public JdbcColumnMetaData(JdbcTableMetaData table, ResultSet rs)
    throws SQLException
  {
    _table = table;

    // COLUMN_NAME
    _name = rs.getString(4);
    // DATA_TYPE
    _jdbcType = rs.getInt(5);
    // COLUMN_SIZE
    _length = rs.getInt(7);

    // NULLABLE
    _isNotNull = rs.getInt(11) == DatabaseMetaData.columnNoNulls;

    // TYPE_NAME
    String type = rs.getString(6).toLowerCase(Locale.ENGLISH);

    _isUnsigned = type.indexOf("unsigned") >= 0;
    _isZeroFill = type.indexOf("zerofill") >= 0;
  }

  /**
   * Returns the column's name.
   */
  public String getName()
  {
    return _name;
  }

  /**
   * Returns the column's table
   */
  public JdbcTableMetaData getTable()
  {
    return _table;
  }

  /**
   * Returns the column length.
   */
  public int getLength()
  {
    return _length;
  }

  /**
   * Returns true if the column is nullable.
   */
  public boolean isNotNull()
  {
    return _isNotNull;
  }

  /**
   * Returns true for a primary key.
   */
  public boolean isPrimaryKey()
  {
    return _isPrimaryKey;
  }

  /**
   * Set true for a primary key.
   */
  void setPrimaryKey(boolean isPrimaryKey)
  {
    _isPrimaryKey = isPrimaryKey;
  }

  /**
   * Returns true for an index
   */
  public boolean isIndex()
  {
    return _isIndex;
  }

  /**
   * Set true for an index
   */
  void setIndex(boolean isIndex)
  {
    _isIndex = isIndex;
  }

  /**
   * Returns true for a unique column
   */
  public boolean isUnique()
  {
    return _isUnique;
  }

  /**
   * Set true for a unique column
   */
  void setUnique(boolean isUnique)
  {
    _isUnique = isUnique;
  }

  /**
   * Returns the JDBC type.
   */
  public int getJdbcType()
  {
    return _jdbcType;
  }

  /**
   * Returns true for numeric data types.
   */
  public static boolean isNumeric(int jdbcType)
  {
    switch (jdbcType) {
      case Types.BIT:
      case Types.TINYINT:
      case Types.SMALLINT:
      case Types.INTEGER:
      case Types.BIGINT:
      case Types.DOUBLE:
      case Types.FLOAT:
      case Types.REAL:
        return true;
      default:
        return false;
    }
  }

  /**
   * Returns true for numeric data types.
   */
  public boolean isNumeric()
  {
    return isNumeric(_jdbcType);
  }

  /**
   * Returns true for float data types.
   */
  public boolean isFloat()
  {
    switch (_jdbcType) {
    case Types.DOUBLE:
    case Types.FLOAT:
    case Types.REAL:
      return true;
    default:
      return false;
    }
  }

  /**
   * Returns true for unsigned.
   */
  public boolean isUnsigned()
  {
    return _isUnsigned;
  }

  /**
   * Returns true for zerofill
   */
  public boolean isZeroFill()
  {
    return _isZeroFill;
  }

  /**
   * Returns true for blob data types.
   */
  public static boolean isBlob(int jdbcType)
  {
    switch (jdbcType) {
      // php/142s
      // php/142v
      case Types.LONGVARBINARY:
      case Types.LONGVARCHAR:
      case Types.BLOB:
      case Types.CLOB:
        return true;
      default:
        return false;
    }
  }

  /**
   * Returns true for blob data types.
   */
  public boolean isBlob()
  {
    return isBlob(_jdbcType);
  }

  public String toString()
  {
    return "JdbcColumnMetaData[" + getName() + "]";
  }
}

