/** * OLAT - Online Learning and Training<br> * http://www.olat.org * <p> * Licensed under the Apache License, Version 2.0 (the "License"); <br> * you may not use this file except in compliance with the License.<br> * You may obtain a copy of the License at * <p> * http://www.apache.org/licenses/LICENSE-2.0 * <p> * Unless required by applicable law or agreed to in writing,<br> * software distributed under the License is distributed on an "AS IS" BASIS, <br> * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. <br> * See the License for the specific language governing permissions and <br> * limitations under the License. * <p> * Copyright (c) since 2004 at Multimedia- & E-Learning Services (MELS),<br> * University of Zurich, Switzerland. * <hr> * <a href="http://www.openolat.org"> * OpenOLAT - Online Learning and Training</a><br> * This file has been modified by the OpenOLAT community. Changes are licensed * under the Apache 2.0 license as the original file. * <p> */ package org.olat.core.commons.persistence; import java.io.Serializable; import java.math.BigDecimal; import java.util.Calendar; import java.util.Collection; import java.util.Date; import java.util.HashMap; import java.util.HashSet; import java.util.Iterator; import java.util.List; import java.util.Locale; import java.util.Map; import java.util.Set; import java.util.StringTokenizer; import org.hibernate.FlushMode; import org.hibernate.HibernateException; import org.hibernate.LockMode; import org.hibernate.Query; import org.hibernate.type.Type; import org.olat.core.logging.DBRuntimeException; import org.olat.core.logging.OLog; import org.olat.core.logging.Tracing; /** * A <b>DBQueryImpl</b> is a wrapper around a Hibernate Query object. * * @author Andreas Ch. Kapp * */ public class DBQueryImpl implements DBQuery { private static final OLog log = Tracing.createLoggerFor(DBQueryImpl.class); private Query query = null; public final static Map<String, SimpleProbe> listTableStatsMap_ = new HashMap<String, SimpleProbe>(); public final static Set<String> registeredTables_ = new HashSet<String>(); static { registeredTables_.add("org.olat.basesecurity.SecurityGroupMembershipImpl"); registeredTables_.add("org.olat.group.area.BGAreaImpl"); registeredTables_.add("org.olat.group.BusinessGroupImpl"); registeredTables_.add("org.olat.resource.OLATResourceImpl"); registeredTables_.add("org.olat.commons.lifecycle.LifeCycleEntry"); } /** * Default construcotr. * @param q */ public DBQueryImpl(Query q) { query = q; } /** * @see org.olat.core.commons.persistence.DBQuery#setLong(java.lang.String, long) */ public DBQuery setLong(String string, long value) { query.setLong(string, value); return this; } /** * @see org.olat.core.commons.persistence.DBQuery#setString(java.lang.String, java.lang.String) */ public DBQuery setString(String string, String value) { query.setString(string, value); return this; } /** * @see org.olat.core.commons.persistence.DBQuery#setTime(java.lang.String, java.util.Date) */ public DBQuery setTime(String name, Date date){ query.setTime(name, date); return this; } /** * @see org.olat.core.commons.persistence.DBQuery#executeUpdate(FlushMode) */ public int executeUpdate(FlushMode nullOrFlushMode) { if (nullOrFlushMode!=null) { query.setFlushMode(nullOrFlushMode); } return query.executeUpdate(); } /** * @see org.olat.core.commons.persistence.DBQuery#list() */ public List list() { final long startTime = System.currentTimeMillis(); try{ boolean doLog = log.isDebug(); long start = 0; if (doLog) start = System.currentTimeMillis(); List li = query.list(); if (doLog) { long time = (System.currentTimeMillis() - start); log.debug("list dbquery (time "+time+") query "+getQueryString()); } String queryString = query.getQueryString().trim(); String queryStringToLowerCase = queryString.toLowerCase(); if (queryStringToLowerCase.startsWith("from ")) { queryString = queryString.substring(5).trim(); queryStringToLowerCase = queryString.toLowerCase(); } else if (queryStringToLowerCase.startsWith("select ") && (queryStringToLowerCase.contains(" from "))) { queryString = queryString.substring(queryStringToLowerCase.indexOf(" from ")+6).trim(); queryStringToLowerCase = queryString.toLowerCase(); } else { queryString = null; } if (queryString!=null) { final long endTime = System.currentTimeMillis(); final long diff = endTime - startTime; int wherePos = queryStringToLowerCase.indexOf(" where "); if (wherePos!=-1) { queryString = queryString.substring(0, wherePos); } queryString = queryString.trim(); StringTokenizer st = new StringTokenizer(queryString, ","); while(st.hasMoreTokens()) { String aTable = st.nextToken(); aTable = aTable.trim(); int spacePos = aTable.toLowerCase().indexOf(" "); if (spacePos!=-1) { aTable = aTable.substring(0, spacePos); } aTable = aTable.trim(); SimpleProbe probe = listTableStatsMap_.get(aTable); if (probe==null) { probe = new SimpleProbe(); listTableStatsMap_.put(aTable, probe); } probe.addMeasurement(diff); if (!registeredTables_.contains(aTable)) { aTable = "THEREST"; probe = listTableStatsMap_.get(aTable); if (probe==null) { probe = new SimpleProbe(); listTableStatsMap_.put(aTable, probe); } probe.addMeasurement(diff); } //System.out.println(" A TABLE: "+aTable+" stats: "+probe); } } return li; } catch (HibernateException he) { String msg ="Error in list()" ; throw new DBRuntimeException(msg, he); } } /** * @see org.olat.core.commons.persistence.DBQuery#getNamedParameters() */ public String[] getNamedParameters() { try { return query.getNamedParameters(); } catch (HibernateException e) { throw new DBRuntimeException("GetNamedParameters failed. ", e); } } /** * @see org.olat.core.commons.persistence.DBQuery#getQueryString() */ public String getQueryString() { return query.getQueryString(); } /** * @see org.olat.core.commons.persistence.DBQuery#getReturnTypes() */ public Type[] getReturnTypes() { try { return query.getReturnTypes(); } catch (HibernateException e) { throw new DBRuntimeException("GetReturnTypes failed. ", e); } } /** * @return iterator */ public Iterator iterate() { try { return query.iterate(); } catch (HibernateException e) { throw new DBRuntimeException("Iterate failed. ", e); } } /** * @see org.olat.core.commons.persistence.DBQuery#setBigDecimal(int, java.math.BigDecimal) */ public DBQuery setBigDecimal(int position, BigDecimal number) { query.setBigDecimal(position, number); return this; } /** * @see org.olat.core.commons.persistence.DBQuery#setBigDecimal(java.lang.String, java.math.BigDecimal) */ public DBQuery setBigDecimal(String name, BigDecimal number) { query.setBigDecimal(name, number); return this; } /** * @see org.olat.core.commons.persistence.DBQuery#setBinary(int, byte[]) */ public DBQuery setBinary(int position, byte[] val) { query.setBinary(position, val); return this; } /** * @see org.olat.core.commons.persistence.DBQuery#setBinary(java.lang.String, byte[]) */ public DBQuery setBinary(String name, byte[] val) { query.setBinary(name, val); return this; } /** * @see org.olat.core.commons.persistence.DBQuery#setBoolean(int, boolean) */ public DBQuery setBoolean(int position, boolean val) { query.setBoolean(position, val); return this; } /** * @see org.olat.core.commons.persistence.DBQuery#setBoolean(java.lang.String, boolean) */ public DBQuery setBoolean(String name, boolean val) { query.setBoolean(name, val); return this; } /** * @see org.olat.core.commons.persistence.DBQuery#setByte(int, byte) */ public DBQuery setByte(int position, byte val) { query.setByte(position, val); return this; } /** * @see org.olat.core.commons.persistence.DBQuery#setByte(java.lang.String, byte) */ public DBQuery setByte(String name, byte val) { query.setByte(name, val); return this; } /** * @see org.olat.core.commons.persistence.DBQuery#setCacheable(boolean) */ public DBQuery setCacheable(boolean cacheable) { query.setCacheable(cacheable); return this; } /** * @see org.olat.core.commons.persistence.DBQuery#setCacheRegion(java.lang.String) */ public DBQuery setCacheRegion(String cacheRegion) { query.setCacheRegion(cacheRegion); return this; } /** * @see org.olat.core.commons.persistence.DBQuery#setCalendar(int, java.util.Calendar) */ public DBQuery setCalendar(int position, Calendar calendar) { query.setCalendar(position, calendar); return this; } /** * @see org.olat.core.commons.persistence.DBQuery#setCalendar(java.lang.String, java.util.Calendar) */ public DBQuery setCalendar(String name, Calendar calendar) { query.setCalendar(name, calendar); return this; } /** * @see org.olat.core.commons.persistence.DBQuery#setCalendarDate(int, java.util.Calendar) */ public DBQuery setCalendarDate(int position, Calendar calendar) { query.setCalendarDate(position, calendar); return this; } /** * @see org.olat.core.commons.persistence.DBQuery#setCalendarDate(java.lang.String, java.util.Calendar) */ public DBQuery setCalendarDate(String name, Calendar calendar) { query.setCalendarDate(name, calendar); return this; } /** * @see org.olat.core.commons.persistence.DBQuery#setCharacter(int, char) */ public DBQuery setCharacter(int position, char val) { query.setCharacter(position, val); return this; } /** * @see org.olat.core.commons.persistence.DBQuery#setCharacter(java.lang.String, char) */ public DBQuery setCharacter(String name, char val) { query.setCharacter(name, val); return this; } /** * @see org.olat.core.commons.persistence.DBQuery#setDate(int, java.util.Date) */ public DBQuery setDate(int position, Date date) { query.setDate(position, date); return this; } /** * @see org.olat.core.commons.persistence.DBQuery#setDate(java.lang.String, java.util.Date) */ public DBQuery setDate(String name, Date date) { query.setDate(name, date); return this; } /** * @see org.olat.core.commons.persistence.DBQuery#setDouble(int, double) */ public DBQuery setDouble(int position, double val) { query.setDouble(position, val); return this; } /** * @see org.olat.core.commons.persistence.DBQuery#setDouble(java.lang.String, double) */ public DBQuery setDouble(String name, double val) { query.setDouble(name, val); return this; } /** * @see org.olat.core.commons.persistence.DBQuery#setEntity(int, java.lang.Object) */ public DBQuery setEntity(int position, Object val) { query.setEntity(position, val); return this; } /** * @see org.olat.core.commons.persistence.DBQuery#setEntity(java.lang.String, java.lang.Object) */ public DBQuery setEntity(String name, Object val) { query.setEntity(name, val); return this; } /** * @see org.olat.core.commons.persistence.DBQuery#setFirstResult(int) */ public DBQuery setFirstResult(int firstResult) { query.setFirstResult(firstResult); return this; } /** * @see org.olat.core.commons.persistence.DBQuery#setFloat(int, float) */ public DBQuery setFloat(int position, float val) { query.setFloat(position, val); return this; } /** * @see org.olat.core.commons.persistence.DBQuery#setFloat(java.lang.String, float) */ public DBQuery setFloat(String name, float val) { query.setFloat(name, val); return this; } /** * @see org.olat.core.commons.persistence.DBQuery#setInteger(int, int) */ public DBQuery setInteger(int position, int val) { query.setInteger(position, val); return this; } /** * @see org.olat.core.commons.persistence.DBQuery#setInteger(java.lang.String, int) */ public DBQuery setInteger(String name, int val) { query.setInteger(name, val); return this; } /** * @see org.olat.core.commons.persistence.DBQuery#setLocale(int, java.util.Locale) */ public DBQuery setLocale(int position, Locale locale) { query.setLocale(position, locale); return this; } /** * @see org.olat.core.commons.persistence.DBQuery#setLocale(java.lang.String, java.util.Locale) */ public DBQuery setLocale(String name, Locale locale) { query.setLocale(name, locale); return this; } /** * @see org.olat.core.commons.persistence.DBQuery#setLockMode(java.lang.String, org.hibernate.LockMode) */ public void setLockMode(String alias, LockMode lockMode) { query.setLockMode(alias, lockMode); } /** * @see org.olat.core.commons.persistence.DBQuery#setLong(int, long) */ public DBQuery setLong(int position, long val) { query.setLong(position, val); return this; } /** * @see org.olat.core.commons.persistence.DBQuery#setMaxResults(int) */ public DBQuery setMaxResults(int maxResults) { query.setMaxResults(maxResults); return this; } /** * @see org.olat.core.commons.persistence.DBQuery#setParameter(int, java.lang.Object, org.hibernate.type.Type) */ public DBQuery setParameter(int position, Object val, Type type) { query.setParameter(position, val, type); return this; } /** * @see org.olat.core.commons.persistence.DBQuery#setParameter(int, java.lang.Object) */ public DBQuery setParameter(int position, Object val) { try { query.setParameter(position, val); } catch (HibernateException e) { throw new DBRuntimeException("DBQuery error. ", e); } return this; } /** * @see org.olat.core.commons.persistence.DBQuery#setParameter(java.lang.String, java.lang.Object, org.hibernate.type.Type) */ public DBQuery setParameter(String name, Object val, Type type) { query.setParameter(name, val, type); return this; } /** * @see org.olat.core.commons.persistence.DBQuery#setParameter(java.lang.String, java.lang.Object) */ public DBQuery setParameter(String name, Object val) { try { query.setParameter(name, val); } catch (HibernateException e) { throw new DBRuntimeException("DBQuery error. ", e); } return this; } /** * @see org.olat.core.commons.persistence.DBQuery#setParameterList(java.lang.String, java.util.Collection, org.hibernate.type.Type) */ public DBQuery setParameterList(String name, Collection vals, Type type) { try { query.setParameterList(name, vals, type); } catch (HibernateException e) { throw new DBRuntimeException("DBQuery error. ", e); } return this; } /** * @see org.olat.core.commons.persistence.DBQuery#setParameterList(java.lang.String, java.util.Collection) */ public DBQuery setParameterList(String name, Collection vals) { try { query.setParameterList(name, vals); } catch (HibernateException e) { throw new DBRuntimeException("DBQuery error. ", e); } return this; } /** * @see org.olat.core.commons.persistence.DBQuery#setParameterList(java.lang.String, java.lang.Object[], org.hibernate.type.Type) */ public DBQuery setParameterList(String name, Object[] vals, Type type) { try { query.setParameterList(name, vals, type); } catch (HibernateException e) { throw new DBRuntimeException("DBQuery error. ", e); } return this; } /** * @see org.olat.core.commons.persistence.DBQuery#setParameterList(java.lang.String, java.lang.Object[]) */ public DBQuery setParameterList(String name, Object[] vals) { try { query.setParameterList(name, vals); } catch (HibernateException e) { throw new DBRuntimeException("DBQuery error. ", e); } return this; } /** * @see org.olat.core.commons.persistence.DBQuery#setProperties(java.lang.Object) */ public DBQuery setProperties(Object bean) { try { query.setProperties(bean); } catch (HibernateException e) { throw new DBRuntimeException("DBQuery error. ", e); } return this; } public DBQuery setProperties(Map map) { try { query.setProperties(map); } catch (HibernateException e) { throw new DBRuntimeException("DBQuery error. ", e); } return this; } /** * @see org.olat.core.commons.persistence.DBQuery#setSerializable(int, java.io.Serializable) */ public DBQuery setSerializable(int position, Serializable val) { query.setSerializable(position, val); return this; } /** * @see org.olat.core.commons.persistence.DBQuery#setSerializable(java.lang.String, java.io.Serializable) */ public DBQuery setSerializable(String name, Serializable val) { query.setSerializable(name, val); return this; } /** * @see org.olat.core.commons.persistence.DBQuery#setShort(int, short) */ public DBQuery setShort(int position, short val) { query.setShort(position, val); return this; } /** * @see org.olat.core.commons.persistence.DBQuery#setShort(java.lang.String, short) */ public DBQuery setShort(String name, short val) { query.setShort(name, val); return this; } /** * @see org.olat.core.commons.persistence.DBQuery#setString(int, java.lang.String) */ public DBQuery setString(int position, String val) { query.setString(position, val); return this; } /** * @see org.olat.core.commons.persistence.DBQuery#setText(int, java.lang.String) */ public DBQuery setText(int position, String val) { query.setText(position, val); return this; } /** * @see org.olat.core.commons.persistence.DBQuery#setText(java.lang.String, java.lang.String) */ public DBQuery setText(String name, String val) { query.setText(name, val); return this; } /** * @see org.olat.core.commons.persistence.DBQuery#setTime(int, java.util.Date) */ public DBQuery setTime(int position, Date date) { query.setTime(position, date); return this; } /** * @see org.olat.core.commons.persistence.DBQuery#setTimeout(int) */ public DBQuery setTimeout(int timeout) { query.setTimeout(timeout); return this; } /** * @see org.olat.core.commons.persistence.DBQuery#setTimestamp(int, java.util.Date) */ public DBQuery setTimestamp(int position, Date date) { query.setTimestamp(position, date); return this; } /** * @see org.olat.core.commons.persistence.DBQuery#setTimestamp(java.lang.String, java.util.Date) */ public DBQuery setTimestamp(String name, Date date) { query.setTimestamp(name, date); return this; } /** * @see org.olat.core.commons.persistence.DBQuery#uniqueResult() */ public Object uniqueResult() { try { return query.uniqueResult(); } catch (HibernateException e) { throw new DBRuntimeException("DBQuery error. ", e); } } }