java.sql.ResultSetMetaData#isNullable ( )源码实例Demo

下面列出了java.sql.ResultSetMetaData#isNullable ( ) 实例代码,或者点击链接到github查看源代码,也可以在右侧发表评论。

/**
 * Retrieves the columns DDL in format, readable by ClickHouse
 */
public String getColumnsDDL(ResultSetMetaData meta) throws SQLException {
    StringBuilder builder = new StringBuilder("columns format version: 1\n");

    builder.append(meta.getColumnCount());
    builder.append(" columns:\n");
    for (int i = 1; i <= meta.getColumnCount(); i++) {
        int precision = meta.getPrecision(i);
        int type = meta.getColumnType(i);
        int scale = meta.getScale(i);

        boolean nullable = ResultSetMetaData.columnNullable == meta.isNullable(i);
        builder.append(ClickHouseUtil.quoteIdentifier(meta.getColumnName(i)));
        builder.append(" ");
        builder.append(getBySQLType(type, precision, scale).getName(nullable,meta.getPrecision(i), meta.getScale(i)));
        builder.append('\n');
    }
    return builder.toString();
}
 
源代码2 项目: spliceengine   文件: ResultSetIterator.java
public ResultSetIterator(Connection connection, PreparedStatement ps, ExecRow execRow) {
    this.connection = connection;
    try {
        this.resultSet = ps.executeQuery();
        ResultSetMetaData rsm = resultSet.getMetaData();
        isNullable = new boolean[rsm.getColumnCount()];
        for (int i =0;i<rsm.getColumnCount();i++) {
            isNullable[i] =rsm.isNullable(i+1)!=0;
        }
    }  catch (Exception e) {
        try {
            if (connection != null)
                connection.close();
        } catch (Exception cE) {
            throw new RuntimeException(cE);
        }
        throw new RuntimeException(e);
    }
    this.execRow = execRow;
}
 
源代码3 项目: nifi   文件: ResultSetRecordSet.java
private static RecordSchema createSchema(final ResultSet rs, final RecordSchema readerSchema) throws SQLException {
    final ResultSetMetaData metadata = rs.getMetaData();
    final int numCols = metadata.getColumnCount();
    final List<RecordField> fields = new ArrayList<>(numCols);

    for (int i = 0; i < numCols; i++) {
        final int column = i + 1;
        final int sqlType = metadata.getColumnType(column);

        final DataType dataType = getDataType(sqlType, rs, column, readerSchema);
        final String fieldName = metadata.getColumnLabel(column);

        final int nullableFlag = metadata.isNullable(column);
        final boolean nullable;
        if (nullableFlag == ResultSetMetaData.columnNoNulls) {
            nullable = false;
        } else {
            nullable = true;
        }

        final RecordField field = new RecordField(fieldName, dataType, nullable);
        fields.add(field);
    }

    return new SimpleRecordSchema(fields);
}
 
源代码4 项目: components   文件: JDBCAvroRegistry.java
protected Schema inferSchemaResultSetMetaData(ResultSetMetaData metadata) throws SQLException {
    List<Field> fields = new ArrayList<>();

    int count = metadata.getColumnCount();
    for (int i = 1; i <= count; i++) {
        int size = metadata.getPrecision(i);
        int scale = metadata.getScale(i);
        boolean nullable = ResultSetMetaData.columnNullable == metadata.isNullable(i);

        int dbtype = metadata.getColumnType(i);
        String fieldName = metadata.getColumnLabel(i);
        String dbColumnName = metadata.getColumnName(i);

        // not necessary for the result schema from the query statement
        boolean isKey = false;

        Field field = sqlType2Avro(size, scale, dbtype, nullable, fieldName, dbColumnName, null, isKey);

        fields.add(field);
    }

    return Schema.createRecord("DYNAMIC", null, null, false, fields);
}
 
源代码5 项目: Mycat2   文件: ResultSetUtil.java
public static int toFlag(ResultSetMetaData metaData, int column)
		throws SQLException {

	int flags = 0;
	if (metaData.isNullable(column) == 1) {
		flags |= 1;
	}

	if (metaData.isSigned(column)) {
		flags |= 16;
	}

	if (metaData.isAutoIncrement(column)) {
		flags |= 128;
	}

	return flags;
}
 
