use of lucee.runtime.type.scope.Argument in project Lucee by lucee.
the class Query method doEndTag.
@Override
public int doEndTag() throws PageException {
if (hasChangedPSQ)
pageContext.setPsq(orgPSQ);
String strSQL = bodyContent.getString().trim();
if (strSQL.isEmpty())
throw new DatabaseException("no sql string defined, inside query tag", null, null, null);
try {
// cannot use attribute params and queryparam tag
if (!items.isEmpty() && params != null)
throw new DatabaseException("you cannot use the attribute params and sub tags queryparam at the same time", null, null, null);
// create SQL
SQL sql;
if (params != null) {
if (params instanceof Argument)
sql = QueryParamConverter.convert(strSQL, (Argument) params);
else if (Decision.isArray(params))
sql = QueryParamConverter.convert(strSQL, Caster.toArray(params));
else if (Decision.isStruct(params))
sql = QueryParamConverter.convert(strSQL, Caster.toStruct(params));
else
throw new DatabaseException("value of the attribute [params] has to be a struct or a array", null, null, null);
} else {
sql = items.isEmpty() ? new SQLImpl(strSQL) : new SQLImpl(strSQL, items.toArray(new SQLItem[items.size()]));
}
// lucee.runtime.type.Query query=null;
QueryResult queryResult = null;
String cacheHandlerId = null;
String cacheId = null;
long exe = 0;
boolean useCache = (cachedWithin != null) || (cachedAfter != null);
CacheHandler cacheHandler = null;
if (useCache) {
cacheId = CacheHandlerCollectionImpl.createId(sql, datasource != null ? datasource.getName() : null, username, password, returntype);
CacheHandlerCollectionImpl coll = (CacheHandlerCollectionImpl) pageContext.getConfig().getCacheHandlerCollection(Config.CACHE_TYPE_QUERY, null);
cacheHandler = coll.getInstanceMatchingObject(cachedWithin, null);
if (cacheHandler == null && cachedAfter != null)
cacheHandler = coll.getTimespanInstance(null);
if (cacheHandler != null) {
// cacheHandlerId specifies to queryResult the cacheType and therefore whether the query is cached or
cacheHandlerId = cacheHandler.id();
if (cacheHandler instanceof CacheHandlerPro) {
CacheItem cacheItem = ((CacheHandlerPro) cacheHandler).get(pageContext, cacheId, (cachedWithin != null) ? cachedWithin : cachedAfter);
if (cacheItem instanceof QueryResultCacheItem)
queryResult = ((QueryResultCacheItem) cacheItem).getQueryResult();
} else {
// FUTURE this else block can be removed when all cache handlers implement CacheHandlerPro
CacheItem cacheItem = cacheHandler.get(pageContext, cacheId);
if (cacheItem instanceof QueryResultCacheItem) {
QueryResultCacheItem queryCachedItem = (QueryResultCacheItem) cacheItem;
Date cacheLimit = cachedAfter;
if (cacheLimit == null || queryCachedItem.isCachedAfter(cacheLimit))
queryResult = queryCachedItem.getQueryResult();
}
}
} else {
List<String> patterns = pageContext.getConfig().getCacheHandlerCollection(Config.CACHE_TYPE_QUERY, null).getPatterns();
throw new ApplicationException("cachedwithin value [" + cachedWithin + "] is invalid, valid values are for example [" + ListUtil.listToList(patterns, ", ") + "]");
}
// query=pageContext.getQueryCache().getQuery(pageContext,sql,datasource!=null?datasource.getName():null,username,password,cachedafter);
}
// cache not found, process and cache result if needed
if (queryResult == null) {
// QoQ
if ("query".equals(dbtype)) {
lucee.runtime.type.Query q = executeQoQ(sql);
if (returntype == RETURN_TYPE_ARRAY)
// TODO this should be done in queryExecute itself so we not have to convert afterwards
queryResult = QueryArray.toQueryArray(q);
else if (returntype == RETURN_TYPE_STRUCT) {
if (columnName == null)
throw new ApplicationException("attribute columnKey is required when return type is set to struct");
// TODO this should be done in queryExecute itself so we not have to convert
queryResult = QueryStruct.toQueryStruct(q, columnName);
// afterwards
} else
queryResult = (QueryResult) q;
} else // ORM and Datasource
{
long start = System.nanoTime();
Object obj;
if ("orm".equals(dbtype) || "hql".equals(dbtype))
obj = executeORM(sql, returntype, ormoptions);
else
obj = executeDatasoure(sql, result != null, pageContext.getTimeZone());
if (obj instanceof QueryResult) {
queryResult = (QueryResult) obj;
} else {
if (setReturnVariable) {
rtn = obj;
} else if (!StringUtil.isEmpty(name)) {
pageContext.setVariable(name, obj);
}
if (result != null) {
Struct sct = new StructImpl();
sct.setEL(KeyConstants._cached, Boolean.FALSE);
long time = System.nanoTime() - start;
sct.setEL(KeyConstants._executionTime, Caster.toDouble(time / 1000000));
sct.setEL(KeyConstants._executionTimeNano, Caster.toDouble(time));
sct.setEL(KeyConstants._SQL, sql.getSQLString());
if (Decision.isArray(obj)) {
} else
sct.setEL(KeyConstants._RECORDCOUNT, Caster.toDouble(1));
pageContext.setVariable(result, sct);
} else
setExecutionTime((System.nanoTime() - start) / 1000000);
return EVAL_PAGE;
}
}
if (cachedWithin != null) {
CacheItem cacheItem = QueryResultCacheItem.newInstance(queryResult, tags, datasource, null);
if (cacheItem != null)
cacheHandler.set(pageContext, cacheId, cachedWithin, cacheItem);
}
exe = queryResult.getExecutionTime();
} else {
queryResult.setCacheType(cacheHandlerId);
}
if (pageContext.getConfig().debug() && debug) {
boolean logdb = ((ConfigImpl) pageContext.getConfig()).hasDebugOptions(ConfigImpl.DEBUG_DATABASE);
if (logdb) {
boolean debugUsage = DebuggerImpl.debugQueryUsage(pageContext, queryResult);
DebuggerImpl di = (DebuggerImpl) pageContext.getDebugger();
di.addQuery(debugUsage ? queryResult : null, datasource != null ? datasource.getName() : null, name, sql, queryResult.getRecordcount(), getPageSource(), exe);
}
}
if (setReturnVariable) {
rtn = queryResult;
} else if ((queryResult.getColumncount() + queryResult.getRecordcount()) > 0 && !StringUtil.isEmpty(name)) {
pageContext.setVariable(name, queryResult);
}
// Result
if (result != null) {
Struct sct = new StructImpl();
sct.setEL(KeyConstants._cached, Caster.toBoolean(queryResult.isCached()));
if ((queryResult.getColumncount() + queryResult.getRecordcount()) > 0) {
String list = ListUtil.arrayToList(queryResult instanceof lucee.runtime.type.Query ? ((lucee.runtime.type.Query) queryResult).getColumnNamesAsString() : CollectionUtil.toString(queryResult.getColumnNames(), false), ",");
sct.setEL(KeyConstants._COLUMNLIST, list);
}
int rc = queryResult.getRecordcount();
if (rc == 0)
rc = queryResult.getUpdateCount();
sct.setEL(KeyConstants._RECORDCOUNT, Caster.toDouble(rc));
sct.setEL(KeyConstants._executionTime, Caster.toDouble(queryResult.getExecutionTime() / 1000000));
sct.setEL(KeyConstants._executionTimeNano, Caster.toDouble(queryResult.getExecutionTime()));
sct.setEL(KeyConstants._SQL, sql.getSQLString());
// GENERATED KEYS
lucee.runtime.type.Query qi = Caster.toQuery(queryResult, null);
if (qi != null) {
lucee.runtime.type.Query qryKeys = qi.getGeneratedKeys();
if (qryKeys != null) {
StringBuilder generatedKey = new StringBuilder(), sb;
Collection.Key[] columnNames = qryKeys.getColumnNames();
QueryColumn column;
for (int c = 0; c < columnNames.length; c++) {
column = qryKeys.getColumn(columnNames[c]);
sb = new StringBuilder();
int size = column.size();
for (int row = 1; row <= size; row++) {
if (row > 1)
sb.append(',');
sb.append(Caster.toString(column.get(row, null)));
}
if (sb.length() > 0) {
sct.setEL(columnNames[c], sb.toString());
if (generatedKey.length() > 0)
generatedKey.append(',');
generatedKey.append(sb);
}
}
if (generatedKey.length() > 0)
sct.setEL(GENERATEDKEY, generatedKey.toString());
}
}
// sqlparameters
SQLItem[] params = sql.getItems();
if (params != null && params.length > 0) {
Array arr = new ArrayImpl();
sct.setEL(SQL_PARAMETERS, arr);
for (int i = 0; i < params.length; i++) {
arr.append(params[i].getValue());
}
}
pageContext.setVariable(result, sct);
} else // cfquery.executiontime
{
setExecutionTime(exe / 1000000);
}
// listener
((ConfigWebImpl) pageContext.getConfig()).getActionMonitorCollector().log(pageContext, "query", "Query", exe, queryResult);
// log
Log log = pageContext.getConfig().getLog("datasource");
if (log.getLogLevel() >= Log.LEVEL_INFO) {
log.info("query tag", "executed [" + sql.toString().trim() + "] in " + DecimalFormat.call(pageContext, exe / 1000000D) + " ms");
}
} catch (PageException pe) {
// log
pageContext.getConfig().getLog("datasource").error("query tag", pe);
throw pe;
} finally {
((PageContextImpl) pageContext).setTimestampWithTSOffset(previousLiteralTimestampWithTSOffset);
if (tmpTZ != null) {
pageContext.setTimeZone(tmpTZ);
}
}
return EVAL_PAGE;
}
use of lucee.runtime.type.scope.Argument in project Lucee by lucee.
the class ChildThreadImpl method execute.
public PageException execute(Config config) {
PageContext oldPc = ThreadLocalPageContext.get();
Page p = page;
PageContextImpl pc = null;
try {
// deamon
if (this.pc != null) {
pc = this.pc;
ThreadLocalPageContext.register(pc);
} else // task
{
ConfigWebImpl cwi;
try {
cwi = (ConfigWebImpl) config;
DevNullOutputStream os = DevNullOutputStream.DEV_NULL_OUTPUT_STREAM;
pc = ThreadUtil.createPageContext(cwi, os, serverName, requestURI, queryString, SerializableCookie.toCookies(cookies), headers, null, parameters, attributes, true, -1);
pc.setRequestTimeout(requestTimeout);
p = PageSourceImpl.loadPage(pc, cwi.getPageSources(oldPc == null ? pc : oldPc, null, template, false, false, true));
// p=cwi.getPageSources(oldPc,null, template, false,false,true).loadPage(cwi);
} catch (PageException e) {
return e;
}
pc.addPageSource(p.getPageSource(), true);
}
threadScope = pc.getThreadScope(KeyConstants._cfthread, null);
pc.setCurrentThreadScope(new ThreadsImpl(this));
pc.setThread(Thread.currentThread());
// String encodings = pc.getHttpServletRequest().getHeader("Accept-Encoding");
Undefined undefined = pc.us();
Argument newArgs = new ArgumentThreadImpl((Struct) Duplicator.duplicate(attrs, false));
LocalImpl newLocal = pc.getScopeFactory().getLocalInstance();
// Key[] keys = attrs.keys();
Iterator<Entry<Key, Object>> it = attrs.entryIterator();
Entry<Key, Object> e;
while (it.hasNext()) {
e = it.next();
newArgs.setEL(e.getKey(), e.getValue());
}
newLocal.setEL(KEY_ATTRIBUTES, newArgs);
Argument oldArgs = pc.argumentsScope();
Local oldLocal = pc.localScope();
int oldMode = undefined.setMode(Undefined.MODE_LOCAL_OR_ARGUMENTS_ALWAYS);
pc.setFunctionScopes(newLocal, newArgs);
try {
p.threadCall(pc, threadIndex);
} catch (Throwable t) {
ExceptionUtil.rethrowIfNecessary(t);
if (!Abort.isSilentAbort(t)) {
ConfigWeb c = pc.getConfig();
if (c instanceof ConfigImpl) {
ConfigImpl ci = (ConfigImpl) c;
Log log = ci.getLog("thread");
if (log != null)
LogUtil.log(log, Log.LEVEL_ERROR, this.getName(), t);
}
PageException pe = Caster.toPageException(t);
if (!serializable)
catchBlock = pe.getCatchBlock(pc.getConfig());
return pe;
}
} finally {
completed = true;
pc.setFunctionScopes(oldLocal, oldArgs);
undefined.setMode(oldMode);
// pc.getScopeFactory().recycle(newArgs);
pc.getScopeFactory().recycle(pc, newLocal);
if (pc.getHttpServletResponse() instanceof HttpServletResponseDummy) {
HttpServletResponseDummy rsp = (HttpServletResponseDummy) pc.getHttpServletResponse();
pc.flush();
contentType = rsp.getContentType();
Pair<String, Object>[] _headers = rsp.getHeaders();
if (_headers != null)
for (int i = 0; i < _headers.length; i++) {
if (_headers[i].getName().equalsIgnoreCase("Content-Encoding"))
contentEncoding = Caster.toString(_headers[i].getValue(), null);
}
}
}
} finally {
pc.getConfig().getFactory().releaseLuceePageContext(pc, true);
pc = null;
if (oldPc != null)
ThreadLocalPageContext.register(oldPc);
}
return null;
}
use of lucee.runtime.type.scope.Argument in project Lucee by lucee.
the class UDFImpl method _call.
private Object _call(PageContext pc, Collection.Key calledName, Object[] args, Struct values, boolean doIncludePath) throws PageException {
// print.out(count++);
PageContextImpl pci = (PageContextImpl) pc;
Argument newArgs = pci.getScopeFactory().getArgumentInstance();
newArgs.setFunctionArgumentNames(properties.getArgumentsSet());
LocalImpl newLocal = pci.getScopeFactory().getLocalInstance();
Undefined undefined = pc.undefinedScope();
Argument oldArgs = pc.argumentsScope();
Local oldLocal = pc.localScope();
Collection.Key oldCalledName = pci.getActiveUDFCalledName();
pc.setFunctionScopes(newLocal, newArgs);
pci.setActiveUDFCalledName(calledName);
int oldCheckArgs = undefined.setMode(pc.getCurrentTemplateDialect() == CFMLEngine.DIALECT_CFML ? (properties.getLocalMode() == null ? pc.getApplicationContext().getLocalMode() : properties.getLocalMode().intValue()) : Undefined.MODE_LOCAL_OR_ARGUMENTS_ALWAYS);
PageSource ps = null;
PageSource psInc = null;
try {
ps = properties.getPageSource();
if (doIncludePath)
psInc = ps;
if (doIncludePath && getOwnerComponent() != null) {
psInc = ComponentUtil.getPageSource(getOwnerComponent());
if (psInc == pci.getCurrentTemplatePageSource()) {
psInc = null;
}
}
if (ps != null)
pci.addPageSource(ps, psInc);
pci.addUDF(this);
// ////////////////////////////////////////
BodyContent bc = null;
Boolean wasSilent = null;
boolean bufferOutput = getBufferOutput(pci);
if (!getOutput()) {
if (bufferOutput)
bc = pci.pushBody();
else
wasSilent = pc.setSilent() ? Boolean.TRUE : Boolean.FALSE;
}
UDF parent = null;
if (ownerComponent != null) {
parent = pci.getActiveUDF();
pci.setActiveUDF(this);
}
Object returnValue = null;
try {
if (args != null)
defineArguments(pc, getFunctionArguments(), args, newArgs);
else
defineArguments(pc, getFunctionArguments(), values, newArgs);
returnValue = implementation(pci);
if (ownerComponent != null)
pci.setActiveUDF(parent);
} catch (Throwable t) {
ExceptionUtil.rethrowIfNecessary(t);
if (ownerComponent != null)
pci.setActiveUDF(parent);
if (!getOutput()) {
if (bufferOutput)
BodyContentUtil.flushAndPop(pc, bc);
else if (!wasSilent)
pc.unsetSilent();
}
// BodyContentUtil.flushAndPop(pc,bc);
throw Caster.toPageException(t);
}
if (!getOutput()) {
if (bufferOutput)
BodyContentUtil.clearAndPop(pc, bc);
else if (!wasSilent)
pc.unsetSilent();
}
if (returnValue == null && pc.getConfig().getFullNullSupport())
return returnValue;
if (properties.getReturnType() == CFTypes.TYPE_ANY || !((PageContextImpl) pc).getTypeChecking())
return returnValue;
if (Decision.isCastableTo(properties.getReturnTypeAsString(), returnValue, false, false, -1))
return returnValue;
throw new UDFCasterException(this, properties.getReturnTypeAsString(), returnValue);
// REALCAST return Caster.castTo(pageContext,returnType,returnValue,false);
// ////////////////////////////////////////
} finally {
if (ps != null)
pc.removeLastPageSource(psInc != null);
pci.removeUDF();
pci.setFunctionScopes(oldLocal, oldArgs);
pci.setActiveUDFCalledName(oldCalledName);
undefined.setMode(oldCheckArgs);
pci.getScopeFactory().recycle(pci, newArgs);
pci.getScopeFactory().recycle(pci, newLocal);
}
}
use of lucee.runtime.type.scope.Argument in project Lucee by lucee.
the class Evaluate method call.
public static Object call(PageContext pc, Object[] objs, boolean preciseMath) throws PageException {
// define a ohter enviroment for the function
if (objs.length > 1 && objs[objs.length - 1] instanceof Scope) {
// Variables Scope
Variables var = null;
Local lcl = null, cLcl = null;
Argument arg = null, cArg = null;
if (objs[objs.length - 1] instanceof Variables) {
var = (Variables) objs[objs.length - 1];
} else if (objs[objs.length - 1] instanceof CallerImpl) {
CallerImpl ci = ((CallerImpl) objs[objs.length - 1]);
var = ci.getVariablesScope();
lcl = ci.getLocalScope();
arg = ci.getArgumentsScope();
}
if (var != null) {
Variables cVar = pc.variablesScope();
pc.setVariablesScope(var);
if (lcl != null && !(lcl instanceof LocalNotSupportedScope)) {
cLcl = pc.localScope();
cArg = pc.argumentsScope();
pc.setFunctionScopes(lcl, arg);
}
try {
return _call(pc, objs, objs.length - 1, preciseMath);
} finally {
pc.setVariablesScope(cVar);
if (cLcl != null)
pc.setFunctionScopes(cLcl, cArg);
}
} else // Undefined Scope
if (objs[objs.length - 1] instanceof Undefined) {
PageContextImpl pci = (PageContextImpl) pc;
Undefined undefined = (Undefined) objs[objs.length - 1];
boolean check = undefined.getCheckArguments();
Variables orgVar = pc.variablesScope();
Argument orgArgs = pc.argumentsScope();
Local orgLocal = pc.localScope();
pci.setVariablesScope(undefined.variablesScope());
if (check)
pci.setFunctionScopes(undefined.localScope(), undefined.argumentsScope());
try {
return _call(pc, objs, objs.length - 1, preciseMath);
} finally {
pc.setVariablesScope(orgVar);
if (check)
pci.setFunctionScopes(orgLocal, orgArgs);
}
}
}
return _call(pc, objs, objs.length, preciseMath);
}
use of lucee.runtime.type.scope.Argument in project Lucee by lucee.
the class UDFUtil method argumentCollection.
public static void argumentCollection(Struct values, FunctionArgument[] funcArgs) {
Object value = values.removeEL(KeyConstants._argumentCollection);
if (value != null) {
value = Caster.unwrap(value, value);
if (value instanceof Argument) {
Argument argColl = (Argument) value;
Iterator<Key> it = argColl.keyIterator();
Key k;
int i = -1;
while (it.hasNext()) {
i++;
k = it.next();
if (funcArgs.length > i && k instanceof ArgumentIntKey) {
if (!values.containsKey(funcArgs[i].getName()))
values.setEL(funcArgs[i].getName(), argColl.get(k, Argument.NULL));
else
values.setEL(k, argColl.get(k, Argument.NULL));
} else if (!values.containsKey(k)) {
values.setEL(k, argColl.get(k, Argument.NULL));
}
}
} else if (value instanceof Collection) {
Collection argColl = (Collection) value;
// Collection.Key[] keys = argColl.keys();
Iterator<Key> it = argColl.keyIterator();
Key k;
while (it.hasNext()) {
k = it.next();
if (!values.containsKey(k)) {
values.setEL(k, argColl.get(k, Argument.NULL));
}
}
} else if (value instanceof Map) {
Map map = (Map) value;
Iterator it = map.entrySet().iterator();
Map.Entry entry;
Key key;
while (it.hasNext()) {
entry = (Entry) it.next();
key = Caster.toKey(entry.getKey(), null);
if (!values.containsKey(key)) {
values.setEL(key, entry.getValue());
}
}
} else if (value instanceof java.util.List) {
java.util.List list = (java.util.List) value;
Iterator it = list.iterator();
Object v;
int index = 0;
Key k;
while (it.hasNext()) {
v = it.next();
k = ArgumentIntKey.init(++index);
if (!values.containsKey(k)) {
values.setEL(k, v);
}
}
} else {
values.setEL(KeyConstants._argumentCollection, value);
}
}
}
Aggregations