Mercurial > dive4elements > river
view flys-artifacts/src/main/java/de/intevation/flys/utils/MapUtils.java @ 5193:fb9dcc68b9c2
Possible fix for flys/1202. Initial SQL statements can now be issued at connection creation.
author | Sascha L. Teichmann <teichmann@intevation.de> |
---|---|
date | Thu, 07 Mar 2013 17:39:25 +0100 |
parents | 48b231a02d3a |
children | 9e11599266c8 |
line wrap: on
line source
package de.intevation.flys.utils; import java.util.regex.Matcher; import java.util.regex.Pattern; import org.apache.log4j.Logger; import org.hibernate.impl.SessionFactoryImpl; import de.intevation.flys.backend.SessionFactoryProvider; public class MapUtils { private static final Logger logger = Logger.getLogger(MapUtils.class); public static final Pattern DB_URL_PATTERN = Pattern.compile("(.*)\\/\\/(.*):([0-9]+)\\/([a-zA-Z_-]+)"); public static final Pattern DB_PSQL_URL_PATTERN = Pattern.compile("(.*)\\/\\/(.*):([0-9]+)\\/([a-zA-Z0-9_-]+)"); /** * This method returns a connection string for databases used by * Mapserver's Mapfile. * * @return A connection string for Mapserver. */ public static String getConnection() { SessionFactoryImpl sf = (SessionFactoryImpl) SessionFactoryProvider.getSessionFactory(); String user = SessionFactoryProvider.getUser(sf); String pass = SessionFactoryProvider.getPass(sf); String url = SessionFactoryProvider.getURL(sf); logger.debug("Parse connection url: " + url); Matcher m = DB_URL_PATTERN.matcher(url); if (!m.matches()) { logger.warn("Could not parse Connection string." + "Try to parse PostgreSQL string."); // maybe this is a PostgreSQL connection... return getPostgreSQLConnection(); } logger.debug("Groups for connection string: " + m.groupCount()); int groups = m.groupCount(); if (logger.isDebugEnabled()) { for (int i = 0; i <= groups; i++) { logger.debug("Group " + i + ": " + m.group(i)); } } String connection = null; if (FLYSUtils.isUsingOracle()) { if (groups < 3) { logger.warn("Could only partially parse connection string."); return null; } String host = m.group(2); String port = m.group(3); connection = user + "/" + pass + "@" + host; } else { if (groups < 4) { logger.warn("Could only partially parse connection string."); return null; } String host = m.group(2); String port = m.group(3); String db = m.group(4); connection = createConnectionString(user, pass, host, db, port); } return connection; } public static String createConnectionString( String user, String pass, String host, String db, String port ) { StringBuilder sb = new StringBuilder(); sb.append("dbname=").append(db); sb.append(" host='").append(host).append("'"); sb.append(" user=").append(user); sb.append(" port=").append(port); // XXX: We need to escape this somehow. sb.append(" password='").append(pass).append("'"); sb.append(" sslmode=disable"); return sb.toString(); } protected static String getPostgreSQLConnection() { SessionFactoryImpl sf = (SessionFactoryImpl) SessionFactoryProvider.getSessionFactory(); String user = SessionFactoryProvider.getUser(sf); String pass = SessionFactoryProvider.getPass(sf); String url = SessionFactoryProvider.getURL(sf); Matcher m = DB_PSQL_URL_PATTERN.matcher(url); if (!m.matches()) { logger.warn("Could not parse PostgreSQL Connection string."); return null; } int groups = m.groupCount(); logger.debug("Groups for PostgreSQL connection string: " + groups); if (logger.isDebugEnabled()) { for (int i = 0; i <= groups; i++) { logger.debug("Group " + i + ": " + m.group(i)); } } String connection = null; if (groups < 4) { logger.warn("Could only partially parse connection string."); return null; } String host = m.group(2); String port = m.group(3); String db = m.group(4); connection = createConnectionString(user, pass, host, db, port); logger.debug("Created connection: '" + connection + "'"); return connection; } public static String getConnectionType() { return FLYSUtils.isUsingOracle() ? "oraclespatial" : "postgis"; } }