package binky.reportrunner.ui.actions.general;
import java.sql.Connection;
import java.sql.DatabaseMetaData;
import java.sql.ResultSet;
import java.util.LinkedList;
import java.util.List;
import javax.sql.DataSource;
import binky.reportrunner.data.RunnerDataSource;
import binky.reportrunner.service.DatasourceService;
import binky.reportrunner.ui.actions.base.StandardRunnerAction;
import binky.reportrunner.ui.actions.general.metadata.Column;
import binky.reportrunner.ui.actions.general.metadata.FKey;
import binky.reportrunner.ui.actions.general.metadata.Meta;
import binky.reportrunner.ui.actions.general.metadata.Table;
import com.google.gson.Gson;
public class SetupQueryEditor extends StandardRunnerAction {
private static final long serialVersionUID = -5994330814661409736L;
private String dataSourceName;
private DatasourceService datasourceService;
private String json;
@Override
public String execute() throws Exception {
RunnerDataSource rds=datasourceService.getDataSource(dataSourceName);
DataSource ds = datasourceService.getJDBCDataSource(rds);
Connection conn = ds.getConnection();
DatabaseMetaData dbm= conn.getMetaData();
ResultSet rs = dbm.getTables(null, null, "%", new String[]{"TABLE"});
List<Table> tables = new LinkedList<Table>();
while(rs.next()) {
String tabCat=rs.getString("TABLE_CAT");
String tabSchema=rs.getString("TABLE_SCHEM");
String tabName=rs.getString("TABLE_NAME");
ResultSet rsCols =dbm.getColumns(tabCat, tabSchema, tabName, "%");
List<Column> cols = new LinkedList<Column>();
while (rsCols.next()) cols.add(new Column(rsCols.getString("COLUMN_NAME"), rsCols.getString("COLUMN_NAME"), rsCols.getString("TYPE_NAME"), rsCols.getInt("COLUMN_SIZE")));
ResultSet rsFK = dbm.getExportedKeys(tabCat, tabSchema, tabName);
List<FKey> fks = new LinkedList<FKey>();
rsCols.close();
while (rsFK.next()) {
String referencedTableName=rsFK.getString("FKTABLE_NAME");
String name=rsFK.getString("FKCOLUMN_NAME");
String label=rsFK.getString("FKCOLUMN_NAME");
String reverseLabel=rsFK.getString("PKTABLE_NAME");
String[] foreignKeyNames = new String[]{rsFK.getString("FKCOLUMN_NAME")};
String[] referencedKeyNames = new String[]{rsFK.getString("PKCOLUMN_NAME")};
fks.add(new FKey(referencedTableName, name, label, foreignKeyNames, referencedKeyNames, reverseLabel));
}
rsFK.close();
tables.add(new Table(cols.toArray(new Column[0]), fks.toArray(new FKey[0])));
}
Meta meta = new Meta();
meta.setTables(tables.toArray(new Table[0]));
Gson gson = new Gson();
this.json=gson.toJson(meta);
rs.close();
conn.close();
return SUCCESS;
}
public String getJson() {
return json;
}
public void setDataSourceName(String dataSourceName) {
this.dataSourceName = dataSourceName;
}
public void setDatasourceService(DatasourceService datasourceService) {
this.datasourceService = datasourceService;
}
}