columnmetadata.java

来自「derby database source code.good for you.」· Java 代码 · 共 926 行 · 第 1/3 页

JAVA
926
字号
    }    // Only called when column meta data is not described, called by registerOutParameter methods.    public void guessOutputParameterMetaData(int parameterIndex,                                             int jdbcType,                                             int scale) throws SqlException {        setParmModeForOutputParameter(parameterIndex);        int driverType = getInternalTypeForGuessedOrRegisteredJdbcType(jdbcType);        if (isParameterModeGuessedAsAnInput(parameterIndex)) { // if input parameter has been set already            // Verify that "set" and "registered" types are compatible.            if (!isCompatibleDriverTypes(driverType, types_[parameterIndex - 1])) {                throw new SqlException(logWriter_, "The jdbcType does not match between the setter method and " +                        "the registerOutParameter method.");            }            // the registered type will take precedence over any previously guessed input "set" type        }        guessParameterMetaDataBasedOnSupportedDriverType(parameterIndex, jdbcType == java.sql.Types.BIGINT, driverType, scale);    }    private boolean isCompatibleDriverTypes(int registeredType, int guessedInputType) {        switch (registeredType) {        case Types.CHAR:        case Types.VARCHAR:        case Types.LONGVARCHAR:            return guessedInputType == Types.CHAR || guessedInputType == Types.VARCHAR || guessedInputType == Types.LONGVARCHAR;        case Types.BINARY:        case Types.VARBINARY:        case Types.LONGVARBINARY:            return guessedInputType == Types.BINARY || guessedInputType == Types.VARBINARY || guessedInputType == Types.LONGVARBINARY;        default:            return registeredType == guessedInputType;        }    }    // Only used when describe information is not available.    private int getInternalTypeForGuessedOrRegisteredJdbcType(int guessedOrRegisteredJdbcType) throws SqlException {        switch (guessedOrRegisteredJdbcType) {        case java.sql.Types.BIT:        case java.sql.Types.TINYINT:        case java.sql.Types.SMALLINT:            return Types.SMALLINT;        case java.sql.Types.INTEGER:            return Types.INTEGER;        case java.sql.Types.BIGINT:            return Types.BIGINT;        case java.sql.Types.REAL:            return Types.REAL;        case java.sql.Types.DOUBLE:        case java.sql.Types.FLOAT:            return Types.DOUBLE;        case java.sql.Types.DECIMAL:        case java.sql.Types.NUMERIC:            return Types.DECIMAL;        case java.sql.Types.DATE:            return Types.DATE;        case java.sql.Types.TIME:            return Types.TIME;        case java.sql.Types.TIMESTAMP:            return Types.TIMESTAMP;        case java.sql.Types.CHAR:            return Types.CHAR;        case java.sql.Types.VARCHAR:            return Types.VARCHAR;        case java.sql.Types.LONGVARCHAR:            return Types.LONGVARCHAR;        case java.sql.Types.BINARY:            return Types.BINARY;        case java.sql.Types.VARBINARY:            return Types.VARBINARY;        case java.sql.Types.LONGVARBINARY:            return Types.LONGVARBINARY;        case java.sql.Types.BLOB:            return Types.BLOB;        case java.sql.Types.CLOB:            return Types.CLOB;        case java.sql.Types.NULL:        case java.sql.Types.OTHER:            throw new SqlException(logWriter_, "Jdbc type " + guessedOrRegisteredJdbcType + " not yet supported.");        default:            throw new SqlException(logWriter_, "Unrecognized jdbc type " + guessedOrRegisteredJdbcType);        }    }    private void guessParameterMetaDataBasedOnSupportedDriverType(int parameterIndex,                                                                  boolean isBigInt,                                                                  int driverType,                                                                  int scale) throws SqlException {        switch (driverType) {        case Types.SMALLINT:            guessParameterMetaData(parameterIndex, driverType, 2, 0, 0);            break;        case Types.INTEGER:            guessParameterMetaData(parameterIndex, driverType, 4, 0, 0);            break;        case Types.BIGINT:            guessParameterMetaData(parameterIndex, driverType, 8, 0, 0);            break;        case Types.REAL:            guessParameterMetaData(parameterIndex, driverType, 4, 0, 0);            break;        case Types.DOUBLE:            guessParameterMetaData(parameterIndex, driverType, 8, 0, 0);            break;        case Types.DECIMAL:            if (isBigInt) {                guessParameterMetaData(parameterIndex, driverType, 0, 19, 0);            } else {                guessParameterMetaData(parameterIndex, driverType, 0, 31, scale);            }            break;        case Types.DATE:            guessParameterMetaData(parameterIndex, driverType, 10, 0, 0);            break;        case Types.TIME:            guessParameterMetaData(parameterIndex, driverType, 8, 0, 0);            break;        case Types.TIMESTAMP:            guessParameterMetaData(parameterIndex, driverType, 26, 0, 0);            break;        case Types.CHAR:        case Types.VARCHAR:            guessParameterMetaData(parameterIndex, driverType, 32672, 0, 0);            break;        case Types.LONGVARCHAR:            guessParameterMetaData(parameterIndex, driverType, 32700, 0, 0);            break;        case Types.BINARY:        case Types.VARBINARY:            guessParameterMetaData(parameterIndex, driverType, 4000, 0, 0);            break;        case Types.LONGVARBINARY:            guessParameterMetaData(parameterIndex, driverType, 32700, 0, 0);            break;        case Types.BLOB:            // 32768 will cause 8004 for a null placeholder length (could hard code in NET layer)            guessParameterMetaData(parameterIndex, driverType, 32768, 0, 0);            break;        case Types.CLOB:            // 32768 will cause 8004 for a null placeholder length (could hard code in NET layer)            guessParameterMetaData(parameterIndex, driverType, 32768, 0, 0);            break;        default:            throw new SqlException(logWriter_, "Unrecognized driver type " + driverType);        }    }    // Only called when column meta data is not described    private void guessParameterMetaData(int parameterIndex,                                        int type,                                        int length,                                        int precision,                                        int scale) {        // Always guess that the column is nullable        nullable_[parameterIndex - 1] = true;        types_[parameterIndex - 1] = type;        sqlLength_[parameterIndex - 1] = length;        sqlPrecision_[parameterIndex - 1] = precision;        sqlScale_[parameterIndex - 1] = scale;        sqlType_[parameterIndex - 1] = mapDriverToSqlType(type, true);    }    int mapDriverToSqlType(int type, boolean nullable) {        int sqlType = 0;        switch (type) {        case java.sql.Types.SMALLINT:            sqlType = Types.DERBY_SQLTYPE_NSMALL;            break;        case java.sql.Types.INTEGER:            sqlType = Types.DERBY_SQLTYPE_NINTEGER;            break;        case java.sql.Types.BIGINT:            sqlType = Types.DERBY_SQLTYPE_NBIGINT;            break;        case java.sql.Types.REAL:        case java.sql.Types.DOUBLE:        case java.sql.Types.FLOAT:            sqlType = Types.DERBY_SQLTYPE_NFLOAT;            break;        case java.sql.Types.DATE:            sqlType = Types.DERBY_SQLTYPE_NDATE;            break;        case java.sql.Types.TIME:            sqlType = Types.DERBY_SQLTYPE_NTIME;            break;        case java.sql.Types.TIMESTAMP:            sqlType = Types.DERBY_SQLTYPE_NTIMESTAMP;            break;        case java.sql.Types.CHAR:        case java.sql.Types.VARCHAR:            sqlType = Types.DERBY_SQLTYPE_NVARCHAR;            break;        case java.sql.Types.LONGVARCHAR:            sqlType = Types.DERBY_SQLTYPE_NLONG;            break;        case java.sql.Types.BINARY:        case java.sql.Types.VARBINARY:            sqlType = Types.DERBY_SQLTYPE_NVARCHAR;            break;        case java.sql.Types.LONGVARBINARY:            sqlType = Types.DERBY_SQLTYPE_NLONG;            break;        case java.sql.Types.NUMERIC:        case java.sql.Types.DECIMAL:            sqlType = Types.DERBY_SQLTYPE_NDECIMAL;            break;        case java.sql.Types.BLOB:            sqlType = Types.DERBY_SQLTYPE_NBLOB;            break;        case java.sql.Types.CLOB:            sqlType = Types.DERBY_SQLTYPE_NCLOB;            break;        default:            break; // bug check        }        if (!nullable) {            sqlType--;        }        return sqlType;    }    public void setLogWriter(LogWriter logWriter) {        logWriter_ = logWriter;    }    private void nullDataForGC() {        columns_ = 0;        nullable_ = null;        types_ = null;        singleMixedByteOrDouble_ = null;        sqldRdbnam_ = null;        sqldSchema_ = null;        sqlPrecision_ = null;        sqlScale_ = null;        sqlLength_ = null;        sqlType_ = null;        sqlCcsid_ = null;        sqlName_ = null;        sqlLabel_ = null;        sqlUnnamed_ = null;        sqlComment_ = null;        sqlxKeymem_ = null;        sqlxGenerated_ = null;        sqlxParmmode_ = null;        sqlxCorname_ = null;        sqlxName_ = null;        sqlxBasename_ = null;        sqlxUpdatable_ = null;        sqlxSchema_ = null;        sqlxRdbnam_ = null;        clientParamtertype_ = null;        types_ = null;    }    public boolean hasLobColumns() {        for (int i = 0; i < columns_; i++) {            switch (org.apache.derby.client.am.Utils.getNonNullableSqlType(sqlType_[i])) {            case org.apache.derby.client.am.Types.DERBY_SQLTYPE_BLOB:            case org.apache.derby.client.am.Types.DERBY_SQLTYPE_CLOB:                return true;            default:                break;            }        }        return false;    }    // Cache the hashtable in ColumnMetaData.    int findColumnX(String columnName) throws SqlException {        // Create cache if it doesn't exist        if (columnNameToIndexCache_ == null) {            columnNameToIndexCache_ = new java.util.Hashtable();        } else { // Check cache for mapping            Integer index = (Integer) columnNameToIndexCache_.get(columnName);            if (index != null) {                return index.intValue();            }        }        // Ok, we'll have to search the metadata        for (int col = 0; col < this.columns_; col++) {            if (this.sqlName_ != null && // sqlName comes from an optional group                    this.sqlName_[col] != null &&                    this.sqlName_[col].equalsIgnoreCase(columnName)) {                // Found it, add it to the cache                columnNameToIndexCache_.put(columnName, new Integer(col + 1));                return col + 1;            }        }        throw new SqlException(logWriter_, "Invalid argument: unknown column name " + columnName);    }    // assign ordinal position as the column name if null.    void assignColumnName(int column) {        if (columnNameToIndexCache_ == null) {            columnNameToIndexCache_ = new java.util.Hashtable();        }        String columnName = (new Integer(column)).toString();        columnNameToIndexCache_.put(columnName, new Integer(column));        sqlName_[column - 1] = columnName;    }    public boolean columnIsNotInUnicode(int index) {        return (sqlCcsid_[index] != 1208);    }}

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?