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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 739469eb1fcc5e408e409dc6fe514ff1c8711e05
4
- data.tar.gz: 990cf866d6de0985e556e208a98478dae1f2f6da
3
+ metadata.gz: 41e2ea244907cf6cfc81009286f985a6357952fb
4
+ data.tar.gz: a5cc2bd510fbe49a0c8c0a0d046ad739a06aad70
5
5
  SHA512:
6
- metadata.gz: 5ba714898af3c685dff95eab5d1f0d4395a3b9ece93f4923aaecaa31acdf110bb513b2691c3d2ff265fa15fbd6f607f31652458361d70da5b937debf5880b85d
7
- data.tar.gz: 1e6591258b540472bf9624aaa0e92a9efaaaf2ad2d56aee67a350836c92f0692e5fa4e3b22f9ab3e8aa3061b15592e5e1215dda4eed0f7a049fe48cf8412317f
6
+ metadata.gz: ab0fa8e05dae0de13195383e8d3c9695d0fb78406d380b49315449fbeb5c80d83e7110ff3103bb9dc243e6415390250eaedd060f38b02848dabd87dc7f17e550
7
+ data.tar.gz: 16e3207bf0565ee14bf27b0a2254a702708c839db8f24ac7fea3143b014ed6f377b26bdb267aff13059e6958b0d69bb87494249e326d496d82241ddb9f981297
@@ -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
- to.setString(column, value.toString());
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 '\"' is Windows
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
  }
@@ -3,3 +3,4 @@ column_options:
3
3
  c1: {type: json}
4
4
  c2: {type: json}
5
5
  c3: {type: json}
6
+ c4: {type: json}
@@ -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.0
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: 2017-12-27 00:00:00.000000000 Z
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.0.jar
23
- - classpath/embulk-input-postgresql-0.9.0.jar
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