xmlservice 1.3.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +7 -0
- data/LICENSE +19 -0
- data/README_IBM_i +62 -0
- data/lib/adapters/abstract_adapter.rb +82 -0
- data/lib/adapters/db2_adapter.rb +70 -0
- data/lib/adapters/rest_adapter.rb +32 -0
- data/lib/password/password.rb +229 -0
- data/lib/xmlservice.rb +2477 -0
- data/test/README_IBM_i +3 -0
- data/test/Rakefile +42 -0
- data/test/genpassword.rb +111 -0
- data/test/test_60000_toolkit_driver/Rakefile +11 -0
- data/test/test_60000_toolkit_driver/test_60010_DriverCallPgmZZCALL.rb +403 -0
- data/test/test_60000_toolkit_driver/test_60110_DriverCallSrvPgmZZARRAY.rb +149 -0
- data/test/test_60000_toolkit_driver/test_60310_DriverCMD.rb +77 -0
- data/test/test_60000_toolkit_driver/test_60510_DriverDataQueue.rb +126 -0
- data/test/test_60000_toolkit_driver/test_60610_DriverCallSrvPgmZZBINARY.rb +59 -0
- data/test/test_60000_toolkit_driver/test_60710_DriverSH.rb +73 -0
- data/test/test_60000_toolkit_driver/test_60910_DriverCallPgmZZMISS.rb +44 -0
- data/test/test_60000_toolkit_driver/test_65010_DriverCallDB2.rb +265 -0
- data/test/test_60000_toolkit_driver/zzassign.rb +66 -0
- data/test/test_60000_toolkit_driver/zzquick.rb +149 -0
- data/test/test_60000_toolkit_driver/zztestrest.rb +45 -0
- data/test/test_60000_toolkit_driver/zzthreadold.rb +78 -0
- data/test/test_70000_toolkit_testonly/Rakefile +11 -0
- data/test/test_70000_toolkit_testonly/test_70010_DriverCallPgmTestOnly.rb +270 -0
- data/test/test_80000_toolkit_dsl/Rakefile +11 -0
- data/test/test_80000_toolkit_dsl/test_80010_DSLCallPgmZZCALL.rb +162 -0
- data/test/test_80000_toolkit_dsl/test_80110_DSLCallSrvPgmZZARRAY.rb +150 -0
- data/test/test_authorization/README_IBM_i +15 -0
- data/test/test_authorization/auth.rb +101 -0
- data/test/test_authorization/key.yml +2 -0
- data/test/test_authorization/password.yml +3 -0
- data/test/test_authorization/xmlservice.yml +69 -0
- data/test/test_data/rowcol.rb +57 -0
- data/version.txt +1 -0
- metadata +92 -0
data/lib/xmlservice.rb
ADDED
@@ -0,0 +1,2477 @@
|
|
1
|
+
require 'adapters/abstract_adapter'
|
2
|
+
require 'yaml'
|
3
|
+
require 'thread'
|
4
|
+
|
5
|
+
# see README
|
6
|
+
module ActiveXMLService
|
7
|
+
XINSTALL = "POWER_RUBY"
|
8
|
+
XCTL = "*here *cdata"
|
9
|
+
XIPC = "*none"
|
10
|
+
XSIZE = 15000000
|
11
|
+
XHEAD = "<?xml version='1.0'?>"
|
12
|
+
XDATABASE = "*LOCAL"
|
13
|
+
XUSERNAME = "*NONE"
|
14
|
+
XPASSWORD = "*NONE"
|
15
|
+
class Base
|
16
|
+
# Converts all +config+ keys to symbols
|
17
|
+
def self.symbolize_keys(config)
|
18
|
+
# config = config.symbolize_keys
|
19
|
+
if config
|
20
|
+
config.keys.each do |key|
|
21
|
+
config[(key.to_sym rescue key) || key] = config.delete(key)
|
22
|
+
end
|
23
|
+
end
|
24
|
+
config
|
25
|
+
end
|
26
|
+
# configuration helper (singleton)
|
27
|
+
def self.establish_configuration(config)
|
28
|
+
# Converts all +config+ keys to symbols
|
29
|
+
config = ActiveXMLService::Base.symbolize_keys(config)
|
30
|
+
# *NEW test by yaml (see ibm_db_password.rb)
|
31
|
+
if ENV['TEST_YAML']
|
32
|
+
config[:test_yaml] = ENV['TEST_YAML']
|
33
|
+
end
|
34
|
+
if ENV['TEST_ENV']
|
35
|
+
config[:test_env] = ENV['TEST_ENV']
|
36
|
+
end
|
37
|
+
if config.has_key?(:test_yaml) && config.has_key?(:test_env)
|
38
|
+
require 'password/password'
|
39
|
+
config = XMLSERVICEPassword::Encrypt.parse_yaml(config,config[:test_yaml],config[:test_env])
|
40
|
+
config = XMLSERVICEPassword::Encrypt.symbolize_keys(config)
|
41
|
+
end
|
42
|
+
# *NEW encrypted passwords - decrypt password or password.yml (see ibm_db_password.rb)
|
43
|
+
if config.has_key?(:pwd_yaml) || config.has_key?(:pwd_enc)
|
44
|
+
require 'password/password'
|
45
|
+
config = XMLSERVICEPassword::Encrypt.parse_user_config(config)
|
46
|
+
end
|
47
|
+
@xml_config = config
|
48
|
+
@xml_config
|
49
|
+
end
|
50
|
+
# last configuration (singleton)
|
51
|
+
def self.configurations
|
52
|
+
@xml_config
|
53
|
+
end
|
54
|
+
# adapter factory (singleton)
|
55
|
+
def self.adapter_factory(config)
|
56
|
+
config = ActiveXMLService::Base.establish_configuration(config)
|
57
|
+
adapter = XMLServiceAdapters::adapter_factory(config)
|
58
|
+
adapter
|
59
|
+
end
|
60
|
+
# standard rails connection (singleton)
|
61
|
+
def self.establish_connection(config)
|
62
|
+
@xml_adapter = ActiveXMLService::Base.adapter_factory(config)
|
63
|
+
end
|
64
|
+
def self.connection
|
65
|
+
@xml_adapter
|
66
|
+
end
|
67
|
+
# *NEW encrypted passwords - generate pass key cipher (see ibm_db_password.rb)
|
68
|
+
def self.generate_key()
|
69
|
+
require 'password/password'
|
70
|
+
key_out = XMLSERVICEPassword::Encrypt.gen_key()
|
71
|
+
key_out
|
72
|
+
end
|
73
|
+
# *NEW encrypted passwords - generate encrypted password (see ibm_db_password.rb)
|
74
|
+
# plaintext - password in plain text
|
75
|
+
# key - 32 char pass key
|
76
|
+
def self.generate_password(plaintext, key="*DEFAULT")
|
77
|
+
require 'password/password'
|
78
|
+
pwd_out = XMLSERVICEPassword::Encrypt.gen_password(plaintext, key)
|
79
|
+
pwd_out
|
80
|
+
end
|
81
|
+
# thread level one at a time
|
82
|
+
def self.semaphore
|
83
|
+
if !(defined? @xml_semaphore)
|
84
|
+
@xml_semaphore = Mutex.new
|
85
|
+
end
|
86
|
+
@xml_semaphore
|
87
|
+
end
|
88
|
+
|
89
|
+
end # Base
|
90
|
+
|
91
|
+
end # module ActiveXMLService
|
92
|
+
|
93
|
+
module XMLService
|
94
|
+
# ---------------------
|
95
|
+
# BASE classes
|
96
|
+
# ---------------------
|
97
|
+
class I_Meta
|
98
|
+
def add_user_accessor(name, value)
|
99
|
+
if !(defined?(name)).nil?
|
100
|
+
self.class.send(:attr_accessor, name)
|
101
|
+
end
|
102
|
+
instance_variable_set("@#{name}", value)
|
103
|
+
name_var = "xml_user_accessor"
|
104
|
+
if !(defined?(name_var)).nil?
|
105
|
+
self.class.send(:attr_accessor, name_var)
|
106
|
+
end
|
107
|
+
instance_variable_set("@#{name_var}", name)
|
108
|
+
end
|
109
|
+
def remove_user_accessor(name)
|
110
|
+
if self.instance_variable_defined?("@#{name}")
|
111
|
+
self.remove_instance_variable("@#{name}")
|
112
|
+
end
|
113
|
+
name_var = "user_accessor"
|
114
|
+
if self.instance_variable_defined?("@#{name_var}")
|
115
|
+
self.remove_instance_variable("@#{name_var}")
|
116
|
+
end
|
117
|
+
end
|
118
|
+
def instance_variable_forward_get(parent,pname,cname)
|
119
|
+
if !parent.class.respond_to?("#{cname}")
|
120
|
+
parent.class.instance_eval do
|
121
|
+
define_method("#{cname}") { eval "@#{pname}.#{cname}" }
|
122
|
+
end
|
123
|
+
end
|
124
|
+
end
|
125
|
+
def instance_variable_forward_set(parent,pname,cname,cvalue)
|
126
|
+
if !parent.class.respond_to?("#{cname}=")
|
127
|
+
parent.class.instance_eval do
|
128
|
+
define_method("#{cname}=") {|value| eval "@#{pname}.#{cname} = value" }
|
129
|
+
end
|
130
|
+
end
|
131
|
+
end
|
132
|
+
def shortCut(obj,parent)
|
133
|
+
if parent.kind_of? I_Parameter or parent.kind_of? I_Return
|
134
|
+
child = parent.value
|
135
|
+
if child.kind_of? I_BaseMulti
|
136
|
+
obj.add_user_accessor(child.var,child)
|
137
|
+
elsif child.kind_of? I_Base
|
138
|
+
obj.instance_variable_forward_get(obj,parent.var,child.var)
|
139
|
+
obj.instance_variable_forward_set(obj,parent.var,child.var,child.value)
|
140
|
+
obj.instance_variable_forward_get(parent,parent.var,child.var)
|
141
|
+
obj.instance_variable_forward_set(parent,parent.var,child.var,child.value)
|
142
|
+
elsif child.instance_of? Array
|
143
|
+
child.each do |v|
|
144
|
+
if v.kind_of? I_BaseMulti
|
145
|
+
t = eval "obj.#{parent.var}.#{v.var}"
|
146
|
+
obj.add_user_accessor(v.var,t)
|
147
|
+
elsif parent.kind_of? I_Return and child.count == 1
|
148
|
+
t = eval "obj.#{parent.var}.#{v.var}"
|
149
|
+
obj.add_user_accessor(v.var,t)
|
150
|
+
end
|
151
|
+
end
|
152
|
+
end
|
153
|
+
end
|
154
|
+
end
|
155
|
+
def parse_output_attr()
|
156
|
+
end
|
157
|
+
def parse_return_attr()
|
158
|
+
end
|
159
|
+
def parse_diag_attr()
|
160
|
+
diag = false
|
161
|
+
diag
|
162
|
+
end
|
163
|
+
end
|
164
|
+
# ---------------------
|
165
|
+
# data types
|
166
|
+
# ---------------------
|
167
|
+
class I_Base < I_Meta
|
168
|
+
def initialize *args
|
169
|
+
case args.size
|
170
|
+
when 0
|
171
|
+
initialize_zero *args
|
172
|
+
when 1
|
173
|
+
initialize_doc *args
|
174
|
+
when 2
|
175
|
+
initialize_type2 *args
|
176
|
+
when 3
|
177
|
+
initialize_type3 *args
|
178
|
+
when 4
|
179
|
+
initialize_type4 *args
|
180
|
+
when 5
|
181
|
+
initialize_type5 *args
|
182
|
+
when 6
|
183
|
+
initialize_type6 *args
|
184
|
+
when 7
|
185
|
+
initialize_type7 *args
|
186
|
+
else
|
187
|
+
raise
|
188
|
+
end
|
189
|
+
end
|
190
|
+
def initialize_zero
|
191
|
+
@xml_type = nil
|
192
|
+
@xml_size = nil
|
193
|
+
@xml_prec = nil
|
194
|
+
@xml_vary = nil
|
195
|
+
@xml_var = nil
|
196
|
+
@xml_data = nil
|
197
|
+
@xml_enddo = nil
|
198
|
+
end
|
199
|
+
def initialize_doc(element)
|
200
|
+
@xml_var = element.attributes['var']
|
201
|
+
@xml_vary = element.attributes['vary']
|
202
|
+
@xml_enddo = element.attributes['enddo']
|
203
|
+
type = element.attributes['type']
|
204
|
+
tp = self.typeParse(type,@xml_var)
|
205
|
+
@xml_type = tp['type']
|
206
|
+
@xml_size = tp['size']
|
207
|
+
@xml_prec = tp['prec']
|
208
|
+
self.setValue(element.text)
|
209
|
+
self.add_user_accessor(@xml_var,@xml_data)
|
210
|
+
end
|
211
|
+
def initialize_type2(v1,v2)
|
212
|
+
raise "#{self.class.name}.new(#{v1},#{v2}) invalid number of parameters"
|
213
|
+
end
|
214
|
+
def initialize_type3(v1,v2,v3)
|
215
|
+
raise "#{self.class.name}.new(#{v1},#{v2},#{v3}) invalid number of parameters"
|
216
|
+
end
|
217
|
+
def initialize_type4(v1,v2,v3,v4)
|
218
|
+
raise "#{self.class.name}.new(#{v1},#{v2},#{v3},#{v4}) invalid number of parameters"
|
219
|
+
end
|
220
|
+
def initialize_type5(v1,v2,v3,v4,v5)
|
221
|
+
raise "#{self.class.name}.new(#{v1},#{v2},#{v3},#{v4},#{v5}) invalid number of parameters"
|
222
|
+
end
|
223
|
+
def initialize_type6(v1,v2,v3,v4,v5,v6)
|
224
|
+
raise "#{self.class.name}.new(#{v1},#{v2},#{v3},#{v4},#{v5},#{v6}) invalid number of parameters"
|
225
|
+
end
|
226
|
+
def initialize_type7(v1,v2,v3,v4,v5,v6,v7)
|
227
|
+
self.initialize_value(v1,v2,v3,v4,v5,v6,v7,"(type=#{v1},size=#{v2},prec=#{v3},var=#{v4},varying=#{v5},data=#{v6},enddo=#{v6})")
|
228
|
+
end
|
229
|
+
def check_nil(v,msg,hint)
|
230
|
+
if v == nil
|
231
|
+
raise "#{self.class.name} #{hint} #{msg}"
|
232
|
+
end
|
233
|
+
end
|
234
|
+
def check_number(v)
|
235
|
+
answer = true
|
236
|
+
begin
|
237
|
+
if Float(v) != nil
|
238
|
+
answer = true
|
239
|
+
end
|
240
|
+
rescue
|
241
|
+
answer = false
|
242
|
+
end
|
243
|
+
answer
|
244
|
+
end
|
245
|
+
def check_var(v,hint)
|
246
|
+
msg = "invalid var"
|
247
|
+
check_nil(v,msg,hint)
|
248
|
+
if v and v.instance_of? String
|
249
|
+
else
|
250
|
+
raise "#{self.class.name} #{hint} #{msg}"
|
251
|
+
end
|
252
|
+
end
|
253
|
+
def check_type(v,hint)
|
254
|
+
msg = "invalid type"
|
255
|
+
check_nil(v,msg,hint)
|
256
|
+
case v
|
257
|
+
when "a"
|
258
|
+
when "i"
|
259
|
+
when "u"
|
260
|
+
when "f"
|
261
|
+
when "p"
|
262
|
+
when "z"
|
263
|
+
when "b"
|
264
|
+
else
|
265
|
+
raise "#{self.class.name} #{hint} #{msg}"
|
266
|
+
end
|
267
|
+
end
|
268
|
+
def check_size(v,hint)
|
269
|
+
msg = "invalid size"
|
270
|
+
check_nil(v,msg,hint)
|
271
|
+
data = v.to_i
|
272
|
+
if data < 1 or !check_number(v)
|
273
|
+
raise "#{self.class.name} #{hint} #{msg}"
|
274
|
+
end
|
275
|
+
end
|
276
|
+
def check_prec(v,hint)
|
277
|
+
msg = "invalid prec"
|
278
|
+
check_nil(v,msg,hint)
|
279
|
+
data = v.to_i
|
280
|
+
if data < 0 or !check_number(v)
|
281
|
+
raise "#{self.class.name} #{hint} #{msg}"
|
282
|
+
end
|
283
|
+
end
|
284
|
+
def check_vary(v,hint)
|
285
|
+
msg = "invalid vary"
|
286
|
+
check_nil(v,msg,hint)
|
287
|
+
if v == false
|
288
|
+
else
|
289
|
+
data = v.to_i
|
290
|
+
if data == 2 or data == 4
|
291
|
+
else
|
292
|
+
raise "#{self.class.name} #{hint} #{msg}"
|
293
|
+
end
|
294
|
+
end
|
295
|
+
end
|
296
|
+
def check_enddo(v,hint)
|
297
|
+
msg = "invalid enddo"
|
298
|
+
if v == nil
|
299
|
+
else
|
300
|
+
if v.instance_of? String
|
301
|
+
else
|
302
|
+
raise "#{self.class.name} #{hint} #{msg}"
|
303
|
+
end
|
304
|
+
end
|
305
|
+
end
|
306
|
+
def initialize_value(type,size,prec,var,vary,data,enddo,hint)
|
307
|
+
check_type(type,hint)
|
308
|
+
check_size(size,hint)
|
309
|
+
check_prec(prec,hint)
|
310
|
+
check_var(var,hint)
|
311
|
+
check_vary(vary,hint)
|
312
|
+
check_enddo(enddo,hint)
|
313
|
+
@xml_type = type
|
314
|
+
@xml_size = size
|
315
|
+
@xml_prec = prec
|
316
|
+
@xml_vary = vary
|
317
|
+
@xml_var = var
|
318
|
+
@xml_enddo = enddo
|
319
|
+
self.add_user_accessor(var,data)
|
320
|
+
self.setValue(data)
|
321
|
+
end
|
322
|
+
def type
|
323
|
+
@xml_type
|
324
|
+
end
|
325
|
+
def size
|
326
|
+
@xml_size
|
327
|
+
end
|
328
|
+
def precision
|
329
|
+
@xml_prec
|
330
|
+
end
|
331
|
+
def vary
|
332
|
+
@xml_vary
|
333
|
+
end
|
334
|
+
def var
|
335
|
+
@xml_var
|
336
|
+
end
|
337
|
+
def dupToUserValue
|
338
|
+
if defined? xml_user_accessor and !@xml_user_accessor.nil? and !@xml_user_accessor.empty?
|
339
|
+
instance_variable_set("@#{xml_user_accessor}", @xml_data)
|
340
|
+
end
|
341
|
+
end
|
342
|
+
def dupFromUserValue
|
343
|
+
if defined? xml_user_accessor and !@xml_user_accessor.nil? and !@xml_user_accessor.empty?
|
344
|
+
@xml_data = instance_variable_get("@#{xml_user_accessor}")
|
345
|
+
end
|
346
|
+
end
|
347
|
+
def setValue(data)
|
348
|
+
if data == nil
|
349
|
+
rdata = 0
|
350
|
+
case @xml_type
|
351
|
+
when "a"
|
352
|
+
rdata = ""
|
353
|
+
when "b"
|
354
|
+
rdata = "00"
|
355
|
+
end
|
356
|
+
elsif data.is_a?(XMLService::I_Base)
|
357
|
+
rdata = data.value
|
358
|
+
else
|
359
|
+
rdata = data
|
360
|
+
end
|
361
|
+
case @xml_type
|
362
|
+
when "a"
|
363
|
+
@xml_data = String.new(rdata)
|
364
|
+
when "i"
|
365
|
+
@xml_data = rdata.to_i
|
366
|
+
when "u"
|
367
|
+
@xml_data = rdata.to_i
|
368
|
+
when "f"
|
369
|
+
@xml_data = rdata.to_f
|
370
|
+
when "p"
|
371
|
+
@xml_data = rdata.to_f
|
372
|
+
when "z"
|
373
|
+
@xml_data = rdata.to_f
|
374
|
+
when "b"
|
375
|
+
@xml_data = rdata
|
376
|
+
end
|
377
|
+
dupToUserValue
|
378
|
+
end
|
379
|
+
def value
|
380
|
+
dupFromUserValue
|
381
|
+
if @xml_data == nil
|
382
|
+
@xml_data = 0
|
383
|
+
case @xml_type
|
384
|
+
when "a"
|
385
|
+
@xml_data = ""
|
386
|
+
when "b"
|
387
|
+
@xml_data = "00"
|
388
|
+
end
|
389
|
+
dupToUserValue
|
390
|
+
end
|
391
|
+
case @xml_type
|
392
|
+
when "a"
|
393
|
+
data = @xml_data.to_s
|
394
|
+
when "i"
|
395
|
+
data = @xml_data.to_i
|
396
|
+
when "u"
|
397
|
+
data = @xml_data.to_i
|
398
|
+
when "f"
|
399
|
+
data = @xml_data.to_f
|
400
|
+
when "p"
|
401
|
+
data = @xml_data.to_f
|
402
|
+
when "z"
|
403
|
+
data = @xml_data.to_f
|
404
|
+
when "b"
|
405
|
+
data = @xml_data # .pack('H')
|
406
|
+
else
|
407
|
+
data = @xml_data
|
408
|
+
end
|
409
|
+
data
|
410
|
+
end
|
411
|
+
def to_s
|
412
|
+
dupFromUserValue
|
413
|
+
data = @xml_data.to_s
|
414
|
+
data
|
415
|
+
end
|
416
|
+
def to_f
|
417
|
+
dupFromUserValue
|
418
|
+
data = @xml_data.to_f
|
419
|
+
data
|
420
|
+
end
|
421
|
+
def to_i
|
422
|
+
dupFromUserValue
|
423
|
+
data = @xml_data.to_i
|
424
|
+
data
|
425
|
+
end
|
426
|
+
def to_xml
|
427
|
+
dupFromUserValue
|
428
|
+
xml = ""
|
429
|
+
data = @xml_data.to_s
|
430
|
+
enddo = ""
|
431
|
+
if @xml_enddo
|
432
|
+
enddo = " enddo='#{@xml_enddo}'"
|
433
|
+
end
|
434
|
+
vary = ""
|
435
|
+
if @xml_vary
|
436
|
+
vary = " varying='#{@xml_vary}'"
|
437
|
+
end
|
438
|
+
case @xml_type
|
439
|
+
when "a"
|
440
|
+
xml = "<data var='#{@xml_var}' type='#{@xml_size}#{@xml_type}'#{vary}>#{data}</data>\n"
|
441
|
+
when "i"
|
442
|
+
if @xml_size < 2
|
443
|
+
type = " type='3#{@xml_type}0'"
|
444
|
+
elsif @xml_size < 4
|
445
|
+
type = " type='5#{@xml_type}0'"
|
446
|
+
elsif @xml_size < 8
|
447
|
+
type = " type='10#{@xml_type}0'"
|
448
|
+
else
|
449
|
+
type = " type='20#{@xml_type}0'"
|
450
|
+
end
|
451
|
+
xml = "<data var='#{@xml_var}'#{type}#{enddo}>#{data}</data>\n"
|
452
|
+
when "u"
|
453
|
+
if @xml_size < 2
|
454
|
+
type = " type='3#{@xml_type}0'"
|
455
|
+
elsif @xml_size < 4
|
456
|
+
type = " type='5#{@xml_type}0'"
|
457
|
+
elsif @xml_size < 8
|
458
|
+
type = " type='10#{@xml_type}0'"
|
459
|
+
else
|
460
|
+
xml = " type='20#{@xml_type}0'"
|
461
|
+
end
|
462
|
+
xml = "<data var='#{@xml_var}'#{type}#{enddo}>#{data}</data>\n"
|
463
|
+
when "f"
|
464
|
+
xml = "<data var='#{@xml_var}' type='#{@xml_size}#{@xml_type}#{@xml_prec}#{enddo}'>#{data}</data>\n"
|
465
|
+
when "p"
|
466
|
+
xml = "<data var='#{@xml_var}' type='#{@xml_size}#{@xml_type}#{@xml_prec}#{enddo}'>#{data}</data>\n"
|
467
|
+
when "z"
|
468
|
+
xml = "<data var='#{@xml_var}' type='#{@xml_size}#{@xml_type}#{@xml_prec}#{enddo}'>#{data}</data>\n"
|
469
|
+
when "b"
|
470
|
+
xml = "<data var='#{@xml_var}' type='#{@xml_size}#{@xml_type}'>#{data}</data>\n"
|
471
|
+
end
|
472
|
+
xml
|
473
|
+
end
|
474
|
+
def typeParse(type, vary)
|
475
|
+
tp = Hash.new
|
476
|
+
tp['type'] = nil
|
477
|
+
tp['vary'] = 0
|
478
|
+
tp['size'] = 0
|
479
|
+
tp['prec'] = 0
|
480
|
+
if type.index('a')
|
481
|
+
size = type.split('a')
|
482
|
+
tp['type'] = "a"
|
483
|
+
tp['size'] = size[0]
|
484
|
+
if vary == 2
|
485
|
+
tp['vary'] = 2
|
486
|
+
elsif vary == 4
|
487
|
+
tp['vary'] = 4
|
488
|
+
else
|
489
|
+
end
|
490
|
+
elsif type.index('i')
|
491
|
+
size = type.split('i')
|
492
|
+
tp['type'] = "i"
|
493
|
+
tp['size'] = size[0]
|
494
|
+
elsif type.index('u')
|
495
|
+
size = type.split('u')
|
496
|
+
tp['type'] = "u"
|
497
|
+
tp['size'] = size[0]
|
498
|
+
elsif type.index('f')
|
499
|
+
size = type.split('f')
|
500
|
+
tp['type'] = "f"
|
501
|
+
tp['size'] = size[0]
|
502
|
+
elsif type.index('p')
|
503
|
+
size = type.split('p')
|
504
|
+
tp['type'] = "p"
|
505
|
+
tp['size'] = size[0]
|
506
|
+
tp['prec'] = size[1]
|
507
|
+
elsif type.index('z')
|
508
|
+
size = type.split('z')
|
509
|
+
tp['type'] = "z"
|
510
|
+
tp['size'] = size[0]
|
511
|
+
tp['prec'] = size[1]
|
512
|
+
elsif type.index('b')
|
513
|
+
size = type.split('b')
|
514
|
+
tp['type'] = "b"
|
515
|
+
tp['size'] = size[0]
|
516
|
+
end
|
517
|
+
tp['prec'] = tp['prec'].to_i
|
518
|
+
tp['size'] = tp['size'].to_i
|
519
|
+
tp
|
520
|
+
end
|
521
|
+
end
|
522
|
+
# ---------------------
|
523
|
+
# data types
|
524
|
+
# ---------------------
|
525
|
+
class I_a < I_Base
|
526
|
+
def initialize_zero
|
527
|
+
self.initialize_value("a",5,0,"char",false,"blank",nil,"()")
|
528
|
+
end
|
529
|
+
def initialize_type3(var,size,data)
|
530
|
+
self.initialize_value("a",size,0,var,false,data,nil,"(var=#{var},size=#{size},data=#{data})")
|
531
|
+
end
|
532
|
+
end
|
533
|
+
class I_String < I_a
|
534
|
+
end
|
535
|
+
class I_Char < I_a
|
536
|
+
end
|
537
|
+
class I_a_varying < I_Base
|
538
|
+
def initialize_zero
|
539
|
+
self.initialize_value("a",5,0,"vchar2",2,"blank",nil,"()")
|
540
|
+
end
|
541
|
+
def initialize_type3(var,size,data)
|
542
|
+
self.initialize_value("a",size,0,var,2,data,nil,"(var=#{var},size=#{size},data=#{data})")
|
543
|
+
end
|
544
|
+
end
|
545
|
+
class I_a_varying_2 < I_a_varying
|
546
|
+
end
|
547
|
+
class I_VarChar2 < I_a_varying
|
548
|
+
end
|
549
|
+
class I_a_varying_4 < I_Base
|
550
|
+
def initialize_zero
|
551
|
+
self.initialize_value("a",5,0,"vchar4",4,"blank",nil,"()")
|
552
|
+
end
|
553
|
+
def initialize_type3(var,size,data)
|
554
|
+
self.initialize_value("a",size,0,var,4,data,nil,"(var=#{var},size=#{size},data=#{data})")
|
555
|
+
end
|
556
|
+
end
|
557
|
+
class I_VarChar4 < I_a_varying_4
|
558
|
+
end
|
559
|
+
class I_3i0 < I_Base
|
560
|
+
def initialize_zero
|
561
|
+
self.initialize_value("i",1,0,"int8",false,0,nil,"()")
|
562
|
+
end
|
563
|
+
def initialize_type2(var,data)
|
564
|
+
self.initialize_value("i",1,0,var,false,data,nil,"(var=#{var},data=#{data})")
|
565
|
+
end
|
566
|
+
def initialize_type3(var,data,enddo)
|
567
|
+
self.initialize_value("i",1,0,var,false,data,enddo,"(var=#{var},data=#{data},enddo=#{enddo})")
|
568
|
+
end
|
569
|
+
end
|
570
|
+
class I_Int8 < I_3i0
|
571
|
+
end
|
572
|
+
class I_5i0 < I_Base
|
573
|
+
def initialize_zero
|
574
|
+
self.initialize_value("i",2,0,"int16",false,0,nil,"()")
|
575
|
+
end
|
576
|
+
def initialize_type2(var,data)
|
577
|
+
self.initialize_value("i",2,0,var,false,data,nil,"(var=#{var},data=#{data})")
|
578
|
+
end
|
579
|
+
def initialize_type3(var,data,enddo)
|
580
|
+
self.initialize_value("i",2,0,var,false,data,enddo,"(var=#{var},data=#{data},enddo=#{enddo})")
|
581
|
+
end
|
582
|
+
end
|
583
|
+
class I_Int16 < I_5i0
|
584
|
+
end
|
585
|
+
class I_10i0 < I_Base
|
586
|
+
def initialize_zero
|
587
|
+
self.initialize_value("i",4,0,"int32",false,0,nil,"()")
|
588
|
+
end
|
589
|
+
def initialize_type2(var,data)
|
590
|
+
self.initialize_value("i",4,0,var,false,data,nil,"(var=#{var},data=#{data})")
|
591
|
+
end
|
592
|
+
def initialize_type3(var,data,enddo)
|
593
|
+
self.initialize_value("i",4,0,var,false,data,enddo,"(var=#{var},data=#{data},enddo=#{enddo})")
|
594
|
+
end
|
595
|
+
end
|
596
|
+
class I_Int32 < I_10i0
|
597
|
+
end
|
598
|
+
class I_20i0 < I_Base
|
599
|
+
def initialize_zero
|
600
|
+
self.initialize_value("i",8,0,"int64",false,0,nil,"()")
|
601
|
+
end
|
602
|
+
def initialize_type2(var,data)
|
603
|
+
self.initialize_value("i",8,0,var,false,data,nil,"(var=#{var},data=#{data})")
|
604
|
+
end
|
605
|
+
def initialize_type3(var,data,enddo)
|
606
|
+
self.initialize_value("i",8,0,var,false,data,enddo,"(var=#{var},data=#{data},enddo=#{enddo})")
|
607
|
+
end
|
608
|
+
end
|
609
|
+
class I_Int64 < I_20i0
|
610
|
+
end
|
611
|
+
class I_3u0 < I_Base
|
612
|
+
def initialize_zero
|
613
|
+
self.initialize_value("u",1,0,"uint8",false,0,nil,"()")
|
614
|
+
end
|
615
|
+
def initialize_type2(var,data)
|
616
|
+
self.initialize_value("u",1,0,var,false,data,nil,"(var=#{var},data=#{data})")
|
617
|
+
end
|
618
|
+
def initialize_type3(var,data,enddo)
|
619
|
+
self.initialize_value("u",1,0,var,false,data,enddo,"(var=#{var},data=#{data},enddo=#{enddo})")
|
620
|
+
end
|
621
|
+
end
|
622
|
+
class I_Uint8 < I_3u0
|
623
|
+
end
|
624
|
+
class I_5u0 < I_Base
|
625
|
+
def initialize_zero
|
626
|
+
self.initialize_value("u",2,0,"uint16",false,0,nil,"()")
|
627
|
+
end
|
628
|
+
def initialize_type2(var,data)
|
629
|
+
self.initialize_value("u",2,0,var,false,data,nil,"(var=#{var},data=#{data})")
|
630
|
+
end
|
631
|
+
def initialize_type3(var,data,enddo)
|
632
|
+
self.initialize_value("u",2,0,var,false,data,enddo,"(var=#{var},data=#{data},enddo=#{enddo})")
|
633
|
+
end
|
634
|
+
end
|
635
|
+
class I_Uint16 < I_5u0
|
636
|
+
end
|
637
|
+
class I_10u0 < I_Base
|
638
|
+
def initialize_zero
|
639
|
+
self.initialize_value("u",4,0,"uint32",false,0,nil,"()")
|
640
|
+
end
|
641
|
+
def initialize_type2(var,data)
|
642
|
+
self.initialize_value("u",4,0,var,false,data,nil,"(var=#{var},data=#{data})")
|
643
|
+
end
|
644
|
+
def initialize_type3(var,data,enddo)
|
645
|
+
self.initialize_value("u",4,0,var,false,data,enddo,"(var=#{var},data=#{data},enddo=#{enddo})")
|
646
|
+
end
|
647
|
+
end
|
648
|
+
class I_Uint32 < I_10u0
|
649
|
+
end
|
650
|
+
class I_20u0 < I_Base
|
651
|
+
def initialize_zero
|
652
|
+
self.initialize_value("u",8,0,"uint64",false,0,nil,"()")
|
653
|
+
end
|
654
|
+
def initialize_type2(var,data)
|
655
|
+
self.initialize_value("u",8,0,var,false,data,nil,"(var=#{var},data=#{data})")
|
656
|
+
end
|
657
|
+
def initialize_type3(var,data,enddo)
|
658
|
+
self.initialize_value("u",8,0,var,false,data,enddo,"(var=#{var},data=#{data},enddo=#{enddo})")
|
659
|
+
end
|
660
|
+
end
|
661
|
+
class I_Uint64 < I_20u0
|
662
|
+
end
|
663
|
+
class I_4f < I_Base
|
664
|
+
def initialize_zero
|
665
|
+
self.initialize_value("f",4,2,"float",false,0,nil,"()")
|
666
|
+
end
|
667
|
+
def initialize_type3(var,prec,data)
|
668
|
+
self.initialize_value("f",4,prec,var,false,data,nil,"(var=#{var},prec=#{prec},data=#{data})")
|
669
|
+
end
|
670
|
+
def initialize_type4(var,prec,data,enddo)
|
671
|
+
self.initialize_value("f",4,prec,var,false,data,enddo,"(var=#{var},prec=#{prec},data=#{data},enddo=#{enddo})")
|
672
|
+
end
|
673
|
+
end
|
674
|
+
class I_Float4 < I_4f
|
675
|
+
end
|
676
|
+
class I_Real < I_4f
|
677
|
+
end
|
678
|
+
class I_8f < I_Base
|
679
|
+
def initialize_zero
|
680
|
+
self.initialize_value("f",8,2,"double",false,0,nil,"()")
|
681
|
+
end
|
682
|
+
def initialize_type3(var,prec,data)
|
683
|
+
self.initialize_value("f",8,prec,var,false,data,nil,"(var=#{var},prec=#{prec},data=#{data})")
|
684
|
+
end
|
685
|
+
def initialize_type4(var,prec,data,enddo)
|
686
|
+
self.initialize_value("f",8,prec,var,false,data,enddo,"(var=#{var},prec=#{prec},data=#{data},enddo=#{enddo})")
|
687
|
+
end
|
688
|
+
end
|
689
|
+
class I_Float8 < I_8f
|
690
|
+
end
|
691
|
+
class I_Double < I_8f
|
692
|
+
end
|
693
|
+
class I_p < I_Base
|
694
|
+
def initialize_zero
|
695
|
+
self.initialize_value("p",12,2,"packed",false,0,nil,"()")
|
696
|
+
end
|
697
|
+
def initialize_type4(var,size,prec,data)
|
698
|
+
self.initialize_value("p",size,prec,var,false,data,nil,"(var=#{var},size=#{size},prec=#{prec},data=#{data})")
|
699
|
+
end
|
700
|
+
def initialize_type5(var,size,prec,data,enddo)
|
701
|
+
self.initialize_value("p",size,prec,var,false,data,enddo,"(var=#{var},size=#{size},prec=#{prec},data=#{data},enddo=#{enddo})")
|
702
|
+
end
|
703
|
+
end
|
704
|
+
class I_PackedDecimal < I_p
|
705
|
+
end
|
706
|
+
class I_z < I_Base
|
707
|
+
def initialize_zero
|
708
|
+
self.initialize_value("z",12,2,"zoned",false,0,nil,"()")
|
709
|
+
end
|
710
|
+
def initialize_type4(var,size,prec,data)
|
711
|
+
self.initialize_value("z",size,prec,var,false,data,nil,"(var=#{var},size=#{size},prec=#{prec},data=#{data})")
|
712
|
+
end
|
713
|
+
def initialize_type5(var,size,prec,data,enddo)
|
714
|
+
self.initialize_value("z",size,prec,var,false,data,enddo,"(var=#{var},size=#{size},prec=#{prec},data=#{data},enddo=#{enddo})")
|
715
|
+
end
|
716
|
+
end
|
717
|
+
class I_ZonedDecimal < I_z
|
718
|
+
end
|
719
|
+
class I_b < I_Base
|
720
|
+
def initialize_zero
|
721
|
+
self.initialize_value("b",1,0,"hex",false,"00",nil,"()")
|
722
|
+
end
|
723
|
+
def initialize_type3(var,size,data)
|
724
|
+
self.initialize_value("b",size,0,var,false,data.to_s(16).upcase,nil,"(var=#{var},size=#{size},data=#{data})")
|
725
|
+
end
|
726
|
+
end
|
727
|
+
class I_Binary < I_b
|
728
|
+
end
|
729
|
+
# ---------------------
|
730
|
+
# collections
|
731
|
+
# ---------------------
|
732
|
+
class I_BaseMulti < I_Meta
|
733
|
+
def initialize *args
|
734
|
+
case args.size
|
735
|
+
when 0
|
736
|
+
initialize_zero *args
|
737
|
+
when 1
|
738
|
+
initialize_doc *args
|
739
|
+
when 2
|
740
|
+
initialize_type2 *args
|
741
|
+
when 3
|
742
|
+
initialize_type3 *args
|
743
|
+
when 4
|
744
|
+
initialize_type4 *args
|
745
|
+
else
|
746
|
+
raise
|
747
|
+
end
|
748
|
+
end
|
749
|
+
def initialize_zero
|
750
|
+
@xml_var = 'multi'
|
751
|
+
@xml_elem = nil
|
752
|
+
end
|
753
|
+
def initialize_doc(element)
|
754
|
+
@xml_var = element.attributes['var']
|
755
|
+
@xml_elem = self.elemParse(element)
|
756
|
+
end
|
757
|
+
def initialize_type2(v1,v2)
|
758
|
+
raise "#{self.class.name}.new(#{v1},#{v2}) invalid number of parameters"
|
759
|
+
end
|
760
|
+
def initialize_type3(v1,v2,v3)
|
761
|
+
raise "#{self.class.name}.new(#{v1},#{v2},#{v3}) invalid number of parameters"
|
762
|
+
end
|
763
|
+
def initialize_type4(v1,v2,v3,v4)
|
764
|
+
raise "#{self.class.name}.new(#{v1},#{v2},#{v3},#{v4}) invalid number of parameters"
|
765
|
+
end
|
766
|
+
def initialize_value(var,elem)
|
767
|
+
@xml_var = var
|
768
|
+
@xml_elem = elem
|
769
|
+
self.add_user_accessor(var,elem)
|
770
|
+
end
|
771
|
+
def getIndexValue(idx)
|
772
|
+
elem = nil
|
773
|
+
if @xml_elem.instance_of? Array
|
774
|
+
if idx.instance_of? String
|
775
|
+
@xml_elem.each do | value |
|
776
|
+
if value.var == idx
|
777
|
+
elem = value
|
778
|
+
break
|
779
|
+
end
|
780
|
+
end
|
781
|
+
else
|
782
|
+
elem = @xml_elem[idx]
|
783
|
+
end
|
784
|
+
elsif @xml_elem.instance_of? Hash
|
785
|
+
if idx.instance_of? String
|
786
|
+
@xml_elem.each do | key, value |
|
787
|
+
if key == idx
|
788
|
+
elem = value
|
789
|
+
break
|
790
|
+
end
|
791
|
+
end
|
792
|
+
end
|
793
|
+
else
|
794
|
+
if idx.instance_of? String
|
795
|
+
if @xml_elem.var == idx
|
796
|
+
elem = @xml_elem
|
797
|
+
end
|
798
|
+
else
|
799
|
+
elem = @xml_elem
|
800
|
+
end
|
801
|
+
end
|
802
|
+
elem
|
803
|
+
end
|
804
|
+
def var(idx=-1)
|
805
|
+
var = "*NONE"
|
806
|
+
if idx == -1
|
807
|
+
var = @xml_var
|
808
|
+
else
|
809
|
+
elem = self.getIndexValue(idx)
|
810
|
+
if elem
|
811
|
+
var = elem.var
|
812
|
+
end
|
813
|
+
end
|
814
|
+
var
|
815
|
+
end
|
816
|
+
def value(idx=-1)
|
817
|
+
elem = nil
|
818
|
+
if idx == -1
|
819
|
+
elem = @xml_elem
|
820
|
+
else
|
821
|
+
elem = self.getIndexValue(idx)
|
822
|
+
end
|
823
|
+
elem
|
824
|
+
end
|
825
|
+
def assoc(idx)
|
826
|
+
self.value(idx)
|
827
|
+
end
|
828
|
+
def [](idx)
|
829
|
+
self.value(idx)
|
830
|
+
end
|
831
|
+
def count
|
832
|
+
cnt = @xml_elem.count
|
833
|
+
cnt
|
834
|
+
end
|
835
|
+
def elemParse(doc)
|
836
|
+
multi = Hash.new
|
837
|
+
elems = Array.new
|
838
|
+
base = I_Base.new
|
839
|
+
doc.elements.each do |element|
|
840
|
+
case element.name
|
841
|
+
when "error"
|
842
|
+
if element.elements["errnoxml"] == nil
|
843
|
+
add_user_accessor("fail", element.text)
|
844
|
+
else
|
845
|
+
elem_add = I_Error.new(element)
|
846
|
+
if !multi.has_key?(elem_add.var)
|
847
|
+
multi[elem_add.var] = Array.new
|
848
|
+
end
|
849
|
+
count = multi[elem_add.var].count
|
850
|
+
multi[elem_add.var][count] = elem_add
|
851
|
+
end
|
852
|
+
when "success"
|
853
|
+
add_user_accessor(element.name, element.text)
|
854
|
+
when "version"
|
855
|
+
add_user_accessor(element.name, element.text)
|
856
|
+
when "jobinfo"
|
857
|
+
elems[elems.count] = I_JobInfo.new(element)
|
858
|
+
elem_add = elems[elems.count - 1]
|
859
|
+
add_user_accessor(element.name, elem_add)
|
860
|
+
when "joblogrec"
|
861
|
+
elem_add = I_JobLogRec.new(element)
|
862
|
+
if !multi.has_key?(elem_add.var)
|
863
|
+
multi[elem_add.var] = Array.new
|
864
|
+
end
|
865
|
+
count = multi[elem_add.var].count
|
866
|
+
multi[elem_add.var][count] = elem_add
|
867
|
+
when "joblogscan"
|
868
|
+
elems[elems.count] = I_JobLogScan.new(element)
|
869
|
+
elem_add = elems[elems.count - 1]
|
870
|
+
add_user_accessor(element.name, elem_add)
|
871
|
+
when "joblog"
|
872
|
+
elems[elems.count] = I_JobLog.new(element)
|
873
|
+
elem_add = elems[elems.count - 1]
|
874
|
+
add_user_accessor(element.name, elem_add)
|
875
|
+
when "ds"
|
876
|
+
elems[elems.count] = I_DS.new(element)
|
877
|
+
elem_add = elems[elems.count - 1]
|
878
|
+
add_user_accessor(elem_add.var, elem_add)
|
879
|
+
if !multi.has_key?(elem_add.var)
|
880
|
+
multi[elem_add.var] = Array.new
|
881
|
+
end
|
882
|
+
count = multi[elem_add.var].count
|
883
|
+
multi[elem_add.var][count] = elem_add
|
884
|
+
when "data"
|
885
|
+
type = element.attributes['type']
|
886
|
+
vary = element.attributes['varying']
|
887
|
+
tp = base.typeParse(type, vary)
|
888
|
+
case tp['type']
|
889
|
+
when "a"
|
890
|
+
case tp['vary']
|
891
|
+
when 0
|
892
|
+
elems[elems.count] = I_Char.new(element)
|
893
|
+
when 2
|
894
|
+
elems[elems.count] = I_VarChar2.new(element)
|
895
|
+
when 4
|
896
|
+
elems[elems.count] = I_VarChar4.new(element)
|
897
|
+
end
|
898
|
+
when "i"
|
899
|
+
case tp['size']
|
900
|
+
when 3
|
901
|
+
elems[elems.count] = I_Int8.new(element)
|
902
|
+
when 5
|
903
|
+
elems[elems.count] = I_Int16.new(element)
|
904
|
+
when 10
|
905
|
+
elems[elems.count] = I_Int32.new(element)
|
906
|
+
when 20
|
907
|
+
elems[elems.count] = I_Int64.new(element)
|
908
|
+
end
|
909
|
+
when "u"
|
910
|
+
case tp['size']
|
911
|
+
when 3
|
912
|
+
elems[elems.count] = I_Uint8.new(element)
|
913
|
+
when 5
|
914
|
+
elems[elems.count] = I_Uint16.new(element)
|
915
|
+
when 10
|
916
|
+
elems[elems.count] = I_Uint32.new(element)
|
917
|
+
when 20
|
918
|
+
elems[elems.count] = I_Uint64.new(element)
|
919
|
+
end
|
920
|
+
when "f"
|
921
|
+
case tp['size']
|
922
|
+
when 4
|
923
|
+
elems[elems.count] = I_Float4.new(element)
|
924
|
+
when 8
|
925
|
+
elems[elems.count] = I_Float8.new(element)
|
926
|
+
end
|
927
|
+
when "p"
|
928
|
+
elems[elems.count] = I_PackedDecimal.new(element)
|
929
|
+
when "z"
|
930
|
+
elems[elems.count] = I_ZonedDecimal.new(element)
|
931
|
+
when "b"
|
932
|
+
elems[elems.count] = I_Binary.new(element)
|
933
|
+
end
|
934
|
+
elem_add = elems[elems.count - 1]
|
935
|
+
add_user_accessor(elem_add.var, elem_add)
|
936
|
+
end
|
937
|
+
end
|
938
|
+
# fix-up multi (dim=1..n)
|
939
|
+
multi.each do |var,elem|
|
940
|
+
add_user_accessor(var, elem)
|
941
|
+
end
|
942
|
+
elems
|
943
|
+
end
|
944
|
+
def add(var, elem)
|
945
|
+
@xml_elem[@xml_elem.count] = elem
|
946
|
+
end
|
947
|
+
def struct(var,dim,&block)
|
948
|
+
self.add(var,I_DS.new(var,dim).input_elems(&block))
|
949
|
+
end
|
950
|
+
def bin(var, size, data="00")
|
951
|
+
self.add(var,I_b.new(var,size,data))
|
952
|
+
end
|
953
|
+
def char(var, size, data=" ")
|
954
|
+
self.add(var,I_a.new(var,size,data))
|
955
|
+
end
|
956
|
+
def varchar(var, size, data=" ")
|
957
|
+
self.add(var,I_a_varying.new(var,size,data))
|
958
|
+
end
|
959
|
+
def varchar4(var, size, data=" ")
|
960
|
+
self.add(var,I_a_varying_4.new(var,size,data))
|
961
|
+
end
|
962
|
+
def tiny(var, data=0)
|
963
|
+
self.add(var,I_Int8.new(var,data))
|
964
|
+
end
|
965
|
+
def short(var, data=0)
|
966
|
+
self.add(var,I_Int16.new(var,data))
|
967
|
+
end
|
968
|
+
def long(var, data=0)
|
969
|
+
self.add(var,I_Int32.new(var,data))
|
970
|
+
end
|
971
|
+
def longlong(var, data=0)
|
972
|
+
self.add(var,I_Int64.new(var,data))
|
973
|
+
end
|
974
|
+
def utiny(var, data=0)
|
975
|
+
self.add(var,I_Uint8.new(var,data))
|
976
|
+
end
|
977
|
+
def ushort(var, data=0)
|
978
|
+
self.add(var,I_Uint16.new(var,data))
|
979
|
+
end
|
980
|
+
def ulong(var, data=0)
|
981
|
+
self.add(var,I_Uint32.new(var,data))
|
982
|
+
end
|
983
|
+
def ulonglong(var, data=0)
|
984
|
+
self.add(var,I_Uint64.new(var,data))
|
985
|
+
end
|
986
|
+
def real(var, scale, data=0.0)
|
987
|
+
self.add(var,I_Float4.new(var,scale,data))
|
988
|
+
end
|
989
|
+
def float4(var, scale, data=0.0)
|
990
|
+
self.add(var,I_Float4.new(var,scale,data))
|
991
|
+
end
|
992
|
+
def double(var, scale, data=0.0)
|
993
|
+
self.add(var,I_Float8.new(var,scale,data))
|
994
|
+
end
|
995
|
+
def float8(var, scale, data=0.0)
|
996
|
+
self.add(var,I_Float8.new(var,scale,data))
|
997
|
+
end
|
998
|
+
def dec(var, size, scale, data=0)
|
999
|
+
self.add(var,I_p.new(var,size,scale,data))
|
1000
|
+
end
|
1001
|
+
def zone(var, size, scale, data=0)
|
1002
|
+
self.add(var,I_s.new(var,size,scale,data))
|
1003
|
+
end
|
1004
|
+
def input_elems(&block)
|
1005
|
+
self.instance_eval(&block)
|
1006
|
+
self
|
1007
|
+
end
|
1008
|
+
end
|
1009
|
+
# ---------------------
|
1010
|
+
# diag (error)
|
1011
|
+
# ---------------------
|
1012
|
+
class I_DiagBase < I_Meta
|
1013
|
+
def initialize *args
|
1014
|
+
case args.size
|
1015
|
+
when 0
|
1016
|
+
initialize_zero *args
|
1017
|
+
when 1
|
1018
|
+
initialize_doc *args
|
1019
|
+
else
|
1020
|
+
raise
|
1021
|
+
end
|
1022
|
+
end
|
1023
|
+
def initialize_zero
|
1024
|
+
@xml_var = 'base'
|
1025
|
+
end
|
1026
|
+
def initialize_doc(element)
|
1027
|
+
if self.var == nil
|
1028
|
+
@xml_var = 'base'
|
1029
|
+
end
|
1030
|
+
elemParse(element)
|
1031
|
+
end
|
1032
|
+
def var
|
1033
|
+
@xml_var
|
1034
|
+
end
|
1035
|
+
def elemParse(doc)
|
1036
|
+
doc.elements.each do |element|
|
1037
|
+
add_user_accessor(element.name, element.text)
|
1038
|
+
end
|
1039
|
+
end
|
1040
|
+
end
|
1041
|
+
class I_Error < I_DiagBase
|
1042
|
+
def initialize_doc(element)
|
1043
|
+
@xml_var = 'error'
|
1044
|
+
super(element)
|
1045
|
+
end
|
1046
|
+
def elemParse(doc)
|
1047
|
+
doc.elements.each do |element|
|
1048
|
+
add_user_accessor(element.name, element.text.gsub(/\n/, ""))
|
1049
|
+
end
|
1050
|
+
end
|
1051
|
+
end
|
1052
|
+
class I_JobInfo < I_DiagBase
|
1053
|
+
def initialize_doc(element)
|
1054
|
+
@xml_var = 'jobinfo'
|
1055
|
+
super(element)
|
1056
|
+
end
|
1057
|
+
end
|
1058
|
+
class I_JobLogRec < I_DiagBase
|
1059
|
+
def initialize_doc(element)
|
1060
|
+
@xml_var = 'joblogrec'
|
1061
|
+
super(element)
|
1062
|
+
end
|
1063
|
+
end
|
1064
|
+
class I_Diag < I_BaseMulti
|
1065
|
+
def initialize_zero
|
1066
|
+
@xml_var = 'diag'
|
1067
|
+
@xml_elem = nil
|
1068
|
+
end
|
1069
|
+
def initialize_doc(element)
|
1070
|
+
@xml_var = 'diag'
|
1071
|
+
super(element)
|
1072
|
+
end
|
1073
|
+
end
|
1074
|
+
class I_JobLogScan < I_BaseMulti
|
1075
|
+
def initialize_zero
|
1076
|
+
@xml_var = 'joblogscan'
|
1077
|
+
@xml_elem = nil
|
1078
|
+
end
|
1079
|
+
def initialize_doc(element)
|
1080
|
+
@xml_var = 'joblogscan'
|
1081
|
+
super(element)
|
1082
|
+
end
|
1083
|
+
end
|
1084
|
+
class I_JobLog < I_DiagBase
|
1085
|
+
def initialize_doc(element)
|
1086
|
+
@xml_var = 'joblog'
|
1087
|
+
super(element)
|
1088
|
+
end
|
1089
|
+
def elemParse(doc)
|
1090
|
+
joblog = ""
|
1091
|
+
doc.texts.each do |t|
|
1092
|
+
joblog << t.value
|
1093
|
+
end
|
1094
|
+
add_user_accessor("joblogdata", joblog)
|
1095
|
+
end
|
1096
|
+
end
|
1097
|
+
# ---------------------
|
1098
|
+
# data structure collection
|
1099
|
+
# ---------------------
|
1100
|
+
class I_DS < I_BaseMulti
|
1101
|
+
def initialize_zero
|
1102
|
+
@xml_var = 'ds'
|
1103
|
+
@xml_elem = nil
|
1104
|
+
self.initialize_value(var,elem)
|
1105
|
+
end
|
1106
|
+
def initialize_doc(element)
|
1107
|
+
@xml_dim = element.attributes['dim']
|
1108
|
+
@xml_dou = element.attributes['dou']
|
1109
|
+
super(element)
|
1110
|
+
end
|
1111
|
+
# for dsl
|
1112
|
+
def initialize_type2(var,dim)
|
1113
|
+
@xml_dim = 1
|
1114
|
+
if dim > 1
|
1115
|
+
@xml_dim = dim
|
1116
|
+
end
|
1117
|
+
@xml_dou = nil
|
1118
|
+
self.initialize_value(var,Array.new)
|
1119
|
+
end
|
1120
|
+
def initialize_type3(var,dim,elem)
|
1121
|
+
@xml_dim = 1
|
1122
|
+
if dim > 1
|
1123
|
+
@xml_dim = dim
|
1124
|
+
end
|
1125
|
+
# for dsl
|
1126
|
+
if elem.instance_of? String
|
1127
|
+
@xml_dou = elem
|
1128
|
+
self.initialize_value(var,Array.new)
|
1129
|
+
# normal ctor
|
1130
|
+
else
|
1131
|
+
@xml_dou = nil
|
1132
|
+
self.initialize_value(var,elem)
|
1133
|
+
end
|
1134
|
+
end
|
1135
|
+
def initialize_type4(var,dim,dou,elem)
|
1136
|
+
@xml_dim = 1
|
1137
|
+
if dim > 1
|
1138
|
+
@xml_dim = dim
|
1139
|
+
end
|
1140
|
+
@xml_dou = dou
|
1141
|
+
self.initialize_value(var,elem)
|
1142
|
+
end
|
1143
|
+
def to_xml_recursive(elem)
|
1144
|
+
xml = ""
|
1145
|
+
if elem.instance_of? Hash
|
1146
|
+
elem.each do |k,a|
|
1147
|
+
if a.instance_of? Hash or a.instance_of? Array
|
1148
|
+
xml << self.to_xml_recursive(a)
|
1149
|
+
else
|
1150
|
+
xml << a.to_xml
|
1151
|
+
end
|
1152
|
+
end
|
1153
|
+
elsif elem.instance_of? Array
|
1154
|
+
elem.each do |a|
|
1155
|
+
if a.instance_of? Hash or a.instance_of? Array
|
1156
|
+
xml << self.to_xml_recursive(a)
|
1157
|
+
else
|
1158
|
+
xml << a.to_xml
|
1159
|
+
end
|
1160
|
+
end
|
1161
|
+
end
|
1162
|
+
xml
|
1163
|
+
end
|
1164
|
+
def to_xml
|
1165
|
+
dim = " dim='#{@xml_dim}'"
|
1166
|
+
dou = ""
|
1167
|
+
if @xml_dou
|
1168
|
+
dou = " dou='#{@xml_dou}'"
|
1169
|
+
end
|
1170
|
+
xml = "<ds var='#{@xml_var}'#{dim}#{dou}>\n"
|
1171
|
+
xml << self.to_xml_recursive(@xml_elem)
|
1172
|
+
xml << "</ds>\n"
|
1173
|
+
xml
|
1174
|
+
end
|
1175
|
+
end
|
1176
|
+
# ---------------------
|
1177
|
+
# parameter
|
1178
|
+
# ---------------------
|
1179
|
+
class I_Parameter < I_BaseMulti
|
1180
|
+
def initialize_zero
|
1181
|
+
@xml_var = 'parm'
|
1182
|
+
@xml_elem = nil
|
1183
|
+
self.initialize_value(var,elem)
|
1184
|
+
end
|
1185
|
+
def initialize_doc(element)
|
1186
|
+
@xml_io = element.attributes['io']
|
1187
|
+
super(element)
|
1188
|
+
end
|
1189
|
+
def initialize_type3(var,io,elem)
|
1190
|
+
@xml_io = io
|
1191
|
+
self.initialize_value(var,elem)
|
1192
|
+
end
|
1193
|
+
def to_xml
|
1194
|
+
xml = "<parm var='#{@xml_var}' io='#{@xml_io}'>\n"
|
1195
|
+
xml << @xml_elem.to_xml
|
1196
|
+
xml << "</parm>\n"
|
1197
|
+
xml
|
1198
|
+
end
|
1199
|
+
end
|
1200
|
+
# ---------------------
|
1201
|
+
# return
|
1202
|
+
# ---------------------
|
1203
|
+
class I_Return < I_BaseMulti
|
1204
|
+
def initialize_zero
|
1205
|
+
@xml_var = 'ret'
|
1206
|
+
@xml_elem = nil
|
1207
|
+
self.initialize_value(var,elem)
|
1208
|
+
end
|
1209
|
+
def initialize_type2(var,elem)
|
1210
|
+
self.initialize_value(var,elem)
|
1211
|
+
end
|
1212
|
+
def to_xml
|
1213
|
+
xml = "<return var='#{@xml_var}'>\n"
|
1214
|
+
xml << @xml_elem.to_xml
|
1215
|
+
xml << "</return>\n"
|
1216
|
+
xml
|
1217
|
+
end
|
1218
|
+
end
|
1219
|
+
# ---------------------
|
1220
|
+
# xmlservice call
|
1221
|
+
# ---------------------
|
1222
|
+
class I_Data < I_Meta
|
1223
|
+
end
|
1224
|
+
class I_CALL < I_Meta
|
1225
|
+
attr_accessor :input, :reponse, :return
|
1226
|
+
def initialize(options)
|
1227
|
+
@xml_options = ActiveXMLService::Base.symbolize_keys(options)
|
1228
|
+
@xml_is_error = true
|
1229
|
+
@input = I_Data.new
|
1230
|
+
@response = I_Data.new
|
1231
|
+
@returndata = I_Data.new
|
1232
|
+
end
|
1233
|
+
def xmlservice()
|
1234
|
+
@xml_is_error = true
|
1235
|
+
# one thread at a time please
|
1236
|
+
ActiveXMLService::Base.semaphore.synchronize {
|
1237
|
+
# user supplied connection
|
1238
|
+
if @xml_options && @xml_options.has_key?(:connection)
|
1239
|
+
adapter = ActiveXMLService::Base.adapter_factory(@xml_options)
|
1240
|
+
# standard rails connection (singleton)
|
1241
|
+
else
|
1242
|
+
adapter = ActiveXMLService::Base.connection
|
1243
|
+
# I believe "the Rails way" would be to lead them down a best-practice path,
|
1244
|
+
# xmlservice over db2 stored procedures is most common connection (best)
|
1245
|
+
if adapter.nil?
|
1246
|
+
adapter = ActiveXMLService::Base.adapter_factory('connection'=>'ActiveRecord')
|
1247
|
+
end
|
1248
|
+
end
|
1249
|
+
adapter.xmlservice(self)
|
1250
|
+
@xml_doc = adapter.out_doc
|
1251
|
+
}
|
1252
|
+
@xml_is_error = self.parse_diag_attr
|
1253
|
+
self.parse_output_attr
|
1254
|
+
self.parse_return_attr
|
1255
|
+
end
|
1256
|
+
def call_recursive(k,v)
|
1257
|
+
if k.nil?
|
1258
|
+
k = "input"
|
1259
|
+
end
|
1260
|
+
if !v.nil?
|
1261
|
+
if v.instance_of? Hash
|
1262
|
+
v.each do | k1, v1 |
|
1263
|
+
if k.eql? "input"
|
1264
|
+
#puts "Hash #{k}.#{k1}, #{v1}"
|
1265
|
+
call_recursive(k + "." + k1,v1)
|
1266
|
+
elsif v1.instance_of? Hash or v.instance_of? Array
|
1267
|
+
#puts "Hash #{k}['#{k1}'], #{v1}"
|
1268
|
+
call_recursive(k + "['#{k1}']",v1)
|
1269
|
+
else
|
1270
|
+
#puts "Hash #{k}.#{k1}, #{v1}"
|
1271
|
+
call_recursive(k + "." + k1,v1)
|
1272
|
+
end
|
1273
|
+
end
|
1274
|
+
elsif v.instance_of? Array
|
1275
|
+
for i in 0..v.count-1
|
1276
|
+
if k.eql? "input"
|
1277
|
+
#puts "Array #{k}, #{v[1]}"
|
1278
|
+
call_recursive(k,v[i])
|
1279
|
+
else
|
1280
|
+
#puts "Array #{k}[#{i}], #{v[1]}"
|
1281
|
+
call_recursive(k + "[#{i}]",v[i])
|
1282
|
+
end
|
1283
|
+
end
|
1284
|
+
elsif !k.eql? "input"
|
1285
|
+
#puts "self.#{k} = #{v}"
|
1286
|
+
eval "self.#{k} = v"
|
1287
|
+
end
|
1288
|
+
end
|
1289
|
+
end
|
1290
|
+
def call(p0=nil,p1=nil,p2=nil,p3=nil,p4=nil,p5=nil,p6=nil,p7=nil,p8=nil,p9=nil,
|
1291
|
+
p10=nil,p11=nil,p12=nil,p13=nil,p14=nil,p15=nil,p16=nil,p17=nil,p18=nil,p19=nil,
|
1292
|
+
p20=nil,p21=nil,p22=nil,p23=nil,p24=nil,p25=nil,p26=nil,p27=nil,p28=nil,p29=nil,
|
1293
|
+
p30=nil,p31=nil,p32=nil,p33=nil,p34=nil,p35=nil,p36=nil,p37=nil,p38=nil,p39=nil,
|
1294
|
+
p40=nil,p41=nil,p42=nil,p43=nil,p44=nil,p45=nil,p46=nil,p47=nil,p48=nil,p49=nil,
|
1295
|
+
p50=nil,p51=nil,p52=nil,p53=nil,p54=nil,p55=nil,p56=nil,p57=nil,p58=nil,p59=nil,
|
1296
|
+
p60=nil,p61=nil,p62=nil,p63=nil,p64=nil)
|
1297
|
+
self.call_recursive(nil,p0)
|
1298
|
+
self.call_recursive(nil,p1)
|
1299
|
+
self.call_recursive(nil,p2)
|
1300
|
+
self.call_recursive(nil,p3)
|
1301
|
+
self.call_recursive(nil,p4)
|
1302
|
+
self.call_recursive(nil,p5)
|
1303
|
+
self.call_recursive(nil,p6)
|
1304
|
+
self.call_recursive(nil,p7)
|
1305
|
+
self.call_recursive(nil,p8)
|
1306
|
+
self.call_recursive(nil,p9)
|
1307
|
+
|
1308
|
+
self.call_recursive(nil,p10)
|
1309
|
+
self.call_recursive(nil,p11)
|
1310
|
+
self.call_recursive(nil,p12)
|
1311
|
+
self.call_recursive(nil,p13)
|
1312
|
+
self.call_recursive(nil,p14)
|
1313
|
+
self.call_recursive(nil,p15)
|
1314
|
+
self.call_recursive(nil,p16)
|
1315
|
+
self.call_recursive(nil,p17)
|
1316
|
+
self.call_recursive(nil,p18)
|
1317
|
+
self.call_recursive(nil,p19)
|
1318
|
+
|
1319
|
+
self.call_recursive(nil,p20)
|
1320
|
+
self.call_recursive(nil,p21)
|
1321
|
+
self.call_recursive(nil,p22)
|
1322
|
+
self.call_recursive(nil,p23)
|
1323
|
+
self.call_recursive(nil,p24)
|
1324
|
+
self.call_recursive(nil,p25)
|
1325
|
+
self.call_recursive(nil,p26)
|
1326
|
+
self.call_recursive(nil,p27)
|
1327
|
+
self.call_recursive(nil,p28)
|
1328
|
+
self.call_recursive(nil,p29)
|
1329
|
+
|
1330
|
+
self.call_recursive(nil,p30)
|
1331
|
+
self.call_recursive(nil,p31)
|
1332
|
+
self.call_recursive(nil,p32)
|
1333
|
+
self.call_recursive(nil,p33)
|
1334
|
+
self.call_recursive(nil,p34)
|
1335
|
+
self.call_recursive(nil,p35)
|
1336
|
+
self.call_recursive(nil,p36)
|
1337
|
+
self.call_recursive(nil,p37)
|
1338
|
+
self.call_recursive(nil,p38)
|
1339
|
+
self.call_recursive(nil,p39)
|
1340
|
+
|
1341
|
+
self.call_recursive(nil,p40)
|
1342
|
+
self.call_recursive(nil,p41)
|
1343
|
+
self.call_recursive(nil,p42)
|
1344
|
+
self.call_recursive(nil,p43)
|
1345
|
+
self.call_recursive(nil,p44)
|
1346
|
+
self.call_recursive(nil,p45)
|
1347
|
+
self.call_recursive(nil,p46)
|
1348
|
+
self.call_recursive(nil,p47)
|
1349
|
+
self.call_recursive(nil,p48)
|
1350
|
+
self.call_recursive(nil,p49)
|
1351
|
+
|
1352
|
+
self.call_recursive(nil,p50)
|
1353
|
+
self.call_recursive(nil,p51)
|
1354
|
+
self.call_recursive(nil,p52)
|
1355
|
+
self.call_recursive(nil,p53)
|
1356
|
+
self.call_recursive(nil,p54)
|
1357
|
+
self.call_recursive(nil,p55)
|
1358
|
+
self.call_recursive(nil,p56)
|
1359
|
+
self.call_recursive(nil,p57)
|
1360
|
+
self.call_recursive(nil,p58)
|
1361
|
+
self.call_recursive(nil,p59)
|
1362
|
+
|
1363
|
+
self.call_recursive(nil,p60)
|
1364
|
+
self.call_recursive(nil,p61)
|
1365
|
+
self.call_recursive(nil,p62)
|
1366
|
+
self.call_recursive(nil,p63)
|
1367
|
+
self.call_recursive(nil,p64)
|
1368
|
+
|
1369
|
+
self.xmlservice
|
1370
|
+
end
|
1371
|
+
def execute(p0=nil,p1=nil,p2=nil,p3=nil,p4=nil,p5=nil,p6=nil,p7=nil,p8=nil,p9=nil,
|
1372
|
+
p10=nil,p11=nil,p12=nil,p13=nil,p14=nil,p15=nil,p16=nil,p17=nil,p18=nil,p19=nil,
|
1373
|
+
p20=nil,p21=nil,p22=nil,p23=nil,p24=nil,p25=nil,p26=nil,p27=nil,p28=nil,p29=nil,
|
1374
|
+
p30=nil,p31=nil,p32=nil,p33=nil,p34=nil,p35=nil,p36=nil,p37=nil,p38=nil,p39=nil,
|
1375
|
+
p40=nil,p41=nil,p42=nil,p43=nil,p44=nil,p45=nil,p46=nil,p47=nil,p48=nil,p49=nil,
|
1376
|
+
p50=nil,p51=nil,p52=nil,p53=nil,p54=nil,p55=nil,p56=nil,p57=nil,p58=nil,p59=nil,
|
1377
|
+
p60=nil,p61=nil,p62=nil,p63=nil,p64=nil)
|
1378
|
+
self.call(p0,p1,p2,p3,p4,p5,p6,p7,p8,p9,
|
1379
|
+
p10,p11,p12,p13,p14,p15,p16,p17,p18,p19,
|
1380
|
+
p20,p21,p22,p23,p24,p25,p26,p27,p28,p29,
|
1381
|
+
p30,p31,p32,p33,p34,p35,p36,p37,p38,p39,
|
1382
|
+
p40,p41,p42,p43,p44,p45,p46,p47,p48,p49,
|
1383
|
+
p50,p51,p52,p53,p54,p55,p56,p57,p58,p59,
|
1384
|
+
p60,p61,p62,p63,p64)
|
1385
|
+
end
|
1386
|
+
def xmlservice_error
|
1387
|
+
@xml_is_error
|
1388
|
+
end
|
1389
|
+
def input()
|
1390
|
+
@input
|
1391
|
+
end
|
1392
|
+
def response()
|
1393
|
+
@response
|
1394
|
+
end
|
1395
|
+
def parse_output_attr()
|
1396
|
+
@response = I_Data.new
|
1397
|
+
end
|
1398
|
+
def returndata()
|
1399
|
+
@returndata
|
1400
|
+
end
|
1401
|
+
def parse_return_attr()
|
1402
|
+
@returndata = I_Data.new
|
1403
|
+
end
|
1404
|
+
def xmlservice_diag_parse(mypath="/report")
|
1405
|
+
diag = nil
|
1406
|
+
@xml_doc.elements.each("/report") do |report|
|
1407
|
+
diag = I_Diag.new(report)
|
1408
|
+
break
|
1409
|
+
end
|
1410
|
+
if diag == nil
|
1411
|
+
@xml_doc.elements.each("#{mypath}/error") do |element|
|
1412
|
+
@xml_doc.elements.each("#{mypath}") do |report|
|
1413
|
+
diag = I_Diag.new(report)
|
1414
|
+
break
|
1415
|
+
end
|
1416
|
+
break
|
1417
|
+
end
|
1418
|
+
end
|
1419
|
+
if diag == nil
|
1420
|
+
return false
|
1421
|
+
end
|
1422
|
+
add_user_accessor('PARM', diag)
|
1423
|
+
return true
|
1424
|
+
end
|
1425
|
+
def out_xml
|
1426
|
+
s = @xml_doc.to_s
|
1427
|
+
s
|
1428
|
+
end
|
1429
|
+
def dump()
|
1430
|
+
msg = self.dump_error(true,true,true,true,true)
|
1431
|
+
msg
|
1432
|
+
end
|
1433
|
+
def dump_all()
|
1434
|
+
msg = self.dump_error(true,true,true,true,true)
|
1435
|
+
msg
|
1436
|
+
end
|
1437
|
+
def dump_error(xmlversion=true,xmlerror=true,jobinfo=true,jobscan=true,joblog=true)
|
1438
|
+
msg = "\n"
|
1439
|
+
# xmlservice error occurred?
|
1440
|
+
if self.xmlservice_error and defined? self.PARM
|
1441
|
+
msg << "=== Dump ===\n"
|
1442
|
+
# xmlservice version (all error modes)
|
1443
|
+
if xmlversion and defined? self.PARM.version
|
1444
|
+
msg << "Version\n"
|
1445
|
+
msg << " version: #{self.PARM.version}\n"
|
1446
|
+
end
|
1447
|
+
# xmlservice job information (all error modes)
|
1448
|
+
if jobinfo and defined? self.PARM.jobinfo
|
1449
|
+
info = self.PARM.jobinfo
|
1450
|
+
msg << "Job\n"
|
1451
|
+
msg << " jobipc: #{info.jobipc}\n"
|
1452
|
+
msg << " jobipcskey: #{info.jobipcskey}\n"
|
1453
|
+
msg << " jobname: #{info.jobname}\n"
|
1454
|
+
msg << " jobuser: #{info.jobuser}\n"
|
1455
|
+
msg << " jobnbr: #{info.jobnbr}\n"
|
1456
|
+
msg << " jobsts: #{info.jobsts}\n"
|
1457
|
+
msg << " curuser: #{info.curuser}\n"
|
1458
|
+
msg << " ccsid: #{info.ccsid}\n"
|
1459
|
+
msg << " dftccsid: #{info.dftccsid}\n"
|
1460
|
+
msg << " paseccsid: #{info.paseccsid}\n"
|
1461
|
+
msg << " langid: #{info.langid}\n"
|
1462
|
+
msg << " cntryid: #{info.cntryid}\n"
|
1463
|
+
msg << " sbsname: #{info.sbsname}\n"
|
1464
|
+
msg << " sbslib: #{info.sbslib}\n"
|
1465
|
+
msg << " curlib: #{info.curlib}\n"
|
1466
|
+
msg << " syslibl: #{info.syslibl}\n"
|
1467
|
+
msg << " usrlibl: #{info.usrlibl}\n"
|
1468
|
+
end
|
1469
|
+
# xmlservice fast internal error log (all error modes)
|
1470
|
+
if xmlerror and defined? self.PARM.error
|
1471
|
+
msg << "XMLError\n"
|
1472
|
+
for j in 0..self.PARM.error.count-1
|
1473
|
+
err = self.PARM.error[j]
|
1474
|
+
msg << " #{err.errnoxml}"
|
1475
|
+
msg << " : #{err.xmlerrmsg}"
|
1476
|
+
msg << " : #{err.xmlhint}\n"
|
1477
|
+
end
|
1478
|
+
end
|
1479
|
+
# xmlservice joblog scan (error='on' or error='off')
|
1480
|
+
if jobscan and defined? self.PARM.joblogscan
|
1481
|
+
msg << "JoblogScan\n"
|
1482
|
+
for j in 0..self.PARM.joblogscan.joblogrec.count-1
|
1483
|
+
log = self.PARM.joblogscan.joblogrec[j]
|
1484
|
+
msg << " #{log.jobcpf}"
|
1485
|
+
msg << " : #{log.jobtime}\n"
|
1486
|
+
msg << " : #{log.jobtext}\n"
|
1487
|
+
end
|
1488
|
+
end
|
1489
|
+
# xmlservice joblog scan (error='on' or error='off')
|
1490
|
+
if joblog and defined? self.PARM.joblog
|
1491
|
+
msg << "Joblog\n"
|
1492
|
+
msg << "#{self.PARM.joblog.joblogdata}\n"
|
1493
|
+
end
|
1494
|
+
end
|
1495
|
+
msg
|
1496
|
+
end
|
1497
|
+
def reserved_words
|
1498
|
+
no = ["@xml_"]
|
1499
|
+
no
|
1500
|
+
end
|
1501
|
+
def format_inspect_include(name)
|
1502
|
+
self.reserved_words.each do |no|
|
1503
|
+
if name.include? no
|
1504
|
+
return false
|
1505
|
+
end
|
1506
|
+
end
|
1507
|
+
true
|
1508
|
+
end
|
1509
|
+
def dump_inspect
|
1510
|
+
out = ""
|
1511
|
+
out << "\n" << self.dump_inspect_input
|
1512
|
+
out << "\n" << self.dump_inspect_response
|
1513
|
+
out << "\n" << self.dump_inspect_returndata
|
1514
|
+
out
|
1515
|
+
end
|
1516
|
+
def dump_inspect_input
|
1517
|
+
out = "Input:\n" << self.format_inspect(@input,"input")
|
1518
|
+
out
|
1519
|
+
end
|
1520
|
+
def dump_inspect_response
|
1521
|
+
out = "Response:\n" << self.format_inspect(@response,"response")
|
1522
|
+
out
|
1523
|
+
end
|
1524
|
+
def dump_inspect_returndata
|
1525
|
+
out = "ReturnData:\n" << self.format_inspect(@returndata,"returndata")
|
1526
|
+
out
|
1527
|
+
end
|
1528
|
+
def format_inspect_recursive(lastvar,dot,alreadyseen,isInput)
|
1529
|
+
# puts "top #{dot}#{lastvar.class.name}"
|
1530
|
+
out = ""
|
1531
|
+
if isInput
|
1532
|
+
if lastvar.kind_of? Hash
|
1533
|
+
outvar = Array.new
|
1534
|
+
lastvar.each do |k, v|
|
1535
|
+
out << dot + "[#{k}]\n"
|
1536
|
+
out << self.format_inspect_recursive(v,dot + ".",alreadyseen,isInput)
|
1537
|
+
end
|
1538
|
+
elsif lastvar.kind_of? Array
|
1539
|
+
outvar = Array.new
|
1540
|
+
for i in 0..lastvar.count-1
|
1541
|
+
out << dot + "[#{i}]\n"
|
1542
|
+
out << self.format_inspect_recursive(lastvar[i],dot + ".",alreadyseen,isInput)
|
1543
|
+
end
|
1544
|
+
else
|
1545
|
+
outvar = lastvar.instance_variables
|
1546
|
+
end
|
1547
|
+
else
|
1548
|
+
outvar = lastvar.instance_variables
|
1549
|
+
end
|
1550
|
+
outvar.each do |v|
|
1551
|
+
name = v.to_s
|
1552
|
+
# puts "child #{dot}#{name}"
|
1553
|
+
if !self.format_inspect_include(name)
|
1554
|
+
next
|
1555
|
+
end
|
1556
|
+
go = true
|
1557
|
+
alreadyseen.each do |seen|
|
1558
|
+
if (dot + "#{name}").eql? "#{seen}"
|
1559
|
+
go = false
|
1560
|
+
break;
|
1561
|
+
end
|
1562
|
+
end
|
1563
|
+
if !go
|
1564
|
+
next
|
1565
|
+
end
|
1566
|
+
nextvar = lastvar.instance_variable_get(name)
|
1567
|
+
# puts "next #{dot}#{name} #{nextvar.class.name}"
|
1568
|
+
if isInput
|
1569
|
+
if dot.eql? "." and !name.include? "PARM"
|
1570
|
+
next
|
1571
|
+
end
|
1572
|
+
else
|
1573
|
+
if dot.eql? "."
|
1574
|
+
if (self.kind_of? I_PGM or self.kind_of? I_SRVPGM) and !(nextvar.kind_of? I_Return or nextvar.kind_of? I_Parameter)
|
1575
|
+
next
|
1576
|
+
end
|
1577
|
+
end
|
1578
|
+
end
|
1579
|
+
whatami = nextvar.class.name
|
1580
|
+
cln = ""
|
1581
|
+
if nextvar.instance_of? I_DS
|
1582
|
+
cln = "[i]"
|
1583
|
+
elsif nextvar.instance_of? Array
|
1584
|
+
cln = "[i]"
|
1585
|
+
elsif nextvar.instance_of? Hash
|
1586
|
+
cln = "[k,v]"
|
1587
|
+
end
|
1588
|
+
out << dot + "#{name}#{cln} -> #{whatami}\n"
|
1589
|
+
alreadyseen << dot + "#{name}"
|
1590
|
+
if !isInput and nextvar.kind_of? I_Base
|
1591
|
+
next
|
1592
|
+
end
|
1593
|
+
if !nextvar.nil?
|
1594
|
+
if nextvar.instance_of? Array
|
1595
|
+
i = 0
|
1596
|
+
nextvar.each do | value |
|
1597
|
+
out << dot + "[#{i}]\n"
|
1598
|
+
out << self.format_inspect_recursive(value,dot + ".",alreadyseen,isInput)
|
1599
|
+
i += 1
|
1600
|
+
end
|
1601
|
+
elsif nextvar.instance_of? Hash
|
1602
|
+
nextvar.each do | key, value |
|
1603
|
+
out << dot + "[#{key}]\n"
|
1604
|
+
out << self.format_inspect_recursive(value,dot + ".",alreadyseen,isInput)
|
1605
|
+
end
|
1606
|
+
else
|
1607
|
+
out << self.format_inspect_recursive(nextvar,dot + ".",alreadyseen,isInput)
|
1608
|
+
end
|
1609
|
+
end
|
1610
|
+
end
|
1611
|
+
out
|
1612
|
+
end
|
1613
|
+
def format_inspect(cat,top)
|
1614
|
+
if top.eql? "input"
|
1615
|
+
isInput = true
|
1616
|
+
else
|
1617
|
+
isInput = false
|
1618
|
+
end
|
1619
|
+
whatami = cat.class.name
|
1620
|
+
out = ""
|
1621
|
+
out2 = "@#{top} -> #{whatami}\n"
|
1622
|
+
out1 = ""
|
1623
|
+
if !cat.nil?
|
1624
|
+
alreadyseen = Array.new
|
1625
|
+
out2 << self.format_inspect_recursive(cat,".",alreadyseen,isInput)
|
1626
|
+
# shortcut methods
|
1627
|
+
shortcutmethods = cat.class.instance_methods
|
1628
|
+
alreadyseen.each do |name|
|
1629
|
+
shortcutmethods.each do |shortcut|
|
1630
|
+
if "#{name}".eql? "..@#{shortcut}"
|
1631
|
+
out1 << "obj." << top << ".#{shortcut}\n"
|
1632
|
+
end
|
1633
|
+
end
|
1634
|
+
end
|
1635
|
+
end
|
1636
|
+
out = out1 + out2
|
1637
|
+
out
|
1638
|
+
end
|
1639
|
+
|
1640
|
+
end
|
1641
|
+
# ---------------------
|
1642
|
+
# xmlservice call PGM or SRVPGM
|
1643
|
+
# mypgm = XMLService::I_SRVPGM.new("ZZLOTS","ZZMANY","ZZLIB",{'error'=>'on'})
|
1644
|
+
# ===================================
|
1645
|
+
# paramters input/output (io='both')
|
1646
|
+
# ===================================
|
1647
|
+
# mypgm.input_parms do
|
1648
|
+
# bin "mybin", 4 # mypgm.input.mybin = 'DEADBEEF' PARM0
|
1649
|
+
# char "mychar", 32 # mypgm.input.mychar = 'Hi there' PARM1
|
1650
|
+
# varchar "myvchar", 64 # mypgm.input.myvchar = 'Hi variable' PARM2
|
1651
|
+
# varchar4 "myvchar4", 1024 # mypgm.input.myvchar4 = 'Hi variable 4' PARM3
|
1652
|
+
# tiny "mytiny" # mypgm.input.mytiny = 1 PARM4
|
1653
|
+
# short "myshort" # mypgm.input.myshort = 11 PARM5
|
1654
|
+
# long "mylong" # mypgm.input.mylong = 1111 PARM6
|
1655
|
+
# longlong "myll" # mypgm.input.myll = 11111111 PARM7
|
1656
|
+
# utiny "myutiny" # mypgm.input.myutiny = 1 PARM8
|
1657
|
+
# ushort "myushort" # mypgm.input.myushort = 11 PARM9
|
1658
|
+
# ulong "myulong" # mypgm.input.myulong = 1111 PARM10
|
1659
|
+
# ulonglong "myull" # mypgm.input.myull = 11111111 PARM11
|
1660
|
+
# real "myreal4", 2 # mypgm.input.myreal4 = 11.11 PARM12
|
1661
|
+
# float4 "myfloat4", 2 # mypgm.input.myfloat4 = 11.11 PARM13
|
1662
|
+
# double "mydouble8", 4 # mypgm.input.mydouble8 = 1111.1111 PARM14
|
1663
|
+
# float8 "myfloat8", 4 # mypgm.input.myfloat8 = 1111.1111 PARM15
|
1664
|
+
# dec "mypack", 12, 2 # mypgm.input.mypack = 11111.11 PARM16
|
1665
|
+
# zone "myzone", 8, 4 # mypgm.input.myzone = 11111.1111 PARM17
|
1666
|
+
# tiny_enddo "mytinye" # mypgm.input.mytinye = 1 PARM18 (enddo='mytinye')
|
1667
|
+
# short_enddo "myshorte" # mypgm.input.myshorte = 1 PARM19 (enddo='myshorte')
|
1668
|
+
# long_enddo "mylonge" # mypgm.input.mylonge = 1 PARM20 (enddo='mylonge')
|
1669
|
+
# longlong_enddo "mylle" # mypgm.input.mylle = 1 PARM21 (enddo='mylle')
|
1670
|
+
# utiny_enddo "myutinye" # mypgm.input.myutinye = 1 PARM22 (enddo='myutinye')
|
1671
|
+
# ushort_enddo "myushorte" # mypgm.input.myushorte = 1 PARM23 (enddo='myutinye')
|
1672
|
+
# ulong_enddo "myulonge" # mypgm.input.myulonge = 1 PARM24 (enddo='myushorte')
|
1673
|
+
# ulonglong_enddo "myulle" # mypgm.input.myulle = 1 PARM25 (enddo='myulle')
|
1674
|
+
# real_enddo "myreal4e", 2 # mypgm.input.myreale = 1 PARM26 (enddo='myreale')
|
1675
|
+
# float4_enddo "myfloat4e", 2 # mypgm.input.myfloat4e = 1 PARM27 (enddo='myfloat4e')
|
1676
|
+
# double_enddo "mydouble8e", 4 # mypgm.input.double8e = 1 PARM28 (enddo='mydouble8e')
|
1677
|
+
# float8_enddo "myfloat8e", 4 # mypgm.input.myfloat8e = 1 PARM29 (enddo='myfloat8e')
|
1678
|
+
# dec_enddo "mypacke", 12, 2 # mypgm.input.mypacke = 1 PARM30 (enddo='mypacke') <-------------
|
1679
|
+
# zone_enddo "myzonee", 8, 4 # mypgm.input.myzonee = 1 PARM31 (enddo='myzonee') |
|
1680
|
+
# struct "myds1",42 do # mypgm.input.myds1 PARM32 |
|
1681
|
+
# varchar "ds1varchar", 64 # mypgm.input.myds1[0].ds1varchar = 'hi' |
|
1682
|
+
# dec "ds1packe", 12, 2 # mypgm.input.myds1[1].ds1packe = 222.22 |
|
1683
|
+
# struct "myds2",42 do # mypgm.input.myds1[2].myds2 |
|
1684
|
+
# char "ds2char", 32 # mypgm.input.myds1[2].myds2[0].ds2char = 'hi hi' |
|
1685
|
+
# zone "ds2zone", 8, 4 # mypgm.input.myds1[2].myds2[1].ds2zone = 33.3333 |
|
1686
|
+
# struct_dou "myds3",42,"mypacke" do # mypgm.input.myds1[2].myds2[2].myds3 (dou='mypacke') <-----
|
1687
|
+
# char "ds3char", 32 # mypgm.input.myds1[2].myds2[2].myds3[0].ds3char = 'hi hi hi' |
|
1688
|
+
# zone "ds3zone", 8, 4 # mypgm.input.myds1[2].myds2[2].myds3[1].ds3zone = 44.4444 |
|
1689
|
+
# end |
|
1690
|
+
# end |
|
1691
|
+
# end |
|
1692
|
+
# end |
|
1693
|
+
# ==================== |
|
1694
|
+
# output only (return) |
|
1695
|
+
# ==================== |
|
1696
|
+
# mypgm.return_parms do |
|
1697
|
+
# struct "rtds1",42 do # mypgm.returndata.rtds1 |
|
1698
|
+
# varchar "rt1vchar", 64 # mypgm.returndata.rtds1[0..42].rt1vchar |
|
1699
|
+
# dec "rt1packed", 12, 2 # mypgm.returndata.rtds1[0..42].rt1packed |
|
1700
|
+
# struct "rtds2",42 do # mypgm.returndata.rtds1[0..42].rtds2 |
|
1701
|
+
# char "rt2char", 32 # mypgm.returndata.rtds1[0..42].rtds2[0..42].rt2char |
|
1702
|
+
# zone "rt2zoned", 8, 4 # mypgm.returndata.rtds1[0..42].rtds2[0..42].rt2zoned |
|
1703
|
+
# struct_dou "rtds3",42,"mypacke" do # mypgm.returndata.rtds1[0..42].rtds2[0..42].rtds3 (dou='mypacke') <--
|
1704
|
+
# char "rt3char", 32 # mypgm.returndata.rtds1[0..42].rtds2[0..42].rtds3[0..mypacke].rt3char
|
1705
|
+
# zone "rt3zoned", 8, 4 # mypgm.returndata.rtds1[0..42].rtds2[0..42].rtds3[0..mypacke].rt3zoned
|
1706
|
+
# end
|
1707
|
+
# end
|
1708
|
+
# end
|
1709
|
+
# end
|
1710
|
+
# ====================
|
1711
|
+
# output
|
1712
|
+
# ====================
|
1713
|
+
# puts mypgm.response.mybin
|
1714
|
+
# puts mypgm.response.mychar
|
1715
|
+
# puts mypgm.response.myvchar
|
1716
|
+
# puts mypgm.response.myvchar4
|
1717
|
+
# puts mypgm.response.mytiny
|
1718
|
+
# puts mypgm.response.myshort
|
1719
|
+
# puts mypgm.response.mylong
|
1720
|
+
# puts mypgm.response.myll
|
1721
|
+
# puts mypgm.response.myutiny
|
1722
|
+
# puts mypgm.response.myushort
|
1723
|
+
# puts mypgm.response.myulong
|
1724
|
+
# puts mypgm.response.myull
|
1725
|
+
# puts mypgm.response.myreal4
|
1726
|
+
# puts mypgm.response.myfloat4
|
1727
|
+
# puts mypgm.response.mydouble8
|
1728
|
+
# puts mypgm.response.myfloat8
|
1729
|
+
# puts mypgm.response.mypack
|
1730
|
+
# puts mypgm.response.myzone
|
1731
|
+
# puts mypgm.response.mytinye
|
1732
|
+
# puts mypgm.response.myshorte
|
1733
|
+
# puts mypgm.response.mylonge
|
1734
|
+
# puts mypgm.response.mylle
|
1735
|
+
# puts mypgm.response.myutinye
|
1736
|
+
# puts mypgm.response.myushorte
|
1737
|
+
# puts mypgm.response.myulonge
|
1738
|
+
# puts mypgm.response.myulle
|
1739
|
+
# puts mypgm.response.myreale
|
1740
|
+
# puts mypgm.response.myfloat4e
|
1741
|
+
# puts mypgm.response.double8e
|
1742
|
+
# puts mypgm.response.myfloat8e
|
1743
|
+
# puts mypgm.response.mypacke
|
1744
|
+
# puts mypgm.response.myzonee
|
1745
|
+
# puts mypgm.response.myds1
|
1746
|
+
# puts mypgm.response.myds1[0..42].ds1varchar
|
1747
|
+
# puts mypgm.response.myds1[0..42].ds1packe
|
1748
|
+
# puts mypgm.response.myds1[0..42].myds2
|
1749
|
+
# puts mypgm.response.myds1[0..42].myds2[0..42].ds2char
|
1750
|
+
# puts mypgm.response.myds1[0..42].myds2[0..42].ds2zone
|
1751
|
+
# puts mypgm.response.myds1[0..42].myds2[0..42].myds3
|
1752
|
+
# puts mypgm.response.myds1[0..42].myds2[0..42].myds3[0..mypacke].ds3char
|
1753
|
+
# puts mypgm.response.myds1[0..42].myds2[0..42].myds3[0..mypacke].ds3zone
|
1754
|
+
# puts mypgm.returndata.rtds1
|
1755
|
+
# puts mypgm.returndata.rtds1[0..42].rt1vchar
|
1756
|
+
# puts mypgm.returndata.rtds1[0..42].rt1packed
|
1757
|
+
# puts mypgm.returndata.rtds1[0..42].rtds2
|
1758
|
+
# puts mypgm.returndata.rtds1[0..42].rtds2[0..42].rt2char
|
1759
|
+
# puts mypgm.returndata.rtds1[0..42].rtds2[0..42].rt2zoned
|
1760
|
+
# puts mypgm.returndata.rtds1[0..42].rtds2[0..42].rtds3 (dou='mypacke')
|
1761
|
+
# puts mypgm.returndata.rtds1[0..42].rtds2[0..42].rtds3[0..mypacke].rt3char
|
1762
|
+
# puts mypgm.returndata.rtds1[0..42].rtds2[0..42].rtds3[0..mypacke].rt3zoned
|
1763
|
+
# ---------------------
|
1764
|
+
class I_PGM < I_CALL
|
1765
|
+
def initialize(name,lib=nil,options=nil,func=nil)
|
1766
|
+
@xml_name = name
|
1767
|
+
@xml_lib = lib
|
1768
|
+
@xml_func = func
|
1769
|
+
@xml_parms = Array.new
|
1770
|
+
@xml_reti = nil
|
1771
|
+
@xml_doc = nil
|
1772
|
+
@xml_isParm = true
|
1773
|
+
super(options)
|
1774
|
+
end
|
1775
|
+
def name
|
1776
|
+
@xml_name
|
1777
|
+
end
|
1778
|
+
def lib
|
1779
|
+
@xml_lib
|
1780
|
+
end
|
1781
|
+
def func
|
1782
|
+
@xml_func
|
1783
|
+
end
|
1784
|
+
def getInputParameter(idx)
|
1785
|
+
parm = nil
|
1786
|
+
if @xml_parms.include?(idx)
|
1787
|
+
parm = @xml_parms[idx]
|
1788
|
+
end
|
1789
|
+
parm
|
1790
|
+
end
|
1791
|
+
def inputParameter(var,io,elem,idx=nil)
|
1792
|
+
if @xml_parms == nil
|
1793
|
+
@xml_parms = Array.new
|
1794
|
+
end
|
1795
|
+
if var == nil
|
1796
|
+
if !idx
|
1797
|
+
var = "PARM" << @xml_parms.count.to_s
|
1798
|
+
else
|
1799
|
+
var = "PARM" << idx.to_s
|
1800
|
+
end
|
1801
|
+
end
|
1802
|
+
if io == nil
|
1803
|
+
io = "io"
|
1804
|
+
end
|
1805
|
+
if !idx
|
1806
|
+
idx = @xml_parms.count
|
1807
|
+
end
|
1808
|
+
@xml_parms[idx] = I_Parameter.new(var,io,elem)
|
1809
|
+
@input.add_user_accessor(var,@xml_parms[idx].value)
|
1810
|
+
self.shortCut(@input,@xml_parms[idx])
|
1811
|
+
end
|
1812
|
+
def << (elem)
|
1813
|
+
self.inputParameter(nil,nil,elem)
|
1814
|
+
self
|
1815
|
+
end
|
1816
|
+
def []= (idx,elem)
|
1817
|
+
self.inputParameter(nil,nil,elem,idx)
|
1818
|
+
self
|
1819
|
+
end
|
1820
|
+
def struct(var,dim,&block)
|
1821
|
+
ds = I_DS.new(var,dim).input_elems(&block)
|
1822
|
+
if @xml_isParm
|
1823
|
+
self.inputParameter(nil,nil,ds)
|
1824
|
+
else
|
1825
|
+
self.setReturn("xaggr",ds)
|
1826
|
+
end
|
1827
|
+
ds
|
1828
|
+
end
|
1829
|
+
def bin(var, size, data="00")
|
1830
|
+
el = I_b.new(var,size,data)
|
1831
|
+
if @xml_isParm
|
1832
|
+
self.inputParameter(nil,nil,el)
|
1833
|
+
else
|
1834
|
+
self.setReturn("xbin",el)
|
1835
|
+
end
|
1836
|
+
el
|
1837
|
+
end
|
1838
|
+
def char(var, size, data=" ")
|
1839
|
+
el = I_a.new(var,size,data)
|
1840
|
+
if @xml_isParm
|
1841
|
+
self.inputParameter(nil,nil,el)
|
1842
|
+
else
|
1843
|
+
self.setReturn("xchr",el)
|
1844
|
+
end
|
1845
|
+
el
|
1846
|
+
end
|
1847
|
+
def varchar(var, size, data=" ")
|
1848
|
+
el = I_a_varying.new(var,size,data)
|
1849
|
+
if @xml_isParm
|
1850
|
+
self.inputParameter(nil,nil,el)
|
1851
|
+
else
|
1852
|
+
self.setReturn("xvchr",el)
|
1853
|
+
end
|
1854
|
+
el
|
1855
|
+
end
|
1856
|
+
def varchar4(var, size, data=" ")
|
1857
|
+
el = I_a_varying_4.new(var,size,data)
|
1858
|
+
if @xml_isParm
|
1859
|
+
self.inputParameter(nil,nil,el)
|
1860
|
+
else
|
1861
|
+
self.setReturn("xvchr4",el)
|
1862
|
+
end
|
1863
|
+
el
|
1864
|
+
end
|
1865
|
+
def tiny(var, data=0)
|
1866
|
+
el = I_Int8.new(var,data)
|
1867
|
+
if @xml_isParm
|
1868
|
+
self.inputParameter(nil,nil,el)
|
1869
|
+
else
|
1870
|
+
self.setReturn("xtiny",el)
|
1871
|
+
end
|
1872
|
+
el
|
1873
|
+
end
|
1874
|
+
def short(var, data=0)
|
1875
|
+
el = I_Int16.new(var,data)
|
1876
|
+
if @xml_isParm
|
1877
|
+
self.inputParameter(nil,nil,el)
|
1878
|
+
else
|
1879
|
+
self.setReturn("xshort",el)
|
1880
|
+
end
|
1881
|
+
el
|
1882
|
+
end
|
1883
|
+
def long(var, data=0)
|
1884
|
+
el = I_Int32.new(var,data)
|
1885
|
+
if @xml_isParm
|
1886
|
+
self.inputParameter(nil,nil,el)
|
1887
|
+
else
|
1888
|
+
self.setReturn("xlong",el)
|
1889
|
+
end
|
1890
|
+
el
|
1891
|
+
end
|
1892
|
+
def longlong(var, data=0)
|
1893
|
+
el = I_Int64.new(var,data)
|
1894
|
+
if @xml_isParm
|
1895
|
+
self.inputParameter(nil,nil,el)
|
1896
|
+
else
|
1897
|
+
self.setReturn("xll",el)
|
1898
|
+
end
|
1899
|
+
el
|
1900
|
+
end
|
1901
|
+
def utiny(var, data=0)
|
1902
|
+
el = I_Uint8.new(var,data)
|
1903
|
+
if @xml_isParm
|
1904
|
+
self.inputParameter(nil,nil,el)
|
1905
|
+
else
|
1906
|
+
self.setReturn("xutiny",el)
|
1907
|
+
end
|
1908
|
+
el
|
1909
|
+
end
|
1910
|
+
def ushort(var, data=0)
|
1911
|
+
el = I_Uint16.new(var,data)
|
1912
|
+
if @xml_isParm
|
1913
|
+
self.inputParameter(nil,nil,el)
|
1914
|
+
else
|
1915
|
+
self.setReturn("xushort",el)
|
1916
|
+
end
|
1917
|
+
el
|
1918
|
+
end
|
1919
|
+
def ulong(var, data=0)
|
1920
|
+
el = I_Uint32.new(var,data)
|
1921
|
+
if @xml_isParm
|
1922
|
+
self.inputParameter(nil,nil,el)
|
1923
|
+
else
|
1924
|
+
self.setReturn("xulong",el)
|
1925
|
+
end
|
1926
|
+
el
|
1927
|
+
end
|
1928
|
+
def ulonglong(var, data=0)
|
1929
|
+
el = I_Uint64.new(var,data)
|
1930
|
+
if @xml_isParm
|
1931
|
+
self.inputParameter(nil,nil,el)
|
1932
|
+
else
|
1933
|
+
self.setReturn("xull",el)
|
1934
|
+
end
|
1935
|
+
el
|
1936
|
+
end
|
1937
|
+
def real(var, scale, data=0.0)
|
1938
|
+
el = I_Float4.new(var,scale,data)
|
1939
|
+
if @xml_isParm
|
1940
|
+
self.inputParameter(nil,nil,el)
|
1941
|
+
else
|
1942
|
+
self.setReturn("xreal",el)
|
1943
|
+
end
|
1944
|
+
el
|
1945
|
+
end
|
1946
|
+
def float4(var, scale, data=0.0)
|
1947
|
+
el = I_Float4.new(var,scale,data)
|
1948
|
+
if @xml_isParm
|
1949
|
+
self.inputParameter(nil,nil,el)
|
1950
|
+
else
|
1951
|
+
self.setReturn("xfloat4",el)
|
1952
|
+
end
|
1953
|
+
el
|
1954
|
+
end
|
1955
|
+
def double(var, scale, data=0.0)
|
1956
|
+
el = I_Float8.new(var,scale,data)
|
1957
|
+
if @xml_isParm
|
1958
|
+
self.inputParameter(nil,nil,el)
|
1959
|
+
else
|
1960
|
+
self.setReturn("xdouble",el)
|
1961
|
+
end
|
1962
|
+
el
|
1963
|
+
end
|
1964
|
+
def float8(var, scale, data=0.0)
|
1965
|
+
el = I_Float8.new(var,scale,data)
|
1966
|
+
if @xml_isParm
|
1967
|
+
self.inputParameter(nil,nil,el)
|
1968
|
+
else
|
1969
|
+
self.setReturn("xfloat8",el)
|
1970
|
+
end
|
1971
|
+
el
|
1972
|
+
end
|
1973
|
+
def dec(var, size, scale, data=0)
|
1974
|
+
el = I_p.new(var,size,scale,data)
|
1975
|
+
if @xml_isParm
|
1976
|
+
self.inputParameter(nil,nil,el)
|
1977
|
+
else
|
1978
|
+
self.setReturn("xdec",el)
|
1979
|
+
end
|
1980
|
+
el
|
1981
|
+
end
|
1982
|
+
def zone(var, size, scale, data=0)
|
1983
|
+
el = I_s.new(var,size,scale,data)
|
1984
|
+
if @xml_isParm
|
1985
|
+
self.inputParameter(nil,nil,el)
|
1986
|
+
else
|
1987
|
+
self.setReturn("xzone",el)
|
1988
|
+
end
|
1989
|
+
el
|
1990
|
+
end
|
1991
|
+
def struct_dou(var,dim,dou,&block)
|
1992
|
+
ds = I_DS.new(var,dim,dou).input_elems(&block)
|
1993
|
+
if @xml_isParm
|
1994
|
+
self.inputParameter(nil,nil,ds)
|
1995
|
+
else
|
1996
|
+
self.setReturn("douaggr",ds)
|
1997
|
+
end
|
1998
|
+
ds
|
1999
|
+
end
|
2000
|
+
def tiny_enddo(var, data=0)
|
2001
|
+
el = I_Int8.new(var,data,var)
|
2002
|
+
if @xml_isParm
|
2003
|
+
self.inputParameter(nil,nil,el)
|
2004
|
+
else
|
2005
|
+
self.setReturn("doutiny",el)
|
2006
|
+
end
|
2007
|
+
el
|
2008
|
+
end
|
2009
|
+
def short_enddo(var, data=0)
|
2010
|
+
el = I_Int16.new(var,data,var)
|
2011
|
+
if @xml_isParm
|
2012
|
+
self.inputParameter(nil,nil,el)
|
2013
|
+
else
|
2014
|
+
self.setReturn("doushort",el)
|
2015
|
+
end
|
2016
|
+
el
|
2017
|
+
end
|
2018
|
+
def long_enddo(var, data=0)
|
2019
|
+
el = I_Int32.new(var,data,var)
|
2020
|
+
if @xml_isParm
|
2021
|
+
self.inputParameter(nil,nil,el)
|
2022
|
+
else
|
2023
|
+
self.setReturn("doulong",el)
|
2024
|
+
end
|
2025
|
+
el
|
2026
|
+
end
|
2027
|
+
def longlong_enddo(var, data=0)
|
2028
|
+
el = I_Int64.new(var,data,var)
|
2029
|
+
if @xml_isParm
|
2030
|
+
self.inputParameter(nil,nil,el)
|
2031
|
+
else
|
2032
|
+
self.setReturn("doull",el)
|
2033
|
+
end
|
2034
|
+
el
|
2035
|
+
end
|
2036
|
+
def utiny_enddo(var, data=0)
|
2037
|
+
el = I_Uint8.new(var,data,var)
|
2038
|
+
if @xml_isParm
|
2039
|
+
self.inputParameter(nil,nil,el)
|
2040
|
+
else
|
2041
|
+
self.setReturn("douutiny",el)
|
2042
|
+
end
|
2043
|
+
el
|
2044
|
+
end
|
2045
|
+
def ushort_enddo(var, data=0)
|
2046
|
+
el = I_Uint16.new(var,data,var)
|
2047
|
+
if @xml_isParm
|
2048
|
+
self.inputParameter(nil,nil,el)
|
2049
|
+
else
|
2050
|
+
self.setReturn("douushort",el)
|
2051
|
+
end
|
2052
|
+
el
|
2053
|
+
end
|
2054
|
+
def ulong_enddo(var, data=0)
|
2055
|
+
el = I_Uint32.new(var,data,var)
|
2056
|
+
if @xml_isParm
|
2057
|
+
self.inputParameter(nil,nil,el)
|
2058
|
+
else
|
2059
|
+
self.setReturn("douulong",el)
|
2060
|
+
end
|
2061
|
+
el
|
2062
|
+
end
|
2063
|
+
def ulonglong_enddo(var, data=0)
|
2064
|
+
el = I_Uint64.new(var,data,var)
|
2065
|
+
if @xml_isParm
|
2066
|
+
self.inputParameter(nil,nil,el)
|
2067
|
+
else
|
2068
|
+
self.setReturn("douull",el)
|
2069
|
+
end
|
2070
|
+
el
|
2071
|
+
end
|
2072
|
+
def real_enddo(var, scale, data=0.0)
|
2073
|
+
el = I_Float4.new(var,scale,data,var)
|
2074
|
+
if @xml_isParm
|
2075
|
+
self.inputParameter(nil,nil,el)
|
2076
|
+
else
|
2077
|
+
self.setReturn("doureal",el)
|
2078
|
+
end
|
2079
|
+
el
|
2080
|
+
end
|
2081
|
+
def float4_enddo(var, scale, data=0.0)
|
2082
|
+
el = I_Float4.new(var,scale,data,var)
|
2083
|
+
if @xml_isParm
|
2084
|
+
self.inputParameter(nil,nil,el)
|
2085
|
+
else
|
2086
|
+
self.setReturn("doufloat4",el)
|
2087
|
+
end
|
2088
|
+
el
|
2089
|
+
end
|
2090
|
+
def double_enddo(var, scale, data=0.0)
|
2091
|
+
el = I_Float8.new(var,scale,data,var)
|
2092
|
+
if @xml_isParm
|
2093
|
+
self.inputParameter(nil,nil,el)
|
2094
|
+
else
|
2095
|
+
self.setReturn("doudouble",el)
|
2096
|
+
end
|
2097
|
+
el
|
2098
|
+
end
|
2099
|
+
def float8_enddo(var, scale, data=0.0)
|
2100
|
+
el = I_Float8.new(var,scale,data,var)
|
2101
|
+
if @xml_isParm
|
2102
|
+
self.inputParameter(nil,nil,el)
|
2103
|
+
else
|
2104
|
+
self.setReturn("doufloat8",el)
|
2105
|
+
end
|
2106
|
+
el
|
2107
|
+
end
|
2108
|
+
def dec_enddo(var, size, scale, data=0)
|
2109
|
+
el = I_p.new(var,size,scale,data,var)
|
2110
|
+
if @xml_isParm
|
2111
|
+
self.inputParameter(nil,nil,el)
|
2112
|
+
else
|
2113
|
+
self.setReturn("doudec",el)
|
2114
|
+
end
|
2115
|
+
el
|
2116
|
+
end
|
2117
|
+
def zone_enddo(var, size, scale, data=0)
|
2118
|
+
el = I_s.new(var,size,scale,data,var)
|
2119
|
+
if @xml_isParm
|
2120
|
+
self.inputParameter(nil,nil,el)
|
2121
|
+
else
|
2122
|
+
self.setReturn("douzone",el)
|
2123
|
+
end
|
2124
|
+
el
|
2125
|
+
end
|
2126
|
+
def input_parms(&block)
|
2127
|
+
@xml_isParm = true
|
2128
|
+
self.instance_eval(&block)
|
2129
|
+
self
|
2130
|
+
end
|
2131
|
+
def return_parms(&block)
|
2132
|
+
@xml_isParm = false
|
2133
|
+
self.instance_eval(&block)
|
2134
|
+
self
|
2135
|
+
@xml_isParm = true
|
2136
|
+
end
|
2137
|
+
def parse_output_attr()
|
2138
|
+
super()
|
2139
|
+
@xml_doc.elements.each("/myscript/pgm/success") do |element|
|
2140
|
+
@response.add_user_accessor("output", element.text)
|
2141
|
+
break
|
2142
|
+
end
|
2143
|
+
@xml_doc.elements.each("/myscript/pgm/error") do |element|
|
2144
|
+
@response.add_user_accessor("output", element.text)
|
2145
|
+
break
|
2146
|
+
end
|
2147
|
+
idx = 0
|
2148
|
+
loop do
|
2149
|
+
parm = self.getIndexOutputParameter(idx)
|
2150
|
+
if parm
|
2151
|
+
@response.add_user_accessor(parm.var, parm)
|
2152
|
+
self.shortCut(@response,parm)
|
2153
|
+
else
|
2154
|
+
break
|
2155
|
+
end
|
2156
|
+
idx += 1
|
2157
|
+
end
|
2158
|
+
end
|
2159
|
+
def getIndexOutputParameter(idx)
|
2160
|
+
parm = nil
|
2161
|
+
i = 0
|
2162
|
+
@xml_doc.elements.each("/myscript/pgm/parm") do |element|
|
2163
|
+
if idx.instance_of? String
|
2164
|
+
if idx == element.attributes['var']
|
2165
|
+
parm = I_Parameter.new(element)
|
2166
|
+
break
|
2167
|
+
end
|
2168
|
+
else
|
2169
|
+
if i == idx
|
2170
|
+
parm = I_Parameter.new(element)
|
2171
|
+
break
|
2172
|
+
end
|
2173
|
+
end
|
2174
|
+
i += 1
|
2175
|
+
end
|
2176
|
+
parm
|
2177
|
+
end
|
2178
|
+
def var(idx)
|
2179
|
+
var = "*NONE"
|
2180
|
+
parm = self.getIndexOutputParameter(idx)
|
2181
|
+
if parm
|
2182
|
+
var = parm.var
|
2183
|
+
end
|
2184
|
+
var
|
2185
|
+
end
|
2186
|
+
def value(idx)
|
2187
|
+
elem = nil
|
2188
|
+
parm = self.getIndexOutputParameter(idx)
|
2189
|
+
if parm
|
2190
|
+
elem = parm.value
|
2191
|
+
end
|
2192
|
+
elem
|
2193
|
+
end
|
2194
|
+
def outputParameter(idx)
|
2195
|
+
self.value(idx)
|
2196
|
+
end
|
2197
|
+
def outputParameter(idx)
|
2198
|
+
self.value(idx)
|
2199
|
+
end
|
2200
|
+
def assoc(idx)
|
2201
|
+
self.value(idx)
|
2202
|
+
end
|
2203
|
+
def [](idx)
|
2204
|
+
self.value(idx)
|
2205
|
+
end
|
2206
|
+
def setReturn(var,elem)
|
2207
|
+
@xml_reti = I_Return.new(var,elem)
|
2208
|
+
@input.add_user_accessor(var,@xml_reti.value)
|
2209
|
+
end
|
2210
|
+
def parse_return_attr()
|
2211
|
+
super()
|
2212
|
+
ret = self.ret()
|
2213
|
+
if ret
|
2214
|
+
@returndata.add_user_accessor(ret.var, ret)
|
2215
|
+
self.shortCut(@returndata,ret)
|
2216
|
+
end
|
2217
|
+
end
|
2218
|
+
def ret()
|
2219
|
+
ret = nil
|
2220
|
+
if @xml_doc
|
2221
|
+
@xml_doc.elements.each("/myscript/pgm/return") do |element|
|
2222
|
+
ret = I_Return.new(element)
|
2223
|
+
end
|
2224
|
+
end
|
2225
|
+
ret
|
2226
|
+
end
|
2227
|
+
def retValue()
|
2228
|
+
elem = nil
|
2229
|
+
ret = self.ret()
|
2230
|
+
if ret
|
2231
|
+
elem = ret.value
|
2232
|
+
end
|
2233
|
+
elem
|
2234
|
+
end
|
2235
|
+
def retVar()
|
2236
|
+
var = "*NONE"
|
2237
|
+
ret = self.ret()
|
2238
|
+
if ret
|
2239
|
+
var = ret.var
|
2240
|
+
end
|
2241
|
+
var
|
2242
|
+
end
|
2243
|
+
def parse_diag_attr()
|
2244
|
+
return self.xmlservice_diag_parse("/myscript/pgm")
|
2245
|
+
end
|
2246
|
+
def to_xml
|
2247
|
+
xml = ""
|
2248
|
+
lib = ""
|
2249
|
+
if @xml_lib
|
2250
|
+
lib = " lib='#{@xml_lib}'"
|
2251
|
+
end
|
2252
|
+
func = ""
|
2253
|
+
if @xml_func
|
2254
|
+
func = " func='#{@xml_func}'"
|
2255
|
+
end
|
2256
|
+
error = " error='fast'"
|
2257
|
+
opm = ""
|
2258
|
+
if @xml_options
|
2259
|
+
if @xml_options.has_key?(:error)
|
2260
|
+
error = " error='#{@xml_options[:error]}'"
|
2261
|
+
end
|
2262
|
+
if @xml_options.has_key?(:opm)
|
2263
|
+
opm = " opm='#{@xml_options[:opm]}'"
|
2264
|
+
end
|
2265
|
+
end
|
2266
|
+
xml = "<pgm name='#{@xml_name}'#{func}#{lib}#{error}#{opm}>\n"
|
2267
|
+
if @xml_parms
|
2268
|
+
@xml_parms.each do |a|
|
2269
|
+
xml << a.to_xml
|
2270
|
+
end
|
2271
|
+
end
|
2272
|
+
if @xml_reti
|
2273
|
+
xml << @xml_reti.to_xml
|
2274
|
+
end
|
2275
|
+
xml << "</pgm>\n"
|
2276
|
+
xml
|
2277
|
+
end
|
2278
|
+
end
|
2279
|
+
# ---------------------
|
2280
|
+
# xmlservice call SRVPGM
|
2281
|
+
# ---------------------
|
2282
|
+
class I_SRVPGM < I_PGM
|
2283
|
+
def initialize(name,func,lib=nil,options=nil)
|
2284
|
+
super(name,lib,options,func)
|
2285
|
+
end
|
2286
|
+
end
|
2287
|
+
# ---------------------
|
2288
|
+
# xmlservice call CMD
|
2289
|
+
# ---------------------
|
2290
|
+
class I_CMD < I_CALL
|
2291
|
+
def initialize(cmd,options=nil)
|
2292
|
+
@xml_cmd = cmd
|
2293
|
+
super(options)
|
2294
|
+
if cmd.include? '?'
|
2295
|
+
if options == nil
|
2296
|
+
@xml_options = Hash.new
|
2297
|
+
end
|
2298
|
+
@xml_options[:exec] = 'rexx'
|
2299
|
+
end
|
2300
|
+
@xml_cmd_desc = Array.new
|
2301
|
+
end
|
2302
|
+
def parse_output_attr()
|
2303
|
+
super()
|
2304
|
+
@xml_doc.elements.each("/myscript/cmd/success") do |element|
|
2305
|
+
@response.add_user_accessor("output", element.text)
|
2306
|
+
break
|
2307
|
+
end
|
2308
|
+
@xml_doc.elements.each("/myscript/cmd/error") do |element|
|
2309
|
+
@response.add_user_accessor("output", element.text)
|
2310
|
+
break
|
2311
|
+
end
|
2312
|
+
end
|
2313
|
+
def parse_return_attr()
|
2314
|
+
super()
|
2315
|
+
@xml_doc.elements.each("/myscript/cmd/row/data") do |element|
|
2316
|
+
@xml_cmd_desc[@xml_cmd_desc.count] = element.attributes['desc']
|
2317
|
+
@returndata.add_user_accessor(element.attributes['desc'],element.text)
|
2318
|
+
end
|
2319
|
+
end
|
2320
|
+
def parse_diag_attr()
|
2321
|
+
return self.xmlservice_diag_parse("/myscript/cmd")
|
2322
|
+
end
|
2323
|
+
def to_xml
|
2324
|
+
error = " error='fast'"
|
2325
|
+
exec = " exec='system'"
|
2326
|
+
if @xml_options
|
2327
|
+
if @xml_options.has_key?(:error)
|
2328
|
+
error = " error='#{@xml_options[:error]}'"
|
2329
|
+
end
|
2330
|
+
if @xml_options.has_key?(:exec)
|
2331
|
+
exec = " exec='#{@xml_options[:exec]}'"
|
2332
|
+
end
|
2333
|
+
end
|
2334
|
+
xml = "<cmd #{exec}#{error}>"
|
2335
|
+
xml << @xml_cmd.to_s
|
2336
|
+
xml << "</cmd>\n"
|
2337
|
+
xml
|
2338
|
+
end
|
2339
|
+
end
|
2340
|
+
# ---------------------
|
2341
|
+
# xmlservice call SH
|
2342
|
+
# ---------------------
|
2343
|
+
class I_SH < I_CALL
|
2344
|
+
def initialize(sh,options=nil)
|
2345
|
+
@xml_sh = sh
|
2346
|
+
super(options)
|
2347
|
+
end
|
2348
|
+
def parse_output_attr()
|
2349
|
+
super()
|
2350
|
+
row = Array.new
|
2351
|
+
isrow = false
|
2352
|
+
@xml_doc.elements.each("/myscript/sh/row") do |element|
|
2353
|
+
row[row.count] = element.text
|
2354
|
+
isrow = true
|
2355
|
+
end
|
2356
|
+
if isrow
|
2357
|
+
@response.add_user_accessor("output", row)
|
2358
|
+
else
|
2359
|
+
text = "*NONE"
|
2360
|
+
@xml_doc.elements.each("/myscript/sh") do |element|
|
2361
|
+
text = element.text
|
2362
|
+
end
|
2363
|
+
@response.add_user_accessor("output", text)
|
2364
|
+
end
|
2365
|
+
end
|
2366
|
+
def parse_diag_attr()
|
2367
|
+
return self.xmlservice_diag_parse("/myscript/sh")
|
2368
|
+
end
|
2369
|
+
def to_xml
|
2370
|
+
rows = ""
|
2371
|
+
error = " error='fast'"
|
2372
|
+
if @xml_options
|
2373
|
+
if @xml_options.has_key?(:error)
|
2374
|
+
error = " error='#{@xml_options[:error]}'"
|
2375
|
+
end
|
2376
|
+
if @xml_options.has_key?(:rows)
|
2377
|
+
error = " rows='#{@xml_options[:rows]}'"
|
2378
|
+
end
|
2379
|
+
end
|
2380
|
+
xml = "<sh #{rows}#{error}>"
|
2381
|
+
xml << @xml_sh.to_s
|
2382
|
+
xml << "</sh>\n"
|
2383
|
+
xml
|
2384
|
+
end
|
2385
|
+
end
|
2386
|
+
# ---------------------
|
2387
|
+
# xmlservice call DB2
|
2388
|
+
# ---------------------
|
2389
|
+
class I_DB2 < I_CALL
|
2390
|
+
def initialize(query,parms=nil,options=nil)
|
2391
|
+
@xml_query = query
|
2392
|
+
@xml_parms = parms
|
2393
|
+
super(options)
|
2394
|
+
end
|
2395
|
+
def parse_output_attr()
|
2396
|
+
super()
|
2397
|
+
row = Array.new
|
2398
|
+
isrow = false
|
2399
|
+
@xml_doc.elements.each("/myscript/sql/fetch/row") do |element|
|
2400
|
+
isrow = true
|
2401
|
+
col = Hash.new
|
2402
|
+
element.each do |child|
|
2403
|
+
col[child.attributes['desc']] = child.text
|
2404
|
+
end
|
2405
|
+
row[row.count] = col
|
2406
|
+
end
|
2407
|
+
if isrow
|
2408
|
+
@response.add_user_accessor("output", row)
|
2409
|
+
else
|
2410
|
+
text = "*NONE"
|
2411
|
+
@response.add_user_accessor("output", text)
|
2412
|
+
end
|
2413
|
+
end
|
2414
|
+
def parse_return_attr()
|
2415
|
+
super()
|
2416
|
+
@xml_doc.elements.each("/myscript/sql/execute/parm") do |element|
|
2417
|
+
@returndata.add_user_accessor(element.attributes['var'],element.text)
|
2418
|
+
end
|
2419
|
+
end
|
2420
|
+
def parse_diag_attr()
|
2421
|
+
rc = self.xmlservice_diag_parse("/myscript/sql/fetch")
|
2422
|
+
if rc
|
2423
|
+
rc = self.xmlservice_diag_parse("/myscript/sql/execute")
|
2424
|
+
end
|
2425
|
+
if rc
|
2426
|
+
rc = self.xmlservice_diag_parse("/myscript/sql/prepare")
|
2427
|
+
end
|
2428
|
+
rc
|
2429
|
+
end
|
2430
|
+
def to_xml
|
2431
|
+
rows = ""
|
2432
|
+
error = " error='fast'"
|
2433
|
+
if @xml_options
|
2434
|
+
if @xml_options.has_key?(:error)
|
2435
|
+
error = " error='#{@xml_options[:error]}'"
|
2436
|
+
end
|
2437
|
+
end
|
2438
|
+
xml = "<sql>\n"
|
2439
|
+
xml << "<prepare #{error}>"
|
2440
|
+
xml << @xml_query.to_s
|
2441
|
+
xml << "</prepare>\n"
|
2442
|
+
if @xml_parms
|
2443
|
+
xml << "<execute #{error}>\n"
|
2444
|
+
if @xml_parms.is_a?(XMLService::I_Base)
|
2445
|
+
parms = @xml_parms.value
|
2446
|
+
else
|
2447
|
+
parms = @xml_parms
|
2448
|
+
end
|
2449
|
+
if parms.is_a?(Array)
|
2450
|
+
i = 0
|
2451
|
+
parms.each do |v|
|
2452
|
+
n = " var='parm#{i.to_s}'"
|
2453
|
+
xml << "<parm io='both' #{n}>#{v}</parm>\n"
|
2454
|
+
i += 1
|
2455
|
+
end
|
2456
|
+
elsif parms.is_a?(Hash)
|
2457
|
+
parms.each do |a,v|
|
2458
|
+
n = " var='#{a}'"
|
2459
|
+
xml << "<parm io='both' #{n}>#{v}</parm>\n"
|
2460
|
+
end
|
2461
|
+
else
|
2462
|
+
n = " var='parm0'"
|
2463
|
+
v = parms
|
2464
|
+
xml << "<parm io='both' #{n}>#{v}</parm>\n"
|
2465
|
+
end
|
2466
|
+
xml << "</execute>\n"
|
2467
|
+
else
|
2468
|
+
xml << "<execute #{error}/>\n"
|
2469
|
+
end
|
2470
|
+
xml << "<fetch block='all' desc='on' #{error}/>\n"
|
2471
|
+
xml << "</sql>\n"
|
2472
|
+
xml
|
2473
|
+
end
|
2474
|
+
end
|
2475
|
+
end # module XMLService
|
2476
|
+
|
2477
|
+
|