embulk-input-postgresql 0.9.0 → 0.9.1
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/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
|