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 + -
显示快捷键?