xmlservice 1.3.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +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
|
+
|