package org.insightech.er.db.impl.postgres;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import org.insightech.er.editor.model.dbimport.ImportFromDBManagerBase;
public class PostgresTableImportManager extends ImportFromDBManagerBase {
@Override
protected String getTableNameWithSchema(String schema, String tableName) {
return this.dbSetting.getTableNameWithSchema("\"" + tableName + "\"",
schema);
}
/**
* {@inheritDoc}
*/
@Override
protected String getViewDefinitionSQL(String schema) {
if (schema != null) {
return "SELECT definition FROM pg_views WHERE schemaname = ? and viewname = ? ";
} else {
return "SELECT definition FROM pg_views WHERE viewname = ? ";
}
}
@Override
protected ColumnData createColumnData(ResultSet columnSet)
throws SQLException {
ColumnData columnData = super.createColumnData(columnSet);
String type = columnData.type.toLowerCase();
if (type.startsWith("time")) {
if (columnData.decimalDegits == 6) {
columnData.size = 0;
} else {
columnData.size = columnData.decimalDegits;
}
columnData.decimalDegits = 0;
} else if (type.equals("numeric")) {
if (columnData.size == 131089 && columnData.decimalDegits == 0) {
columnData.size = 0;
}
}
return columnData;
}
@Override
protected void cashOtherColumnData(String tableName, String schema,
ColumnData columnData) throws SQLException {
if (columnData.type.equals("interval")) {
String restrictType = this.getRestrictType(tableName, schema,
columnData);
if (restrictType != null && restrictType.indexOf("(") != -1) {
columnData.size = columnData.decimalDegits;
} else {
columnData.size = 0;
}
columnData.type = restrictType;
columnData.decimalDegits = 0;
}
}
private String getRestrictType(String tableName, String schema,
ColumnData columnData) throws SQLException {
String type = null;
PreparedStatement ps = null;
ResultSet rs = null;
try {
ps = con.prepareStatement("select atttypmod from pg_attribute"
+ " inner join pg_stat_user_tables "
+ " on pg_stat_user_tables.relid = pg_attribute.attrelid "
+ " where pg_stat_user_tables.relname = ? "
+ " and pg_stat_user_tables.schemaname=? "
+ " and pg_attribute.attname = ?");
ps.setString(1, tableName);
ps.setString(2, schema);
ps.setString(3, columnData.columnName);
rs = ps.executeQuery();
if (rs.next()) {
int atttypmod = rs.getInt("atttypmod");
if (atttypmod == 196607) {
type = "interval month";
} else if (atttypmod == 327679) {
type = "interval year";
} else if (atttypmod == 458751) {
type = "interval year to month";
} else if (atttypmod == 589823) {
type = "interval day";
} else if (atttypmod == 67174399) {
type = "interval hour";
} else if (atttypmod == 67698687) {
type = "interval day to hour";
} else if (atttypmod == 134283263) {
type = "interval minute";
} else if (atttypmod == 201916415) {
type = "interval day to minute";
} else if (atttypmod == 201392127) {
type = "interval hour to minute";
} else if (atttypmod == 268500991) {
type = "interval second";
} else if (atttypmod >= 268435457 && atttypmod <= 268435462) {
type = "interval second(p)";
} else if (atttypmod == 402718719) {
type = "interval minute to second";
} else if (atttypmod >= 402653185 && atttypmod <= 402653190) {
type = "interval minute to second(p)";
} else if (atttypmod == 469827583) {
type = "interval hour to second";
} else if (atttypmod >= 469762049 && atttypmod <= 469762054) {
type = "interval hour to second(p)";
} else if (atttypmod == 470351871) {
type = "interval day to second";
} else if (atttypmod >= 470286337 && atttypmod <= 470286342) {
type = "interval day to second(p)";
} else if (atttypmod >= 2147418113 && atttypmod <= 2147418118) {
type = "interval(p)";
} else {
type = "interval";
}
}
} finally {
if (rs != null) {
rs.close();
}
if (ps != null) {
ps.close();
}
}
return type;
}
}