vistarpc4r 0.2.3 → 0.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.
data/VERSION CHANGED
@@ -1 +1 @@
1
- 0.2.3
1
+ 0.3.0
@@ -36,13 +36,19 @@ module VistaRPC4r
36
36
  @port=port
37
37
  @access=access
38
38
  @verify=verify
39
- @debug=debug
39
+ if debug
40
+ @loglevel=2
41
+ else
42
+ @loglevel=0
43
+ end
40
44
  @token=nil
41
45
  @socket = nil
42
46
  @encryptedAV = nil
43
47
  @writeBuffer = String.new
44
48
  @duz = "0"
45
49
  @currentContext = nil
50
+ @lastvistaerror = nil
51
+
46
52
  end
47
53
 
48
54
  def connect
@@ -70,7 +76,8 @@ module VistaRPC4r
70
76
  retVal = logIn()
71
77
  return retVal
72
78
  end
73
-
79
+
80
+ # close tries to gracefully end the VistA session. If socket is already dead, will return nil
74
81
  def close()
75
82
  if isConnected()
76
83
  if @sentConnect
@@ -81,36 +88,49 @@ module VistaRPC4r
81
88
  @socket.close()
82
89
  @socket = nil
83
90
  @duz = "0"
91
+ @lastvistaerror = nil
84
92
  @currentContext = nil
85
93
  return retval
86
94
  end
87
95
  end
88
96
  end
97
+
98
+ # force the broker into the pre connect state. Use if close returns nil
99
+ def forceclose
100
+ @sentConnect = false # set in connect()
101
+ @signedOn=false # set in signOn() inside connect()
102
+ @socket.close()
103
+ @socket = nil
104
+ @duz = "0"
105
+ @currentContext = nil
106
+ @lastvistaerror=nil
107
+ return true
108
+ end
89
109
 
90
110
  def isConnected()
91
111
  return @socket != nil
92
112
  end
93
113
 
114
+ # execute differs from RPCBrokerConnection - We want the application to know about eof
115
+ # execute will return nil if ioerror most likely unexpected EOFError
94
116
  def execute(rpc)
117
+ @lastvistaerror = nil
95
118
  retVal = executeOnce(rpc)
96
119
  if (retVal == nil && @signedOn)
97
- #reconnect
120
+ #maybe some reconnect logic
98
121
  if (rpc.name == "#BYE#")
99
122
  # We're disconnecting anyway
100
123
  return nil
101
124
  end
102
125
  # attempt to log back on
103
- if (connect())
104
- if (@currentContext != nil)
105
- tempcontext = @currentContext
106
- @currentContext = nil
107
- setContext(tempcontext)
108
- end
109
- retVal = executeOnce(rpc)
110
- end
111
- end
112
- if (retVal == nil)
113
- raise "Lost connection to server"
126
+ #if (connect())
127
+ # if (@currentContext != nil)
128
+ # tempcontext = @currentContext
129
+ # @currentContext = nil
130
+ # setContext(tempcontext)
131
+ # end
132
+ # retVal = executeOnce(rpc)
133
+ #end
114
134
  end
115
135
  return retVal
116
136
  end
@@ -139,6 +159,12 @@ module VistaRPC4r
139
159
  rpc.params = args
140
160
  end
141
161
  rpcresponse = execute(rpc)
162
+ if rpcresponse.nil?
163
+ return nil
164
+ end
165
+ if !rpcresponse.error_message.nil?
166
+ @lastvistaerror = rpcresponse.error_message
167
+ end
142
168
  return rpcresponse.value
143
169
  end
144
170
 
@@ -152,9 +178,19 @@ module VistaRPC4r
152
178
  rpc.params = args
153
179
  end
154
180
  rpcresponse = execute(rpc)
181
+ if rpcresponse.nil?
182
+ return nil
183
+ end
184
+ if !rpcresponse.error_message.nil?
185
+ @lastvistaerror = rpcresponse.error_message
186
+ end
155
187
  return rpcresponse.value
156
188
  end
157
189
 
190
+ # if call_a or call_s return nil, you can check to see if there was a VistA error message
191
+ def lastvistaerror
192
+ return @lastvistaerror
193
+ end
158
194
 
159
195
  def setContext(context)
160
196
  if (context == @currentContext)
@@ -165,7 +201,7 @@ module VistaRPC4r
165
201
  warn "changing context from " + @currentContext + " to " + context
166
202
  end
167
203
 
