
com.facebook.presto.jdbc.PrestoDriver Maven / Gradle / Ivy
/*
* 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.facebook.presto.jdbc;
import com.facebook.presto.jdbc.internal.guava.base.Throwables;
import java.io.Closeable;
import java.net.URI;
import java.net.URISyntaxException;
import java.sql.Connection;
import java.sql.Driver;
import java.sql.DriverManager;
import java.sql.DriverPropertyInfo;
import java.sql.SQLException;
import java.sql.SQLFeatureNotSupportedException;
import java.util.Properties;
import java.util.logging.Logger;
import static com.facebook.presto.jdbc.internal.guava.base.Strings.isNullOrEmpty;
import static java.lang.String.format;
public class PrestoDriver
implements Driver, Closeable
{
static final int VERSION_MAJOR = 1;
static final int VERSION_MINOR = 0;
static final int JDBC_VERSION_MAJOR = 4;
static final int JDBC_VERSION_MINOR = 1;
static final String DRIVER_NAME = "Presto JDBC Driver";
static final String DRIVER_VERSION = VERSION_MAJOR + "." + VERSION_MINOR;
private static final DriverPropertyInfo[] DRIVER_PROPERTY_INFOS = {};
private static final String JDBC_URL_START = "jdbc:";
private static final String DRIVER_URL_START = "jdbc:presto:";
private static final String USER_PROPERTY = "user";
private final QueryExecutor queryExecutor;
static {
JettyLogging.useJavaUtilLogging();
try {
DriverManager.registerDriver(new PrestoDriver());
}
catch (SQLException e) {
throw Throwables.propagate(e);
}
}
public PrestoDriver()
{
this.queryExecutor = QueryExecutor.create(DRIVER_NAME + "/" + DRIVER_VERSION);
}
@Override
public void close()
{
queryExecutor.close();
}
@Override
public Connection connect(String url, Properties info)
throws SQLException
{
if (!acceptsURL(url)) {
return null;
}
String user = info.getProperty(USER_PROPERTY);
if (isNullOrEmpty(user)) {
throw new SQLException(format("Username property (%s) must be set", USER_PROPERTY));
}
return new PrestoConnection(parseDriverUrl(url), user, queryExecutor);
}
@Override
public boolean acceptsURL(String url)
throws SQLException
{
return url.startsWith(DRIVER_URL_START);
}
@Override
public DriverPropertyInfo[] getPropertyInfo(String url, Properties info)
throws SQLException
{
return DRIVER_PROPERTY_INFOS;
}
@Override
public int getMajorVersion()
{
return VERSION_MAJOR;
}
@Override
public int getMinorVersion()
{
return VERSION_MINOR;
}
@Override
public boolean jdbcCompliant()
{
// TODO: pass compliance tests
return false;
}
@Override
public Logger getParentLogger()
throws SQLFeatureNotSupportedException
{
// TODO: support java.util.Logging
throw new SQLFeatureNotSupportedException();
}
private static URI parseDriverUrl(String url)
throws SQLException
{
URI uri;
try {
uri = new URI(url.substring(JDBC_URL_START.length()));
}
catch (URISyntaxException e) {
throw new SQLException("Invalid JDBC URL: " + url, e);
}
if (isNullOrEmpty(uri.getHost())) {
throw new SQLException("No host specified: " + url);
}
if (uri.getPort() == -1) {
throw new SQLException("No port number specified: " + url);
}
if ((uri.getPort() < 1) || (uri.getPort() > 65535)) {
throw new SQLException("Invalid port number: " + url);
}
return uri;
}
}
© 2015 - 2025 Weber Informatics LLC | Privacy Policy