static DBFeatureType getFeatureType(Connection connection, PostgresqlStoreParameters params) throws ReadException { DBFeatureType featureType = new DBFeatureType(); String[] ids = params.getFieldsId(); int i; DBAttributeDescriptor attr; loadFieldsToFeatureType(connection, params, featureType); try { featureType.setFieldsId(ids); } catch (DataException e) { throw new ReadException(PostgresqlStore.DATASTORE_NAME, e); } // Inicializamos los 'serial' ya que en postgres el // 'isAutonumeric' devuelve false // try{ // initializeSerialFields(connection,featureType); // } catch (java.sql.SQLException e) { // throw new InitializeException(PostgresqlStore.DATASTORE_NAME,e); // // } // // Inicializar campos geometricos si los hubiese // TODO Datos geometricos // featureType.setDefaultGeometry(params.getGeometryField()); getTableEPSG_and_shapeType(connection, params, featureType); // Inicializar la geometria por defecto if (params.getDefaultGeometryField() != null && params.getDefaultGeometryField() != "") { if (featureType.getIndex(params.getDefaultGeometryField()) < 0) { throw new InitializeException( PostgresqlStore.DATASTORE_NAME, new Exception("Geometry Field '" + params.getDefaultGeometryField() + "' not Found")); } attr = (DBAttributeDescriptor) featureType.get(params.getDefaultGeometryField()); if (attr.getDataType() != FeatureAttributeDescriptor.GEOMETRY) { throw new InitializeException( PostgresqlStore.DATASTORE_NAME, new Exception("Field '" + params.getDefaultGeometryField() + "' isn't a geometry")); } } featureType.setDefaultGeometry(params.getDefaultGeometryField()); // featureType.setGeometryTypes(new int[]{Geometry.TYPES.GEOMETRY}); return featureType; }
private static void initializeSerialFields(Connection connection, DBFeatureType featureType) throws java.sql.SQLException, DataException { DBAttributeDescriptor attr; ArrayList serialCandidates = new ArrayList(); Iterator iter = featureType.iterator(); while (iter.hasNext()) { attr = (DBAttributeDescriptor) iter.next(); if (attr.getSqlTypeName().equals("int4") && attr.getTableName() != null && attr.getTableName().length() > 0) { serialCandidates.add(attr); } } if (serialCandidates.size() == 0) { return; } Statement st = connection.createStatement(); StringBuffer sqlSeq = new StringBuffer( "select table_catalog,table_schema,table_name,column_name from information_schema.columns where column_default like 'nextval(%' and ( "); iter = serialCandidates.iterator(); String sql; int i; for (i = 0; i < serialCandidates.size() - 1; i++) { attr = (DBAttributeDescriptor) serialCandidates.get(i); addConditionForSerialField(attr, sqlSeq); sqlSeq.append(" or "); } attr = (DBAttributeDescriptor) serialCandidates.get(i); addConditionForSerialField(attr, sqlSeq); sqlSeq.append(")"); sql = sqlSeq.toString(); ResultSet rs = st.executeQuery(sql); while (rs.next()) { iter = serialCandidates.iterator(); while (iter.hasNext()) { attr = (DBAttributeDescriptor) iter.next(); if (rs.getString("column_name").equals(attr.getName())) { attr.setAutoIncrement(true); serialCandidates.remove(attr); break; } } } }
private static void addConditionForSerialField(DBAttributeDescriptor attr, StringBuffer sqlSeq) { sqlSeq.append(" ("); sqlSeq.append(" column_name = '" + attr.getName() + "'"); sqlSeq.append(" and table_name = '" + attr.getTableName() + "'"); if (attr.getSchemaName() != null && attr.getSchemaName().length() > 0) { sqlSeq.append(" and table_schema = '" + attr.getSchemaName() + "'"); } sqlSeq.append(" and table_catalog = '" + attr.getCatalogName() + "'"); sqlSeq.append(")"); }
private static void loadFieldsToFeatureType( Connection conn, PostgresqlStoreParameters params, DBFeatureType featureType) throws ReadException { String sql = ""; String columns = params.getFieldsString(); boolean fillTableData; if (params.getSqlSoure() != null) { sql = params.getSqlSoure(); fillTableData = false; } else { sql = "Select " + columns + " from " + params.tableID(); fillTableData = true; } try { Statement stAux = conn.createStatement(); stAux.setFetchSize(1); ResultSet rs = stAux.executeQuery(sql); ResultSetMetaData rsMetadata = rs.getMetaData(); int i; featureType.setTableID(params.tableID()); DBAttributeDescriptor attr; for (i = 1; i <= rsMetadata.getColumnCount(); i++) { attr = getAttributeFromJDBC(featureType, conn, rsMetadata, i); featureType.add(attr); // attr.setOrdinal(i-1); attr.loading(); attr.setCatalogName(params.getDb()); if (fillTableData) { attr.setSchemaName(params.getSchema()); attr.setTableName(params.getTableName()); } attr.stopLoading(); } rs.close(); stAux.close(); } catch (java.sql.SQLException e) { throw new SQLException(sql, "getFeatureType", e); } catch (IsNotAttributeSettingException e) { e.printStackTrace(); } }
private static DBAttributeDescriptor getAttributeFromJDBC( DefaultFeatureType fType, Connection conn, ResultSetMetaData rsMetadata, int colIndex) throws SQLException { DBAttributeDescriptor column = (DBAttributeDescriptor) fType.createAttributeDescriptor(); try { column.loading(); column.setName(rsMetadata.getColumnName(colIndex)); column.setCaseSensitive(rsMetadata.isCaseSensitive(colIndex)); column.setSqlType(rsMetadata.getColumnType(colIndex)); column.setAllowNull(rsMetadata.isNullable(colIndex) == ResultSetMetaData.columnNullable); column.setAutoIncrement(rsMetadata.isAutoIncrement(colIndex)); column.setReadOnly(rsMetadata.isReadOnly(colIndex)); column.setWritable(rsMetadata.isWritable(colIndex)); column.setClassName(rsMetadata.getColumnClassName(colIndex)); column.setCatalogName(rsMetadata.getCatalogName(colIndex)); column.setDefinitelyWritable(rsMetadata.isDefinitelyWritable(colIndex)); column.setLabel(rsMetadata.getColumnLabel(colIndex)); column.setSchemaName(rsMetadata.getSchemaName(colIndex)); column.setTableName(rsMetadata.getTableName(colIndex)); column.setCatalogName(rsMetadata.getCatalogName(colIndex)); column.setSqlTypeName(rsMetadata.getColumnTypeName(colIndex)); column.setSearchable(rsMetadata.isSearchable(colIndex)); column.setSigned(rsMetadata.isSigned(colIndex)); column.setCurrency(rsMetadata.isCurrency(colIndex)); column.setPrecision(rsMetadata.getPrecision(colIndex)); column.setSize(rsMetadata.getColumnDisplaySize(colIndex)); switch (rsMetadata.getColumnType(colIndex)) { case java.sql.Types.INTEGER: column.setType(FeatureAttributeDescriptor.INT); break; case java.sql.Types.BIGINT: column.setType(FeatureAttributeDescriptor.LONG); break; case java.sql.Types.REAL: column.setType(FeatureAttributeDescriptor.DOUBLE); break; case java.sql.Types.DOUBLE: column.setType(FeatureAttributeDescriptor.DOUBLE); break; case java.sql.Types.CHAR: column.setType(FeatureAttributeDescriptor.STRING); break; case java.sql.Types.VARCHAR: column.setType(FeatureAttributeDescriptor.STRING); break; case java.sql.Types.FLOAT: column.setType(FeatureAttributeDescriptor.FLOAT); break; case java.sql.Types.DECIMAL: column.setType(FeatureAttributeDescriptor.FLOAT); break; case java.sql.Types.DATE: column.setType(FeatureAttributeDescriptor.DATE); break; case java.sql.Types.TIME: column.setType(FeatureAttributeDescriptor.TIME); break; case java.sql.Types.TIMESTAMP: column.setType(FeatureAttributeDescriptor.TIMESTAMP); break; case java.sql.Types.BOOLEAN: column.setType(FeatureAttributeDescriptor.BOOLEAN); break; case java.sql.Types.OTHER: if (column.getSqlTypeName().equalsIgnoreCase("geometry")) { column.setType(FeatureAttributeDescriptor.GEOMETRY); break; } // No hacemos break para que se quede en default default: column.setType(FeatureAttributeDescriptor.OBJECT); break; } column.stopLoading(); } catch (java.sql.SQLException e) { throw new SQLException("", "load attribute definition", e); } catch (IsNotAttributeSettingException e) { e.printStackTrace(); } return column; }