xmlservice 1.3.0

Sign up to get free protection for your applications and to get access to all the features.
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
+