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.
Files changed (37) hide show
  1. checksums.yaml +7 -0
  2. data/LICENSE +19 -0
  3. data/README_IBM_i +62 -0
  4. data/lib/adapters/abstract_adapter.rb +82 -0
  5. data/lib/adapters/db2_adapter.rb +70 -0
  6. data/lib/adapters/rest_adapter.rb +32 -0
  7. data/lib/password/password.rb +229 -0
  8. data/lib/xmlservice.rb +2477 -0
  9. data/test/README_IBM_i +3 -0
  10. data/test/Rakefile +42 -0
  11. data/test/genpassword.rb +111 -0
  12. data/test/test_60000_toolkit_driver/Rakefile +11 -0
  13. data/test/test_60000_toolkit_driver/test_60010_DriverCallPgmZZCALL.rb +403 -0
  14. data/test/test_60000_toolkit_driver/test_60110_DriverCallSrvPgmZZARRAY.rb +149 -0
  15. data/test/test_60000_toolkit_driver/test_60310_DriverCMD.rb +77 -0
  16. data/test/test_60000_toolkit_driver/test_60510_DriverDataQueue.rb +126 -0
  17. data/test/test_60000_toolkit_driver/test_60610_DriverCallSrvPgmZZBINARY.rb +59 -0
  18. data/test/test_60000_toolkit_driver/test_60710_DriverSH.rb +73 -0
  19. data/test/test_60000_toolkit_driver/test_60910_DriverCallPgmZZMISS.rb +44 -0
  20. data/test/test_60000_toolkit_driver/test_65010_DriverCallDB2.rb +265 -0
  21. data/test/test_60000_toolkit_driver/zzassign.rb +66 -0
  22. data/test/test_60000_toolkit_driver/zzquick.rb +149 -0
  23. data/test/test_60000_toolkit_driver/zztestrest.rb +45 -0
  24. data/test/test_60000_toolkit_driver/zzthreadold.rb +78 -0
  25. data/test/test_70000_toolkit_testonly/Rakefile +11 -0
  26. data/test/test_70000_toolkit_testonly/test_70010_DriverCallPgmTestOnly.rb +270 -0
  27. data/test/test_80000_toolkit_dsl/Rakefile +11 -0
  28. data/test/test_80000_toolkit_dsl/test_80010_DSLCallPgmZZCALL.rb +162 -0
  29. data/test/test_80000_toolkit_dsl/test_80110_DSLCallSrvPgmZZARRAY.rb +150 -0
  30. data/test/test_authorization/README_IBM_i +15 -0
  31. data/test/test_authorization/auth.rb +101 -0
  32. data/test/test_authorization/key.yml +2 -0
  33. data/test/test_authorization/password.yml +3 -0
  34. data/test/test_authorization/xmlservice.yml +69 -0
  35. data/test/test_data/rowcol.rb +57 -0
  36. data/version.txt +1 -0
  37. metadata +92 -0
@@ -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
+