embulk-output-sqlserver 0.7.8 → 0.7.9
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/README.md +2 -0
- data/classpath/embulk-output-jdbc-0.7.9.jar +0 -0
- data/classpath/embulk-output-sqlserver-0.7.9.jar +0 -0
- data/src/main/java/org/embulk/output/SQLServerOutputPlugin.java +20 -1
- data/src/main/java/org/embulk/output/sqlserver/NativeBatchInsert.java +3 -2
- data/src/main/java/org/embulk/output/sqlserver/SQLServerOutputConnection.java +21 -39
- data/src/main/java/org/embulk/output/sqlserver/SQLServerOutputConnector.java +26 -2
- metadata +4 -4
- data/classpath/embulk-output-jdbc-0.7.8.jar +0 -0
- data/classpath/embulk-output-sqlserver-0.7.8.jar +0 -0
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 760819b9d6fa3e94d1719d1730e4b5b7564b6134
|
4
|
+
data.tar.gz: 2867fe096261c86be930712a61becaa633bf30ac
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: b40606a2db66bd7725dee518ff2d69041cccc59ddf3d0125d854060d49aab17e9db19d1192b8d6731092e3a6f49181e3f503cf5d3934d38ebccb8898e960d95d
|
7
|
+
data.tar.gz: c7f7bad7eddc9fafbdfa0e37bca3f4dfcf24d65eec2ebf19b1d9b277f60c9328492897fb0da07d6f06d9f1098f7df55498fc8b8943968909dfb227113c24e221
|
data/README.md
CHANGED
@@ -22,6 +22,8 @@ embulk "-J-Djava.library.path=C:\drivers" run input-sqlserver.yml
|
|
22
22
|
- **password**: database login password (string, default: "")
|
23
23
|
- **instance**: destination instance name (string, default: use the default instance)
|
24
24
|
- **database**: destination database name (string, default: use the default database)
|
25
|
+
- **schema**: destination schema name (string, optional)
|
26
|
+
- **temp_schema**: schema name for intermediate tables. by default, intermediate tables will be created in the same schema as destination table. (string, optional)
|
25
27
|
- **url**: URL of the JDBC connection (string, optional)
|
26
28
|
- **table**: destination table name (string, required)
|
27
29
|
- **options**: extra connection properties (hash, default: {})
|
Binary file
|
Binary file
|
@@ -8,8 +8,10 @@ import org.embulk.config.ConfigDefault;
|
|
8
8
|
import org.embulk.config.ConfigException;
|
9
9
|
import org.embulk.output.jdbc.AbstractJdbcOutputPlugin;
|
10
10
|
import org.embulk.output.jdbc.BatchInsert;
|
11
|
+
import org.embulk.output.jdbc.JdbcOutputConnection;
|
11
12
|
import org.embulk.output.jdbc.MergeConfig;
|
12
13
|
import org.embulk.output.jdbc.StandardBatchInsert;
|
14
|
+
import org.embulk.output.jdbc.TableIdentifier;
|
13
15
|
import org.embulk.output.jdbc.setter.ColumnSetterFactory;
|
14
16
|
import org.embulk.output.sqlserver.InsertMethod;
|
15
17
|
import org.embulk.output.sqlserver.NativeBatchInsert;
|
@@ -67,6 +69,14 @@ public class SQLServerOutputPlugin
|
|
67
69
|
@ConfigDefault("\"\"")
|
68
70
|
public Optional<String> getPassword();
|
69
71
|
|
72
|
+
@Config("schema")
|
73
|
+
@ConfigDefault("null")
|
74
|
+
public Optional<String> getSchema();
|
75
|
+
|
76
|
+
@Config("temp_schema")
|
77
|
+
@ConfigDefault("null")
|
78
|
+
public Optional<String> getTempSchema();
|
79
|
+
|
70
80
|
@Config("insert_method")
|
71
81
|
@ConfigDefault("\"normal\"")
|
72
82
|
public InsertMethod getInsertMethod();
|
@@ -139,7 +149,7 @@ public class SQLServerOutputPlugin
|
|
139
149
|
|
140
150
|
UrlAndProperties urlProps = getUrlAndProperties(sqlServerTask, useJtdsDriver);
|
141
151
|
logger.info("Connecting to {} options {}", urlProps.getUrl(), getPropsWithMaskedSecret(urlProps));
|
142
|
-
return new SQLServerOutputConnector(urlProps.getUrl(), urlProps.getProps(),
|
152
|
+
return new SQLServerOutputConnector(urlProps.getUrl(), urlProps.getProps(), sqlServerTask.getSchema().orNull());
|
143
153
|
}
|
144
154
|
|
145
155
|
private UrlAndProperties getUrlAndProperties(SQLServerPluginTask sqlServerTask, boolean useJtdsDriver)
|
@@ -231,6 +241,15 @@ public class SQLServerOutputPlugin
|
|
231
241
|
return new UrlAndProperties(url, props);
|
232
242
|
}
|
233
243
|
|
244
|
+
@Override
|
245
|
+
protected TableIdentifier buildIntermediateTableId(JdbcOutputConnection con, PluginTask task, String tableName) {
|
246
|
+
SQLServerPluginTask sqlServerTask = (SQLServerPluginTask) task;
|
247
|
+
// replace mode doesn't support temp_schema because sp_rename cannot change schema of table
|
248
|
+
if (sqlServerTask.getTempSchema().isPresent() && sqlServerTask.getMode() != Mode.REPLACE) {
|
249
|
+
return new TableIdentifier(null, sqlServerTask.getTempSchema().get(), tableName);
|
250
|
+
}
|
251
|
+
return super.buildIntermediateTableId(con, task, tableName);
|
252
|
+
}
|
234
253
|
|
235
254
|
@Override
|
236
255
|
protected BatchInsert newBatchInsert(PluginTask task, Optional<MergeConfig> mergeConfig) throws IOException, SQLException
|
@@ -12,6 +12,7 @@ import org.embulk.output.jdbc.BatchInsert;
|
|
12
12
|
import org.embulk.output.jdbc.JdbcColumn;
|
13
13
|
import org.embulk.output.jdbc.JdbcSchema;
|
14
14
|
import org.embulk.output.jdbc.StandardBatchInsert;
|
15
|
+
import org.embulk.output.jdbc.TableIdentifier;
|
15
16
|
import org.embulk.output.jdbc.TimestampFormat;
|
16
17
|
import org.embulk.output.sqlserver.nativeclient.NativeClientWrapper;
|
17
18
|
import org.embulk.spi.Exec;
|
@@ -58,10 +59,10 @@ public class NativeBatchInsert implements BatchInsert
|
|
58
59
|
|
59
60
|
|
60
61
|
@Override
|
61
|
-
public void prepare(
|
62
|
+
public void prepare(TableIdentifier loadTable, JdbcSchema insertSchema) throws SQLException
|
62
63
|
{
|
63
64
|
columnCount = insertSchema.getCount();
|
64
|
-
client.open(server, port, instance, database, user, password, loadTable);
|
65
|
+
client.open(server, port, instance, database, user, password, loadTable.getTableName());
|
65
66
|
|
66
67
|
formats = new DateFormat[insertSchema.getCount()];
|
67
68
|
for (int i = 0; i < insertSchema.getCount(); i++) {
|
@@ -10,6 +10,7 @@ import org.embulk.output.jdbc.JdbcColumn;
|
|
10
10
|
import org.embulk.output.jdbc.JdbcOutputConnection;
|
11
11
|
import org.embulk.output.jdbc.JdbcSchema;
|
12
12
|
import org.embulk.output.jdbc.MergeConfig;
|
13
|
+
import org.embulk.output.jdbc.TableIdentifier;
|
13
14
|
|
14
15
|
public class SQLServerOutputConnection
|
15
16
|
extends JdbcOutputConnection
|
@@ -22,13 +23,18 @@ public class SQLServerOutputConnection
|
|
22
23
|
}
|
23
24
|
|
24
25
|
@Override
|
25
|
-
protected String buildRenameTableSql(
|
26
|
+
protected String buildRenameTableSql(TableIdentifier fromTable, TableIdentifier toTable)
|
26
27
|
{
|
28
|
+
// sp_rename cannot change schema of table
|
27
29
|
StringBuilder sb = new StringBuilder();
|
28
30
|
sb.append("EXEC sp_rename ");
|
29
|
-
|
31
|
+
if (fromTable.getSchemaName() == null) {
|
32
|
+
sb.append(quoteIdentifierString(fromTable.getTableName()));
|
33
|
+
} else {
|
34
|
+
sb.append(quoteIdentifierString(fromTable.getSchemaName() + "." + fromTable.getTableName()));
|
35
|
+
}
|
30
36
|
sb.append(", ");
|
31
|
-
sb.append(quoteIdentifierString(toTable));
|
37
|
+
sb.append(quoteIdentifierString(toTable.getTableName()));
|
32
38
|
sb.append(", 'OBJECT'");
|
33
39
|
return sb.toString();
|
34
40
|
}
|
@@ -55,53 +61,29 @@ public class SQLServerOutputConnection
|
|
55
61
|
}
|
56
62
|
|
57
63
|
@Override
|
58
|
-
public void dropTableIfExists(
|
64
|
+
public void dropTableIfExists(TableIdentifier table) throws SQLException
|
59
65
|
{
|
60
|
-
if (tableExists(
|
61
|
-
dropTable(
|
66
|
+
if (tableExists(table)) {
|
67
|
+
dropTable(table);
|
62
68
|
}
|
63
69
|
}
|
64
70
|
|
65
71
|
@Override
|
66
|
-
protected void dropTableIfExists(Statement stmt,
|
72
|
+
protected void dropTableIfExists(Statement stmt, TableIdentifier table) throws SQLException
|
67
73
|
{
|
68
|
-
if (tableExists(
|
69
|
-
dropTable(stmt,
|
74
|
+
if (tableExists(table)) {
|
75
|
+
dropTable(stmt, table);
|
70
76
|
}
|
71
77
|
}
|
72
78
|
|
73
79
|
@Override
|
74
|
-
public void createTableIfNotExists(
|
75
|
-
{
|
76
|
-
if (!tableExists(tableName)) {
|
77
|
-
createTable(tableName, schema);
|
78
|
-
}
|
79
|
-
}
|
80
|
-
|
81
|
-
public void createTable(String tableName, JdbcSchema schema) throws SQLException
|
80
|
+
public void createTableIfNotExists(TableIdentifier table, JdbcSchema schema) throws SQLException
|
82
81
|
{
|
83
|
-
|
84
|
-
|
85
|
-
String sql = buildCreateTableSql(tableName, schema);
|
86
|
-
executeUpdate(stmt, sql);
|
87
|
-
commitIfNecessary(connection);
|
88
|
-
} catch (SQLException ex) {
|
89
|
-
throw safeRollback(connection, ex);
|
90
|
-
} finally {
|
91
|
-
stmt.close();
|
82
|
+
if (!tableExists(table)) {
|
83
|
+
createTable(table, schema);
|
92
84
|
}
|
93
85
|
}
|
94
86
|
|
95
|
-
protected String buildCreateTableSql(String name, JdbcSchema schema)
|
96
|
-
{
|
97
|
-
StringBuilder sb = new StringBuilder();
|
98
|
-
|
99
|
-
sb.append("CREATE TABLE ");
|
100
|
-
quoteIdentifierString(sb, name);
|
101
|
-
sb.append(buildCreateTableSchemaSql(schema));
|
102
|
-
return sb.toString();
|
103
|
-
}
|
104
|
-
|
105
87
|
private static final String[] SIMPLE_TYPE_NAMES = {
|
106
88
|
"BIT", "FLOAT",
|
107
89
|
};
|
@@ -116,12 +98,12 @@ public class SQLServerOutputConnection
|
|
116
98
|
}
|
117
99
|
|
118
100
|
@Override
|
119
|
-
protected String buildCollectMergeSql(List<
|
101
|
+
protected String buildCollectMergeSql(List<TableIdentifier> fromTables, JdbcSchema schema, TableIdentifier toTable, MergeConfig mergeConfig) throws SQLException
|
120
102
|
{
|
121
103
|
StringBuilder sb = new StringBuilder();
|
122
104
|
|
123
105
|
sb.append("MERGE INTO ");
|
124
|
-
sb.append(
|
106
|
+
sb.append(quoteTableIdentifier(toTable));
|
125
107
|
sb.append(" AS T");
|
126
108
|
sb.append(" USING (");
|
127
109
|
for (int i = 0; i < fromTables.size(); i++) {
|
@@ -129,7 +111,7 @@ public class SQLServerOutputConnection
|
|
129
111
|
sb.append(" SELECT ");
|
130
112
|
sb.append(buildColumns(schema, ""));
|
131
113
|
sb.append(" FROM ");
|
132
|
-
sb.append(
|
114
|
+
sb.append(quoteTableIdentifier(fromTables.get(i)));
|
133
115
|
}
|
134
116
|
sb.append(") AS S");
|
135
117
|
sb.append(" ON (");
|
@@ -1,15 +1,22 @@
|
|
1
1
|
package org.embulk.output.sqlserver;
|
2
2
|
|
3
|
-
import org.embulk.output.jdbc.JdbcOutputConnector;
|
4
|
-
|
5
3
|
import java.sql.Connection;
|
6
4
|
import java.sql.DriverManager;
|
5
|
+
import java.sql.PreparedStatement;
|
6
|
+
import java.sql.ResultSet;
|
7
7
|
import java.sql.SQLException;
|
8
8
|
import java.util.Properties;
|
9
9
|
|
10
|
+
import org.embulk.output.jdbc.JdbcOutputConnector;
|
11
|
+
import org.embulk.spi.Exec;
|
12
|
+
import org.slf4j.Logger;
|
13
|
+
|
14
|
+
|
10
15
|
public class SQLServerOutputConnector
|
11
16
|
implements JdbcOutputConnector
|
12
17
|
{
|
18
|
+
private final Logger logger = Exec.getLogger(getClass());
|
19
|
+
|
13
20
|
private final String url;
|
14
21
|
private final Properties properties;
|
15
22
|
private final String schemaName;
|
@@ -30,6 +37,23 @@ public class SQLServerOutputConnector
|
|
30
37
|
throw new SQLException("Invalid url : " + url);
|
31
38
|
}
|
32
39
|
|
40
|
+
String schemaName = this.schemaName;
|
41
|
+
if (schemaName == null) {
|
42
|
+
// get default schema name for user (Connection#getSchema won't work)
|
43
|
+
try {
|
44
|
+
try (PreparedStatement statement = c.prepareStatement("SELECT default_schema_name FROM sys.database_principals WHERE name = ?")) {
|
45
|
+
statement.setString(1, properties.getProperty("user"));
|
46
|
+
try (ResultSet rs = statement.executeQuery()) {
|
47
|
+
if (rs.next()) {
|
48
|
+
schemaName = rs.getString(1);
|
49
|
+
}
|
50
|
+
}
|
51
|
+
}
|
52
|
+
} catch (SQLException e) {
|
53
|
+
logger.warn("Cannot specify default schema : " + e);
|
54
|
+
}
|
55
|
+
}
|
56
|
+
|
33
57
|
try {
|
34
58
|
SQLServerOutputConnection con = new SQLServerOutputConnection(c, schemaName, autoCommit);
|
35
59
|
c = null;
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: embulk-output-sqlserver
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.7.
|
4
|
+
version: 0.7.9
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Sadayuki Furuhashi
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2017-
|
11
|
+
date: 2017-06-23 00:00:00.000000000 Z
|
12
12
|
dependencies: []
|
13
13
|
description: Inserts or updates records to a table.
|
14
14
|
email:
|
@@ -19,8 +19,8 @@ extra_rdoc_files: []
|
|
19
19
|
files:
|
20
20
|
- README.md
|
21
21
|
- build.gradle
|
22
|
-
- classpath/embulk-output-jdbc-0.7.
|
23
|
-
- classpath/embulk-output-sqlserver-0.7.
|
22
|
+
- classpath/embulk-output-jdbc-0.7.9.jar
|
23
|
+
- classpath/embulk-output-sqlserver-0.7.9.jar
|
24
24
|
- classpath/jtds-1.3.1.jar
|
25
25
|
- lib/embulk/output/sqlserver.rb
|
26
26
|
- src/main/java/org/embulk/output/SQLServerOutputPlugin.java
|
Binary file
|
Binary file
|