use of lucee.runtime.type.StructImpl in project Lucee by lucee.
the class Search method doStartTag.
@Override
public int doStartTag() throws PageException {
// SerialNumber sn = pageContext.getConfig().getSerialNumber();
// if(sn.getVersion()==SerialNumber.VERSION_COMMUNITY)
// throw new SecurityException("no access to this functionality with the "+sn.getStringVersion()+" version of Lucee");
final String v = "VARCHAR", d = "DOUBLE";
String[] cols = new String[] { "title", "url", "summary", "score", "recordssearched", "key", "custom1", "custom2", "custom3", "custom4", "categoryTree", "category", "context", "size", "rank", "author", "type", "collection" };
// TODO support context
String[] types = new String[] { v, v, v, d, d, v, v, v, v, v, v, v, v, d, d, v, v, v };
SearchData data = pageContext.getConfig().getSearchEngine(pageContext).createSearchData(suggestions);
// this is already here to make sure the classloader load this sinstance
SuggestionItem item = null;
lucee.runtime.type.Query qry = new QueryImpl(cols, types, 0, "query");
SearchCollection collection;
long time = System.currentTimeMillis();
AddionalAttrs.setAddionalAttrs(contextBytes, contextPassages, contextHighlightBegin, contextHighlightEnd);
try {
for (int i = 0; i < collections.length; i++) {
collection = collections[i];
startrow = collection.search(data, qry, criteria, collection.getLanguage(), type, startrow, maxrows, categoryTree, category);
if (maxrows >= 0 && qry.getRecordcount() >= maxrows)
break;
}
pageContext.setVariable(name, qry);
} catch (SearchException se) {
throw Caster.toPageException(se);
} finally {
AddionalAttrs.removeAddionalAttrs();
}
time = System.currentTimeMillis() - time;
Double recSearched = new Double(data.getRecordsSearched());
int len = qry.getRecordcount();
for (int i = 1; i <= len; i++) {
qry.setAt("recordssearched", i, recSearched);
}
// status
if (status != null) {
Struct sct = new StructImpl();
pageContext.setVariable(status, sct);
sct.set(FOUND, new Double(qry.getRecordcount()));
sct.set(SEARCHED, recSearched);
sct.set(KeyConstants._time, new Double(time));
// TODO impl this values
Map s = data.getSuggestion();
if (s.size() > 0) {
String key;
Iterator it = s.keySet().iterator();
Struct keywords = new StructImpl();
Struct keywordScore = new StructImpl();
sct.set(KEYWORDS, keywords);
sct.set(KEYWORD_SCORE, keywordScore);
Object obj;
while (it.hasNext()) {
key = (String) it.next();
// the problem is a conflict between the SuggestionItem version from core and extension
obj = s.get(key);
if (obj instanceof SuggestionItem) {
item = (SuggestionItem) obj;
keywords.set(key, item.getKeywords());
keywordScore.set(key, item.getKeywordScore());
} else {
Class clazz = obj.getClass();
try {
keywords.set(key, clazz.getMethod("getKeywords", new Class[0]).invoke(obj, new Object[0]));
keywordScore.set(key, clazz.getMethod("getKeywordScore", new Class[0]).invoke(obj, new Object[0]));
} catch (Exception e) {
}
}
}
String query = data.getSuggestionQuery();
if (query != null) {
String html = StringUtil.replace(query, "<suggestion>", "<b>", false);
html = StringUtil.replace(html, "</suggestion>", "</b>", false);
sct.set("suggestedQueryHTML", html);
String plain = StringUtil.replace(query, "<suggestion>", "", false);
plain = StringUtil.replace(plain, "</suggestion>", "", false);
sct.set("suggestedQuery", plain);
}
}
// if(suggestions!=SUGGESTIONS_NEVER)sct.set("suggestedQuery", "");
// sct.set("keywords", "");
// sct.set("keywordScore", "");
}
return SKIP_BODY;
}
use of lucee.runtime.type.StructImpl in project Lucee by lucee.
the class StoredProc method doEndTag.
@Override
public int doEndTag() throws PageException {
long startNS = System.nanoTime();
Object ds = datasource;
if (StringUtil.isEmpty(datasource)) {
ds = pageContext.getApplicationContext().getDefDataSource();
if (StringUtil.isEmpty(ds)) {
boolean isCFML = pageContext.getRequestDialect() == CFMLEngine.DIALECT_CFML;
throw new ApplicationException("attribute [datasource] is required, when no default datasource is defined", "you can define a default datasource as attribute [defaultdatasource] of the tag " + (isCFML ? Constants.CFML_APPLICATION_TAG_NAME : Constants.LUCEE_APPLICATION_TAG_NAME) + " or as data member of the " + (isCFML ? Constants.CFML_APPLICATION_EVENT_HANDLER : Constants.LUCEE_APPLICATION_EVENT_HANDLER) + " (this.defaultdatasource=\"mydatasource\";)");
}
}
Struct res = new StructImpl();
DataSourceManager manager = pageContext.getDataSourceManager();
DatasourceConnection dc = ds instanceof DataSource ? manager.getConnection(pageContext, (DataSource) ds, username, password) : manager.getConnection(pageContext, Caster.toString(ds), username, password);
// create returnValue
returnValue(dc);
String sql = createSQL();
// add returnValue to params
if (returnValue != null) {
params.add(0, returnValue);
}
Log log = pageContext.getConfig().getLog("datasource");
SQLImpl _sql = new SQLImpl(sql);
CallableStatement callStat = null;
try {
if (// log entry added to troubleshoot LDEV-1147
log.getLogLevel() >= Log.LEVEL_DEBUG)
log.debug("LDEV1147", sql + " [" + params.size() + " params]");
callStat = dc.getConnection().prepareCall(sql);
if (blockfactor > 0)
callStat.setFetchSize(blockfactor);
if (timeout > 0)
DataSourceUtil.setQueryTimeoutSilent(callStat, timeout);
// set IN register OUT
Iterator<ProcParamBean> it = params.iterator();
ProcParamBean param;
int index = 1;
while (it.hasNext()) {
param = it.next();
param.setIndex(index);
_sql.addItems(new SQLItemImpl(param.getValue()));
if (param.getDirection() != ProcParamBean.DIRECTION_OUT) {
SQLCaster.setValue(pageContext, pageContext.getTimeZone(), callStat, index, param);
}
if (param.getDirection() != ProcParamBean.DIRECTION_IN) {
registerOutParameter(callStat, param);
}
index++;
}
String dsn = (ds instanceof DataSource) ? ((DataSource) ds).getName() : Caster.toString(ds);
// cache
boolean isFromCache = false;
Object cacheValue = null;
boolean useCache = (cachedWithin != null) || (cachedafter != null);
String cacheId = null;
CacheHandler cacheHandler = null;
if (useCache) {
cacheId = CacheHandlerCollectionImpl.createId(_sql, dsn, username, password, Query.RETURN_TYPE_STORED_PROC);
cacheHandler = pageContext.getConfig().getCacheHandlerCollection(Config.CACHE_TYPE_QUERY, null).getInstanceMatchingObject(cachedWithin, null);
if (cacheHandler instanceof CacheHandlerPro) {
CacheItem cacheItem = ((CacheHandlerPro) cacheHandler).get(pageContext, cacheId, cachedWithin);
if (cacheItem != null)
cacheValue = ((StoredProcCacheItem) cacheItem).getStruct();
} else if (cacheHandler != null) {
// TODO this else block can be removed when all cache handlers implement CacheHandlerPro
CacheItem cacheItem = cacheHandler.get(pageContext, cacheId);
if (cacheItem != null)
cacheValue = ((StoredProcCacheItem) cacheItem).getStruct();
// cacheValue = pageContext.getQueryCache().get(pageContext,_sql,dsn,username,password,cachedafter);
}
}
int count = 0;
long start = System.currentTimeMillis();
if (cacheValue == null) {
// execute
boolean isResult = callStat.execute();
Struct cacheStruct = useCache ? new StructImpl() : null;
// resultsets
ProcResultBean result;
index = 1;
do {
if (isResult) {
ResultSet rs = callStat.getResultSet();
if (rs != null) {
try {
result = (ProcResultBean) results.get(index++, null);
if (result != null) {
lucee.runtime.type.Query q = new QueryImpl(rs, result.getMaxrows(), result.getName(), pageContext.getTimeZone());
count += q.getRecordcount();
setVariable(result.getName(), q);
if (useCache)
cacheStruct.set(KeyImpl.getInstance(result.getName()), q);
}
} finally {
IOUtil.closeEL(rs);
}
}
}
} while ((isResult = callStat.getMoreResults()) || (callStat.getUpdateCount() != -1));
// params
it = params.iterator();
while (it.hasNext()) {
param = it.next();
if (param.getDirection() != ProcParamBean.DIRECTION_IN) {
Object value = null;
if (!StringUtil.isEmpty(param.getVariable())) {
try {
value = SQLCaster.toCFType(callStat.getObject(param.getIndex()));
} catch (Throwable t) {
ExceptionUtil.rethrowIfNecessary(t);
}
value = emptyIfNull(value);
if (param == STATUS_CODE)
res.set(STATUSCODE, value);
else
setVariable(param.getVariable(), value);
if (useCache)
cacheStruct.set(KeyImpl.getInstance(param.getVariable()), value);
}
}
}
if (cacheHandler != null) {
cacheStruct.set(COUNT, Caster.toDouble(count));
cacheHandler.set(pageContext, cacheId, cachedWithin, new StoredProcCacheItem(cacheStruct, procedure, System.currentTimeMillis() - start));
// pageContext.getQueryCache().set(pageContext,_sql,dsn,username,password,cache,cachedbefore);
}
} else if (cacheValue instanceof Struct) {
Struct sctCache = (Struct) cacheValue;
count = Caster.toIntValue(sctCache.removeEL(COUNT), 0);
Iterator<Entry<Key, Object>> cit = sctCache.entryIterator();
Entry<Key, Object> ce;
while (cit.hasNext()) {
ce = cit.next();
if (STATUS_CODE.getVariable().equals(ce.getKey().getString()))
res.set(KEY_SC, ce.getValue());
else
setVariable(ce.getKey().getString(), ce.getValue());
}
isFromCache = true;
}
// result
long exe;
setVariable(this.result, res);
res.set(KeyConstants._executionTime, Caster.toDouble(exe = (System.nanoTime() - startNS)));
res.set(KeyConstants._cached, Caster.toBoolean(isFromCache));
if (pageContext.getConfig().debug() && debug) {
boolean logdb = ((ConfigImpl) pageContext.getConfig()).hasDebugOptions(ConfigImpl.DEBUG_DATABASE);
if (logdb)
pageContext.getDebugger().addQuery(null, dsn, procedure, _sql, count, pageContext.getCurrentPageSource(), (int) exe);
}
// log
if (log.getLogLevel() >= Log.LEVEL_INFO) {
log.info(StoredProc.class.getSimpleName(), "executed [" + sql.trim() + "] in " + DecimalFormat.call(pageContext, exe / 1000000D) + " ms");
}
} catch (SQLException e) {
// log
log.error(StoredProc.class.getSimpleName(), e);
throw new DatabaseException(e, new SQLImpl(sql), dc);
} catch (PageException pe) {
// log
log.error(StoredProc.class.getSimpleName(), pe);
throw pe;
} finally {
if (callStat != null) {
try {
callStat.close();
} catch (SQLException e) {
}
}
manager.releaseConnection(pageContext, dc);
}
return EVAL_PAGE;
}
use of lucee.runtime.type.StructImpl in project Lucee by lucee.
the class TagUtil method addTagMetaData.
/**
* load metadata from cfc based custom tags and add the info to the tag
* @param cs
* @param config
*/
public static void addTagMetaData(ConfigWebImpl cw) {
if (true)
return;
PageContextImpl pc = null;
try {
pc = ThreadUtil.createPageContext(cw, DevNullOutputStream.DEV_NULL_OUTPUT_STREAM, "localhost", "/", "", new Cookie[0], new Pair[0], null, new Pair[0], new StructImpl(), false, -1);
} catch (Throwable t) {
ExceptionUtil.rethrowIfNecessary(t);
return;
}
PageContext orgPC = ThreadLocalPageContext.get();
try {
ThreadLocalPageContext.register(pc);
// MUST MOST of them are the same, so this is a huge overhead
_addTagMetaData(pc, cw, CFMLEngine.DIALECT_CFML);
_addTagMetaData(pc, cw, CFMLEngine.DIALECT_LUCEE);
} catch (Throwable t) {
ExceptionUtil.rethrowIfNecessary(t);
} finally {
pc.getConfig().getFactory().releaseLuceePageContext(pc, true);
ThreadLocalPageContext.register(orgPC);
}
}
use of lucee.runtime.type.StructImpl in project Lucee by lucee.
the class ThreadTag method setDynamicAttribute.
@Override
public void setDynamicAttribute(String uri, String name, Object value) {
if (attrs == null)
attrs = new StructImpl();
Key key = KeyImpl.getInstance(StringUtil.trim(name, ""));
attrs.setEL(key, value);
}
use of lucee.runtime.type.StructImpl in project Lucee by lucee.
the class Admin method doGetCacheDefaultConnection.
private void doGetCacheDefaultConnection() throws PageException {
int type;
String strType = getString("admin", "GetCacheDefaultConnection", "cacheType");
strType = strType.toLowerCase().trim();
if (strType.equals("object"))
type = ConfigImpl.CACHE_TYPE_OBJECT;
else if (strType.equals("template"))
type = ConfigImpl.CACHE_TYPE_TEMPLATE;
else if (strType.equals("query"))
type = ConfigImpl.CACHE_TYPE_QUERY;
else if (strType.equals("resource"))
type = ConfigImpl.CACHE_TYPE_RESOURCE;
else if (strType.equals("function"))
type = ConfigImpl.CACHE_TYPE_FUNCTION;
else if (strType.equals("include"))
type = ConfigImpl.CACHE_TYPE_INCLUDE;
else if (strType.equals("http"))
type = ConfigImpl.CACHE_TYPE_HTTP;
else if (strType.equals("file"))
type = ConfigImpl.CACHE_TYPE_FILE;
else if (strType.equals("webservice"))
type = ConfigImpl.CACHE_TYPE_WEBSERVICE;
else
throw new ApplicationException("inv,query,resourcealid type defintion, valid values are [object,template,query,resource,function,include]");
CacheConnection cc = config.getCacheDefaultConnection(type);
if (cc != null) {
Struct sct = new StructImpl();
sct.setEL(KeyConstants._name, cc.getName());
sct.setEL(KeyConstants._class, cc.getClassDefinition().getClassName());
sct.setEL(KeyConstants._bundleName, cc.getClassDefinition().getName());
sct.setEL(KeyConstants._bundleVersion, cc.getClassDefinition().getVersionAsString());
sct.setEL(KeyConstants._custom, cc.getCustom());
sct.setEL(KeyConstants._default, Caster.toBoolean(true));
sct.setEL(KeyConstants._readonly, Caster.toBoolean(cc.isReadOnly()));
pageContext.setVariable(getString("admin", action, "returnVariable"), sct);
} else
throw new ApplicationException("there is no cache default connection");
}
Aggregations