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 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