168
- puts "Setting context to: " + context
204
+ #puts "Setting context to: " + context
169
205
  xwbCreateContext = VistaRPC.new("XWB CREATE CONTEXT", RPCResponse::SINGLE_VALUE)
170
206
  encryptedContext = xwbCreateContext.encrypt(context)
171
207
  xwbCreateContext.params[0] = encryptedContext
@@ -182,7 +218,14 @@ module VistaRPC4r
182
218
  return @duz
183
219
  end
184
220
 
185
-
221
+ # set log level 0= off, 1= informational, 2=debug
222
+ def loglevel(level)
223
+ if level < 0 or level > 2
224
+ return nil
225
+ end
226
+ @loglevel = level
227
+ return @loglevel
228
+ end
186
229
 
187
230
  private
188
231
 
@@ -259,8 +302,12 @@ module VistaRPC4r
259
302
  write(END_MARKER)
260
303
  if (flush())
261
304
  retVal = getResponse(rpc.type)
262
- if @debug
263
- puts "<Response> " + retVal.to_s + "</Response>"
305
+ if @loglevel ==2
306
+ if retVal.nil? # io error
307
+ puts "<Response> IO Error </Response>"
308
+ else
309
+ puts "<Response> " + retVal.to_s + "</Response>"
310
+ end
264
311
  end
265
312
  end
266
313
  return retVal
@@ -350,7 +397,7 @@ module VistaRPC4r
350
397
  def flush()
351
398
  retVal = false
352
399
  if (isConnected() || connect())
353
- if @debug
400
+ if @loglevel ==2
354
401
  puts "<Request>" + @writeBuffer + "</Request>"
355
402
  end
356
403
  @socket.write(@writeBuffer)
@@ -361,21 +408,24 @@ module VistaRPC4r
361
408
  return retVal
362
409
  end
363
410
 
411
+ # Get response will return a response object or nil
412
+ # Response object could contain a vista generated security/other error
413
+ # Nil means something went wrong with the connection, check the system error
364
414
  def getResponse(rpcType)
365
415
  hadError = Array.new # for passing around boolean by reference
366
416
  hadError[0]=false
417
+
418
+ # Check for VistA erros
367
419
  securityError = readSPack(hadError)
368
- #puts "<SecurityError>" + securityError + "</SecurityError>"
369
420
  if (hadError[0])
370
- return nil
421
+ return nil # had a io error
371
422
  end
372
423
  if (securityError.empty?)
373
424
  securityError = nil
374
425
  end
375
-
376
426
  otherError = readSPack(hadError)
377
427
  if (hadError[0])
378
- return nil
428
+ return nil # had a io error
379
429
  end
380
430
  if (otherError.empty?)
381
431
  otherError = nil
@@ -445,7 +495,17 @@ module VistaRPC4r
445
495
  buffer = String.new
446
496
  gotCR = false
447
497
  while true
448
- byte = @socket.readbyte # read one byte
498
+ begin
499
+ byte = @socket.readbyte # read one byte
500
+ rescue EOFError => emsg
501
+ if (hadError != nil)
502
+ hadError[0] = true
503
+ end
504
+ if @loglevel ==2
505
+ puts "EOFError"
506
+ end
507
+ return nil
508
+ end
449
509
  if (byte == END_MARKER)
450
510
  if (endMarker != nil)
451
511
  endMarker[0] = true
@@ -474,9 +534,32 @@ module VistaRPC4r
474
534
  if (hadError != nil)
475
535
  hadError[0] = false
476
536
  end
477
- len = @socket.readbyte # read one byte into a fixnum
537
+
538
+ begin
539
+ len = @socket.readbyte # read one byte into a fixnum
540
+ rescue EOFError => emsg
541
+ if (hadError != nil)
542
+ hadError[0] = true
543
+ end
544
+ if @loglevel ==2
545
+ puts "EOFError"
546
+ end
547
+ return nil
548
+ end
549
+
478
550
  data = String.new
479
- data = @socket.read(len)
551
+ begin
552
+ data = @socket.read(len)
553
+ rescue EOFError => emsg
554
+ if (hadError != nil)
555
+ hadError[0] = true
556
+ end
557
+ if @loglevel ==2
558
+ puts "EOFError"
559
+ end
560
+ return nil
561
+ end
562
+
480
563
  return data
481
564
  end
482
565
 
@@ -5,11 +5,11 @@
5
5
 
6
6
  Gem::Specification.new do |s|
7
7
  s.name = %q{vistarpc4r}
8
- s.version = "0.2.3"
8
+ s.version = "0.3.0"
9
9
 
