package jef.database.query.function; import java.util.List; import jef.database.dialect.DatabaseDialect; import jef.database.jsqlparser.expression.Function; import jef.database.jsqlparser.expression.StringValue; import jef.database.jsqlparser.visitor.Expression; import jef.database.meta.FunctionMapping; import jef.database.query.Func; import jef.database.support.SQL_TSI; public class EmuJDBCTimestampFunction extends BaseArgumentSqlFunction{ private Func func; private DatabaseDialect parent; public EmuJDBCTimestampFunction(Func name,DatabaseDialect parent){ this.func=name; this.parent=parent; } public String getName() { return func.name(); } @Override public boolean needEscape() { return true; } public Expression renderExpression(List<Expression> arguments) { Function func=new Function(this.func.name(),arguments); func.setEscaped(true); String ex=arguments.get(0).toString().toUpperCase(); if(ex.startsWith("SQL_TSI_")){ ex=ex.substring(8); } SQL_TSI tsi=jef.tools.reflect.Enums.valueOf(SQL_TSI.class, ex, null); if(tsi==null){ throw new IllegalArgumentException("Can not parse the argument: "+arguments.get(0)+" to a valid SQL_TSI value."); } arguments.set(0, tsi.get()); if(this.func==Func.timestampadd){ checkArg(arguments,2); }else if(this.func==Func.timestampdiff){ checkArg(arguments,1); checkArg(arguments,2); } return func; } private void checkArg(List<Expression> arguments, int i) { Expression ex=arguments.get(i); if(ex instanceof StringValue){ FunctionMapping mapping=parent.getFunctions().get("timestamp"); if(mapping!=null){ ex=mapping.rewrite("timestamp", ex); arguments.set(i, ex); } } } }