源代码6 项目: dremio-oss   文件: PreparedStatementTest.java
boolean isEqualsTo(ResultSetMetaData metadata, int colNum) throws SQLException {
  return
      metadata.getCatalogName(colNum).equals(InfoSchemaConstants.IS_CATALOG_NAME) &&
      metadata.getSchemaName(colNum).isEmpty() &&
      metadata.getTableName(colNum).isEmpty() &&
      metadata.getColumnName(colNum).equals(columnName) &&
      metadata.getColumnLabel(colNum).equals(columnName) &&
      metadata.getColumnType(colNum) == type &&
      metadata.isNullable(colNum) == nullable &&
      // There is an existing bug where query results doesn't contain the precision for VARCHAR field.
      //metadata.getPrecision(colNum) == precision &&
      metadata.getScale(colNum) == scale &&
      metadata.isSigned(colNum) == signed &&
      metadata.getColumnDisplaySize(colNum) == displaySize &&
      metadata.getColumnClassName(colNum).equals(className) &&
      metadata.isSearchable(colNum) &&
      metadata.isAutoIncrement(colNum) == false &&
      metadata.isCaseSensitive(colNum) == false &&
      metadata.isReadOnly(colNum) &&
      metadata.isWritable(colNum) == false &&
      metadata.isDefinitelyWritable(colNum) == false &&
      metadata.isCurrency(colNum) == false;
}
 
源代码7 项目: shardingsphere   文件: QueryHeaderBuilder.java
private static QueryHeader build(final ResultSetMetaData resultSetMetaData, final SchemaContext schema, final String columnName, final int columnIndex) throws SQLException {
    String schemaName = schema.getName();
    String actualTableName = resultSetMetaData.getTableName(columnIndex);
    Optional<DataNodeRoutedRule> dataNodeRoutedRule = schema.getSchema().getRules().stream().filter(each -> each instanceof DataNodeRoutedRule).findFirst().map(rule -> (DataNodeRoutedRule) rule);
    String tableName;
    boolean primaryKey;
    if (null != actualTableName && dataNodeRoutedRule.isPresent()) {
        tableName = dataNodeRoutedRule.get().findLogicTableByActualTable(actualTableName).orElse("");
        TableMetaData tableMetaData = schema.getSchema().getMetaData().getSchema().getConfiguredSchemaMetaData().get(tableName);
        primaryKey = null != tableMetaData && tableMetaData.getColumns().get(columnName.toLowerCase()).isPrimaryKey();
    } else {
        tableName = actualTableName;
        primaryKey = false;
    }
    String columnLabel = resultSetMetaData.getColumnLabel(columnIndex);
    int columnLength = resultSetMetaData.getColumnDisplaySize(columnIndex);
    Integer columnType = resultSetMetaData.getColumnType(columnIndex);
    int decimals = resultSetMetaData.getScale(columnIndex);
    boolean signed = resultSetMetaData.isSigned(columnIndex);
    boolean notNull = resultSetMetaData.isNullable(columnIndex) == ResultSetMetaData.columnNoNulls;
    boolean autoIncrement = resultSetMetaData.isAutoIncrement(columnIndex);
    return new QueryHeader(schemaName, tableName, columnLabel, columnName, columnLength, columnType, decimals, signed, primaryKey, notNull, autoIncrement);
}
 
源代码8 项目: spanner-jdbc   文件: SelectStatementsTester.java
private void testSelect(String sql, Object... parameters) throws SQLException {
  PreparedStatement ps = connection.prepareStatement(sql);
  for (int i = 1; i <= parameters.length; i++) {
    ps.setObject(i, parameters[i - 1]);
  }
  try (ResultSet rs = ps.executeQuery()) {
    ResultSetMetaData metadata = rs.getMetaData();
    for (int i = 1; i <= metadata.getColumnCount(); i++) {
      metadata.getColumnClassName(i);
      metadata.getColumnDisplaySize(i);
      metadata.getColumnLabel(i);
      metadata.getColumnName(i);
      metadata.getColumnType(i);
      metadata.getColumnTypeName(i);
      metadata.getPrecision(i);
      metadata.getScale(i);
      metadata.getCatalogName(i);
      metadata.getSchemaName(i);
      metadata.getTableName(i);
      metadata.isNullable(i);
      metadata.isAutoIncrement(i);
      metadata.isCaseSensitive(i);
      metadata.isCurrency(i);
      metadata.isDefinitelyWritable(i);
      metadata.isReadOnly(i);
      metadata.isSearchable(i);
      metadata.isSigned(i);
      metadata.isWritable(i);
    }
    while (rs.next()) {
      // do nothing
    }
  }
}
 
