/** * The contents of this file are subject to the OpenMRS Public License * Version 1.0 (the "License"); you may not use this file except in * compliance with the License. You may obtain a copy of the License at * http://license.openmrs.org * * Software distributed under the License is distributed on an "AS IS" * basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See the * License for the specific language governing rights and limitations * under the License. * * Copyright (C) OpenMRS, LLC. All Rights Reserved. */ package org.openmrs.api.db.hibernate; import java.sql.SQLException; import org.apache.commons.lang.StringUtils; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import org.hibernate.HibernateException; import org.hibernate.SessionFactory; import org.hibernate.dialect.Dialect; import org.hibernate.dialect.HSQLDialect; import org.hibernate.engine.SessionFactoryImplementor; /** * This class holds common methods and utilities that are used across the hibernate related classes */ public class HibernateUtil { private static Log log = LogFactory.getLog(HibernateUtil.class); private static Dialect dialect = null; private static Boolean isHSQLDialect = null; /** * Check and cache whether the currect dialect is HSQL or not. This is needed because some * queries are different if in the hsql world as opposed to the mysql/postgres world * * @param sessionFactory * @return true/false whether we're in hsql right now or not */ public static boolean isHSQLDialect(SessionFactory sessionFactory) { if (isHSQLDialect == null) // check and cache the dialect isHSQLDialect = HSQLDialect.class.getName().equals(getDialect(sessionFactory).getClass().getName()); return isHSQLDialect; } /** * Fetch the current Dialect of the given SessionFactory * * @param sessionFactory SessionFactory to pull the dialect from * @return Dialect of sql that this connection/session is using */ public static Dialect getDialect(SessionFactory sessionFactory) { // return cached dialect if (dialect != null) return dialect; SessionFactoryImplementor implementor = (SessionFactoryImplementor) sessionFactory; dialect = implementor.getDialect(); if (log.isDebugEnabled()) log.debug("Getting dialect for session: " + dialect); return dialect; } /** * Escapes all sql wildcards in the given string, returns the same string if it doesn't contain * any sql wildcards * * @param oldString the string in which to escape the sql wildcards * @return the string with sql wildcards escaped if any found otherwise the original string is * returned */ public static String escapeSqlWildcards(String oldString, SessionFactory sessionFactory) { //replace all sql wildcards if any if (!StringUtils.isBlank(oldString)) { String escapeCharacter = ""; try { //get the database specific escape character from the metadata escapeCharacter = sessionFactory.getCurrentSession().connection().getMetaData().getSearchStringEscape(); } catch (HibernateException e) { log.warn("Error generated", e); } catch (SQLException e) { log.warn("Error generated", e); } //insert an escape character before each sql wildcard in the search phrase return StringUtils.replaceEach(oldString, new String[] { "%", "_", "*" }, new String[] { escapeCharacter + "%", escapeCharacter + "_", escapeCharacter + "*" }); } else return oldString; } }