package net.sf.minuteProject.utils;
import java.sql.Connection;
import java.sql.DatabaseMetaData;
import java.sql.ResultSet;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import org.apache.log4j.Logger;
import net.sf.minuteProject.configuration.bean.DataModel;
import net.sf.minuteProject.configuration.bean.model.data.Database;
import net.sf.minuteProject.configuration.bean.model.data.Function;
import net.sf.minuteProject.configuration.bean.model.data.FunctionColumn;
import net.sf.minuteProject.configuration.bean.model.data.constant.Direction;
import net.sf.minuteProject.configuration.bean.model.data.impl.DDLUtils.FunctionColumnDDLUtils;
import net.sf.minuteProject.configuration.bean.model.data.impl.DDLUtils.FunctionDDLUtils;
public class FunctionUtils {
private static Logger log = Logger.getLogger(FunctionUtils.class);
private static Map<String, Function> functions;
public static List<Function> getFunctions(DataModel dataModel, Database database) {
Connection connection = ConnectionUtils.getConnection(dataModel);
if (connection!=null) {
String schema = dataModel.getSchema();
return getFunctions (connection, schema, database);
}
return new ArrayList<Function>();
}
public static List<Function> getFunctions(Connection connection, String schema, Database database) {
functions = new HashMap<String, Function>();
Function function = null;
try {
DatabaseMetaData dbMetaData = connection.getMetaData();
String catalog = connection.getCatalog();
ResultSet rs;
if ("MYSQL".equals(database.getType()))
rs = dbMetaData.getProcedureColumns(catalog, schema, "%", "%");
else
rs = dbMetaData.getProcedureColumns(catalog, schema, null, null);
// String previousProcedureCatalog = "";
// String previousProcedureName = "";
while(rs.next()) {
// get stored procedure metadata
String procedureCatalog = rs.getString(1);
// String procedureSchema = rs.getString(2);
String procedureName = rs.getString(3);
String columnName = rs.getString(4);
short columnReturn = rs.getShort(5);
int columnDataType = rs.getInt(6);
String columnReturnTypeName = rs.getString(7);
int columnPrecision = rs.getInt(8);
int columnByteLength = rs.getInt(9);
short columnScale = rs.getShort(10);
short columnRadix = rs.getShort(11);
short columnNullable = rs.getShort(12);
String columnRemarks = rs.getString(13);
function = getFunction (procedureCatalog, catalog, procedureName);
// if (procedureCatalog==null || !procedureCatalog.equals(previousProcedureCatalog) || !procedureName.equals(previousProcedureName)) {
// if (function!=null)
// functions.add(function);
// function = new FunctionDDLUtils();
// if (procedureCatalog!=null)
// function.setCatalog(procedureCatalog);
// else
// function.setCatalog(catalog);
// function.setName(procedureName);
// }
// previousProcedureCatalog = (procedureCatalog!=null)?procedureCatalog:"";
// previousProcedureName = (procedureName!=null)?procedureName:"";
//
FunctionColumn functionColumn = new FunctionColumnDDLUtils();
functionColumn.setName(columnName);
Direction dir = getDirection(columnReturn);
functionColumn.setDirection(dir);
functionColumn.setTypeCode(columnDataType);
functionColumn.setType(columnReturnTypeName);//getType(columnDataType));
functionColumn.setPrecisionRadix(columnRadix);
functionColumn.setSizeAndScale(columnByteLength, columnScale);
functionColumn.setSize(columnByteLength+"");
functionColumn.setPrecision(columnPrecision);
functionColumn.setRequired((columnNullable==0)?true:false);
functionColumn.setDescription(columnRemarks);
function.addColumn(functionColumn);
function.setDatabase(database);
functions.put(getKey(procedureCatalog, catalog, procedureName), function);
}
connection.close();
return new ArrayList<Function>(functions.values());
} catch (Exception e) {
log.error("Problem handling store procedures "+e.getMessage());
}
return new ArrayList<Function>();
}
private static Function getFunction(String procedureCatalog, String catalog,
String procedureName) {
Function function = functions.get(getKey(procedureCatalog, catalog, procedureName));
if (function!=null) return function;
function = new FunctionDDLUtils();
if (procedureCatalog!=null)
function.setCatalog(procedureCatalog);
else
function.setCatalog(catalog);
function.setName(procedureName);
return function;
}
private static String getKey(String procedureCatalog, String catalog,String procedureName) {
return catalog+"-"+procedureCatalog+"-"+procedureName;
}
private static Direction getDirection(int direction) {
if (direction==1)
return Direction.IN;
if (direction==4)
return Direction.OUT;
if (direction==5)
return Direction.RETURN;
return Direction.INOUT;
}
}