源代码9 项目: tutorials   文件: ResultSetLiveTest.java
@Test
public void givenDbConnectionF_whenRSMetaInfo_thenCorrect() throws SQLException {
    int columnCount = 0;
    try (PreparedStatement pstmt = dbConnection.prepareStatement("select * from employees", ResultSet.TYPE_SCROLL_SENSITIVE, ResultSet.CONCUR_UPDATABLE); ResultSet rs = pstmt.executeQuery()) {
        ResultSetMetaData metaData = rs.getMetaData();
        columnCount = metaData.getColumnCount();
        for (int i = 1; i <= columnCount; i++) {
            String catalogName = metaData.getCatalogName(i);
            String className = metaData.getColumnClassName(i);
            String label = metaData.getColumnLabel(i);
            String name = metaData.getColumnName(i);
            String typeName = metaData.getColumnTypeName(i);
            Integer type = metaData.getColumnType(i);
            String tableName = metaData.getTableName(i);
            String schemaName = metaData.getSchemaName(i);
            boolean isAutoIncrement = metaData.isAutoIncrement(i);
            boolean isCaseSensitive = metaData.isCaseSensitive(i);
            boolean isCurrency = metaData.isCurrency(i);
            boolean isDefiniteWritable = metaData.isDefinitelyWritable(i);
            boolean isReadOnly = metaData.isReadOnly(i);
            boolean isSearchable = metaData.isSearchable(i);
            boolean isReadable = metaData.isReadOnly(i);
            boolean isSigned = metaData.isSigned(i);
            boolean isWritable = metaData.isWritable(i);
            int nullable = metaData.isNullable(i);
        }
    }

    assertEquals("column count", 4, columnCount);
}
 
源代码10 项目: gemfirexd-oss   文件: VTIResultSet.java
private boolean[] setNullableColumnList() throws SQLException, StandardException {

		if (runtimeNullableColumn != null)
			return runtimeNullableColumn;

		// Derby-style table functions return SQL rows which don't have not-null
		// constraints bound to them
		if ( isDerbyStyleTableFunction )
		{
		    int         count = getAllocatedRow().nColumns() + 1;
            
		    runtimeNullableColumn = new boolean[ count ];
		    for ( int i = 0; i < count; i++ )   { runtimeNullableColumn[ i ] = true; }
            
		    return runtimeNullableColumn;
		}

		if (userVTI == null)
			return null;

		ResultSetMetaData rsmd = userVTI.getMetaData();
		boolean[] nullableColumn = new boolean[rsmd.getColumnCount() + 1];
		for (int i = 1; i <  nullableColumn.length; i++) {
			nullableColumn[i] = rsmd.isNullable(i) != ResultSetMetaData.columnNoNulls;
		}

		return runtimeNullableColumn = nullableColumn;
	}
 
源代码11 项目: clickhouse-jdbc   文件: ClickHouseResultSetTest.java
@Test
public void testClassNamesObjects() throws Exception {
    String testData = ClickHouseTypesTestData.buildTestString();
    ByteArrayInputStream is = new ByteArrayInputStream(testData.getBytes("UTF-8"));
    ResultSet rs = buildResultSet(is, testData.length(), "db", "table", false, null,
        TimeZone.getTimeZone("UTC"), props);
    rs.next();
    ResultSetMetaData meta = rs.getMetaData();
    for (int i = 1; i <= meta.getColumnCount(); i++) {
        String typeName = meta.getColumnTypeName(i);
        String className = null;
        try {
            className = meta.getColumnClassName(i);
        } catch (Exception e) {
            fail("Unable to determine class name for " + typeName, e);
        }
        Class<?> clazz = Class.forName(className);
        assertNotNull(
            clazz,
            "Class not available. class name: " + className + ", type name: " + typeName);
        Object o = rs.getObject(i);
        if (o == null && meta.isNullable(i) > 0) {
            continue;
        }
        assertNotNull(
            o,
            "Object null. class name: " + className + ", type name: " + typeName);
        assertTrue(
            clazz.isAssignableFrom(rs.getObject(i).getClass()),
            "Class mismatch. class name: " + className + ", type name: " + typeName +
                " object class: " + o.getClass().getCanonicalName());
    }
}
 
