package org.skywalking.apm.plugin.jdbc.connectionurl.parser;
import org.skywalking.apm.plugin.jdbc.ConnectionInfo;
/**
* {@link MysqlURLParser} parse connection url of mysql.
* <p>
* The {@link ConnectionInfo#host} be set the string between charset "//" and the first
* charset "/" after the charset "//", and {@link ConnectionInfo#databaseName} be set the
* string between the last index of "/" and the first charset "?". but one more thing, the
* {@link ConnectionInfo#hosts} be set if the host container multiple host.
*
* @author zhangxin
*/
public class MysqlURLParser extends AbstractURLParser {
private static final int DEFAULT_PORT = 3306;
private static final String DB_TYPE = "Mysql";
public MysqlURLParser(String url) {
super(url);
}
@Override
protected int[] fetchDatabaseHostsIndexRange() {
int hostLabelStartIndex = url.indexOf("//");
int hostLabelEndIndex = url.indexOf("/", hostLabelStartIndex + 2);
return new int[] {hostLabelStartIndex + 2, hostLabelEndIndex};
}
@Override
protected int[] fetchDatabaseNameIndexRange() {
int databaseStartTag = url.lastIndexOf("/");
int databaseEndTag = url.indexOf("?", databaseStartTag);
if (databaseEndTag == -1) {
databaseEndTag = url.length();
}
return new int[] {databaseStartTag + 1, databaseEndTag};
}
@Override
public ConnectionInfo parse() {
int[] hostRangeIndex = fetchDatabaseHostsIndexRange();
String hosts = url.substring(hostRangeIndex[0], hostRangeIndex[1]);
String[] hostSegment = hosts.split(",");
if (hostSegment.length > 1) {
StringBuilder sb = new StringBuilder();
for (String host : hostSegment) {
if (host.split(":").length == 1) {
sb.append(host + ":" + DEFAULT_PORT + ",");
} else {
sb.append(host + ",");
}
}
return new ConnectionInfo(DB_TYPE, sb.toString(), fetchDatabaseNameFromURL());
} else {
String[] hostAndPort = hostSegment[0].split(":");
if (hostAndPort.length != 1) {
return new ConnectionInfo(DB_TYPE, hostAndPort[0], Integer.valueOf(hostAndPort[1]), fetchDatabaseNameFromURL());
} else {
return new ConnectionInfo(DB_TYPE, hostAndPort[0], DEFAULT_PORT, fetchDatabaseNameFromURL());
}
}
}
}