1
1
module Neo4j
2
2
module Server
3
3
class CypherResponse
4
- attr_reader :data , :columns , :error_msg , :error_status , :error_code , : response
4
+ attr_reader :data , :columns , :response
5
5
6
6
class ResponseError < StandardError
7
7
attr_reader :status , :code
@@ -13,7 +13,6 @@ def initialize(msg, status, code)
13
13
end
14
14
end
15
15
16
-
17
16
class HashEnumeration
18
17
include Enumerable
19
18
extend Forwardable
@@ -89,12 +88,13 @@ def hash_value_as_object(value, session)
89
88
attr_reader :struct
90
89
91
90
def initialize ( response , uncommited = false )
92
- @response = response
91
+ @response = response
93
92
@uncommited = uncommited
93
+ set_data_from_request if response
94
94
end
95
95
96
- def entity_data ( id = nil )
97
- if @ uncommited
96
+ def entity_data ( id = nil )
97
+ if uncommited?
98
98
data = @data . first [ 'row' ] . first
99
99
data . is_a? ( Hash ) ? { 'data' => data , 'id' => id } : data
100
100
else
@@ -104,7 +104,7 @@ def entity_data(id = nil)
104
104
end
105
105
106
106
def first_data ( id = nil )
107
- if @ uncommited
107
+ if uncommited?
108
108
data = @data . first [ 'row' ] . first
109
109
# data.is_a?(Hash) ? {'data' => data, 'id' => id} : data
110
110
else
@@ -121,8 +121,43 @@ def add_transaction_entity_id
121
121
mapped_rest_data . merge! ( 'id' => mapped_rest_data [ 'self' ] . split ( '/' ) . last . to_i )
122
122
end
123
123
124
+ def errors
125
+ transaction_response? ? transaction_errors : non_transaction_errors
126
+ end
127
+
128
+ def transaction_errors
129
+ Array ( response . body [ 'errors' ] ) . map do |error |
130
+ ResponseError . new ( error [ 'message' ] , error [ 'status' ] , error [ 'code' ] )
131
+ end
132
+ end
133
+
134
+ def non_transaction_errors
135
+ return [ ] unless response . status == 400
136
+ Array ( ResponseError . new ( response . body [ 'message' ] , response . body [ 'exception' ] , response . body [ 'fullname' ] ) )
137
+ end
138
+
139
+ def error
140
+ errors . first
141
+ end
142
+
143
+ def error_msg
144
+ error && error . message
145
+ end
146
+
147
+ def error_status
148
+ error && error . status
149
+ end
150
+
151
+ def error_code
152
+ error && error . code
153
+ end
154
+
124
155
def error?
125
- !!@error
156
+ errors . any?
157
+ end
158
+
159
+ def uncommited?
160
+ @uncommited
126
161
end
127
162
128
163
def data?
@@ -147,55 +182,45 @@ def set_data(data, columns)
147
182
@struct = columns . empty? ? Object . new : Struct . new ( *columns . map ( &:to_sym ) )
148
183
self
149
184
end
150
-
151
- def set_error ( error_msg , error_status , error_core )
152
- @error = true
153
- @error_msg = error_msg
154
- @error_status = error_status
155
- @error_code = error_core
156
- self
185
+
186
+ def set_data_from_request
187
+ return if error?
188
+ if transaction_response? && response . body [ 'results' ]
189
+ set_data ( response . body [ 'results' ] [ 0 ] [ 'data' ] , response . body [ 'results' ] [ 0 ] [ 'columns' ] )
190
+ else
191
+ set_data ( response . body [ 'data' ] , response . body [ 'columns' ] )
192
+ end
157
193
end
158
-
194
+
159
195
def raise_error
160
- fail 'Tried to raise error without an error' unless @ error
161
- fail ResponseError . new ( @error_msg , @error_status , @error_code )
196
+ fail 'Tried to raise error without an error' unless error?
197
+ fail error
162
198
end
163
-
199
+
164
200
def raise_cypher_error
165
- fail 'Tried to raise error without an error' unless @ error
166
- fail Neo4j ::Session ::CypherError . new ( @error_msg , @error_code , @error_status )
201
+ fail 'Tried to raise error without an error' unless error?
202
+ fail Neo4j ::Session ::CypherError . new ( error . message , error . code , error . status )
167
203
end
168
-
169
-
204
+
170
205
def self . create_with_no_tx ( response )
171
- case response . status
172
- when 200
173
- CypherResponse . new ( response ) . set_data ( response . body [ 'data' ] , response . body [ 'columns' ] )
174
- when 400
175
- CypherResponse . new ( response ) . set_error ( response . body [ 'message' ] , response . body [ 'exception' ] , response . body [ 'fullname' ] )
176
- else
177
- fail "Unknown response code #{ response . status } for #{ response . env [ :url ] } "
178
- end
206
+ CypherResponse . new ( response )
179
207
end
180
208
181
209
def self . create_with_tx ( response )
182
- fail "Unknown response code #{ response . status } for #{ response . request_uri } " unless response . status == 200
183
-
184
- first_result = response . body [ 'results' ] [ 0 ]
185
- cr = CypherResponse . new ( response , true )
186
-
187
- if response . body [ 'errors' ] . empty?
188
- cr . set_data ( first_result [ 'data' ] , first_result [ 'columns' ] )
189
- else
190
- first_error = response . body [ 'errors' ] . first
191
- cr . set_error ( first_error [ 'message' ] , first_error [ 'status' ] , first_error [ 'code' ] )
192
- end
193
- cr
210
+ CypherResponse . new ( response , true )
194
211
end
195
212
196
213
def transaction_response?
197
214
response . respond_to? ( 'body' ) && !response . body [ 'commit' ] . nil?
198
215
end
216
+
217
+ def transaction_failed?
218
+ errors . any? { |e | e . code =~ /Neo\. DatabaseError/ }
219
+ end
220
+
221
+ def transaction_not_found?
222
+ errors . any? { |e | e . code == 'Neo.ClientError.Transaction.UnknownId' }
223
+ end
199
224
200
225
def rest_data
201
226
@result_index = @row_index = 0
0 commit comments