jvertica 0.1.9 → 0.1.10
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/.gitignore +3 -1
- data/.travis.yml +6 -1
- data/README.md +3 -3
- data/example/copy.rb +32 -0
- data/example/data.json +2 -0
- data/example/select.rb +23 -0
- data/jvertica.gemspec +1 -0
- data/lib/jvertica.rb +67 -308
- data/lib/jvertica/constant.rb +39 -0
- data/lib/jvertica/error.rb +7 -0
- data/lib/jvertica/result_set.rb +101 -0
- data/lib/jvertica/row.rb +84 -0
- data/lib/jvertica/version.rb +1 -1
- data/spec/jvertica_spec.rb +0 -4
- metadata +24 -4
- data/.ruby-version +0 -1
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 4e58f3395ddff02d8858035b5f1c8cd83630ecff
|
4
|
+
data.tar.gz: 9cd5d1caacd940c2c69b133e939647e245ddd0de
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 776711c902b8c08f906dbff6b412f7a516feb9009d236d91284526e8ad75bf521c877b0cc921f3f8216ff36b7c7c97b6504d128d55bc183b94ee3894b476d430
|
7
|
+
data.tar.gz: 8ee959130289e1b56635bce5dd2677a68d6a4131ba195dbfebffb3552ecc97ed9a2ba96bce6a6d1d71967f40b2747b7cf83e23e4900b838e063b3c1dbae4c80b
|
data/.gitignore
CHANGED
data/.travis.yml
CHANGED
data/README.md
CHANGED
@@ -23,7 +23,7 @@ Or install it yourself as:
|
|
23
23
|
```ruby
|
24
24
|
require 'jvertica'
|
25
25
|
|
26
|
-
|
26
|
+
params = {
|
27
27
|
host: 'vertica.com',
|
28
28
|
port: 5433,
|
29
29
|
user: 'xxxxxx',
|
@@ -32,8 +32,8 @@ conn_opts = {
|
|
32
32
|
|
33
33
|
sql = 'select * from sandbox.jdbc_tests;'
|
34
34
|
|
35
|
-
c = Jvertica.connect
|
36
|
-
c.query
|
35
|
+
c = Jvertica.connect(params)
|
36
|
+
c.query(sql) do |row|
|
37
37
|
p row
|
38
38
|
end
|
39
39
|
```
|
data/example/copy.rb
ADDED
@@ -0,0 +1,32 @@
|
|
1
|
+
require 'jvertica'
|
2
|
+
require 'dotenv'
|
3
|
+
|
4
|
+
# Create .env file like
|
5
|
+
# HOSTNAME=
|
6
|
+
# USERNAME=
|
7
|
+
# PASSWORD=
|
8
|
+
Dotenv.load
|
9
|
+
|
10
|
+
params = {
|
11
|
+
host: ENV['HOSTNAME'],
|
12
|
+
port: 5433,
|
13
|
+
user: ENV['USERNAME'],
|
14
|
+
password: ENV['PASSWORD'],
|
15
|
+
}
|
16
|
+
puts params
|
17
|
+
|
18
|
+
vertica = Jvertica.connect(params)
|
19
|
+
vertica.query("DROP TABLE sandbox.jvertica_test") rescue nil
|
20
|
+
vertica.query("CREATE TABLE sandbox.jvertica_test (id integer, str varchar(80))")
|
21
|
+
vertica.copy("COPY sandbox.jvertica_test FROM STDIN PARSER fjsonparser() NO COMMIT") do |io|
|
22
|
+
File.open(File.expand_path('../data.json', __FILE__), 'r') do |f|
|
23
|
+
begin
|
24
|
+
io << f.gets
|
25
|
+
end until f.eof?
|
26
|
+
end
|
27
|
+
end
|
28
|
+
vertica.commit
|
29
|
+
vertica.query("SELECT * from sandbox.jvertica_test") do |row|
|
30
|
+
p row
|
31
|
+
end
|
32
|
+
vertica.query("DROP TABLE sandbox.jvertica_test")
|
data/example/data.json
ADDED
data/example/select.rb
ADDED
@@ -0,0 +1,23 @@
|
|
1
|
+
require 'jvertica'
|
2
|
+
require 'dotenv'
|
3
|
+
|
4
|
+
# Create .env file like
|
5
|
+
# HOSTNAME=
|
6
|
+
# USERNAME=
|
7
|
+
# PASSWORD=
|
8
|
+
Dotenv.load
|
9
|
+
|
10
|
+
params = {
|
11
|
+
host: ENV['HOSTNAME'],
|
12
|
+
port: 5433,
|
13
|
+
user: ENV['USERNAME'],
|
14
|
+
password: ENV['PASSWORD'],
|
15
|
+
}
|
16
|
+
puts params
|
17
|
+
|
18
|
+
sql = 'select * from dt;'
|
19
|
+
|
20
|
+
c = Jvertica.connect(params)
|
21
|
+
c.query(sql) do |row|
|
22
|
+
p row
|
23
|
+
end
|
data/jvertica.gemspec
CHANGED
@@ -21,6 +21,7 @@ Gem::Specification.new do |spec|
|
|
21
21
|
spec.add_development_dependency "bundler", "~> 1.7"
|
22
22
|
spec.add_development_dependency "rake", "~> 10.0"
|
23
23
|
spec.add_development_dependency "rspec"
|
24
|
+
spec.add_development_dependency "dotenv"
|
24
25
|
|
25
26
|
spec.add_dependency "jdbc-vertica"
|
26
27
|
end
|
data/lib/jvertica.rb
CHANGED
@@ -1,15 +1,19 @@
|
|
1
1
|
require 'java'
|
2
2
|
require 'thread'
|
3
|
-
require 'jvertica/version'
|
4
3
|
require 'jdbc-vertica'
|
5
4
|
require Jdbc::Vertica.driver_jar
|
5
|
+
require 'jvertica/version'
|
6
|
+
require 'jvertica/result_set'
|
7
|
+
require 'jvertica/row'
|
8
|
+
require 'jvertica/error'
|
9
|
+
require 'jvertica/constant'
|
6
10
|
|
7
11
|
class Jvertica
|
8
12
|
unless %r{java} === RUBY_PLATFORM
|
9
13
|
warn "only for use with JRuby"
|
10
14
|
end
|
11
15
|
|
12
|
-
|
16
|
+
DEFAULT_OPTION_VALUES = {
|
13
17
|
host: 'localhost',
|
14
18
|
port: 5433,
|
15
19
|
database: 'vdb',
|
@@ -18,33 +22,35 @@ class Jvertica
|
|
18
22
|
AutoCommit: false,
|
19
23
|
}
|
20
24
|
|
21
|
-
def self.connect
|
22
|
-
new
|
25
|
+
def self.connect(options = {})
|
26
|
+
new(options)
|
23
27
|
end
|
24
28
|
|
25
29
|
attr_reader :host, :port, :database
|
26
30
|
|
27
|
-
def initialize
|
28
|
-
options
|
29
|
-
|
30
|
-
@
|
31
|
-
@
|
32
|
-
|
33
|
-
options.delete key
|
34
|
-
end
|
31
|
+
def initialize(options)
|
32
|
+
options = options.inject({}) {|h, (k, v)| h[k.to_sym] = v; h } # symbolize_keys
|
33
|
+
options = DEFAULT_OPTION_VALUES.merge(options)
|
34
|
+
@host = options.delete(:host)
|
35
|
+
@port = options.delete(:port)
|
36
|
+
@database = options.delete(:database)
|
35
37
|
|
36
38
|
prop = Properties.new
|
37
39
|
options.each do |key, value|
|
38
|
-
prop.put
|
40
|
+
prop.put(key.to_s, value) unless value.nil?
|
39
41
|
end
|
40
42
|
|
41
|
-
@connection =
|
42
|
-
|
43
|
-
|
44
|
-
|
45
|
-
|
46
|
-
|
47
|
-
|
43
|
+
@connection =
|
44
|
+
begin
|
45
|
+
DriverManager.getConnection("jdbc:vertica://#{host}:#{port}/#{database}", prop)
|
46
|
+
rescue => e
|
47
|
+
raise ConnectionError.new(
|
48
|
+
"Connection Failed.\n" <<
|
49
|
+
"Error Message => #{e.message}\n" <<
|
50
|
+
"see documentation => #{Constant::CONNECTION_PROPERTY_DOCUMENT_URL}\n"
|
51
|
+
)
|
52
|
+
end
|
53
|
+
|
48
54
|
@closed = false
|
49
55
|
@connection
|
50
56
|
end
|
@@ -54,7 +60,10 @@ class Jvertica
|
|
54
60
|
end
|
55
61
|
|
56
62
|
def close
|
57
|
-
@connection.close
|
63
|
+
@connection.close
|
64
|
+
ensure
|
65
|
+
@connection = nil
|
66
|
+
@closed = true
|
58
67
|
end
|
59
68
|
|
60
69
|
def commit
|
@@ -77,26 +86,26 @@ class Jvertica
|
|
77
86
|
# TODO
|
78
87
|
#end
|
79
88
|
|
80
|
-
def property
|
89
|
+
def property(key, value = nil)
|
81
90
|
key = key.to_s
|
82
91
|
if value.nil?
|
83
|
-
@connection.getProperty
|
92
|
+
@connection.getProperty(key)
|
84
93
|
else
|
85
|
-
@connection.setProperty
|
94
|
+
@connection.setProperty(key, value)
|
86
95
|
end
|
87
96
|
end
|
88
97
|
|
89
|
-
def query
|
98
|
+
def query(query, &blk)
|
90
99
|
stmt = @connection.createStatement
|
91
100
|
case query
|
92
|
-
when %r{\A\s*copy}miu then return stmt.execute
|
93
|
-
when %r{\A\s*insert}miu then return stmt.executeUpdate
|
94
|
-
when %r{\A\s*update}miu then return stmt.executeUpdate
|
95
|
-
when %r{\A\s*delete}miu then return stmt.executeUpdate
|
96
|
-
when %r{\A\s*drop}miu then return stmt.execute
|
97
|
-
when %r{\A\s*create}miu then return stmt.execute
|
98
|
-
when %r{\A\s*set}miu then return stmt.execute
|
99
|
-
else rs = stmt.executeQuery
|
101
|
+
when %r{\A\s*copy}miu then return stmt.execute(query)
|
102
|
+
when %r{\A\s*insert}miu then return stmt.executeUpdate(query)
|
103
|
+
when %r{\A\s*update}miu then return stmt.executeUpdate(query)
|
104
|
+
when %r{\A\s*delete}miu then return stmt.executeUpdate(query)
|
105
|
+
when %r{\A\s*drop}miu then return stmt.execute(query)
|
106
|
+
when %r{\A\s*create}miu then return stmt.execute(query)
|
107
|
+
when %r{\A\s*set}miu then return stmt.execute(query)
|
108
|
+
else rs = stmt.executeQuery(query)
|
100
109
|
end
|
101
110
|
|
102
111
|
if block_given?
|
@@ -104,13 +113,13 @@ class Jvertica
|
|
104
113
|
yield row
|
105
114
|
end
|
106
115
|
else
|
107
|
-
ResultSet.new
|
116
|
+
ResultSet.new(rs)
|
108
117
|
end
|
109
118
|
end
|
110
119
|
|
111
|
-
def copy
|
120
|
+
def copy(query, source = nil, &blk)
|
112
121
|
raise InvalidQuery.new('can use only "copy".') unless %r{\A\s*copy}miu === query
|
113
|
-
if
|
122
|
+
if source or block_given?
|
114
123
|
copy_stream(query, source, &blk)
|
115
124
|
else
|
116
125
|
[query(query), nil]
|
@@ -118,34 +127,36 @@ class Jvertica
|
|
118
127
|
end
|
119
128
|
|
120
129
|
private
|
121
|
-
|
122
|
-
|
130
|
+
|
131
|
+
class DriverManager < java.sql.DriverManager
|
132
|
+
end
|
133
|
+
|
134
|
+
class Properties < java.util.Properties
|
135
|
+
end
|
136
|
+
|
137
|
+
class DataSource < com.vertica.jdbc.DataSource
|
138
|
+
end
|
139
|
+
|
140
|
+
def copy_stream(query, io = nil, &blk)
|
141
|
+
unless ((io and io.is_a?(IO)) or block_given?)
|
142
|
+
raise InvalidObject.new("block or IO object is required.")
|
143
|
+
end
|
144
|
+
|
145
|
+
stream = com.vertica.jdbc.VerticaCopyStream.new(@connection, query)
|
123
146
|
stream.start
|
124
147
|
thread = nil
|
148
|
+
|
125
149
|
begin
|
126
150
|
|
127
151
|
if block_given?
|
128
|
-
|
129
152
|
i, o = IO.pipe
|
130
|
-
|
131
|
-
|
132
|
-
|
133
|
-
o.close
|
134
|
-
end
|
135
|
-
stream.addStream org.jruby.util.IOInputStream.new(i)
|
136
|
-
rescue => e
|
137
|
-
raise e
|
138
|
-
ensure
|
153
|
+
thread = Thread.new do
|
154
|
+
yield(o)
|
155
|
+
o.close
|
139
156
|
end
|
140
|
-
|
157
|
+
stream.addStream(org.jruby.util.IOInputStream.new(i))
|
141
158
|
else
|
142
|
-
|
143
|
-
if io.is_a? IO
|
144
|
-
stream.addStream org.jruby.util.IOInputStream.new(io)
|
145
|
-
else
|
146
|
-
raise InvalidObject.new("source must be a IO.")
|
147
|
-
end
|
148
|
-
|
159
|
+
stream.addStream(org.jruby.util.IOInputStream.new(io))
|
149
160
|
end
|
150
161
|
|
151
162
|
rescue => e
|
@@ -157,262 +168,10 @@ class Jvertica
|
|
157
168
|
stream.execute
|
158
169
|
rejects = stream.getRejects
|
159
170
|
results = stream.finish
|
160
|
-
rescue => e
|
161
|
-
raise e
|
162
171
|
ensure
|
163
172
|
thread.join unless thread.nil?
|
164
173
|
end
|
165
174
|
|
166
175
|
[results, rejects.to_ary]
|
167
176
|
end
|
168
|
-
|
169
|
-
class ConnectionError < StandardError
|
170
|
-
end
|
171
|
-
|
172
|
-
class InvalidQuery < StandardError
|
173
|
-
end
|
174
|
-
|
175
|
-
class InvalidObject < StandardError
|
176
|
-
end
|
177
|
-
|
178
|
-
class InsufficientArgument < StandardError
|
179
|
-
end
|
180
|
-
|
181
|
-
class ResultSet
|
182
|
-
include Enumerable
|
183
|
-
|
184
|
-
def each
|
185
|
-
return enum_for(:each) unless block_given?
|
186
|
-
return if closed?
|
187
|
-
|
188
|
-
while @nrow
|
189
|
-
idx = 0
|
190
|
-
row = Jvertica::Row.new(
|
191
|
-
@col_labels,
|
192
|
-
@col_labels_d,
|
193
|
-
@getters.map{|gt|
|
194
|
-
case gt
|
195
|
-
when :getBigNum
|
196
|
-
v = @rset.getBigDecimal idx+=1
|
197
|
-
@rset.was_null ? nil : v.toPlainString.to_i
|
198
|
-
when :getBigDecimal
|
199
|
-
v = @rset.getBigDecimal idx+=1
|
200
|
-
@rset.was_null ? nil : BigDecimal.new(v.toPlainString)
|
201
|
-
else
|
202
|
-
v = @rset.send gt, idx+=1
|
203
|
-
@rset.was_null ? nil : v
|
204
|
-
end
|
205
|
-
},
|
206
|
-
@rownum += 1
|
207
|
-
)
|
208
|
-
close unless @nrow = @rset.next
|
209
|
-
yield row
|
210
|
-
end
|
211
|
-
close
|
212
|
-
end
|
213
|
-
|
214
|
-
def close
|
215
|
-
return if closed?
|
216
|
-
|
217
|
-
@rset.close
|
218
|
-
@close_callback.call if @close_callback
|
219
|
-
@closed = true
|
220
|
-
end
|
221
|
-
|
222
|
-
def closed?
|
223
|
-
@closed
|
224
|
-
end
|
225
|
-
|
226
|
-
def initialize rset, &close_callback
|
227
|
-
unless rset.respond_to? :get_meta_data
|
228
|
-
rset.close if rset
|
229
|
-
@closed = true
|
230
|
-
return
|
231
|
-
end
|
232
|
-
|
233
|
-
@close_callback = close_callback
|
234
|
-
@rset = rset
|
235
|
-
@rsmd = @rset.get_meta_data
|
236
|
-
@num_col = @rsmd.get_column_count
|
237
|
-
@getters = []
|
238
|
-
@col_labels = []
|
239
|
-
@col_labels_d = []
|
240
|
-
(1..@num_col).each do |i|
|
241
|
-
type = @rsmd.get_column_type i
|
242
|
-
|
243
|
-
@getters <<
|
244
|
-
case type
|
245
|
-
when java.sql.Types::NUMERIC, java.sql.Types::DECIMAL
|
246
|
-
precision = @rsmd.get_precision i
|
247
|
-
scale = @rsmd.get_scale i
|
248
|
-
|
249
|
-
if precision > 0 and scale >= 0
|
250
|
-
if scale > 0 then :getBigDecimal
|
251
|
-
else
|
252
|
-
|
253
|
-
if precision <= 9 then :getInt
|
254
|
-
elsif precision <= 18 then :getLong
|
255
|
-
else :getBigNum
|
256
|
-
end
|
257
|
-
|
258
|
-
end
|
259
|
-
else :getBigDecimal
|
260
|
-
end
|
261
|
-
|
262
|
-
else Jvertica::Constant::GETTER_MAP.fetch type, :get_string
|
263
|
-
end
|
264
|
-
|
265
|
-
label = @rsmd.get_column_label i
|
266
|
-
@col_labels << label
|
267
|
-
@col_labels_d << label.downcase
|
268
|
-
end
|
269
|
-
|
270
|
-
@rownum = -1
|
271
|
-
@nrow = @rset.next
|
272
|
-
@closed = false
|
273
|
-
end
|
274
|
-
end
|
275
|
-
|
276
|
-
class Row
|
277
|
-
attr_reader :labels, :values, :rownum
|
278
|
-
alias_method :keys, :labels
|
279
|
-
|
280
|
-
include Enumerable
|
281
|
-
|
282
|
-
def [] *idx
|
283
|
-
return @values[*idx] if idx.length > 1
|
284
|
-
|
285
|
-
idx = idx.first
|
286
|
-
case idx
|
287
|
-
when Fixnum
|
288
|
-
raise RangeError.new("Index out of bound") if idx >= @values.length
|
289
|
-
@values[idx]
|
290
|
-
when String, Symbol
|
291
|
-
vidx = @labels_d.index(idx.to_s.downcase) or
|
292
|
-
raise NameError.new("Unknown column label: #{idx}")
|
293
|
-
@values[vidx]
|
294
|
-
else
|
295
|
-
@values[idx]
|
296
|
-
end
|
297
|
-
end
|
298
|
-
|
299
|
-
def each(&blk)
|
300
|
-
@values.each do |v|
|
301
|
-
yield v
|
302
|
-
end
|
303
|
-
end
|
304
|
-
|
305
|
-
def inspect
|
306
|
-
strs = []
|
307
|
-
@labels.each do |col|
|
308
|
-
strs << "#{col}: #{self[col] || '(null)'}"
|
309
|
-
end
|
310
|
-
'[' + strs.join(', ') + ']'
|
311
|
-
end
|
312
|
-
|
313
|
-
def to_a
|
314
|
-
@values
|
315
|
-
end
|
316
|
-
|
317
|
-
def join sep = $OUTPUT_FIELD_SEPARATOR
|
318
|
-
to_a.join sep
|
319
|
-
end
|
320
|
-
|
321
|
-
def eql? other
|
322
|
-
self.hash == other.hash
|
323
|
-
end
|
324
|
-
|
325
|
-
def hash
|
326
|
-
@labels.zip(@values).sort.hash
|
327
|
-
end
|
328
|
-
|
329
|
-
def to_h
|
330
|
-
Hash[@labels.zip @values]
|
331
|
-
end
|
332
|
-
|
333
|
-
alias :== :eql?
|
334
|
-
|
335
|
-
def initialize col_labels, col_labels_d, values, rownum
|
336
|
-
@labels = col_labels
|
337
|
-
@labels_d = col_labels_d
|
338
|
-
@values = values
|
339
|
-
@rownum = rownum
|
340
|
-
end
|
341
|
-
|
342
|
-
def method_missing symb, *args
|
343
|
-
if vidx = @labels_d.index(symb.to_s.downcase)
|
344
|
-
@values[vidx]
|
345
|
-
elsif @values.respond_to? symb
|
346
|
-
@values.send symb, *args
|
347
|
-
else
|
348
|
-
raise NoMethodError.new("undefined method or attribute `#{symb}'")
|
349
|
-
end
|
350
|
-
end
|
351
|
-
|
352
|
-
[:id, :tap, :gem, :display, :class, :method, :methods, :trust].select do |s|
|
353
|
-
method_defined? s
|
354
|
-
end.each do |m|
|
355
|
-
undef_method m
|
356
|
-
end
|
357
|
-
end
|
358
|
-
|
359
|
-
class DriverManager < java.sql.DriverManager
|
360
|
-
end
|
361
|
-
|
362
|
-
class Properties < java.util.Properties
|
363
|
-
end
|
364
|
-
|
365
|
-
class DataSource < com.vertica.jdbc.DataSource
|
366
|
-
end
|
367
|
-
|
368
|
-
module Constant
|
369
|
-
CONNECTION_PROPERTY_DOCUMENT_URL =
|
370
|
-
'http://my.vertica.com/docs/7.1.x/HTML/index.htm#Authoring/ProgrammersGuide/ClientJDBC/JDBCConnectionProperties.htm'
|
371
|
-
|
372
|
-
RUBY_SQL_TYPE_MAP = {
|
373
|
-
Fixnum => java.sql.Types::INTEGER,
|
374
|
-
Bignum => java.sql.Types::BIGINT,
|
375
|
-
String => java.sql.Types::VARCHAR,
|
376
|
-
Float => java.sql.Types::DOUBLE,
|
377
|
-
Time => java.sql.Types::TIMESTAMP
|
378
|
-
}
|
379
|
-
GETTER_MAP = {
|
380
|
-
java.sql.Types::TINYINT => :getInt,
|
381
|
-
java.sql.Types::SMALLINT => :getInt,
|
382
|
-
java.sql.Types::INTEGER => :getInt,
|
383
|
-
java.sql.Types::BIGINT => :getLong,
|
384
|
-
java.sql.Types::CHAR => :getString,
|
385
|
-
java.sql.Types::VARCHAR => :getString,
|
386
|
-
java.sql.Types::LONGVARCHAR => :getString,
|
387
|
-
(java.sql.Types::NCHAR rescue nil) => :getString,
|
388
|
-
(java.sql.Types::NVARCHAR rescue nil) => :getString,
|
389
|
-
(java.sql.Types::LONGNVARCHAR rescue nil) => :getString,
|
390
|
-
java.sql.Types::BINARY => :getBinaryStream,
|
391
|
-
java.sql.Types::VARBINARY => :getBinaryStream,
|
392
|
-
java.sql.Types::LONGVARBINARY => :getBinaryStream,
|
393
|
-
java.sql.Types::REAL => :getDouble,
|
394
|
-
java.sql.Types::FLOAT => :getFloat,
|
395
|
-
java.sql.Types::DOUBLE => :getDouble,
|
396
|
-
java.sql.Types::DATE => :getDate,
|
397
|
-
java.sql.Types::TIME => :getTime,
|
398
|
-
java.sql.Types::TIMESTAMP => :getTimestamp,
|
399
|
-
java.sql.Types::BLOB => :getBlob,
|
400
|
-
java.sql.Types::CLOB => :getString,
|
401
|
-
(java.sql.Types::NCLOB rescue nil) => :getString,
|
402
|
-
java.sql.Types::BOOLEAN => :getBoolean
|
403
|
-
}
|
404
|
-
end
|
405
|
-
end
|
406
|
-
|
407
|
-
class Hash
|
408
|
-
def to_sym
|
409
|
-
self.inject self.class.new do |h, (k, v)|
|
410
|
-
h[k.to_sym] = if v.is_a? self.class
|
411
|
-
v.to_sym
|
412
|
-
else
|
413
|
-
v
|
414
|
-
end
|
415
|
-
h
|
416
|
-
end
|
417
|
-
end
|
418
177
|
end
|
@@ -0,0 +1,39 @@
|
|
1
|
+
class Jvertica
|
2
|
+
module Constant
|
3
|
+
CONNECTION_PROPERTY_DOCUMENT_URL =
|
4
|
+
'http://my.vertica.com/docs/7.1.x/HTML/index.htm#Authoring/ProgrammersGuide/ClientJDBC/JDBCConnectionProperties.htm'
|
5
|
+
|
6
|
+
RUBY_SQL_TYPE_MAP = {
|
7
|
+
Fixnum => java.sql.Types::INTEGER,
|
8
|
+
Bignum => java.sql.Types::BIGINT,
|
9
|
+
String => java.sql.Types::VARCHAR,
|
10
|
+
Float => java.sql.Types::DOUBLE,
|
11
|
+
Time => java.sql.Types::TIMESTAMP
|
12
|
+
}
|
13
|
+
GETTER_MAP = {
|
14
|
+
java.sql.Types::TINYINT => :getInt,
|
15
|
+
java.sql.Types::SMALLINT => :getInt,
|
16
|
+
java.sql.Types::INTEGER => :getInt,
|
17
|
+
java.sql.Types::BIGINT => :getLong,
|
18
|
+
java.sql.Types::CHAR => :getString,
|
19
|
+
java.sql.Types::VARCHAR => :getString,
|
20
|
+
java.sql.Types::LONGVARCHAR => :getString,
|
21
|
+
(java.sql.Types::NCHAR rescue nil) => :getString,
|
22
|
+
(java.sql.Types::NVARCHAR rescue nil) => :getString,
|
23
|
+
(java.sql.Types::LONGNVARCHAR rescue nil) => :getString,
|
24
|
+
java.sql.Types::BINARY => :getBinaryStream,
|
25
|
+
java.sql.Types::VARBINARY => :getBinaryStream,
|
26
|
+
java.sql.Types::LONGVARBINARY => :getBinaryStream,
|
27
|
+
java.sql.Types::REAL => :getDouble,
|
28
|
+
java.sql.Types::FLOAT => :getFloat,
|
29
|
+
java.sql.Types::DOUBLE => :getDouble,
|
30
|
+
java.sql.Types::DATE => :getDate,
|
31
|
+
java.sql.Types::TIME => :getTime,
|
32
|
+
java.sql.Types::TIMESTAMP => :getTimestamp,
|
33
|
+
java.sql.Types::BLOB => :getBlob,
|
34
|
+
java.sql.Types::CLOB => :getString,
|
35
|
+
(java.sql.Types::NCLOB rescue nil) => :getString,
|
36
|
+
java.sql.Types::BOOLEAN => :getBoolean
|
37
|
+
}
|
38
|
+
end
|
39
|
+
end
|
@@ -0,0 +1,101 @@
|
|
1
|
+
require 'jvertica/row'
|
2
|
+
|
3
|
+
class Jvertica
|
4
|
+
class ResultSet
|
5
|
+
include Enumerable
|
6
|
+
|
7
|
+
def initialize(rset, &close_callback)
|
8
|
+
unless rset.respond_to?(:get_meta_data)
|
9
|
+
rset.close if rset
|
10
|
+
@closed = true
|
11
|
+
return
|
12
|
+
end
|
13
|
+
|
14
|
+
@close_callback = close_callback
|
15
|
+
@rset = rset
|
16
|
+
@rsmd = @rset.get_meta_data
|
17
|
+
@num_col = @rsmd.get_column_count
|
18
|
+
@getters = []
|
19
|
+
@col_labels = []
|
20
|
+
@col_labels_d = []
|
21
|
+
|
22
|
+
(1..@num_col).each do |i|
|
23
|
+
type = @rsmd.get_column_type(i)
|
24
|
+
|
25
|
+
@getters <<
|
26
|
+
case type
|
27
|
+
when java.sql.Types::NUMERIC, java.sql.Types::DECIMAL
|
28
|
+
precision = @rsmd.get_precision(i)
|
29
|
+
scale = @rsmd.get_scale(i)
|
30
|
+
|
31
|
+
if precision > 0 and scale >= 0
|
32
|
+
if scale > 0
|
33
|
+
:getBigDecimal
|
34
|
+
elsif precision <= 9
|
35
|
+
:getInt
|
36
|
+
elsif precision <= 18
|
37
|
+
:getLong
|
38
|
+
else
|
39
|
+
:getBigNum
|
40
|
+
end
|
41
|
+
else
|
42
|
+
:getBigDecimal
|
43
|
+
end
|
44
|
+
|
45
|
+
else Jvertica::Constant::GETTER_MAP.fetch(type)
|
46
|
+
:get_string
|
47
|
+
end
|
48
|
+
|
49
|
+
label = @rsmd.get_column_label(i)
|
50
|
+
@col_labels << label
|
51
|
+
@col_labels_d << label.downcase
|
52
|
+
end
|
53
|
+
|
54
|
+
@rownum = -1
|
55
|
+
@nrow = @rset.next
|
56
|
+
@closed = false
|
57
|
+
end
|
58
|
+
|
59
|
+
def each
|
60
|
+
return enum_for(:each) unless block_given?
|
61
|
+
return if closed?
|
62
|
+
|
63
|
+
while @nrow
|
64
|
+
idx = 0
|
65
|
+
row = Jvertica::Row.new(
|
66
|
+
@col_labels,
|
67
|
+
@col_labels_d,
|
68
|
+
@getters.map {|gt|
|
69
|
+
case gt
|
70
|
+
when :getBigNum
|
71
|
+
v = @rset.getBigDecimal(idx+=1)
|
72
|
+
@rset.was_null ? nil : v.toPlainString.to_i
|
73
|
+
when :getBigDecimal
|
74
|
+
v = @rset.getBigDecimal(idx+=1)
|
75
|
+
@rset.was_null ? nil : BigDecimal.new(v.toPlainString)
|
76
|
+
else
|
77
|
+
v = @rset.send(gt, idx+=1)
|
78
|
+
@rset.was_null ? nil : v
|
79
|
+
end
|
80
|
+
},
|
81
|
+
@rownum += 1
|
82
|
+
)
|
83
|
+
close unless @nrow = @rset.next
|
84
|
+
yield row
|
85
|
+
end
|
86
|
+
close
|
87
|
+
end
|
88
|
+
|
89
|
+
def close
|
90
|
+
return if closed?
|
91
|
+
@rset.close rescue nil
|
92
|
+
@close_callback.call if @close_callback
|
93
|
+
ensure
|
94
|
+
@closed = true
|
95
|
+
end
|
96
|
+
|
97
|
+
def closed?
|
98
|
+
@closed
|
99
|
+
end
|
100
|
+
end
|
101
|
+
end
|
data/lib/jvertica/row.rb
ADDED
@@ -0,0 +1,84 @@
|
|
1
|
+
class Jvertica
|
2
|
+
class Row
|
3
|
+
attr_reader :labels, :values, :rownum
|
4
|
+
alias_method :keys, :labels
|
5
|
+
|
6
|
+
include Enumerable
|
7
|
+
|
8
|
+
def initialize(col_labels, col_labels_d, values, rownum)
|
9
|
+
@labels = col_labels
|
10
|
+
@labels_d = col_labels_d
|
11
|
+
@values = values
|
12
|
+
@rownum = rownum
|
13
|
+
end
|
14
|
+
|
15
|
+
def [](*idx)
|
16
|
+
return @values[*idx] if idx.length > 1
|
17
|
+
|
18
|
+
idx = idx.first
|
19
|
+
case idx
|
20
|
+
when Fixnum
|
21
|
+
raise RangeError.new("Index out of bound") if idx >= @values.length
|
22
|
+
@values[idx]
|
23
|
+
when String, Symbol
|
24
|
+
vidx = @labels_d.index(idx.to_s.downcase) or
|
25
|
+
raise NameError.new("Unknown column label: #{idx}")
|
26
|
+
@values[vidx]
|
27
|
+
else
|
28
|
+
@values[idx]
|
29
|
+
end
|
30
|
+
end
|
31
|
+
|
32
|
+
def each(&blk)
|
33
|
+
@values.each do |v|
|
34
|
+
yield v
|
35
|
+
end
|
36
|
+
end
|
37
|
+
|
38
|
+
def inspect
|
39
|
+
strs = []
|
40
|
+
@labels.each do |col|
|
41
|
+
strs << "#{col}: #{self[col] || '(null)'}"
|
42
|
+
end
|
43
|
+
'[' + strs.join(', ') + ']'
|
44
|
+
end
|
45
|
+
|
46
|
+
def to_a
|
47
|
+
@values
|
48
|
+
end
|
49
|
+
|
50
|
+
def join(sep = $OUTPUT_FIELD_SEPARATOR)
|
51
|
+
to_a.join(sep)
|
52
|
+
end
|
53
|
+
|
54
|
+
def eql?(other)
|
55
|
+
self.hash == other.hash
|
56
|
+
end
|
57
|
+
|
58
|
+
def hash
|
59
|
+
@labels.zip(@values).sort.hash
|
60
|
+
end
|
61
|
+
|
62
|
+
def to_h
|
63
|
+
Hash[@labels.zip(@values)]
|
64
|
+
end
|
65
|
+
|
66
|
+
alias :== :eql?
|
67
|
+
|
68
|
+
def method_missing(symb, *args)
|
69
|
+
if vidx = @labels_d.index(symb.to_s.downcase)
|
70
|
+
@values[vidx]
|
71
|
+
elsif @values.respond_to?(symb)
|
72
|
+
@values.send(symb, *args)
|
73
|
+
else
|
74
|
+
raise NoMethodError.new("undefined method or attribute `#{symb}'")
|
75
|
+
end
|
76
|
+
end
|
77
|
+
|
78
|
+
[:id, :tap, :gem, :display, :class, :method, :methods, :trust].select do |s|
|
79
|
+
method_defined?(s)
|
80
|
+
end.each do |m|
|
81
|
+
undef_method(m)
|
82
|
+
end
|
83
|
+
end
|
84
|
+
end
|
data/lib/jvertica/version.rb
CHANGED
data/spec/jvertica_spec.rb
CHANGED
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: jvertica
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.1.
|
4
|
+
version: 0.1.10
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- takahiro.nakayama
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2015-06-
|
11
|
+
date: 2015-06-24 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
requirement: !ruby/object:Gem::Requirement
|
@@ -52,6 +52,20 @@ dependencies:
|
|
52
52
|
- - '>='
|
53
53
|
- !ruby/object:Gem::Version
|
54
54
|
version: '0'
|
55
|
+
- !ruby/object:Gem::Dependency
|
56
|
+
requirement: !ruby/object:Gem::Requirement
|
57
|
+
requirements:
|
58
|
+
- - '>='
|
59
|
+
- !ruby/object:Gem::Version
|
60
|
+
version: '0'
|
61
|
+
name: dotenv
|
62
|
+
prerelease: false
|
63
|
+
type: :development
|
64
|
+
version_requirements: !ruby/object:Gem::Requirement
|
65
|
+
requirements:
|
66
|
+
- - '>='
|
67
|
+
- !ruby/object:Gem::Version
|
68
|
+
version: '0'
|
55
69
|
- !ruby/object:Gem::Dependency
|
56
70
|
requirement: !ruby/object:Gem::Requirement
|
57
71
|
requirements:
|
@@ -75,14 +89,20 @@ extra_rdoc_files: []
|
|
75
89
|
files:
|
76
90
|
- .gitignore
|
77
91
|
- .rspec
|
78
|
-
- .ruby-version
|
79
92
|
- .travis.yml
|
80
93
|
- Gemfile
|
81
94
|
- LICENSE.txt
|
82
95
|
- README.md
|
83
96
|
- Rakefile
|
97
|
+
- example/copy.rb
|
98
|
+
- example/data.json
|
99
|
+
- example/select.rb
|
84
100
|
- jvertica.gemspec
|
85
101
|
- lib/jvertica.rb
|
102
|
+
- lib/jvertica/constant.rb
|
103
|
+
- lib/jvertica/error.rb
|
104
|
+
- lib/jvertica/result_set.rb
|
105
|
+
- lib/jvertica/row.rb
|
86
106
|
- lib/jvertica/version.rb
|
87
107
|
- spec/jvertica_spec.rb
|
88
108
|
- spec/spec_helper.rb
|
@@ -106,7 +126,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
106
126
|
version: '0'
|
107
127
|
requirements: []
|
108
128
|
rubyforge_project:
|
109
|
-
rubygems_version: 2.
|
129
|
+
rubygems_version: 2.4.5
|
110
130
|
signing_key:
|
111
131
|
specification_version: 4
|
112
132
|
summary: jvertica
|
data/.ruby-version
DELETED
@@ -1 +0,0 @@
|
|
1
|
-
jruby-1.7.16
|