-
Notifications
You must be signed in to change notification settings - Fork 2
Expand file tree
/
Copy pathCsv2JdbcDriver.java
More file actions
135 lines (110 loc) · 3.96 KB
/
Csv2JdbcDriver.java
File metadata and controls
135 lines (110 loc) · 3.96 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
package com.mageddo.csv2jdbc;
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.Arrays;
import java.util.Collections;
import java.util.LinkedHashSet;
import java.util.List;
import java.util.Map;
import java.util.Optional;
import java.util.Properties;
import java.util.Set;
import java.util.logging.Logger;
public class Csv2JdbcDriver implements Driver {
public static final String PROP_DELEGATE_DRIVER_CLASSNAME = "delegateDriverClassName";
public static final String PROP_STM_BUFFER_SIZE = "stmBufferSize";
public static final Set<String> PROPS = new LinkedHashSet<>(Arrays.asList(
PROP_DELEGATE_DRIVER_CLASSNAME,
PROP_STM_BUFFER_SIZE
));
public static final String URL_PREFIX = "jdbc:csv2jdbc:";
static {
try {
DriverManager.registerDriver(new Csv2JdbcDriver());
} catch (SQLException e) {
throw new RuntimeException("Driver registering failed: " + e.getMessage());
}
}
private Driver delegate;
@Override
public Connection connect(String url, Properties info) throws SQLException {
final Map<String, List<String>> params = UrlUtils.parseUrlQueryParams(url);
final String delegateDriverClassName = getOrDefault(
params,
PROP_DELEGATE_DRIVER_CLASSNAME,
info.getProperty(PROP_DELEGATE_DRIVER_CLASSNAME,"org.h2.Driver")
);
this.delegate = Reflections.createInstance(delegateDriverClassName);
final String delegateUrl = toDelegateUrl(url);
final String buffSize = Objects.mapOrNull(getOrDefault(params, PROP_STM_BUFFER_SIZE), (it) -> {
System.setProperty("csv2jdbc.buffSize", it);
return it;
});
Log.log(
"status=createdProxyDriver, delegateDriverClassName=%s, buffSize=%s, delegateUrl=%s, "
+ "version=%s%n",
delegateDriverClassName, buffSize, delegateUrl, Version.getVersion()
);
return new Csv2JdbcConnection(this.delegate.connect(delegateUrl, info));
}
private String getOrDefault(Map<String, List<String>> params, String k) {
return getOrDefault(params, k, null);
}
private String getOrDefault(Map<String, List<String>> params, String k, String def) {
return Optional.ofNullable(params.get(k))
.orElse(Collections.emptyList())
.stream()
.findFirst()
.orElse(def);
}
private static String toDelegateUrl(String url) {
final StringBuilder newUrl = new StringBuilder(
UrlUtils.findBody(url.replace(URL_PREFIX, "jdbc:")));
final Map<String, List<String>> params = UrlUtils.parseUrlQueryParams(url);
PROPS.forEach(params::remove);
if (!params.isEmpty()) {
newUrl.append('?');
}
params.forEach((k, v) -> {
for (final String val : v) {
newUrl.append(UrlUtils.encode(k));
newUrl.append('=');
newUrl.append(UrlUtils.encode(val));
newUrl.append('&');
}
});
return newUrl.toString();
}
@Override
public boolean acceptsURL(String url) {
return url.startsWith(URL_PREFIX);
}
@Override
public DriverPropertyInfo[] getPropertyInfo(String url, Properties info) throws SQLException {
// final DriverPropertyInfo[] source = this.delegate.getPropertyInfo(url, info);
// final DriverPropertyInfo[] props = new DriverPropertyInfo[source.length + 1];
// System.arraycopy(source, 0, props, 0, source.length);
// props[source.length] = new DriverPropertyInfo("vendor", "csv2jdbc");
return this.delegate.getPropertyInfo(url, info);
}
@Override
public int getMajorVersion() {
return this.delegate.getMajorVersion();
}
@Override
public int getMinorVersion() {
return this.delegate.getMinorVersion();
}
@Override
public boolean jdbcCompliant() {
return this.delegate.jdbcCompliant();
}
@Override
public Logger getParentLogger() throws SQLFeatureNotSupportedException {
return this.delegate.getParentLogger();
}
}