源代码12 项目: ymate-platform-v2   文件: ColumnInfo.java
public static Map<String, ColumnInfo> create(ConfigInfo configInfo, String dbType, String tableName, List<String> primaryKeys, DatabaseMetaData databaseMetaData, ResultSetMetaData metaData) throws SQLException {
    Map<String, ColumnInfo> _returnValue = new LinkedHashMap<String, ColumnInfo>(metaData.getColumnCount());
    //
    for (int _idx = 1; _idx <= metaData.getColumnCount(); _idx++) {
        // 获取字段元数据对象
        ResultSet _column = databaseMetaData.getColumns(configInfo.getDbName(),
                "oracle".equalsIgnoreCase(dbType) ? configInfo.getDbUserName().toUpperCase() : configInfo.getDbUserName(), tableName, metaData.getColumnName(_idx));
        if (_column.next()) {
            // 提取字段定义及字段默认值
            String _name = metaData.getColumnName(_idx).toLowerCase();
            ColumnInfo _columnInfo = new ColumnInfo(
                    configInfo.getNamedFilter(),
                    _name,
                    metaData.getColumnClassName(_idx),
                    metaData.isAutoIncrement(_idx),
                    primaryKeys.contains(_name),
                    metaData.isSigned(_idx),
                    metaData.getPrecision(_idx),
                    metaData.getScale(_idx),
                    metaData.isNullable(_idx),
                    _column.getString("COLUMN_DEF"),
                    _column.getString("REMARKS"));
            _returnValue.put(_name, _columnInfo);
        }
        _column.close();
    }
    return _returnValue;
}
 
protected static PostgresType typeFromSQL(ResultSetMetaData metaData, int columnIndex, TypesTranslator typesTranslator) throws SQLException {
    TypeId typeId = TypeId.getBuiltInTypeId(metaData.getColumnType(columnIndex));
    if (typeId == null) {
        try {
            typeId = TypeId.getUserDefinedTypeId(metaData.getColumnTypeName(columnIndex),
                                                 false);
        }
        catch (StandardException ex) {
            throw new SQLParserInternalException(ex);
        }
    }
    DataTypeDescriptor sqlType;
    if (typeId.isDecimalTypeId() || typeId.isNumericTypeId()) {
        sqlType = new DataTypeDescriptor(typeId,
                                         metaData.getPrecision(columnIndex),
                                         metaData.getScale(columnIndex),
                                         metaData.isNullable(columnIndex) != ResultSetMetaData.columnNoNulls,
                                         metaData.getColumnDisplaySize(columnIndex));
    }
    else {
        sqlType = new DataTypeDescriptor(typeId,
                                         metaData.isNullable(columnIndex) != ResultSetMetaData.columnNoNulls,
                                         metaData.getColumnDisplaySize(columnIndex));
    }
    TInstance type = typesTranslator.typeForSQLType(sqlType);
    return PostgresType.fromDerby(sqlType, type);
}
 
源代码14 项目: components   文件: JDBCAvroRegistryString.java
protected Schema inferSchemaResultSetMetaData(ResultSetMetaData metadata) throws SQLException {
    List<Field> fields = new ArrayList<>();

    Set<String> existNames = new HashSet<String>();
    int index = 0;
    
    int count = metadata.getColumnCount();
    for (int i = 1; i <= count; i++) {
        int size = metadata.getPrecision(i);
        int scale = metadata.getScale(i);
        boolean nullable = ResultSetMetaData.columnNullable == metadata.isNullable(i);

        int dbtype = metadata.getColumnType(i);
        String fieldName = metadata.getColumnLabel(i);
        String dbColumnName = metadata.getColumnName(i);

        // not necessary for the result schema from the query statement
        boolean isKey = false;

        String validName = NameUtil.correct(fieldName, index++, existNames);
        existNames.add(validName);
        
        Field field = sqlType2Avro(size, scale, dbtype, nullable, validName, dbColumnName, null, isKey);

        fields.add(field);
    }
    return Schema.createRecord("DYNAMIC", null, null, false, fields);
}
 
