Skip to content

Commit

Permalink
feat: support external driver; support mysql connector
Browse files Browse the repository at this point in the history
  • Loading branch information
arjenzhou committed Nov 26, 2021
1 parent 75f7ba2 commit a9a869b
Show file tree
Hide file tree
Showing 8 changed files with 109 additions and 20 deletions.
50 changes: 45 additions & 5 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -22,31 +22,71 @@ ping is a universal data source connection test project.
| --clientPrincipal | client principal | foo/bar@XAB.DE | false |
| --krb5Path | krb5.conf file path | /etc/krb5.conf | false |
| --driverFolder | custom driver folder | ~/drivers/custom/ | false |
| --driverClass | external driver class | /Users/foo/bar | false |

## Builtin Driver
## Common Driver

ping have some builtin drivers

### PostgreSQL

required parameters: type, url, sql, username, password
```
java -jar ping.jar --type postgresql --url "jdbc:postgresql://127.0.0.1:5432/postgres" --username postgres --password password --sql "SELECT 1"
```
### PrestoDB

required addon parameters which used to auth with Kerberos or LDAP

```
java -jar ping.jar --type prestodb --url "jdbc:presto://127.0.0.1:8081/hive/bi" --sql "SELECT 1"
```

## Custom Driver
```
java -jar ping.jar --type prestodb --username hive --url "jdbc:presto://127.0.0.1:7778?SSL=true&KerberosKeytabPath=./impala.keytab&KerberosPrincipal=impala/foo.org@BAR.COM&SSLTrustStorePath=./keystore.jks&SSLTrustStorePassword=password&KerberosRemoteServiceName=impala&KerberosConfigPath=./krb5.conf" --sql "SELECT 1"
```

## Builtin Driver

ping also support external drivers, located in [drivers](src/main/resources/drivers)
ping also support builtin drivers, located in [drivers](src/main/resources/drivers)

### MySQL

Usage of mysql if something like common drivers. type, url, sql, username are required, password if needed

```
java -jar ping.jar --type mysql --username foo --password bar --url "jdbc:mysql://127.0.0.1:3306/abc" --sql "SELECT 1"
```
### Hive

By default, krb5.conf is located at `/etc/krb5.conf`, and not required.

```
java -jar ping.jar --type hive --url "jdbc:hive2://127.0.0.1:21050/test;auth=noSasl" --sql "SELECT 1"
```

```
java -jar ping.jar --type hive --url "jdbc:hive2://127.0.0.1:2181,127.0.0.2:2181,127.0.0.3:2181/foo;serviceDiscoveryMode=zooKeeper;zooKeeperNamespace=hiveserver2;principal=hive/_HOST@BAR" --sql "SELECT * FROM FOO.BAR" --keytabPath ./abc.keytab --clientPrincipal foo/bar@ABC.COM
```
### Impala

Impala is roughly same with Hive

### Custom
```
java -jar ping.jar --url jdbc:impala://127.0.0.1:21050/;authType=noSasl --username foo --type impala --sql "SELECT 1"
```
```
java -jar ping.jar --type impala --url "jdbc:impala://127.0.0.1:21050/;AuthMech=1;KrbRealm=ABCD.COM;KrbHostFQDN=_HOST;KrbServiceName=impala;KrbAuthType=0" --sql "SELECT 1" --keytabPath foo.keytab --clientPrincipal foo/bar@ABC.COM --krb5Path krb5.conf
```

## External Driver

Using custom driver, `--driverFolder` is required to specify which directory to load drivers.
Using custom driver, `--driverFolder` and `--driverClass` is required to specify which directory to load drivers.

For example:
```
java -jar ping.ar --type external --username dbadmin --password dbadmin --url "jdbc:vertica://127.0.0.1:5433/vmart" --sql "SELECT * FROM "online_sales"."call_center_dimension" LIMIT 3" --driverFolder "path_to_folder" --driverClass "com.vertica.jdbc.Driver"
```
## How to add Connector

ping use SPI to load connectors, you can add your connector in your `META-INF/ping/service` file.
2 changes: 1 addition & 1 deletion pom.xml
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@

<groupId>de.xab</groupId>
<artifactId>ping</artifactId>
<version>1.0.0</version>
<version>1.0.2</version>

