You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
789 lines
30 KiB
789 lines
30 KiB
2 years ago
|
package com.fr.plugin.db.procedure.controller;
|
||
|
|
||
|
import com.fr.base.CursorValue;
|
||
|
import com.fr.base.Parameter;
|
||
|
import com.fr.base.ParameterHelper;
|
||
|
import com.fr.base.StoreProcedureParameter;
|
||
|
import com.fr.base.TableDataConnection;
|
||
|
import com.fr.config.holder.Conf;
|
||
|
import com.fr.config.holder.factory.Holders;
|
||
|
import com.fr.config.holder.factory.XmlHolders;
|
||
|
import com.fr.config.holder.impl.ColConf;
|
||
|
import com.fr.config.holder.impl.xml.XmlColConf;
|
||
|
import com.fr.data.AbstractParameterTableData;
|
||
|
import com.fr.data.api.StoreProcedureAssist;
|
||
|
import com.fr.data.core.TableDataXmlUtils;
|
||
|
import com.fr.data.core.db.DBUtils;
|
||
|
import com.fr.data.core.db.dialect.Dialect;
|
||
|
import com.fr.data.core.db.dialect.DialectFactory;
|
||
|
import com.fr.data.core.db.dml.Table;
|
||
|
import com.fr.data.core.db.handler.SQLTypeHandler;
|
||
|
import com.fr.data.impl.NameDatabaseConnection;
|
||
|
import com.fr.data.impl.restriction.DSRestrictionScene;
|
||
|
import com.fr.data.impl.restriction.SqlTimeoutChecker;
|
||
|
import com.fr.data.impl.restriction.TimeoutExecutor;
|
||
|
import com.fr.data.impl.storeproc.DiskCacheProcereDataModel;
|
||
|
import com.fr.data.impl.storeproc.MemCachedProcedureDataModel;
|
||
|
import com.fr.data.impl.storeproc.ProcedureDataModel;
|
||
|
import com.fr.data.impl.storeproc.StoreProcedureExecution;
|
||
|
import com.fr.general.ComparatorUtils;
|
||
|
import com.fr.general.ManagerFactory;
|
||
|
import com.fr.general.data.DataModel;
|
||
|
import com.fr.general.data.TableDataException;
|
||
|
import com.fr.interruption.Condition;
|
||
|
import com.fr.interruption.Conditions;
|
||
|
import com.fr.interruption.DSConditionScene;
|
||
|
import com.fr.locale.InterProviderFactory;
|
||
|
import com.fr.log.FineLoggerFactory;
|
||
|
import com.fr.restriction.RestrictionDealer;
|
||
|
import com.fr.restriction.Restrictions;
|
||
|
import com.fr.restriction.dimension.Dimension;
|
||
|
import com.fr.script.Calculator;
|
||
|
import com.fr.stable.ArrayUtils;
|
||
|
import com.fr.stable.FormulaProvider;
|
||
|
import com.fr.stable.ParameterProvider;
|
||
|
import com.fr.stable.Primitive;
|
||
|
import com.fr.stable.StringUtils;
|
||
|
import com.fr.stable.UtilEvalError;
|
||
|
import com.fr.stable.monitor.MemoryHelper;
|
||
|
import com.fr.stable.script.CalculatorProvider;
|
||
|
import com.fr.stable.xml.XMLPrintWriter;
|
||
|
import com.fr.stable.xml.XMLReadable;
|
||
|
import com.fr.stable.xml.XMLable;
|
||
|
import com.fr.stable.xml.XMLableReader;
|
||
|
import java.sql.CallableStatement;
|
||
|
import java.sql.Connection;
|
||
|
import java.sql.ResultSet;
|
||
|
import java.sql.ResultSetMetaData;
|
||
|
import java.sql.SQLException;
|
||
|
import java.text.Collator;
|
||
|
import java.text.SimpleDateFormat;
|
||
|
import java.util.ArrayList;
|
||
|
import java.util.Arrays;
|
||
|
import java.util.Collection;
|
||
|
import java.util.Date;
|
||
|
import java.util.List;
|
||
|
import java.util.Locale;;
|
||
|
|
||
|
public class MyStoreProcedure extends AbstractParameterTableData implements XMLable, TableDataConnection {
|
||
|
private static final int PARAMETER_PROPERTY_COUNT = 4;
|
||
|
public static final String XML_TAG = "MyStoreProcedure";
|
||
|
private List dataModelList = new ArrayList();
|
||
|
private Conf<Boolean> share = Holders.simple(false);
|
||
|
private Conf<Integer> maxMemRowCount = Holders.simple(-1);
|
||
|
private Conf<String> query = Holders.simple("");
|
||
|
private XmlColConf<Collection<StoreProcedureParameter>> procedureParameters = XmlHolders.collection(new ArrayList(), StoreProcedureParameter.class);
|
||
|
private ColConf<Collection<String>> resultNames = Holders.collection(new ArrayList(), String.class);
|
||
|
private transient Connection connection;
|
||
|
private transient CallableStatement statement;
|
||
|
private Conf<com.fr.data.impl.Connection> database = Holders.obj(null, com.fr.data.impl.Connection.class);
|
||
|
private boolean isCalculating;
|
||
|
private boolean isFirstExpand = true;
|
||
|
private transient String sql;
|
||
|
private transient long queryStart;
|
||
|
private static final int MAX_IGNORE_COUNT = 100;
|
||
|
private static final long serialVersionUID = 1L;
|
||
|
|
||
|
public MyStoreProcedure() {
|
||
|
}
|
||
|
|
||
|
public static StoreProcedureParameter[] getSortPara(StoreProcedureParameter[] var0) {
|
||
|
int var1 = var0.length;
|
||
|
StoreProcedureParameter[] var2 = new StoreProcedureParameter[var1];
|
||
|
String[] var3 = new String[var1];
|
||
|
|
||
|
int var4;
|
||
|
for(var4 = 0; var4 < var1; ++var4) {
|
||
|
var3[var4] = var0[var4].getName();
|
||
|
}
|
||
|
|
||
|
Arrays.sort(var3, Collator.getInstance(Locale.CHINA));
|
||
|
|
||
|
for(var4 = 0; var4 < var1; ++var4) {
|
||
|
String var5 = var3[var4];
|
||
|
|
||
|
for(int var6 = 0; var6 < var1; ++var6) {
|
||
|
if (ComparatorUtils.equals(var5, var0[var6].getName())) {
|
||
|
var2[var4] = var0[var6];
|
||
|
break;
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
|
||
|
return var2;
|
||
|
}
|
||
|
|
||
|
public void setCalculating(boolean var1) {
|
||
|
this.isCalculating = var1;
|
||
|
}
|
||
|
|
||
|
public boolean isCalculating() {
|
||
|
return this.isCalculating;
|
||
|
}
|
||
|
|
||
|
public List getResultNames() {
|
||
|
return (List)this.resultNames.get();
|
||
|
}
|
||
|
|
||
|
public ProcedureDataModel getProcedureDataModel(Calculator var1, String var2) {
|
||
|
ProcedureDataModel[] var3 = this.creatDataModel(var1);
|
||
|
return StoreProcedureAssist.findMatch(var3, var2);
|
||
|
}
|
||
|
|
||
|
public int getDataModelSize() {
|
||
|
return this.dataModelList.size();
|
||
|
}
|
||
|
|
||
|
public void resetDataModelList() {
|
||
|
this.dataModelList.clear();
|
||
|
}
|
||
|
|
||
|
public void refreshDataModelListAndResultNames(ProcedureDataModel[] var1) {
|
||
|
if (var1 != null) {
|
||
|
this.resetDataModelList();
|
||
|
ArrayList var2 = new ArrayList();
|
||
|
ProcedureDataModel[] var3 = var1;
|
||
|
int var4 = var1.length;
|
||
|
|
||
|
for(int var5 = 0; var5 < var4; ++var5) {
|
||
|
ProcedureDataModel var6 = var3[var5];
|
||
|
this.dataModelList.add(var6);
|
||
|
var2.add(var6.getName());
|
||
|
}
|
||
|
|
||
|
this.resultNames.set(var2);
|
||
|
}
|
||
|
}
|
||
|
|
||
|
public ProcedureDataModel[] creatLazyDataModel() {
|
||
|
return (ProcedureDataModel[])((ProcedureDataModel[])this.dataModelList.toArray(new ProcedureDataModel[this.dataModelList.size()]));
|
||
|
}
|
||
|
|
||
|
public ProcedureDataModel[] creatDataModel(Calculator var1) {
|
||
|
return this.isShareTableData() ? (ProcedureDataModel[])((ProcedureDataModel[]) ManagerFactory.getCacheProvider().getProcedureDataModel((com.fr.data.impl.Connection)this.database.get(), (String)this.query.get(), this, var1)) : this.creatCacheableDataModel(var1);
|
||
|
}
|
||
|
|
||
|
public ProcedureDataModel[] creatCacheableDataModel(CalculatorProvider var1) {
|
||
|
try {
|
||
|
this.prepareCall(var1);
|
||
|
ProcedureDataModel[] var2 = this.creatDataModels(false);
|
||
|
return var2;
|
||
|
} catch (SQLException var7) {
|
||
|
this.dealWithSQLException(var7);
|
||
|
} catch (TableDataException var8) {
|
||
|
throw new RuntimeException(var8.getMessage(), var8);
|
||
|
} finally {
|
||
|
this.release();
|
||
|
}
|
||
|
|
||
|
return new ProcedureDataModel[0];
|
||
|
}
|
||
|
|
||
|
public ProcedureDataModel[] creatCacheableDataModel(CalculatorProvider var1, boolean var2) {
|
||
|
try {
|
||
|
this.prepareCall(var1);
|
||
|
ProcedureDataModel[] var3 = this.creatDataModels(var2);
|
||
|
return var3;
|
||
|
} catch (SQLException var8) {
|
||
|
this.dealWithSQLException(var8);
|
||
|
} catch (TableDataException var9) {
|
||
|
throw new RuntimeException(var9.getMessage(), var9);
|
||
|
} finally {
|
||
|
this.release();
|
||
|
}
|
||
|
|
||
|
return new ProcedureDataModel[0];
|
||
|
}
|
||
|
|
||
|
private void prepareCall(CalculatorProvider var1) throws SQLException, TableDataException {
|
||
|
synchronized(this) {
|
||
|
try {
|
||
|
this.connection = ((com.fr.data.impl.Connection)this.database.get()).createConnection();
|
||
|
} catch (Exception var15) {
|
||
|
this.dealWithDriverNotFound(var15);
|
||
|
}
|
||
|
|
||
|
if (this.query != null) {
|
||
|
boolean var3 = this.connection == null;
|
||
|
if (!var3) {
|
||
|
this.queryStart = System.currentTimeMillis();
|
||
|
this.connection.setAutoCommit(false);
|
||
|
Dialect var4 = DialectFactory.generateDialect(this.connection);
|
||
|
Parameter[] var5 = Parameter.providers2Parameter(this.processParameters(var1, this.getParameters()));
|
||
|
this.sql = this.getNewQuery(var4, var5);
|
||
|
this.statement = this.connection.prepareCall(this.sql);
|
||
|
StoreProcedureParameter[] var6 = this.getParameters();
|
||
|
|
||
|
for(int var7 = 0; var7 < var6.length; ++var7) {
|
||
|
StoreProcedureParameter var8 = var6[var7];
|
||
|
if (var8.getSchema() != 2147483645) {
|
||
|
try {
|
||
|
StoreProcedureParameter var9 = new StoreProcedureParameter(var8.getName(), var8.getValue(), var8.getSchema(), var8.getType());
|
||
|
Parameter var10 = new Parameter(var5[var7].getName(), var5[var7].getValue());
|
||
|
Object var11 = this.calculateHandlerValue(var10, var1, var9);
|
||
|
SQLTypeHandler var12 = var4.buildSQLTypeHandlerFactory().getTypeHandler(var9.getType());
|
||
|
var12.setValue(this.statement, var7 + 1, var11, var9.getType());
|
||
|
} catch (UtilEvalError var14) {
|
||
|
FineLoggerFactory.getLogger().error(var14.getMessage(), var14);
|
||
|
}
|
||
|
}
|
||
|
|
||
|
if (var8.getSchema() != 2147483646) {
|
||
|
this.statement.registerOutParameter(var7 + 1, var8.getType());
|
||
|
}
|
||
|
}
|
||
|
|
||
|
StoreProcedureExecution var19 = new StoreProcedureExecution(Calculator.getSavedSessionNameSpace(), this.statement);
|
||
|
SqlTimeoutChecker.checkExecution(var19);
|
||
|
|
||
|
try {
|
||
|
TimeoutExecutor.execute(var19);
|
||
|
} catch (SQLException var16) {
|
||
|
throw var16;
|
||
|
} catch (Exception var17) {
|
||
|
if (var17.getCause() instanceof SQLException) {
|
||
|
throw (SQLException)var17.getCause();
|
||
|
}
|
||
|
|
||
|
throw new SQLException(var17);
|
||
|
}
|
||
|
|
||
|
FineLoggerFactory.getLogger().info("SQL:\n" + this.sql);
|
||
|
this.dataModelList.clear();
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
|
||
|
private void dealWithSQLException(SQLException var1) {
|
||
|
String var2 = var1.getMessage();
|
||
|
if (var1.getErrorCode() != 0) {
|
||
|
var2 = var1.getErrorCode() + ":" + var1.getMessage();
|
||
|
}
|
||
|
|
||
|
throw new RuntimeException(StringUtils.perfectStart(var2, InterProviderFactory.getProvider().getLocText("Fine-Engine_Report_Stored_Procedure_Exe_Exception", new String[]{this.getName()}) + " "), var1);
|
||
|
}
|
||
|
|
||
|
private void dealWithDriverNotFound(Exception var1) throws TableDataException {
|
||
|
Object var2;
|
||
|
for(var2 = var1; ((Throwable)var2).getCause() != null; var2 = ((Throwable)var2).getCause()) {
|
||
|
}
|
||
|
|
||
|
if (var2 instanceof ClassNotFoundException && ((Throwable)var2).getMessage() != null && ((Throwable)var2).getMessage().contains(((com.fr.data.impl.Connection)this.database.get()).getDriver())) {
|
||
|
throw new TableDataException(InterProviderFactory.getProvider().getLocText("Fine-Engine_Data_Connection_Driver_Not_Found", new String[]{((com.fr.data.impl.Connection)this.database.get()).toString()}), (Throwable)var2, "");
|
||
|
} else {
|
||
|
throw new TableDataException(((com.fr.data.impl.Connection)this.database.get()).toString(), var1, InterProviderFactory.getProvider().getLocText("Fine-Engine_Utils_Can_Not_Create_Connection_With_Error_Code"));
|
||
|
}
|
||
|
}
|
||
|
|
||
|
private ParameterProvider[] processParameters(CalculatorProvider var1, ParameterProvider[] var2) {
|
||
|
if (var2 == null) {
|
||
|
return new ParameterProvider[0];
|
||
|
} else {
|
||
|
ParameterProvider[] var4 = new ParameterProvider[var2.length];
|
||
|
|
||
|
for(int var5 = 0; var5 < var2.length; ++var5) {
|
||
|
var4[var5] = var2[var5];
|
||
|
if (var4[var5] != null && var1 != null) {
|
||
|
Object var3 = var1.resolveVariable(var4[var5].getName());
|
||
|
if (var3 == null || var3 == Primitive.NULL) {
|
||
|
var3 = var1.resolveVariable(var4[var5].getValue());
|
||
|
}
|
||
|
|
||
|
try {
|
||
|
var4[var5] = (ParameterProvider)var4[var5].clone();
|
||
|
} catch (CloneNotSupportedException var7) {
|
||
|
FineLoggerFactory.getLogger().error(var7.getMessage(), var7);
|
||
|
}
|
||
|
|
||
|
if (var3 != null && ((StoreProcedureParameter)var4[var5]).getType() != 31) {
|
||
|
var4[var5].setValue(var3);
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
|
||
|
return var4;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
private Object calculateHandlerValue(Parameter var1, CalculatorProvider var2, StoreProcedureParameter var3) throws UtilEvalError {
|
||
|
if (var1.getValue() instanceof FormulaProvider) {
|
||
|
Object var4 = this.calFormula(var2, (FormulaProvider)var1.getValue());
|
||
|
var1.setValue(var4);
|
||
|
var3.setType(this.judgeType(var4));
|
||
|
var3.setValue(var4);
|
||
|
return this.calculateHandlerValue(var1, var2, var3);
|
||
|
} else {
|
||
|
return var1.getValue() instanceof Date ? (new SimpleDateFormat("yyyy-MM-dd HH:mm:ss")).format(var1.getValue()) : var1.getValue();
|
||
|
}
|
||
|
}
|
||
|
|
||
|
private int judgeType(Object var1) {
|
||
|
if (var1 instanceof CursorValue) {
|
||
|
return -10;
|
||
|
} else if (var1 instanceof String) {
|
||
|
return ((String)var1).length() > 0 && ((String)var1).charAt(0) == '=' ? 31 : 12;
|
||
|
} else if (var1 instanceof Integer) {
|
||
|
return 4;
|
||
|
} else if (var1 instanceof Double) {
|
||
|
return 3;
|
||
|
} else if (var1 instanceof Date) {
|
||
|
return 91;
|
||
|
} else {
|
||
|
return var1 instanceof Boolean ? 16 : 31;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
private Object calFormula(CalculatorProvider var1, FormulaProvider var2) throws UtilEvalError {
|
||
|
Object var3 = var1.eval(var2);
|
||
|
return var3 != null && var3 != Primitive.NULL ? var3 : var2.getResult();
|
||
|
}
|
||
|
|
||
|
private String getNewQuery(Dialect var1, Parameter[] var2) {
|
||
|
return ParameterHelper.analyzeCurrentContextTableData4Templatee(this.getCallQuery(var1, var2.length), var2);
|
||
|
}
|
||
|
|
||
|
private ProcedureDataModel[] creatDataModels(boolean var1) throws TableDataException, SQLException {
|
||
|
synchronized(this) {
|
||
|
if (this.statement == null) {
|
||
|
return null;
|
||
|
} else {
|
||
|
String var3 = ((com.fr.data.impl.Connection)this.database.get()).getOriginalCharsetName();
|
||
|
String var4 = ((com.fr.data.impl.Connection)this.database.get()).getNewCharsetName();
|
||
|
Dialect var5 = DialectFactory.generateDialect(this.connection);
|
||
|
ResultSet var6 = this.statement.getResultSet();
|
||
|
if (var6 != null) {
|
||
|
this.dataModelList.add(this.createDataModeByResultSet(var6, var5, "Table", var4, var3, var1, System.currentTimeMillis() - this.queryStart, this.queryStart));
|
||
|
int var7 = 0;
|
||
|
|
||
|
while(this.statement.getMoreResults()) {
|
||
|
++var7;
|
||
|
var6 = this.statement.getResultSet();
|
||
|
this.dataModelList.add(this.createDataModeByResultSet(var6, var5, "Table" + var7, var4, var3, var1, System.currentTimeMillis() - this.queryStart, this.queryStart));
|
||
|
}
|
||
|
}
|
||
|
|
||
|
StoreProcedureParameter[] var15 = this.getParameters();
|
||
|
|
||
|
for(int var8 = 0; var8 < var15.length; ++var8) {
|
||
|
StoreProcedureParameter var9 = var15[var8];
|
||
|
if (var9.getSchema() != 2147483646) {
|
||
|
Object var10;
|
||
|
try {
|
||
|
var10 = this.statement.getObject(var8 + 1);
|
||
|
} catch (SQLException var13) {
|
||
|
continue;
|
||
|
}
|
||
|
|
||
|
if (var10 instanceof ResultSet) {
|
||
|
var6 = (ResultSet)var10;
|
||
|
this.dataModelList.add(this.createDataModeByResultSet(var6, var5, var9.getName(), var4, var3, var1, System.currentTimeMillis() - this.queryStart, this.queryStart));
|
||
|
} else {
|
||
|
ArrayList var11 = new ArrayList(1);
|
||
|
var11.add(new Object[]{var10});
|
||
|
this.dataModelList.add(new MemCachedProcedureDataModel(var11, new String[]{var9.getName()}, var9.getName(), false, 0L, System.currentTimeMillis() - this.queryStart, this.queryStart, this.sql));
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
|
||
|
DBUtils.closeResultSet(var6);
|
||
|
this.release();
|
||
|
return (ProcedureDataModel[])((ProcedureDataModel[])this.dataModelList.toArray(new ProcedureDataModel[this.dataModelList.size()]));
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
|
||
|
private ProcedureDataModel createDataModeByResultSet(ResultSet var1, Dialect var2, String var3, String var4, String var5, boolean var6, long var7, long var9) throws SQLException, TableDataException {
|
||
|
synchronized(this) {
|
||
|
if (!((Collection)this.resultNames.get()).contains(var3)) {
|
||
|
this.resultNames.add(var3);
|
||
|
}
|
||
|
|
||
|
long var12 = System.currentTimeMillis();
|
||
|
ResultSetMetaData var14 = var1.getMetaData();
|
||
|
List var15 = this.createRowList(var1, var14, var2, var4, var5);
|
||
|
long var16 = System.currentTimeMillis() - var12;
|
||
|
return (ProcedureDataModel)((Integer)this.maxMemRowCount.get() > 0 && var15.size() > (Integer)this.maxMemRowCount.get() ? new DiskCacheProcereDataModel(var15, this.creatColumnName(var14), var3, var16, var7, var9, this.sql) : new MemCachedProcedureDataModel(var15, this.creatColumnName(var14), var3, var6, var16, var7, var9, this.sql));
|
||
|
}
|
||
|
}
|
||
|
|
||
|
private List createRowList(ResultSet var1, ResultSetMetaData var2, Dialect var3, String var4, String var5) throws TableDataException, SQLException {
|
||
|
synchronized(this) {
|
||
|
ArrayList var7 = new ArrayList();
|
||
|
int var8 = var2.getColumnCount();
|
||
|
|
||
|
try {
|
||
|
int[] var9 = new int[var8];
|
||
|
if (var2 != null) {
|
||
|
for(int var10 = 0; var10 < var8; ++var10) {
|
||
|
var9[var10] = var2.getColumnType(var10 + 1);
|
||
|
}
|
||
|
}
|
||
|
|
||
|
SQLTypeHandler[] var23 = new SQLTypeHandler[var8];
|
||
|
|
||
|
int var11;
|
||
|
for(var11 = 0; var11 < var8; ++var11) {
|
||
|
var23[var11] = var3.buildSQLTypeHandlerFactory().getTypeHandler(var9[var11]);
|
||
|
}
|
||
|
|
||
|
var11 = 0;
|
||
|
RestrictionDealer var12 = Restrictions.getRestriction(DSRestrictionScene.ROW_COUNT);
|
||
|
Dimension var13 = var12.create(var11);
|
||
|
|
||
|
for(Condition var14 = Conditions.get(DSConditionScene.ROW); var1.next(); ++var11) {
|
||
|
Object[] var15 = new Object[var8];
|
||
|
|
||
|
for(int var16 = 0; var16 < var8; ++var16) {
|
||
|
try {
|
||
|
var15[var16] = var23[var16].getValue(var1, var16 + 1, var9[var16]);
|
||
|
boolean var17 = StringUtils.isNotEmpty(var5);
|
||
|
if (var17 && var15[var16] instanceof String) {
|
||
|
var15[var16] = DBUtils.changeCharset((String)var15[var16], var5, var4);
|
||
|
}
|
||
|
} catch (SQLException var20) {
|
||
|
var15[var16] = null;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
var7.add(var15);
|
||
|
if ((var11 & 255) == 0) {
|
||
|
var14.setMetric(var11);
|
||
|
MemoryHelper.getMemoryAlarmProcessor().interruptIfConditionMet(var14);
|
||
|
var13.setMetric(var11);
|
||
|
var12.check(var13);
|
||
|
}
|
||
|
}
|
||
|
} catch (Exception var21) {
|
||
|
try {
|
||
|
this.release();
|
||
|
} catch (Exception var19) {
|
||
|
FineLoggerFactory.getLogger().error("Error happens while releaseConnection");
|
||
|
}
|
||
|
|
||
|
if (var21.getCause() != null) {
|
||
|
FineLoggerFactory.getLogger().error("Caused By:" + var21.getCause().getMessage(), var21.getCause());
|
||
|
}
|
||
|
|
||
|
throw new TableDataException(var21.getMessage(), var21);
|
||
|
}
|
||
|
|
||
|
return var7;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
public boolean isFirstExpand() {
|
||
|
return this.isFirstExpand;
|
||
|
}
|
||
|
|
||
|
public void setFirstExpand(boolean var1) {
|
||
|
this.isFirstExpand = var1;
|
||
|
}
|
||
|
|
||
|
private String[] creatColumnName(ResultSetMetaData var1) throws SQLException {
|
||
|
int var2 = var1.getColumnCount();
|
||
|
String[] var3 = new String[var2];
|
||
|
|
||
|
for(int var4 = 0; var4 < var2; ++var4) {
|
||
|
String var5 = var1.getColumnName(var4 + 1);
|
||
|
var3[var4] = ComparatorUtils.equals(var5, "") ? "Column" + (var4 == 0 ? "" : String.valueOf(var4)) : var5;
|
||
|
}
|
||
|
|
||
|
return var3;
|
||
|
}
|
||
|
|
||
|
public void release() {
|
||
|
synchronized(this) {
|
||
|
if (this.connection != null) {
|
||
|
DBUtils.closeStatement(this.statement);
|
||
|
|
||
|
try {
|
||
|
if (!this.connection.getAutoCommit()) {
|
||
|
this.connection.commit();
|
||
|
}
|
||
|
} catch (SQLException var4) {
|
||
|
FineLoggerFactory.getLogger().error(var4.getMessage(), var4);
|
||
|
}
|
||
|
|
||
|
DBUtils.closeConnection(this.connection);
|
||
|
this.statement = null;
|
||
|
this.connection = null;
|
||
|
}
|
||
|
|
||
|
}
|
||
|
}
|
||
|
|
||
|
public com.fr.data.impl.Connection getDatabaseConnection() {
|
||
|
return (com.fr.data.impl.Connection)this.database.get();
|
||
|
}
|
||
|
|
||
|
public void setDatabaseConnection(com.fr.data.impl.Connection var1) {
|
||
|
this.database.set(var1);
|
||
|
}
|
||
|
|
||
|
private Table initTable() {
|
||
|
String[] var1 = ((String)this.query.get()).split("\\.");
|
||
|
return ArrayUtils.getLength(var1) <= 1 ? new Table(var1[0]) : new Table(var1[var1.length - 2], var1[var1.length - 1]);
|
||
|
}
|
||
|
|
||
|
private String getCallQuery(Dialect var1, int var2) {
|
||
|
StringBuffer var3 = new StringBuffer();
|
||
|
var3.append("{call ");
|
||
|
Table var4 = this.initTable();
|
||
|
var3.append(var1.table2SQL(var4) + "(");
|
||
|
|
||
|
for(int var5 = 0; var5 < var2; ++var5) {
|
||
|
var3.append('?');
|
||
|
if (var5 != var2 - 1) {
|
||
|
var3.append(',');
|
||
|
}
|
||
|
}
|
||
|
|
||
|
var3.append(')');
|
||
|
var3.append("}");
|
||
|
return var3.toString();
|
||
|
}
|
||
|
|
||
|
public String getQuery() {
|
||
|
return (String)this.query.get();
|
||
|
}
|
||
|
|
||
|
public void setQuery(String var1) {
|
||
|
this.query.set(var1);
|
||
|
}
|
||
|
|
||
|
public StoreProcedureParameter[] getParameters() {
|
||
|
Collection var1 = (Collection)this.procedureParameters.get();
|
||
|
return (StoreProcedureParameter[])var1.toArray(new StoreProcedureParameter[var1.size()]);
|
||
|
}
|
||
|
|
||
|
public ParameterProvider[] getParameters(Calculator var1) {
|
||
|
return this.getParameters();
|
||
|
}
|
||
|
|
||
|
public void setParameters(StoreProcedureParameter[] var1) {
|
||
|
this.procedureParameters.set(ArrayUtils.toList(var1));
|
||
|
}
|
||
|
|
||
|
public StoreProcedureParameter[] get_IN_Parameters() {
|
||
|
StoreProcedureParameter[] var1 = new StoreProcedureParameter[0];
|
||
|
StoreProcedureParameter[] var2 = this.getParameters();
|
||
|
int var3 = 0;
|
||
|
|
||
|
for(int var4 = var2.length; var3 < var4; ++var3) {
|
||
|
if (var2[var3].getSchema() != 2147483645) {
|
||
|
var1 = (StoreProcedureParameter[])ArrayUtils.add(var1, var2[var3]);
|
||
|
}
|
||
|
}
|
||
|
|
||
|
return var1;
|
||
|
}
|
||
|
|
||
|
public boolean isShare() {
|
||
|
return (Boolean)this.share.get();
|
||
|
}
|
||
|
|
||
|
public void setShare(boolean var1) {
|
||
|
this.share.set(var1);
|
||
|
}
|
||
|
|
||
|
public boolean isShareTableData() {
|
||
|
return (Boolean)this.share.get();
|
||
|
}
|
||
|
|
||
|
public int getMaxMemRowCount() {
|
||
|
return (Integer)this.maxMemRowCount.get();
|
||
|
}
|
||
|
|
||
|
public void setMaxMemRowCount(int var1) {
|
||
|
this.maxMemRowCount.set(var1);
|
||
|
}
|
||
|
|
||
|
public void registerNoPrivilege(ArrayList<String> var1, String var2, String var3) {
|
||
|
com.fr.data.impl.Connection var4 = this.getDatabaseConnection();
|
||
|
if (var4 instanceof NameDatabaseConnection) {
|
||
|
String var5 = ((NameDatabaseConnection)var4).getName();
|
||
|
if (ComparatorUtils.equals(var2, var5)) {
|
||
|
var1.add(var3);
|
||
|
}
|
||
|
}
|
||
|
|
||
|
}
|
||
|
|
||
|
public void readXML(XMLableReader var1) {
|
||
|
if (var1.isChildNode()) {
|
||
|
String var2 = var1.getTagName();
|
||
|
if ("Attributes".equals(var2)) {
|
||
|
this.setShare(var1.getAttrAsBoolean("share", false));
|
||
|
this.setMaxMemRowCount(var1.getAttrAsInt("maxMemRowCount", -1));
|
||
|
}
|
||
|
|
||
|
if ("Connection".equals(var2)) {
|
||
|
if (var1.getAttrAsString("class", (String)null) != null) {
|
||
|
com.fr.data.impl.Connection var4 = TableDataXmlUtils.readXMLConnection(var1);
|
||
|
this.setDatabaseConnection(var4);
|
||
|
}
|
||
|
} else if ("Query".equals(var2)) {
|
||
|
String var3;
|
||
|
if ((var3 = var1.getElementValue()) != null) {
|
||
|
this.setQuery(var3);
|
||
|
}
|
||
|
} else if ("ParamterList".equals(var2)) {
|
||
|
this.readParameters(var1);
|
||
|
} else if ("ResultNames".equals(var2)) {
|
||
|
this.readResultNames(var1);
|
||
|
}
|
||
|
}
|
||
|
|
||
|
}
|
||
|
|
||
|
private void readResultNames(XMLableReader var1) {
|
||
|
final ArrayList var2 = new ArrayList();
|
||
|
var1.readXMLObject(new XMLReadable() {
|
||
|
public void readXML(XMLableReader var1) {
|
||
|
if (var1.isAttr()) {
|
||
|
MyStoreProcedure.this.resultNames.set(new ArrayList());
|
||
|
}
|
||
|
|
||
|
if (var1.isChildNode()) {
|
||
|
String var3 = var1.getTagName();
|
||
|
String var2x;
|
||
|
if ("Name".equals(var3) && (var2x = var1.getElementValue()) != null) {
|
||
|
var2.add(var2x);
|
||
|
}
|
||
|
}
|
||
|
|
||
|
}
|
||
|
});
|
||
|
this.resultNames.set(var2);
|
||
|
}
|
||
|
|
||
|
private void readParameters(XMLableReader var1) {
|
||
|
if (var1.getXMLVersion().isBefore711_FOR_STOREPROCEDURE_PARA()) {
|
||
|
String var2 = var1.getElementValue();
|
||
|
if (var2 != null) {
|
||
|
this.setParameterList(var2);
|
||
|
return;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
final ArrayList var3 = new ArrayList();
|
||
|
var1.readXMLObject(new XMLReadable() {
|
||
|
public void readXML(XMLableReader var1) {
|
||
|
if (var1.getTagName().equals("para")) {
|
||
|
StoreProcedureParameter var2 = new StoreProcedureParameter();
|
||
|
var1.readXMLObject(var2);
|
||
|
var3.add(var2);
|
||
|
}
|
||
|
|
||
|
}
|
||
|
});
|
||
|
this.procedureParameters.set(var3);
|
||
|
}
|
||
|
|
||
|
private void setParameterList(String var1) {
|
||
|
String[] var2 = var1.split("]");
|
||
|
StoreProcedureParameter[] var3 = new StoreProcedureParameter[var2.length / 4];
|
||
|
|
||
|
for(int var4 = 0; var4 < var2.length; var4 += 4) {
|
||
|
StoreProcedureParameter var5 = new StoreProcedureParameter();
|
||
|
String var6 = var2[var4];
|
||
|
String var7 = var2[var4 + 1];
|
||
|
String var8 = var2[var4 + 2];
|
||
|
String var9 = var2[var4 + 3];
|
||
|
var5.setName(var6.substring(var6.indexOf(58) + 1));
|
||
|
var5.setSchema(this.getIntSchema(var8));
|
||
|
var5.setType(this.getIntType(var7));
|
||
|
var5.setValue(var9.substring(var9.indexOf(58) + 1));
|
||
|
|
||
|
try {
|
||
|
var3[var4 / 4] = var5;
|
||
|
} catch (Exception var11) {
|
||
|
FineLoggerFactory.getLogger().error("Out of bounds : " + var4);
|
||
|
}
|
||
|
}
|
||
|
|
||
|
this.setParameters(var3);
|
||
|
}
|
||
|
|
||
|
private int getIntSchema(String var1) {
|
||
|
try {
|
||
|
return Integer.parseInt(var1.substring(var1.indexOf(58) + 1));
|
||
|
} catch (Exception var3) {
|
||
|
return 2147483646;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
private int getIntType(String var1) {
|
||
|
try {
|
||
|
return Integer.parseInt(var1.substring(var1.indexOf(58) + 1));
|
||
|
} catch (Exception var3) {
|
||
|
return 12;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
public com.fr.data.impl.Connection getDatabase() {
|
||
|
return this.getDatabaseConnection();
|
||
|
}
|
||
|
|
||
|
public void writeXML(XMLPrintWriter var1) {
|
||
|
var1.startTAG("Attributes");
|
||
|
if (this.isShare()) {
|
||
|
var1.attr("share", this.isShare());
|
||
|
}
|
||
|
|
||
|
var1.attr("maxMemRowCount", this.getMaxMemRowCount()).end();
|
||
|
if (this.database.get() != null) {
|
||
|
TableDataXmlUtils.writeXMLConnection(var1, (com.fr.data.impl.Connection)this.database.get());
|
||
|
}
|
||
|
|
||
|
var1.startTAG("Query").textNode(this.getQuery()).end();
|
||
|
this.writeParameters(var1);
|
||
|
this.writeResultNames(var1);
|
||
|
}
|
||
|
|
||
|
private void writeResultNames(XMLPrintWriter var1) {
|
||
|
var1.startTAG("ResultNames");
|
||
|
int var2 = Math.min(12, ((Collection)this.resultNames.get()).size());
|
||
|
|
||
|
for(int var3 = 0; var3 < var2; ++var3) {
|
||
|
var1.startTAG("Name").textNode((String)((List)this.resultNames.get()).get(var3)).end();
|
||
|
}
|
||
|
|
||
|
var1.end();
|
||
|
}
|
||
|
|
||
|
private void writeParameters(XMLPrintWriter var1) {
|
||
|
int var2 = ArrayUtils.getLength(this.getParameters());
|
||
|
if (var2 != 0) {
|
||
|
var1.startTAG("ParamterList");
|
||
|
StoreProcedureParameter[] var3 = this.getParameters();
|
||
|
|
||
|
for(int var4 = 0; var4 < var2; ++var4) {
|
||
|
var1.startTAG("para");
|
||
|
var3[var4].writeXML(var1);
|
||
|
var1.end();
|
||
|
}
|
||
|
|
||
|
var1.end();
|
||
|
}
|
||
|
}
|
||
|
|
||
|
public String toString() {
|
||
|
return "StoreProcedure";
|
||
|
}
|
||
|
|
||
|
public DataModel createDataModel(Calculator var1) {
|
||
|
return DataModel.EMPTY_DATAMODEL;
|
||
|
}
|
||
|
|
||
|
public DataModel createDataModel(Calculator var1, String var2) {
|
||
|
return this.getProcedureDataModel(var1, var2);
|
||
|
}
|
||
|
|
||
|
|
||
|
|
||
|
|
||
|
}
|
||
|
|