10
10
  s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
11
11
  s.authors = ["Mike Cham"]
12
- s.date = %q{2011-08-30}
12
+ s.date = %q{2011-09-25}
13
13
  s.description = %q{more}
14
14
  s.email = %q{mike@blenderhouse.com}
15
15
  s.extra_rdoc_files = [
@@ -38,7 +38,7 @@ Gem::Specification.new do |s|
38
38
  s.homepage = %q{http://github.com/michaelcham/vistarpc4r}
39
39
  s.licenses = ["MIT"]
40
40
  s.require_paths = ["lib"]
41
- s.rubygems_version = %q{1.5.3}
41
+ s.rubygems_version = %q{1.4.2}
42
42
  s.summary = %q{Provides capability to make rpc calls to VistA EHR systems that have rpcbroker running}
43
43
 
44
44
  if s.respond_to? :specification_version then
metadata CHANGED
@@ -1,13 +1,13 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: vistarpc4r
3
3
  version: !ruby/object:Gem::Version
4
- hash: 17
4
+ hash: 19
5
5
  prerelease:
6
6
  segments:
7
7
  - 0
8
- - 2
9
8
  - 3
10
- version: 0.2.3
9
+ - 0
10
+ version: 0.3.0
11
11
  platform: ruby
12
12
  authors:
13
13
  - Mike Cham
@@ -15,12 +15,14 @@ autorequire:
15
15
  bindir: bin
16
16
  cert_chain: []
17
17
 
18
- date: 2011-08-30 00:00:00 -04:00
18
+ date: 2011-09-25 00:00:00 -04:00
19
19
  default_executable:
20
20
  dependencies:
21
21
  - !ruby/object:Gem::Dependency
22
+ prerelease: false
23
+ name: shoulda
22
24
  type: :development
23
- requirement: &id001 !ruby/object:Gem::Requirement
25
+ version_requirements: &id001 !ruby/object:Gem::Requirement
24
26
  none: false
25
27
  requirements:
26
28
  - - ">="
@@ -29,12 +31,12 @@ dependencies:
29
31
  segments:
30
32
  - 0
31
33
  version: "0"
32
- name: shoulda
33
- version_requirements: *id001
34
- prerelease: false
34
+ requirement: *id001
35
35
  - !ruby/object:Gem::Dependency
36
+ prerelease: false
37
+ name: bundler
36
38
  type: :development
37
- requirement: &id002 !ruby/object:Gem::Requirement
39
+ version_requirements: &id002 !ruby/object:Gem::Requirement
38
40
  none: false
39
41
  requirements:
40
42
  - - ~>
@@ -45,12 +47,12 @@ dependencies:
45
47
  - 0
46
48
  - 0
47
49
  version: 1.0.0
48
- name: bundler
49
- version_requirements: *id002
50
- prerelease: false
50
+ requirement: *id002
51
51
  - !ruby/object:Gem::Dependency
52
+ prerelease: false
53
+ name: jeweler
52
54
  type: :development
53
- requirement: &id003 !ruby/object:Gem::Requirement
55
+ version_requirements: &id003 !ruby/object:Gem::Requirement
54
56
  none: false
55
57
  requirements:
56
58
  - - ~>
@@ -61,12 +63,12 @@ dependencies:
61
63
  - 6
62
64
  - 0
63
65
  version: 1.6.0
64
- name: jeweler
65
- version_requirements: *id003
66
- prerelease: false
66
+ requirement: *id003
67
67
  - !ruby/object:Gem::Dependency
68
+ prerelease: false
69
+ name: rcov
68
70
  type: :development
69
- requirement: &id004 !ruby/object:Gem::Requirement
71
+ version_requirements: &id004 !ruby/object:Gem::Requirement
70
72
  none: false
71
73
  requirements:
72
74
  - - ">="
@@ -75,9 +77,7 @@ dependencies:
75
77
  segments:
76
78
  - 0
77
79
  version: "0"
78
- name: rcov
79
- version_requirements: *id004
80
- prerelease: false
80
+ requirement: *id004
81
81
  description: more
82
82
  email: mike@blenderhouse.com
83
83
  executables: []
@@ -135,7 +135,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
135
135
  requirements: []
136
136
 
137
137
  rubyforge_project:
138
- rubygems_version: 1.5.3
138
+ rubygems_version: 1.4.2
139
139
  signing_key:
140
140
  specification_version: 3
141
141
  summary: Provides capability to make rpc calls to VistA EHR systems that have rpcbroker running