源代码15 项目: CloverETL-Engine   文件: AnalyzeDB.java
/**
 *  Description of the Method
 *
 * @param  metadata          Description of Parameter
 * @param  fieldNo           Description of Parameter
 * @return                   Description of the Returned Value
 * @exception  SQLException  Description of Exception
 * @since                    September 25, 2002
 */
private static String dbMetadata2jetel(ResultSetMetaData metadata, int fieldNo, JdbcSpecific jdbcSpecific) throws SQLException {
	StringBuffer strBuf = new StringBuffer();
	char fieldType = jdbcSpecific.sqlType2jetel(metadata.getColumnType(fieldNo));

	// head
	strBuf.append("\t<Field name=\"");
	strBuf.append(metadata.getColumnName(fieldNo));

	// DATA TYPE
	strBuf.append("\" type=\"");
	try{
		strBuf.append(SQLUtil.jetelType2Str(fieldType));
	}catch(Exception ex){
		throw new RuntimeException("Field name " + metadata.getColumnName(fieldNo), ex);
	}
	
	strBuf.append("\"");
	// NULLABLE
	if (metadata.isNullable(fieldNo) == ResultSetMetaData.columnNullable) {
		strBuf.append(" nullable=\"yes\"");
	}
	// DELIMITER
	strBuf.append(" delimiter=\"");
	if (fieldNo == metadata.getColumnCount()) {
		strBuf.append("\\n");
		// last field by default delimited by NEWLINE character
	} else {
		strBuf.append(delimiter);
	}
	strBuf.append("\"");
	/*
	*  this is not safe - at least Oracle JDBC driver reports NUMBER to be currency
	* // FORMAT (in case of currency)
	* if (metadata.isCurrency(fieldNo)) {
	*	strBuf.append(" format=\"???#.#\"");
	* }
	*/

	// end
	strBuf.append(" />");

	return strBuf.toString();
}
 
源代码16 项目: bdf3   文件: DbCommonServiceImpl.java
@Override
public List<ColumnInfo> findMultiColumnInfos(String dbInfoId, String sql) throws Exception {
	if (!StringUtils.hasText(sql)) {
		return null;
	}
	DataSource ds = this.getDataSourceByDbInfoId(dbInfoId);
	Connection conn = null;
	Statement st = null;
	ResultSet rs = null;
	try {
		conn = DataSourceUtils.getConnection(ds);
		st = conn.createStatement();
		rs = st.executeQuery(sql);
		ResultSetMetaData rsmd = rs.getMetaData();
		int count = rsmd.getColumnCount();
		List<ColumnInfo> columnNames = new ArrayList<ColumnInfo>();
		ColumnInfo columnInfo = null;
		for (int i = 1; i <= count; i++) {
			columnInfo = new ColumnInfo();
			columnInfo.setColumnName(rsmd.getColumnLabel(i));
			columnInfo.setColumnType(rsmd.getColumnTypeName(i));
			columnInfo.setTableName(rsmd.getTableName(i));
			if (rsmd.getPrecision(i) > 0 && !columnInfo.getColumnType().equals("DATETIME") && !columnInfo.getColumnType().equals("TIMESTAMP") && !columnInfo.getColumnType().equals("DATE")) {
				columnInfo.setColumnSize(String.valueOf(rsmd.getPrecision(i)));
			}
			if (rsmd.getScale(i) > 0 && !columnInfo.getColumnType().equals("DATETIME") && !columnInfo.getColumnType().equals("TIMESTAMP") && !columnInfo.getColumnType().equals("DATE")) {
				columnInfo.setColumnSize(columnInfo.getColumnSize() + "," + rsmd.getScale(i));
			}
			int flagI = rsmd.isNullable(i);
			if (flagI == 0) {
				columnInfo.setIsnullAble(false);
			} else {
				columnInfo.setIsnullAble(true);
			}
			columnNames.add(columnInfo);
		}
		return columnNames;
	} finally {
		JdbcUtils.closeResultSet(rs);
		JdbcUtils.closeStatement(st);
		JdbcUtils.closeConnection(conn);
	}
}
 