<properties>
<maven.compiler.source>8</maven.compiler.source>
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
package de.xab.ping.connector.impl;

public class BuiltinConnector extends CustomConnector {

@Override
protected String parseDriver(String url, String driverFolder) {
return "drivers/" + url.split(":")[1] + "/";
}
}
6 changes: 6 additions & 0 deletions src/main/java/de/xab/ping/connector/impl/CustomConnector.java
Original file line number Diff line number Diff line change
Expand Up @@ -35,6 +35,12 @@ public class CustomConnector extends JDBCConnector {

@Override
protected Connection getConnection(String url, String username, String password, Properties properties) throws SQLException {
if (username != null) {
properties.put("user", username);
}
if (password != null) {
properties.put("password", password);
}
String driverClass = getDriverClass(properties);
String driverFolder = (String) properties.get(DRIVER_FOLDER);
Driver driver = loadDriver(url, driverFolder, driverClass);
Expand Down
32 changes: 32 additions & 0 deletions src/main/java/de/xab/ping/connector/impl/ExternalConnector.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,32 @@
package de.xab.ping.connector.impl;

import java.io.File;
import java.io.IOException;
import java.net.MalformedURLException;
import java.net.URI;
import java.net.URL;
import java.net.URLClassLoader;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.util.List;
import java.util.stream.Collectors;

public class ExternalConnector extends CustomConnector {
protected ClassLoader initClassloader(String url, String driverFolder) throws IOException {
List<URL> list;
URI uri = new File(driverFolder).toURI();
Path dirPath = Paths.get(uri);
list = Files.list(dirPath).map(path -> {
try {
return path.toUri().toURL();
} catch (MalformedURLException e) {
e.printStackTrace();
return null;
}
}).collect(Collectors.toList());
URL[] array = new URL[]{};
array = list.toArray(array);
return new URLClassLoader(array);
}
}
15 changes: 2 additions & 13 deletions src/main/java/de/xab/ping/connector/impl/HiveConnector.java
Original file line number Diff line number Diff line change
Expand Up @@ -17,26 +17,20 @@

import static de.xab.ping.common.Constants.*;

public class HiveConnector extends CustomConnector {
public class HiveConnector extends BuiltinConnector {
Logger logger = LoggerFactory.getLogger("PING");

@Override
public boolean test(String url, String username, String password, String sql, Properties properties) {
try {
Context context = new Context(url, username, password, sql, properties);
return exec(context, (funcContext -> {
if (username != null) {
properties.put("user", username);
}
if (password != null) {
properties.put("password", password);
}
try (Connection connection = getConnection(url, null, null, properties);
Statement statement = connection.createStatement();
ResultSet resultSet = statement.executeQuery(sql)) {
return printResultSet(resultSet);
} catch (SQLException e) {
logger.error(Throwables.getStackTraceAsString(e));
logger.error(Throwables.getStackTraceAsString(e));
return false;
}
}));
Expand Down Expand Up @@ -64,9 +58,4 @@ protected boolean exec(Context context, Function<Context, Boolean> function) thr
}
return false;
}

@Override
protected String parseDriver(String url, String driverFolder) {
return "drivers/" + url.split(":")[1] + "/";
}
}
11 changes: 11 additions & 0 deletions src/main/java/de/xab/ping/connector/impl/MySQLConnector.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
package de.xab.ping.connector.impl;

import java.util.Properties;

public class MySQLConnector extends BuiltinConnector {

@Override
protected String getDriverClass(Properties properties) {
return "com.mysql.cj.jdbc.Driver";
}
}
Original file line number Diff line number Diff line change
@@ -1,5 +1,7 @@
external=de.xab.ping.connector.impl.ExternalConnector
h2=de.xab.ping.connector.impl.H2Connector
postgresql=de.xab.ping.connector.impl.PostgreSQLConnector
hive=de.xab.ping.connector.impl.HiveConnector
impala=de.xab.ping.connector.impl.ImpalaConnector
prestodb=de.xab.ping.connector.impl.PrestoDBConnector
prestodb=de.xab.ping.connector.impl.PrestoDBConnector
mysql=de.xab.ping.connector.impl.MySQLConnector

0 comments on commit a9a869b

Please sign in to comment.