package com.megatim.fdxcommons.tools.database.tables;
|
|
import com.megatim.fdxcommons.tools.exceptions.FdxColumnNotFoundException;
|
import com.megatim.fdxcommons.tools.database.contrat.TableName;
|
import java.sql.Connection;
|
import java.sql.DatabaseMetaData;
|
import java.sql.ResultSet;
|
import java.sql.SQLException;
|
import java.util.ArrayList;
|
import java.util.Collections;
|
import java.util.List;
|
import javax.naming.NamingException;
|
|
/**
|
*
|
* @author Gabuntu
|
*/
|
public class FdxTableColumns {
|
|
private final TableName tableName;
|
private final Connection connection;
|
private final List<FdxTableColumn> fdxTableColumns = new ArrayList<>();
|
|
public FdxTableColumns(TableName tableName, Connection connection) {
|
this.tableName = tableName;
|
this.connection = connection;
|
}
|
|
public List<FdxTableColumn> columns() throws SQLException, NamingException {
|
if (fdxTableColumns.isEmpty()) {
|
DatabaseMetaData metaData = connection.getMetaData();
|
ResultSet columns = metaData.getColumns(null, null, tableName.name(connection), null);
|
while (columns.next()) {
|
String name = columns.getString("COLUMN_NAME");
|
int type = columns.getInt("DATA_TYPE");
|
int position = columns.getInt("ORDINAL_POSITION");
|
int size = columns.getInt("COLUMN_SIZE");
|
fdxTableColumns.add(new FdxTableColumn(name, type, position, size));
|
}
|
|
Collections.sort(fdxTableColumns, (c1, c2) -> Integer.valueOf(c1.getPosition()).compareTo(c2.getPosition()));
|
}
|
return fdxTableColumns;
|
}
|
|
public FdxTableColumn column(String name) throws FdxColumnNotFoundException, SQLException, NamingException {
|
return columns()
|
.stream()
|
.filter(c -> c.getName().equals(name))
|
.findFirst()
|
.orElseThrow(() -> new FdxColumnNotFoundException("Colonne introuvable dans la table"));
|
}
|
|
}
|