源代码17 项目: gemfirexd-oss   文件: ResultColumnList.java
/** 
 * Generate an RCL to match the contents of a ResultSetMetaData.
 * This is useful when dealing with VTIs.
 *
 * @param rsmd			The ResultSetMetaData.
 * @param tableName		The TableName for the BCNs.
 * @param javaClassName	The name of the VTI
 *
 * @exception StandardException			Thrown on error
 */
public void createListFromResultSetMetaData(ResultSetMetaData rsmd,
											TableName tableName,
											String javaClassName)
		throws StandardException
{
	try
	{
		// JDBC columns #s are 1-based
		// Check to make sure # of columns >= 1
		int numColumns = rsmd.getColumnCount();

		if (numColumns <= 0)
		{
			throw StandardException.newException(SQLState.LANG_INVALID_V_T_I_COLUMN_COUNT, 
								javaClassName, String.valueOf(numColumns));
		}

		for (int index = 1; index <= numColumns; index++)
		{
			boolean nullableResult = 
				(rsmd.isNullable(index) != ResultSetMetaData.columnNoNulls);

			TypeId cti;

			int jdbcColumnType = rsmd.getColumnType(index);

			switch (jdbcColumnType) {
			case Types.JAVA_OBJECT:
			case Types.OTHER:
			{
				cti = TypeId.getUserDefinedTypeId(rsmd.getColumnTypeName(index), false);
				break;
			}
			default:
			{
				cti = TypeId.getBuiltInTypeId(jdbcColumnType);
				break;
			}
			}

			// Handle the case where a VTI returns a bad column type
			if (cti == null)
			{
				throw StandardException.newException(SQLState.LANG_BAD_J_D_B_C_TYPE_INFO, Integer.toString(index));
			}

			// Get the maximum byte storage for this column
			int maxWidth;

			/* Get maximum byte storage from rsmd for variable
			 * width types, set it to MAXINT for the long types,
			 * otherwise get it from the TypeId
			 */
			if (cti.variableLength())
			{
				maxWidth = rsmd.getColumnDisplaySize(index);
			}
			else if (jdbcColumnType == Types.LONGVARCHAR ||
					 jdbcColumnType == Types.LONGVARBINARY)
			{
				maxWidth = Integer.MAX_VALUE;
			}
			else
			{
				maxWidth = 0;
			}

			int precision = cti.isDecimalTypeId() ? rsmd.getPrecision(index) : 0;
			int scale = cti.isDecimalTypeId() ? rsmd.getScale(index) : 0;
			DataTypeDescriptor dts = new DataTypeDescriptor(cti, 
										precision,
										scale, 
										nullableResult, 
										maxWidth);
			addColumn( tableName, rsmd.getColumnName(index), dts );
		}
	}
	catch (Throwable t)
	{
		if (t instanceof StandardException)
		{
			throw (StandardException) t;
		}
		else
		{
			throw StandardException.unexpectedUserException(t);
		}
	}
}
 
源代码18 项目: sakai   文件: Foorm.java
/**
 * 
 * @param table
 * @param formDefinition
 * @param vendor
 * @param md
 * @return
 */
