voruby 1.1 → 1.1.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.
- data/REQUIREMENTS +3 -3
- data/Rakefile.rb +6 -2
- data/lib/voruby/active_votable/active_votable.rb +61 -6
- data/lib/voruby/adql/adql.rb +64 -12
- data/lib/voruby/adql/ext.rb +2 -3
- data/lib/voruby/adql/loader.rb +1 -0
- data/lib/voruby/resources/voresource/voresource_v0_10.rb +7 -2
- data/lib/voruby/services/gestalt/footprint.rb +2 -2
- data/lib/voruby/services/gestalt/wesix.rb +1 -1
- data/lib/voruby/services/resolver/resolver.rb +1 -1
- data/lib/voruby/services/schema/schema.rb +644 -0
- data/lib/voruby/simple/sap.rb +2 -2
- data/lib/voruby/votables/chandra.rb +194 -231
- data/lib/voruby/votables/galex.rb +229 -242
- data/lib/voruby/votables/int.rb +193 -230
- data/lib/voruby/votables/nsa.rb +299 -282
- data/lib/voruby/votables/rexml_votable.rb +1 -1
- data/lib/voruby/votables/sdss.rb +194 -231
- data/lib/voruby/votables/transforms.rb +3 -3
- data/lib/voruby/votables/votable.rb +338 -281
- data/test/active_votable/unittest.rb +18 -4
- data/test/plastic/test.rb +1 -1
- data/test/resources/voresource/unittest_v1_0.rb +2 -2
- data/test/stc/unittest_v1_20.rb +2 -2
- metadata +52 -54
- data/lib/voruby/votables/cnoc.rb +0 -393
- data/lib/voruby/votables/hst.rb +0 -391
- data/lib/voruby/votables/nsar3.rb +0 -410
- data/lib/voruby/votables/xmm.rb +0 -394
@@ -0,0 +1,644 @@
|
|
1
|
+
|
2
|
+
module VORuby
|
3
|
+
module Services
|
4
|
+
module Schema
|
5
|
+
|
6
|
+
module SSException
|
7
|
+
# An exception thrown when the incoming type does not match
|
8
|
+
# the expected value.
|
9
|
+
class TypeException < Exception
|
10
|
+
# [_obj_:]
|
11
|
+
# The object itself.
|
12
|
+
# [_prototype_:]
|
13
|
+
# The prototype of the expected class.
|
14
|
+
def initialize(obj=nil, prototype=nil)
|
15
|
+
super("Invalid type: #{obj.class} (#{obj}) != #{prototype}")
|
16
|
+
end
|
17
|
+
end
|
18
|
+
|
19
|
+
# A class which checks to see whether the type of the incoming class
|
20
|
+
# matches expectation.
|
21
|
+
class TypeCheck
|
22
|
+
attr_accessor :obj, :proto
|
23
|
+
|
24
|
+
# [_obj_:]
|
25
|
+
# The object in question.
|
26
|
+
# [_proto_:]
|
27
|
+
# The prototype of the expected class.
|
28
|
+
def initialize(obj=nil, proto=nil)
|
29
|
+
@obj = obj
|
30
|
+
@proto = proto
|
31
|
+
end
|
32
|
+
|
33
|
+
# Check to see whether the class is of the expected type.
|
34
|
+
def check
|
35
|
+
raise SSException::TypeException.new(@obj, @proto) if @obj == nil and !@obj.is_a?(@proto)
|
36
|
+
end
|
37
|
+
|
38
|
+
def to_s
|
39
|
+
"{object=#{@obj};prototype=#{@proto}}"
|
40
|
+
end
|
41
|
+
end
|
42
|
+
end
|
43
|
+
|
44
|
+
module SchemaDefinition
|
45
|
+
class Table
|
46
|
+
#It's the same that MetaTable
|
47
|
+
end
|
48
|
+
|
49
|
+
class MetaTable
|
50
|
+
attr_reader :name, :description, :rows
|
51
|
+
|
52
|
+
def initialize(name=nil, description=nil, rows=nil)
|
53
|
+
@name = name
|
54
|
+
@description = description
|
55
|
+
@rows = rows
|
56
|
+
end
|
57
|
+
|
58
|
+
# The node is MetaTable
|
59
|
+
def self.from_xml(node)
|
60
|
+
name_node = REXML::XPath.first(node, 'Name')
|
61
|
+
name = name_node.get_text.value.strip if name_node.get_text
|
62
|
+
|
63
|
+
description_node = REXML::XPath.first(node, 'Description')
|
64
|
+
description = description_node.get_text.value.strip if description_node.get_text
|
65
|
+
|
66
|
+
rows_node = REXML::XPath.first(node, 'Rows')
|
67
|
+
rows = rows_node.get_text.value.strip if rows_node.get_text
|
68
|
+
|
69
|
+
return MetaTable.new(name, description, rows)
|
70
|
+
end
|
71
|
+
|
72
|
+
def to_s
|
73
|
+
"{name=#{self.name};description=#{self.description};rows=#{self.rows}}"
|
74
|
+
end
|
75
|
+
end
|
76
|
+
|
77
|
+
class ArrayOfMetaTable
|
78
|
+
attr_reader :meta_tables
|
79
|
+
|
80
|
+
def initialize(meta_tables=[])
|
81
|
+
@meta_tables = meta_tables
|
82
|
+
end
|
83
|
+
|
84
|
+
# The node is MetaTable
|
85
|
+
def self.from_xml(node)
|
86
|
+
meta_tbls = []
|
87
|
+
|
88
|
+
node.elements.each('MetaTable') do |elem|
|
89
|
+
meta_table = MetaTable.from_xml(elem)
|
90
|
+
meta_tbls.push(meta_table) if meta_table
|
91
|
+
end
|
92
|
+
|
93
|
+
return ArrayOfMetaTable.new(meta_tbls)
|
94
|
+
end
|
95
|
+
|
96
|
+
def to_s
|
97
|
+
meta_tbls = []
|
98
|
+
@meta_tables.each do |meta_table|
|
99
|
+
meta_tbls.push(meta_table.to_s)
|
100
|
+
end
|
101
|
+
|
102
|
+
return "{meta_tables=[#{meta_tbls.join(',')}]}"
|
103
|
+
end
|
104
|
+
end
|
105
|
+
|
106
|
+
class Column
|
107
|
+
attr_reader :name
|
108
|
+
|
109
|
+
def initialize(name=nil)
|
110
|
+
@name = name
|
111
|
+
end
|
112
|
+
|
113
|
+
# The node is String
|
114
|
+
def self.from_xml(node)
|
115
|
+
return Column.new(node.get_text.value.strip) if node.has_text?
|
116
|
+
end
|
117
|
+
|
118
|
+
def to_s
|
119
|
+
"name=#{self.name}"
|
120
|
+
end
|
121
|
+
end
|
122
|
+
|
123
|
+
class ArrayOfString
|
124
|
+
attr_reader :columns
|
125
|
+
|
126
|
+
def initialize(columns=[])
|
127
|
+
@columns = columns
|
128
|
+
end
|
129
|
+
|
130
|
+
# The node is String
|
131
|
+
def self.from_xml(node)
|
132
|
+
cols = []
|
133
|
+
|
134
|
+
node.elements.each('string') do |elem|
|
135
|
+
column = Column.from_xml(elem)
|
136
|
+
cols.push(column) if column
|
137
|
+
end
|
138
|
+
|
139
|
+
return ArrayOfString.new(cols)
|
140
|
+
end
|
141
|
+
|
142
|
+
def to_s
|
143
|
+
cols = []
|
144
|
+
@columns.each do |col|
|
145
|
+
cols.push(col.to_s)
|
146
|
+
end
|
147
|
+
|
148
|
+
return "{columns=[#{cols.join(',')}]}"
|
149
|
+
end
|
150
|
+
end
|
151
|
+
|
152
|
+
class MetaColumn
|
153
|
+
attr_reader :name, :type, :unit, :description, :ucd
|
154
|
+
|
155
|
+
def initialize(name=nil, type=nil, unit=nil, description=nil, ucd=nil)
|
156
|
+
@name = name
|
157
|
+
@type = type
|
158
|
+
@unit = unit
|
159
|
+
@description = description
|
160
|
+
@ucd = ucd
|
161
|
+
end
|
162
|
+
|
163
|
+
# The node is MetaColumn
|
164
|
+
def self.from_xml(node)
|
165
|
+
name_node = REXML::XPath.first(node, 'Name')
|
166
|
+
name = name_node.get_text.value.strip if name_node.get_text
|
167
|
+
|
168
|
+
type_node = REXML::XPath.first(node, 'Type')
|
169
|
+
type = type_node.get_text.value.strip if type_node.get_text
|
170
|
+
|
171
|
+
unit_node = REXML::XPath.first(node, 'Unit')
|
172
|
+
unit = unit_node.get_text.value.strip if unit_node.get_text
|
173
|
+
|
174
|
+
description_node = REXML::XPath.first(node, 'Description')
|
175
|
+
description = description_node.get_text.value.strip if description_node.get_text
|
176
|
+
|
177
|
+
ucd_node = REXML::XPath.first(node, 'UCD')
|
178
|
+
ucd = ucd_node.get_text.value.strip if ucd_node.get_text
|
179
|
+
|
180
|
+
return MetaColumn.new(name, type, unit, description, ucd)
|
181
|
+
end
|
182
|
+
|
183
|
+
def to_s
|
184
|
+
"{name=#{self.name};type=#{self.type};unit=#{self.unit};" +
|
185
|
+
"description=#{self.description};ucd=#{self.ucd}}"
|
186
|
+
end
|
187
|
+
end
|
188
|
+
|
189
|
+
class ArrayOfMetaColumn
|
190
|
+
attr_reader :meta_columns
|
191
|
+
|
192
|
+
def initialize(meta_columns=[])
|
193
|
+
@meta_columns = meta_columns
|
194
|
+
end
|
195
|
+
|
196
|
+
# The node is String
|
197
|
+
def self.from_xml(node)
|
198
|
+
meta_cols = []
|
199
|
+
|
200
|
+
node.elements.each('MetaColumn') do |elem|
|
201
|
+
meta_column = MetaColumn.from_xml(elem)
|
202
|
+
meta_cols.push(meta_column) if meta_column
|
203
|
+
end
|
204
|
+
|
205
|
+
return ArrayOfMetaColumn.new(meta_cols)
|
206
|
+
end
|
207
|
+
|
208
|
+
def to_s
|
209
|
+
meta_cols = []
|
210
|
+
@meta_columns.each do |meta_col|
|
211
|
+
meta_cols.push(meta_col.to_s)
|
212
|
+
end
|
213
|
+
|
214
|
+
return "{meta_columns=[#{meta_cols.join(',')}]}"
|
215
|
+
end
|
216
|
+
end
|
217
|
+
end
|
218
|
+
|
219
|
+
module HTTPGetQuery
|
220
|
+
require 'net/http'
|
221
|
+
require 'net/https'
|
222
|
+
require 'uri'
|
223
|
+
|
224
|
+
def fetch
|
225
|
+
http = Net::HTTP.new(uri.host, uri.port)
|
226
|
+
http.read_timeout = query_timeout()
|
227
|
+
http.use_ssl = (uri.scheme == 'https')# enable SSL/TLS
|
228
|
+
|
229
|
+
if http.use_ssl
|
230
|
+
http.ca_path = ssl_files[:ca_path]
|
231
|
+
http.cert = OpenSSL::X509::Certificate.new(File.read(ssl_files[:cert_file]))
|
232
|
+
http.key = OpenSSL::PKey::RSA.new(File.read(ssl_files[:key_file]), ssl_files[:password])
|
233
|
+
end
|
234
|
+
|
235
|
+
res = http.start {|http|
|
236
|
+
http.get(uri.path + '?' + required_parameters().join('&'))
|
237
|
+
}
|
238
|
+
|
239
|
+
self.response = res.body
|
240
|
+
end
|
241
|
+
|
242
|
+
# URI::InvalidURIError: Raised if URI given is not a correct one.
|
243
|
+
def uri=(u)
|
244
|
+
@uri = URI.parse(u)
|
245
|
+
end
|
246
|
+
|
247
|
+
def ssl_files=(sf)
|
248
|
+
if sf != nil
|
249
|
+
SSException::TypeCheck.new(sf, Hash).check()
|
250
|
+
raise "CA certification path isn't directory" if sf[:ca_path] == nil and
|
251
|
+
!File.directory?(sf[:ca_path])
|
252
|
+
raise "SSL Certificate file doesn't exists" if sf[:cert_file] == nil and
|
253
|
+
!File.exist?(sf[:cert_file])
|
254
|
+
raise "SSL Key file doesn't exists" if sf[:key_file] == nil and
|
255
|
+
!File.exist?(sf[:key_file])
|
256
|
+
@ssl_files = sf
|
257
|
+
end
|
258
|
+
end
|
259
|
+
|
260
|
+
def query_timeout=(qt)
|
261
|
+
SSException::TypeCheck.new(qt, Integer).check()
|
262
|
+
@query_timeout = qt
|
263
|
+
end
|
264
|
+
end
|
265
|
+
|
266
|
+
module SSParameters
|
267
|
+
require 'uri'
|
268
|
+
|
269
|
+
class Method
|
270
|
+
attr_reader :method
|
271
|
+
|
272
|
+
def initialize(method)
|
273
|
+
self.method = method
|
274
|
+
end
|
275
|
+
|
276
|
+
def method=(m)
|
277
|
+
SSException::TypeCheck.new(m, String).check()
|
278
|
+
raise "method parameter is empty" if m.empty?
|
279
|
+
@method = m
|
280
|
+
end
|
281
|
+
|
282
|
+
def to_p
|
283
|
+
URI.escape("method=#{self.method}")
|
284
|
+
end
|
285
|
+
|
286
|
+
def to_s
|
287
|
+
"#{self.method}"
|
288
|
+
end
|
289
|
+
end
|
290
|
+
|
291
|
+
class TableName
|
292
|
+
attr_reader :table_name
|
293
|
+
|
294
|
+
def initialize(table_name)
|
295
|
+
self.table_name = table_name
|
296
|
+
end
|
297
|
+
|
298
|
+
def table_name=(t)
|
299
|
+
SSException::TypeCheck.new(t, String).check()
|
300
|
+
raise "table_name parameter is empty" if t.empty?
|
301
|
+
@table_name = t
|
302
|
+
end
|
303
|
+
|
304
|
+
def to_p
|
305
|
+
URI.escape("tableName=#{self.table_name}")
|
306
|
+
end
|
307
|
+
|
308
|
+
def to_s
|
309
|
+
"#{self.table_name}"
|
310
|
+
end
|
311
|
+
end
|
312
|
+
|
313
|
+
class ColumnName
|
314
|
+
attr_reader :column_name
|
315
|
+
|
316
|
+
def initialize(column_name)
|
317
|
+
self.column_name = column_name
|
318
|
+
end
|
319
|
+
|
320
|
+
def column_name=(c)
|
321
|
+
SSException::TypeCheck.new(c, String).check()
|
322
|
+
raise "column_name parameter is empty" if c.empty?
|
323
|
+
@column_name = c
|
324
|
+
end
|
325
|
+
|
326
|
+
def to_p
|
327
|
+
URI.escape("columnName=#{self.column_name}")
|
328
|
+
end
|
329
|
+
|
330
|
+
def to_s
|
331
|
+
"#{self.column_name}"
|
332
|
+
end
|
333
|
+
end
|
334
|
+
end
|
335
|
+
|
336
|
+
module SSResponse
|
337
|
+
require 'rexml/document'
|
338
|
+
|
339
|
+
class ResponseParser
|
340
|
+
attr_reader :xml_doc
|
341
|
+
|
342
|
+
def initialize(src)
|
343
|
+
begin
|
344
|
+
@xml_doc = REXML::Document.new(src)
|
345
|
+
rescue Exception => e
|
346
|
+
raise "REXML Exception, is a XML?: #{e.message}"
|
347
|
+
end
|
348
|
+
end
|
349
|
+
|
350
|
+
def parse
|
351
|
+
return ResponseDocument.from_xml(self.xml_doc.root)
|
352
|
+
end
|
353
|
+
end
|
354
|
+
|
355
|
+
class ObjectBuilder
|
356
|
+
def self.classes
|
357
|
+
{:ArrayOfMetaTable => SchemaDefinition::ArrayOfMetaTable,
|
358
|
+
:MetaTable => SchemaDefinition::MetaTable,
|
359
|
+
:ArrayOfString => SchemaDefinition::ArrayOfString,
|
360
|
+
:ArrayOfMetaColumn => SchemaDefinition::ArrayOfMetaColumn,
|
361
|
+
:MetaColumn => SchemaDefinition::MetaColumn}
|
362
|
+
end
|
363
|
+
|
364
|
+
def self.get_class_for(type)
|
365
|
+
klass = self.classes()[type.to_sym] || self.classes()[type]
|
366
|
+
raise "Unable to find type #{type}" if !klass
|
367
|
+
return klass
|
368
|
+
end
|
369
|
+
end
|
370
|
+
|
371
|
+
class ResponseContent
|
372
|
+
def self.from_xml(node)
|
373
|
+
return ObjectBuilder.get_class_for(node.name).from_xml(node)
|
374
|
+
end
|
375
|
+
end
|
376
|
+
|
377
|
+
class ResponseDocument
|
378
|
+
attr_reader :response, :status, :message
|
379
|
+
|
380
|
+
def initialize(response=nil, status=nil, message=nil)
|
381
|
+
@response = response
|
382
|
+
@status = status
|
383
|
+
@message = message
|
384
|
+
end
|
385
|
+
|
386
|
+
def self.from_xml(root)
|
387
|
+
raise "root element is null." if root == nil
|
388
|
+
|
389
|
+
response = ResponseContent.from_xml(root)
|
390
|
+
|
391
|
+
if !response
|
392
|
+
status = root.attributes['status']
|
393
|
+
message = root.get_text.value.strip if root.has_text?
|
394
|
+
end
|
395
|
+
|
396
|
+
return ResponseDocument.new(response, status, message)
|
397
|
+
end
|
398
|
+
|
399
|
+
def to_s
|
400
|
+
"{response=#{self.response};status=#{self.status};message=#{self.message}}"
|
401
|
+
end
|
402
|
+
end
|
403
|
+
end
|
404
|
+
|
405
|
+
module SchemaRetrieval
|
406
|
+
class SchemaRetrievalGeneric
|
407
|
+
def method=(m)
|
408
|
+
@method = SSParameters::Method.new(m)
|
409
|
+
end
|
410
|
+
|
411
|
+
def marshall
|
412
|
+
raise "response parameter is null" if self.response == nil
|
413
|
+
return SSResponse::ResponseParser.new(self.response).parse()
|
414
|
+
end
|
415
|
+
|
416
|
+
def to_s
|
417
|
+
"uri=#{self.uri.to_s};method=#{self.method.to_s};" +
|
418
|
+
"response=#{self.response.to_s};" +
|
419
|
+
"query_timeout=#{query_timeout.to_s}"
|
420
|
+
end
|
421
|
+
end
|
422
|
+
|
423
|
+
# Gets the list of table names.
|
424
|
+
class GetTables < SchemaRetrievalGeneric
|
425
|
+
include HTTPGetQuery
|
426
|
+
|
427
|
+
attr_reader :uri, :ssl_files, :query_timeout, :method
|
428
|
+
attr_accessor :response
|
429
|
+
|
430
|
+
def initialize(uri, ssl_files=nil, query_timeout=30)
|
431
|
+
self.uri = uri
|
432
|
+
|
433
|
+
self.ssl_files = ssl_files
|
434
|
+
self.query_timeout = query_timeout
|
435
|
+
|
436
|
+
self.method = 'getTables'
|
437
|
+
|
438
|
+
self.response = nil
|
439
|
+
end
|
440
|
+
|
441
|
+
def required_parameters
|
442
|
+
[self.method.to_p]
|
443
|
+
end
|
444
|
+
|
445
|
+
def to_s
|
446
|
+
super.to_s
|
447
|
+
end
|
448
|
+
end
|
449
|
+
|
450
|
+
# Just like getTables class but with additional metadata info.
|
451
|
+
class GetMetaTables < SchemaRetrievalGeneric
|
452
|
+
include HTTPGetQuery
|
453
|
+
|
454
|
+
attr_reader :uri, :ssl_files, :query_timeout, :method
|
455
|
+
attr_accessor :response
|
456
|
+
|
457
|
+
def initialize(uri, ssl_files=nil, query_timeout=30)
|
458
|
+
self.uri = uri
|
459
|
+
|
460
|
+
self.ssl_files = ssl_files
|
461
|
+
self.query_timeout = query_timeout
|
462
|
+
|
463
|
+
self.method = 'getMetaTables'
|
464
|
+
|
465
|
+
self.response = nil
|
466
|
+
end
|
467
|
+
|
468
|
+
def required_parameters
|
469
|
+
[self.method.to_p]
|
470
|
+
end
|
471
|
+
|
472
|
+
def to_s
|
473
|
+
super.to_s
|
474
|
+
end
|
475
|
+
end
|
476
|
+
|
477
|
+
# Gets the info associated to a table
|
478
|
+
class GetTableInfo < SchemaRetrievalGeneric
|
479
|
+
include HTTPGetQuery
|
480
|
+
|
481
|
+
attr_reader :uri, :ssl_files, :query_timeout, :method, :table_name
|
482
|
+
attr_accessor :response
|
483
|
+
|
484
|
+
def initialize(uri, table_name, ssl_files=nil, query_timeout=30)
|
485
|
+
self.uri = uri
|
486
|
+
self.table_name = table_name
|
487
|
+
|
488
|
+
self.ssl_files = ssl_files
|
489
|
+
self.query_timeout = query_timeout
|
490
|
+
|
491
|
+
self.method = 'getTableInfo'
|
492
|
+
|
493
|
+
self.response = nil
|
494
|
+
end
|
495
|
+
|
496
|
+
def table_name=(t)
|
497
|
+
@table_name = SSParameters::TableName.new(t)
|
498
|
+
end
|
499
|
+
|
500
|
+
def required_parameters
|
501
|
+
[self.method.to_p, self.table_name.to_p]
|
502
|
+
end
|
503
|
+
|
504
|
+
def to_s
|
505
|
+
super.to_s + ";table_name=#{self.table_name.to_s}"
|
506
|
+
end
|
507
|
+
end
|
508
|
+
|
509
|
+
# Gets the list of column names for a particular table.
|
510
|
+
class GetColumns < SchemaRetrievalGeneric
|
511
|
+
include HTTPGetQuery
|
512
|
+
|
513
|
+
attr_reader :uri, :ssl_files, :query_timeout, :method, :table_name
|
514
|
+
attr_accessor :response
|
515
|
+
|
516
|
+
def initialize(uri, table_name, ssl_files=nil, query_timeout=30)
|
517
|
+
self.uri = uri
|
518
|
+
self.table_name = table_name
|
519
|
+
|
520
|
+
self.ssl_files = ssl_files
|
521
|
+
self.query_timeout = query_timeout
|
522
|
+
|
523
|
+
self.method = 'getColumns'
|
524
|
+
|
525
|
+
self.response = nil
|
526
|
+
end
|
527
|
+
|
528
|
+
def table_name=(t)
|
529
|
+
@table_name = SSParameters::TableName.new(t)
|
530
|
+
end
|
531
|
+
|
532
|
+
def required_parameters
|
533
|
+
[self.method.to_p, self.table_name.to_p]
|
534
|
+
end
|
535
|
+
|
536
|
+
def to_s
|
537
|
+
super.to_s + ";table_name=#{self.table_name.to_s}"
|
538
|
+
end
|
539
|
+
end
|
540
|
+
|
541
|
+
# Just like getColumns but with additional metadata info.
|
542
|
+
class GetMetaColumns < SchemaRetrievalGeneric
|
543
|
+
include HTTPGetQuery
|
544
|
+
|
545
|
+
attr_reader :uri, :ssl_files, :query_timeout, :method, :table_name
|
546
|
+
attr_accessor :response
|
547
|
+
|
548
|
+
def initialize(uri, table_name, ssl_files=nil, query_timeout=30)
|
549
|
+
self.uri = uri
|
550
|
+
self.table_name = table_name
|
551
|
+
|
552
|
+
self.ssl_files = ssl_files
|
553
|
+
self.query_timeout = query_timeout
|
554
|
+
|
555
|
+
self.method = 'getMetaColumns'
|
556
|
+
|
557
|
+
self.response = nil
|
558
|
+
end
|
559
|
+
|
560
|
+
def table_name=(t)
|
561
|
+
@table_name = SSParameters::TableName.new(t)
|
562
|
+
end
|
563
|
+
|
564
|
+
def required_parameters
|
565
|
+
[self.method.to_p, self.table_name.to_p]
|
566
|
+
end
|
567
|
+
|
568
|
+
def to_s
|
569
|
+
super.to_s + ";table_name=#{self.table_name.to_s}"
|
570
|
+
end
|
571
|
+
end
|
572
|
+
|
573
|
+
# Gets the info associated to a column.
|
574
|
+
class GetColumnInfo < SchemaRetrievalGeneric
|
575
|
+
include HTTPGetQuery
|
576
|
+
|
577
|
+
attr_reader :uri, :ssl_files, :query_timeout, :method, :table_name, :column_name
|
578
|
+
attr_accessor :response
|
579
|
+
|
580
|
+
def initialize(uri, table_name, column_name, ssl_files=nil, query_timeout=30)
|
581
|
+
self.uri = uri
|
582
|
+
self.table_name = table_name
|
583
|
+
self.column_name = column_name
|
584
|
+
|
585
|
+
self.ssl_files = ssl_files
|
586
|
+
self.query_timeout = query_timeout
|
587
|
+
|
588
|
+
self.method = 'getColumnInfo'
|
589
|
+
|
590
|
+
self.response = nil
|
591
|
+
end
|
592
|
+
|
593
|
+
def table_name=(t)
|
594
|
+
@table_name = SSParameters::TableName.new(t)
|
595
|
+
end
|
596
|
+
|
597
|
+
def column_name=(c)
|
598
|
+
@column_name = SSParameters::ColumnName.new(c)
|
599
|
+
end
|
600
|
+
|
601
|
+
def required_parameters
|
602
|
+
[self.method.to_p, self.table_name.to_p, self.column_name.to_p]
|
603
|
+
end
|
604
|
+
|
605
|
+
def to_s
|
606
|
+
super.to_s + ";table_name=#{self.table_name.to_s};column_name=#{self.column_name}"
|
607
|
+
end
|
608
|
+
end
|
609
|
+
end
|
610
|
+
|
611
|
+
class QueryExecutor
|
612
|
+
attr_reader :queries, :results
|
613
|
+
|
614
|
+
def initialize(queries=[], abort_on_exception=false)
|
615
|
+
self.queries = queries
|
616
|
+
Thread::abort_on_exception = abort_on_exception
|
617
|
+
|
618
|
+
@results = {}
|
619
|
+
begin_queries()
|
620
|
+
end
|
621
|
+
|
622
|
+
def queries=(q)
|
623
|
+
SSException::TypeCheck.new(q, Array).check()
|
624
|
+
raise "queries Array is empty" if q.empty?
|
625
|
+
@queries = q
|
626
|
+
end
|
627
|
+
|
628
|
+
def begin_queries
|
629
|
+
threads = []
|
630
|
+
|
631
|
+
queries.each do |query|
|
632
|
+
threads << Thread.new(query){ |the_query|
|
633
|
+
the_query.fetch()
|
634
|
+
@results[the_query] = the_query.marshall()
|
635
|
+
}
|
636
|
+
end
|
637
|
+
|
638
|
+
threads.each{ |thread| thread.join() }
|
639
|
+
end
|
640
|
+
end
|
641
|
+
|
642
|
+
end
|
643
|
+
end
|
644
|
+
end
|
data/lib/voruby/simple/sap.rb
CHANGED
@@ -47,7 +47,7 @@ module VORuby
|
|
47
47
|
# * Simple::ConeSearch (Simple Cone Search queries)
|
48
48
|
# [_converter_:]
|
49
49
|
# An anonymous subroutine that can be used to convert the result of a
|
50
|
-
# query into another form--often a
|
50
|
+
# query into another form--often a VOTable::VOTable for our purposes.
|
51
51
|
# By default, it simply returns the completed query.
|
52
52
|
# [_abort_on_exeception_:]
|
53
53
|
# A flag which indicates whether or not if one query fails, the other queries
|
@@ -121,7 +121,7 @@ module VORuby
|
|
121
121
|
end
|
122
122
|
|
123
123
|
# Mixin a method that converts an XML VOTable into an object using
|
124
|
-
# a
|
124
|
+
# a VOTable::TreeParsedVOTable.
|
125
125
|
module VOTableMarshaller
|
126
126
|
# Interpret the response into an object.
|
127
127
|
def marshall
|