/* * Copyright 2014 NAVER Corp. * * Licensed under the Apache License, Version 2.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://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package com.navercorp.pinpoint.plugin.jdbc.jtds; import com.navercorp.pinpoint.bootstrap.context.DatabaseInfo; import com.navercorp.pinpoint.bootstrap.logging.PLogger; import com.navercorp.pinpoint.bootstrap.logging.PLoggerFactory; import com.navercorp.pinpoint.bootstrap.plugin.jdbc.DefaultDatabaseInfo; import com.navercorp.pinpoint.bootstrap.plugin.jdbc.JdbcUrlParserV2; import com.navercorp.pinpoint.bootstrap.plugin.jdbc.StringMaker; import com.navercorp.pinpoint.bootstrap.plugin.jdbc.UnKnownDatabaseInfo; import com.navercorp.pinpoint.common.trace.ServiceType; import java.util.ArrayList; import java.util.List; /** * @author emeroad */ public class JtdsJdbcUrlParser implements JdbcUrlParserV2 { public static final int DEFAULT_PORT = 1433; private static final String URL_PREFIX = "jdbc:jtds:sqlserver:"; private final PLogger logger = PLoggerFactory.getLogger(this.getClass()); @Override public DatabaseInfo parse(String jdbcUrl) { if (jdbcUrl == null) { logger.info("jdbcUrl may not be null"); return UnKnownDatabaseInfo.INSTANCE; } if (!jdbcUrl.startsWith(URL_PREFIX)) { logger.info("jdbcUrl has invalid prefix.(url:{}, prefix:{})", jdbcUrl, URL_PREFIX); return UnKnownDatabaseInfo.INSTANCE; } DatabaseInfo result = null; try { result = parse0(jdbcUrl); } catch (Exception e) { logger.info("JtdsJdbcUrl parse error. url: {}, Caused: {}", jdbcUrl, e.getMessage(), e); result = UnKnownDatabaseInfo.createUnknownDataBase(JtdsConstants.MSSQL, JtdsConstants.MSSQL_EXECUTE_QUERY, jdbcUrl); } return result; } private DatabaseInfo parse0(String url) { // jdbc:jtds:sqlserver://10.xx.xx.xx:1433;DatabaseName=CAFECHAT;sendStringParametersAsUnicode=false;useLOBs=false;loginTimeout=3 // jdbc:jtds:sqlserver://server[:port][/database][;property=value[;...]] // jdbc:jtds:sqlserver://server/db;user=userName;password=password StringMaker maker = new StringMaker(url); maker.lower().after(URL_PREFIX); StringMaker before = maker.after("//").before(';'); final String hostAndPortAndDataBaseString = before.value(); String databaseId = ""; String hostAndPortString = ""; final int databaseIdIndex = hostAndPortAndDataBaseString.indexOf('/'); if (databaseIdIndex != -1) { hostAndPortString = hostAndPortAndDataBaseString.substring(0, databaseIdIndex); databaseId = hostAndPortAndDataBaseString.substring(databaseIdIndex + 1, hostAndPortAndDataBaseString.length()); } else { hostAndPortString = hostAndPortAndDataBaseString; } List<String> hostList = new ArrayList<String>(1); hostList.add(hostAndPortString); // option properties search if (databaseId.isEmpty()) { databaseId = maker.next().after("databasename=").before(';').value(); } String normalizedUrl = maker.clear().before(";").value(); return new DefaultDatabaseInfo(JtdsConstants.MSSQL, JtdsConstants.MSSQL_EXECUTE_QUERY, url, normalizedUrl, hostList, databaseId); } @Override public ServiceType getServiceType() { return JtdsConstants.MSSQL; } }