public String[] formAdjustTable(String table, String[] formDefinition, String vendor, ResultSetMetaData md) {
	ArrayList<String> rv = new ArrayList<String>();

	for (String formField : formDefinition) {
		Properties info = parseFormString(formField);
		String field = info.getProperty("field", null);
		String type = info.getProperty("type", null);
		if ( "header".equals(type) ) continue;
		String maxs = adjustMax(info.getProperty("maxlength", null));
		int maxlength = 0;
		if (maxs != null) maxlength = (new Integer(maxs)).intValue();
		if (maxlength < 1) maxlength = 80;

		String sqlType = null;
		boolean autoIncrement = false;
		int sqlLength = -1;
		boolean isNullable = false;			
		try {
			for( int i = 1; i <= md.getColumnCount(); i++ ) {
				if ( field.equalsIgnoreCase(md.getColumnLabel(i)) ) {
					sqlLength = md.getColumnDisplaySize(i);
					autoIncrement = md.isAutoIncrement(i);
					sqlType = getSuperType(md.getColumnClassName(i));
					isNullable = (md.isNullable(i) == ResultSetMetaData.columnNullable);
					break;
				}
			}
		} catch(Exception e) {
			// ignore
		}

		log.debug("{} ({}) type={}", field, maxlength, type);
		log.debug("{} ({}) auto={} type={} null={}", field, sqlLength, autoIncrement, sqlType, isNullable);

		//  If the field is not there...
		if ( sqlType == null ) {
			if ( "oracle".equals(vendor) ) {
				rv.add("ALTER TABLE "+table+" ADD ( " + formSql(formField, vendor) + " )");
			} else if ( "mysql".equals(vendor) ) {
				rv.add("ALTER TABLE "+table+" ADD " + formSql(formField, vendor));
			} else {
				rv.add("ALTER TABLE "+table+" ADD COLUMN " + formSql(formField, vendor));
			}
			continue;
		}

		String ff = formSql(formField, vendor);

		// BLTI-220, BLTI-238 - Required will be enforced in software - not the DB
		boolean shouldAlter = false;
		if ("key".equals(type)) {
			if ( ! NUMBER_TYPE.equals(sqlType) ) log.warn("{} must be Integer and Auto Increment", field);
		} else if ("autodate".equals(type)) {
		} else if ("url".equals(type) || "text".equals(type) || "textarea".equals(type)) {
			if ( "oracle.sql.CLOB".equals(sqlType) || "oracle.jdbc.OracleClob".equals(sqlType) ) continue;  // CLOBS large enough :)
			if ( ! STRING_TYPE.equals(sqlType)) {
				log.warn("{} must be String field", field);
				continue;
			}
			if ( sqlLength < maxlength ) shouldAlter = true;
			if ( ! isNullable ) shouldAlter = true; // BLTI-220, BLTI-238

			// shouldAlter = true; // Temporary SAK-31695 to force ALTER statements to be emitted

		} else if ("radio".equals(type) || "checkbox".equals(type) || "integer".equals(type) ) {
			if ( NUMBER_TYPE.equals(sqlType)) continue;
			log.warn("{} must be Integer field", field);
		}

		if ( shouldAlter ) {
			if ( "oracle".equals(vendor) ) {
				rv.add("ALTER TABLE "+table+" MODIFY ( " + ff + " )");
			} else if ( "mysql".equals(vendor) ) {
				rv.add("ALTER TABLE "+table+" MODIFY " + ff);
			} else {
				rv.add("ALTER TABLE "+table+" ALTER COLUMN " + ff);
			}
		}
	}

	return rv.toArray(new String[rv.size()]);
}
 
源代码19 项目: spliceengine   文件: ResultColumnList.java
/**
 * Generate an RCL to match the contents of a ResultSetMetaData.
 * This is useful when dealing with VTIs.
 *
 * @param rsmd          The ResultSetMetaData.
 * @param tableName     The TableName for the BCNs.
 * @param javaClassName The name of the VTI
 * @throws StandardException Thrown on error
 */
