in HSQL/src/org/hsqldb1/DatabaseURL.java [122:267]
public static HsqlProperties parseURL(String url, boolean hasPrefix) {
String urlImage = url.toLowerCase(Locale.ENGLISH);
HsqlProperties props = new HsqlProperties();
HsqlProperties extraProps = null;
String arguments = null;
int pos = 0;
if (hasPrefix) {
if (urlImage.startsWith(S_URL_PREFIX)) {
pos = S_URL_PREFIX.length();
} else {
return props;
}
}
String type = null;
String host;
int port = 0;
String database;
String path;
boolean isNetwork = false;
props.setProperty("url", url);
int semicolpos = url.indexOf(';', pos);
if (semicolpos < 0) {
semicolpos = url.length();
} else {
arguments = urlImage.substring(semicolpos + 1, urlImage.length());
extraProps = HsqlProperties.delimitedArgPairsToProps(arguments,
"=", ";", null);
//todo - check if properties have valid names / values
props.addProperties(extraProps);
}
if (semicolpos == pos + 1 && urlImage.startsWith(S_DOT, pos)) {
type = S_DOT;
} else if (urlImage.startsWith(S_MEM, pos)) {
type = S_MEM;
} else if (urlImage.startsWith(S_FILE, pos)) {
type = S_FILE;
} else if (urlImage.startsWith(S_RES, pos)) {
type = S_RES;
} else if (urlImage.startsWith(S_ALIAS, pos)) {
type = S_ALIAS;
} else if (urlImage.startsWith(S_HSQL, pos)) {
type = S_HSQL;
port = ServerConstants.SC_DEFAULT_HSQL_SERVER_PORT;
isNetwork = true;
} else if (urlImage.startsWith(S_HSQLS, pos)) {
type = S_HSQLS;
port = ServerConstants.SC_DEFAULT_HSQLS_SERVER_PORT;
isNetwork = true;
} else if (urlImage.startsWith(S_HTTP, pos)) {
type = S_HTTP;
port = ServerConstants.SC_DEFAULT_HTTP_SERVER_PORT;
isNetwork = true;
} else if (urlImage.startsWith(S_HTTPS, pos)) {
type = S_HTTPS;
port = ServerConstants.SC_DEFAULT_HTTPS_SERVER_PORT;
isNetwork = true;
}
if (type == null) {
type = S_FILE;
} else if (type == S_DOT) {
type = S_MEM;
// keep pos
} else {
pos += type.length();
}
props.setProperty("connection_type", type);
if (isNetwork) {
int slashpos = url.indexOf('/', pos);
if (slashpos < pos || slashpos > semicolpos) {
slashpos = semicolpos;
}
int colonpos = url.indexOf(':', pos);
if (colonpos < pos || colonpos > slashpos) {
colonpos = slashpos;
} else {
try {
port = Integer.parseInt(url.substring(colonpos + 1,
slashpos));
} catch (NumberFormatException e) {
return null;
}
}
host = urlImage.substring(pos, colonpos);
int secondslashpos = url.lastIndexOf('/', semicolpos);
if (secondslashpos < pos) {
path = "/";
database = "";
} else if (secondslashpos == slashpos) {
path = "/";
database = urlImage.substring(secondslashpos + 1, semicolpos);
} else {
path = url.substring(slashpos, secondslashpos);
database = urlImage.substring(secondslashpos + 1, semicolpos);
}
props.setProperty("port", port);
props.setProperty("host", host);
props.setProperty("path", path);
if (extraProps != null) {
String filePath = extraProps.getProperty("filepath");
if (filePath != null && database.length() != 0) {
database += ";" + filePath;
}
}
} else {
if (type == S_MEM) {
database = urlImage.substring(pos, semicolpos);
} else if (type == S_RES) {
database = url.substring(pos, semicolpos);
if (database.indexOf('/') != 0) {
database = '/' + database;
}
} else {
database = url.substring(pos, semicolpos);
}
if (database.length() == 0) {
return null;
}
}
props.setProperty("database", database);
return props;
}