embulk-input-postgresql 0.9.0 → 0.9.1
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/classpath/{embulk-input-jdbc-0.9.0.jar → embulk-input-jdbc-0.9.1.jar} +0 -0
- data/classpath/{embulk-input-postgresql-0.9.0.jar → embulk-input-postgresql-0.9.1.jar} +0 -0
- data/src/main/java/org/embulk/input/postgresql/getter/ArrayColumnGetter.java +99 -1
- data/src/test/java/org/embulk/input/postgresql/ArrayTest.java +0 -1
- data/src/test/java/org/embulk/input/postgresql/PostgreSQLTests.java +2 -2
- data/src/test/resources/org/embulk/input/postgresql/test/expect/array/as_json.yml +1 -0
- data/src/test/resources/org/embulk/input/postgresql/test/expect/array/expected_json.csv +3 -2
- data/src/test/resources/org/embulk/input/postgresql/test/expect/array/expected_string.csv +3 -2
- data/src/test/resources/org/embulk/input/postgresql/test/expect/array/setup.sql +6 -3
- metadata +4 -4
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 41e2ea244907cf6cfc81009286f985a6357952fb
|
4
|
+
data.tar.gz: a5cc2bd510fbe49a0c8c0a0d046ad739a06aad70
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: ab0fa8e05dae0de13195383e8d3c9695d0fb78406d380b49315449fbeb5c80d83e7110ff3103bb9dc243e6415390250eaedd060f38b02848dabd87dc7f17e550
|
7
|
+
data.tar.gz: 16e3207bf0565ee14bf27b0a2254a702708c839db8f24ac7fea3143b014ed6f377b26bdb267aff13059e6958b0d69bb87494249e326d496d82241ddb9f981297
|
Binary file
|
Binary file
|
@@ -10,6 +10,7 @@ import org.embulk.spi.json.JsonParser;
|
|
10
10
|
import org.embulk.spi.type.Type;
|
11
11
|
import org.msgpack.value.Value;
|
12
12
|
|
13
|
+
import java.math.BigDecimal;
|
13
14
|
import java.sql.Array;
|
14
15
|
import java.sql.ResultSet;
|
15
16
|
import java.sql.SQLException;
|
@@ -72,6 +73,12 @@ public class ArrayColumnGetter
|
|
72
73
|
case Types.LONGNVARCHAR:
|
73
74
|
arrayNode.add(jsonNodeFactory.textNode((String) v));
|
74
75
|
break;
|
76
|
+
case Types.DECIMAL:
|
77
|
+
case Types.NUMERIC:
|
78
|
+
arrayNode.add(jsonNodeFactory.numberNode((BigDecimal) v));
|
79
|
+
break;
|
80
|
+
default:
|
81
|
+
arrayNode.add(jsonNodeFactory.textNode(v.toString()));
|
75
82
|
}
|
76
83
|
}
|
77
84
|
}
|
@@ -96,9 +103,100 @@ public class ArrayColumnGetter
|
|
96
103
|
}
|
97
104
|
}
|
98
105
|
|
106
|
+
private void buildArrayString(StringBuilder builder, Object[] values)
|
107
|
+
throws SQLException
|
108
|
+
{
|
109
|
+
builder.append("{");
|
110
|
+
for (Object v : values) {
|
111
|
+
if (v == null) {
|
112
|
+
builder.append("");
|
113
|
+
}
|
114
|
+
else if (v.getClass().isArray()) {
|
115
|
+
buildArrayString(builder, (Object[]) v);
|
116
|
+
}
|
117
|
+
else {
|
118
|
+
switch (value.getBaseType()) {
|
119
|
+
case Types.TINYINT:
|
120
|
+
case Types.SMALLINT:
|
121
|
+
case Types.INTEGER:
|
122
|
+
case Types.BIGINT:
|
123
|
+
builder.append(((Number) v).longValue());
|
124
|
+
break;
|
125
|
+
case Types.FLOAT:
|
126
|
+
case Types.REAL:
|
127
|
+
case Types.DOUBLE:
|
128
|
+
builder.append(((Number) v).doubleValue());
|
129
|
+
break;
|
130
|
+
case Types.BOOLEAN:
|
131
|
+
case Types.BIT: // JDBC BIT is boolean, unlike SQL-92
|
132
|
+
if (((Boolean) v)) {
|
133
|
+
builder.append("t");
|
134
|
+
}
|
135
|
+
else {
|
136
|
+
builder.append("f");
|
137
|
+
}
|
138
|
+
break;
|
139
|
+
case Types.CHAR:
|
140
|
+
case Types.VARCHAR:
|
141
|
+
case Types.LONGVARCHAR:
|
142
|
+
case Types.CLOB:
|
143
|
+
case Types.NCHAR:
|
144
|
+
case Types.NVARCHAR:
|
145
|
+
case Types.LONGNVARCHAR:
|
146
|
+
escape(builder, (String) v);
|
147
|
+
break;
|
148
|
+
case Types.DECIMAL:
|
149
|
+
case Types.NUMERIC:
|
150
|
+
builder.append(((BigDecimal) v).toPlainString());
|
151
|
+
break;
|
152
|
+
default:
|
153
|
+
escape(builder, v.toString());
|
154
|
+
}
|
155
|
+
}
|
156
|
+
builder.append(",");
|
157
|
+
}
|
158
|
+
builder.deleteCharAt(builder.length() - 1);
|
159
|
+
builder.append("}");
|
160
|
+
}
|
161
|
+
|
162
|
+
/**
|
163
|
+
* Escaping text using information from here:
|
164
|
+
* https://www.postgresql.org/docs/current/static/arrays.html
|
165
|
+
*/
|
166
|
+
private void escape(StringBuilder builder, String value)
|
167
|
+
{
|
168
|
+
StringBuilder s = new StringBuilder();
|
169
|
+
boolean escape = false;
|
170
|
+
for (int i = 0; i < value.length(); ++i) {
|
171
|
+
char c = value.charAt(i);
|
172
|
+
if (c == ',' || c == '{' || c == '}') {
|
173
|
+
escape = true;
|
174
|
+
}
|
175
|
+
if (c == '"' || c == '\\') {
|
176
|
+
escape = true;
|
177
|
+
s.append("\\");
|
178
|
+
}
|
179
|
+
s.append(c);
|
180
|
+
}
|
181
|
+
if (escape) {
|
182
|
+
builder.append('\"').append(s.toString()).append('\"');
|
183
|
+
}
|
184
|
+
else {
|
185
|
+
builder.append(value);
|
186
|
+
}
|
187
|
+
}
|
188
|
+
|
99
189
|
@Override
|
100
190
|
public void stringColumn(Column column)
|
101
191
|
{
|
102
|
-
|
192
|
+
StringBuilder builder = new StringBuilder();
|
193
|
+
try {
|
194
|
+
buildArrayString(builder, (Object[]) value.getArray());
|
195
|
+
to.setString(column, builder.toString());
|
196
|
+
}
|
197
|
+
catch (SQLException e) {
|
198
|
+
// Never reach here
|
199
|
+
to.setString(column, value.toString());
|
200
|
+
}
|
103
201
|
}
|
104
202
|
}
|
@@ -5,7 +5,6 @@ import org.embulk.input.PostgreSQLInputPlugin;
|
|
5
5
|
import org.embulk.spi.InputPlugin;
|
6
6
|
import org.embulk.test.EmbulkTests;
|
7
7
|
import org.embulk.test.TestingEmbulk;
|
8
|
-
import org.embulk.test.TestingEmbulk.RunResult;
|
9
8
|
import org.junit.Before;
|
10
9
|
import org.junit.Rule;
|
11
10
|
import org.junit.Test;
|
@@ -42,8 +42,8 @@ public class PostgreSQLTests
|
|
42
42
|
private static String convert(String sql)
|
43
43
|
{
|
44
44
|
if (Platform.getNativePlatform().getOS().equals(OS.WINDOWS)) {
|
45
|
-
// '"' should be '\"'
|
46
|
-
return sql.replace("\"", "\\\"");
|
45
|
+
// '"' should be '\"' and '\' should be '\\' in Windows
|
46
|
+
return sql.replace("\\\\", "\\").replace("\\", "\\\\").replace("\"", "\\\"");
|
47
47
|
}
|
48
48
|
return sql;
|
49
49
|
}
|
@@ -1,2 +1,3 @@
|
|
1
|
-
"[1000,2000,3000,4000]","[[""red"",""green""],[""blue"",""cyan""]]",[[[true]]]
|
2
|
-
"[5000,6000,7000,8000]","[[""yellow"",""magenta""],[""purple"",""light,dark""]]","[[[true,true],[false,false]],[[true,false],[false,true]]]"
|
1
|
+
"[1000,2000,3000,4000]","[[""red"",""green""],[""blue"",""cyan""]]",[[[true]]],[1.23456789E9]
|
2
|
+
"[5000,6000,7000,8000]","[[""yellow"",""magenta""],[""purple"",""light,dark""]]","[[[true,true],[false,false]],[[true,false],[false,true]]]",[1.2345678901234567E19]
|
3
|
+
[1000],"[[""\"""",""{\\}"",""{a,b}""]]",[true],[1.2345678901234567E19]
|
@@ -1,2 +1,3 @@
|
|
1
|
-
"{1000,2000,3000,4000}","{{red,green},{blue,cyan}}",{{{t}}}
|
2
|
-
"{5000,6000,7000,8000}","{{yellow,magenta},{purple,""light,dark""}}","{{{t,t},{f,f}},{{t,f},{f,t}}}"
|
1
|
+
"{1000,2000,3000,4000}","{{red,green},{blue,cyan}}",{{{t}}},{1234567890}
|
2
|
+
"{5000,6000,7000,8000}","{{yellow,magenta},{purple,""light,dark""}}","{{{t,t},{f,f}},{{t,f},{f,t}}}",{12345678901234567890}
|
3
|
+
{1000},"{{""\"""",""{\\}"",""{a,b}""}}",{t},{12345678901234567890.1234567890}
|
@@ -3,9 +3,12 @@ drop table if exists input_array;
|
|
3
3
|
create table input_array (
|
4
4
|
c1 integer[],
|
5
5
|
c2 text[][],
|
6
|
-
c3 bool[][][]
|
6
|
+
c3 bool[][][],
|
7
|
+
c4 decimal[]
|
7
8
|
);
|
8
9
|
|
9
|
-
insert into input_array (c1, c2, c3) values ('{1000, 2000, 3000, 4000}', '{{"red", "green"}, {"blue", "cyan"}}', '{{{true}}}');
|
10
|
+
insert into input_array (c1, c2, c3, c4) values ('{1000, 2000, 3000, 4000}', '{{"red", "green"}, {"blue", "cyan"}}', '{{{true}}}', '{1234567890}');
|
10
11
|
|
11
|
-
insert into input_array (c1, c2, c3) values ('{5000, 6000, 7000, 8000}', '{{"yellow", "magenta"}, {"purple", "light,dark"}}', '{{{t,t},{f,f}},{{t,f},{f,t}}}');
|
12
|
+
insert into input_array (c1, c2, c3, c4) values ('{5000, 6000, 7000, 8000}', '{{"yellow", "magenta"}, {"purple", "light,dark"}}', '{{{t,t},{f,f}},{{t,f},{f,t}}}', '{12345678901234567890}');
|
13
|
+
|
14
|
+
insert into input_array (c1, c2, c3, c4) values ('{1000}', '{{"\"", "{\\}", "{a,b}"}}', '{true}', '{12345678901234567890.1234567890}');
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: embulk-input-postgresql
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.9.
|
4
|
+
version: 0.9.1
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Sadayuki Furuhashi
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date:
|
11
|
+
date: 2018-03-09 00:00:00.000000000 Z
|
12
12
|
dependencies: []
|
13
13
|
description: Selects records from 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-input-jdbc-0.9.
|
23
|
-
- classpath/embulk-input-postgresql-0.9.
|
22
|
+
- classpath/embulk-input-jdbc-0.9.1.jar
|
23
|
+
- classpath/embulk-input-postgresql-0.9.1.jar
|
24
24
|
- default_jdbc_driver/postgresql-9.4-1205-jdbc41.jar
|
25
25
|
- lib/embulk/input/postgresql.rb
|
26
26
|
- src/main/java/org/embulk/input/PostgreSQLInputPlugin.java
|