public void createListFromResultSetMetaData(ResultSetMetaData rsmd,
                                            TableName tableName,
                                            String javaClassName) throws StandardException{
    try{
        // JDBC columns #s are 1-based
        // Check to make sure # of columns >= 1
        int numColumns=rsmd.getColumnCount();

        if(numColumns<=0){
            throw StandardException.newException(SQLState.LANG_INVALID_V_T_I_COLUMN_COUNT,
                    javaClassName,String.valueOf(numColumns));
        }

        for(int index=1;index<=numColumns;index++){
            boolean nullableResult=
                    (rsmd.isNullable(index)!=ResultSetMetaData.columnNoNulls);

            TypeId cti;

            int jdbcColumnType=rsmd.getColumnType(index);

            switch(jdbcColumnType){
                case Types.JAVA_OBJECT:
                case Types.OTHER:{
                    cti=TypeId.getUserDefinedTypeId(rsmd.getColumnTypeName(index),false);
                    break;
                }
                default:{
                    cti=TypeId.getBuiltInTypeId(jdbcColumnType);
                    break;
                }
            }

            // Handle the case where a VTI returns a bad column type
            if(cti==null){
                throw StandardException.newException(SQLState.LANG_BAD_J_D_B_C_TYPE_INFO,Integer.toString(index));
            }

            // Get the maximum byte storage for this column
            int maxWidth;

            /* Get maximum byte storage from rsmd for variable
             * width types, set it to MAXINT for the long types,
             * otherwise get it from the TypeId
             */
            if(cti.variableLength()){
                maxWidth=rsmd.getColumnDisplaySize(index);
            }else if(jdbcColumnType==Types.LONGVARCHAR || jdbcColumnType==Types.LONGVARBINARY){
                maxWidth=Integer.MAX_VALUE;
            }else{
                maxWidth=0;
            }

            int precision=cti.isDecimalTypeId()?rsmd.getPrecision(index):0;
            int scale=cti.isDecimalTypeId()?rsmd.getScale(index):0;
            DataTypeDescriptor dts=new DataTypeDescriptor(cti, precision, scale, nullableResult, maxWidth);
            addColumn(tableName,rsmd.getColumnName(index),dts);
        }
    }catch(Throwable t){
        if(t instanceof StandardException){
            throw (StandardException)t;
        }else{
            throw StandardException.unexpectedUserException(t);
        }
    }
}
 
源代码20 项目: gemfirexd-oss   文件: ResultColumnList.java
/** 
 * Generate an RCL to match the contents of a ResultSetMetaData.
 * This is useful when dealing with VTIs.
 *
 * @param rsmd			The ResultSetMetaData.
 * @param tableName		The TableName for the BCNs.
 * @param javaClassName	The name of the VTI
 *
 * @exception StandardException			Thrown on error
 */
public void createListFromResultSetMetaData(ResultSetMetaData rsmd,
											TableName tableName,
											String javaClassName)
		throws StandardException
{
	try
	{
		// JDBC columns #s are 1-based
		// Check to make sure # of columns >= 1
		int numColumns = rsmd.getColumnCount();

		if (numColumns <= 0)
		{
			throw StandardException.newException(SQLState.LANG_INVALID_V_T_I_COLUMN_COUNT, 
								javaClassName, String.valueOf(numColumns));
		}

		for (int index = 1; index <= numColumns; index++)
		{
			boolean nullableResult = 
				(rsmd.isNullable(index) != ResultSetMetaData.columnNoNulls);

			TypeId cti;

			int jdbcColumnType = rsmd.getColumnType(index);

			switch (jdbcColumnType) {
			case Types.JAVA_OBJECT:
			case Types.OTHER:
			{
				cti = TypeId.getUserDefinedTypeId(rsmd.getColumnTypeName(index), false);
				break;
			}
			default:
			{
				cti = TypeId.getBuiltInTypeId(jdbcColumnType);
				break;
			}
			}

			// Handle the case where a VTI returns a bad column type
			if (cti == null)
			{
				throw StandardException.newException(SQLState.LANG_BAD_J_D_B_C_TYPE_INFO, Integer.toString(index));
			}

			// Get the maximum byte storage for this column
			int maxWidth;

			/* Get maximum byte storage from rsmd for variable
			 * width types, set it to MAXINT for the long types,
			 * otherwise get it from the TypeId
			 */
			if (cti.variableLength())
			{
				maxWidth = rsmd.getColumnDisplaySize(index);
			}
			else if (jdbcColumnType == Types.LONGVARCHAR ||
					 jdbcColumnType == Types.LONGVARBINARY)
			{
				maxWidth = Integer.MAX_VALUE;
			}
			else
			{
				maxWidth = 0;
			}

			int precision = cti.isDecimalTypeId() ? rsmd.getPrecision(index) : 0;
			int scale = cti.isDecimalTypeId() ? rsmd.getScale(index) : 0;
			DataTypeDescriptor dts = new DataTypeDescriptor(cti, 
										precision,
										scale, 
										nullableResult, 
										maxWidth);
			addColumn( tableName, rsmd.getColumnName(index), dts );
		}
	}
	catch (Throwable t)
	{
		if (t instanceof StandardException)
		{
			throw (StandardException) t;
		}
		else
		{
			throw StandardException.unexpectedUserException(t);
		}
	}
}