use of lucee.runtime.db.DataSourceManager 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.db.DataSourceManager in project Lucee by lucee.
the class Admin method _doVerifyDatasource.
private void _doVerifyDatasource(DataSource ds, String username, String password) throws PageException {
try {
DataSourceManager manager = pageContext.getDataSourceManager();
DatasourceConnectionImpl dc = new DatasourceConnectionImpl(ds.getConnection(config, username, password), ds, username, password);
manager.releaseConnection(pageContext, dc);
} catch (Exception e) {
throw Caster.toPageException(e);
}
}
use of lucee.runtime.db.DataSourceManager in project Lucee by lucee.
the class Transaction method doStartTag.
@Override
public int doStartTag() throws PageException {
DataSourceManager manager = pageContext.getDataSourceManager();
// first transaction
if (manager.isAutoCommit()) {
// if(!hasBody)throw new DatabaseException("transaction tag with no end Tag can only be used inside a transaction tag",null,null,null);
manager.begin(isolation);
return EVAL_BODY_INCLUDE;
}
// inside transaction
innerTag = true;
switch(action) {
/* nested transaction no longer throw a exception, they are simply ignored
case ACTION_NONE:
throw new DatabaseException("you can't have a nested transaction with no action defined",null,null,null);
case ACTION_BEGIN:
throw new DatabaseException("you can't start a transaction inside a transaction tag",null,null,null);
*/
case ACTION_NONE:
case ACTION_BEGIN:
ignore = true;
break;
case ACTION_COMMIT:
manager.commit();
break;
case ACTION_ROLLBACK:
manager.rollback();
break;
case ACTION_SET_SAVEPOINT:
((DatasourceManagerImpl) manager).savepoint();
break;
}
return EVAL_BODY_INCLUDE;
}
use of lucee.runtime.db.DataSourceManager in project Lucee by lucee.
the class Update method doEndTag.
@Override
public int doEndTag() throws PageException {
Object ds = DBInfo.getDatasource(pageContext, datasource);
DataSourceManager manager = pageContext.getDataSourceManager();
DatasourceConnection dc = ds instanceof DataSource ? manager.getConnection(pageContext, (DataSource) ds, username, password) : manager.getConnection(pageContext, Caster.toString(ds), username, password);
try {
Struct meta = null;
try {
meta = Insert.getMeta(dc, tablequalifier, tableowner, tablename);
} catch (SQLException se) {
meta = new StructImpl();
}
String[] pKeys = getPrimaryKeys(dc);
SQL sql = createSQL(dc, pKeys, meta);
if (sql != null) {
lucee.runtime.type.Query query = new QueryImpl(pageContext, dc, sql, -1, -1, null, "query");
if (pageContext.getConfig().debug()) {
String dsn = ds instanceof DataSource ? ((DataSource) ds).getName() : Caster.toString(ds);
boolean logdb = ((ConfigImpl) pageContext.getConfig()).hasDebugOptions(ConfigImpl.DEBUG_DATABASE);
if (logdb) {
boolean debugUsage = DebuggerUtil.debugQueryUsage(pageContext, query);
pageContext.getDebugger().addQuery(debugUsage ? query : null, dsn, "", sql, query.getRecordcount(), pageContext.getCurrentPageSource(), query.getExecutionTime());
}
}
// log
Log log = pageContext.getConfig().getLog("datasource");
if (log.getLogLevel() >= Log.LEVEL_INFO) {
log.info("update tag", "executed [" + sql.toString().trim() + "] in " + DecimalFormat.call(pageContext, query.getExecutionTime() / 1000000D) + " ms");
}
}
return EVAL_PAGE;
} catch (PageException pe) {
pageContext.getConfig().getLog("datasource").error("update tag", pe);
throw pe;
} finally {
manager.releaseConnection(pageContext, dc);
}
}
use of lucee.runtime.db.DataSourceManager in project Lucee by lucee.
the class DBInfo method doStartTag.
@Override
public int doStartTag() throws PageException {
Object ds = getDatasource(pageContext, datasource);
DataSourceManager manager = pageContext.getDataSourceManager();
DatasourceConnection dc = ds instanceof DataSource ? manager.getConnection(pageContext, (DataSource) ds, username, password) : manager.getConnection(pageContext, Caster.toString(ds), username, password);
try {
if (type == TYPE_TABLE_COLUMNS)
typeColumns(dc.getConnection().getMetaData());
else if (type == TYPE_DBNAMES)
typeDBNames(dc.getConnection().getMetaData());
else if (type == TYPE_FOREIGNKEYS)
typeForeignKeys(dc.getConnection().getMetaData());
else if (type == TYPE_INDEX)
typeIndex(dc.getConnection().getMetaData());
else if (type == TYPE_PROCEDURES)
typeProcedures(dc.getConnection().getMetaData());
else if (type == TYPE_PROCEDURE_COLUMNS)
typeProcedureColumns(dc.getConnection().getMetaData());
else if (type == TYPE_TERMS)
typeTerms(dc.getConnection().getMetaData());
else if (type == TYPE_TABLES)
typeTables(dc.getConnection().getMetaData());
else if (type == TYPE_VERSION)
typeVersion(dc.getConnection().getMetaData());
else if (type == TYPE_USERS)
typeUsers(dc.getConnection().getMetaData());
} catch (SQLException sqle) {
throw new DatabaseException(sqle, dc);
} finally {
manager.releaseConnection(pageContext, dc);
}
return SKIP_BODY;
}
Aggregations