yugabyte-ycql-driver 3.2.3.1

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 (145) hide show
  1. checksums.yaml +7 -0
  2. data/.yardopts +13 -0
  3. data/README.md +242 -0
  4. data/ext/cassandra_murmur3/cassandra_murmur3.c +178 -0
  5. data/ext/cassandra_murmur3/extconf.rb +2 -0
  6. data/lib/cassandra/address_resolution.rb +36 -0
  7. data/lib/cassandra/address_resolution/policies.rb +2 -0
  8. data/lib/cassandra/address_resolution/policies/ec2_multi_region.rb +56 -0
  9. data/lib/cassandra/address_resolution/policies/none.rb +35 -0
  10. data/lib/cassandra/aggregate.rb +123 -0
  11. data/lib/cassandra/argument.rb +51 -0
  12. data/lib/cassandra/attr_boolean.rb +33 -0
  13. data/lib/cassandra/auth.rb +100 -0
  14. data/lib/cassandra/auth/providers.rb +17 -0
  15. data/lib/cassandra/auth/providers/password.rb +65 -0
  16. data/lib/cassandra/cassandra_logger.rb +80 -0
  17. data/lib/cassandra/cluster.rb +331 -0
  18. data/lib/cassandra/cluster/client.rb +1612 -0
  19. data/lib/cassandra/cluster/connection_pool.rb +78 -0
  20. data/lib/cassandra/cluster/connector.rb +372 -0
  21. data/lib/cassandra/cluster/control_connection.rb +962 -0
  22. data/lib/cassandra/cluster/failed_connection.rb +35 -0
  23. data/lib/cassandra/cluster/metadata.rb +142 -0
  24. data/lib/cassandra/cluster/options.rb +145 -0
  25. data/lib/cassandra/cluster/registry.rb +284 -0
  26. data/lib/cassandra/cluster/schema.rb +405 -0
  27. data/lib/cassandra/cluster/schema/cql_type_parser.rb +112 -0
  28. data/lib/cassandra/cluster/schema/fetchers.rb +1627 -0
  29. data/lib/cassandra/cluster/schema/fqcn_type_parser.rb +175 -0
  30. data/lib/cassandra/cluster/schema/partitioners.rb +21 -0
  31. data/lib/cassandra/cluster/schema/partitioners/murmur3.rb +45 -0
  32. data/lib/cassandra/cluster/schema/partitioners/ordered.rb +37 -0
  33. data/lib/cassandra/cluster/schema/partitioners/random.rb +37 -0
  34. data/lib/cassandra/cluster/schema/replication_strategies.rb +21 -0
  35. data/lib/cassandra/cluster/schema/replication_strategies/network_topology.rb +102 -0
  36. data/lib/cassandra/cluster/schema/replication_strategies/none.rb +39 -0
  37. data/lib/cassandra/cluster/schema/replication_strategies/simple.rb +44 -0
  38. data/lib/cassandra/column.rb +66 -0
  39. data/lib/cassandra/column_container.rb +326 -0
  40. data/lib/cassandra/compression.rb +69 -0
  41. data/lib/cassandra/compression/compressors/lz4.rb +73 -0
  42. data/lib/cassandra/compression/compressors/snappy.rb +69 -0
  43. data/lib/cassandra/custom_data.rb +53 -0
  44. data/lib/cassandra/driver.rb +260 -0
  45. data/lib/cassandra/errors.rb +784 -0
  46. data/lib/cassandra/execution/info.rb +69 -0
  47. data/lib/cassandra/execution/options.rb +267 -0
  48. data/lib/cassandra/execution/profile.rb +153 -0
  49. data/lib/cassandra/execution/profile_manager.rb +71 -0
  50. data/lib/cassandra/execution/trace.rb +192 -0
  51. data/lib/cassandra/executors.rb +113 -0
  52. data/lib/cassandra/function.rb +156 -0
  53. data/lib/cassandra/function_collection.rb +85 -0
  54. data/lib/cassandra/future.rb +794 -0
  55. data/lib/cassandra/host.rb +102 -0
  56. data/lib/cassandra/index.rb +118 -0
  57. data/lib/cassandra/keyspace.rb +473 -0
  58. data/lib/cassandra/listener.rb +87 -0
  59. data/lib/cassandra/load_balancing.rb +121 -0
  60. data/lib/cassandra/load_balancing/policies.rb +20 -0
  61. data/lib/cassandra/load_balancing/policies/dc_aware_round_robin.rb +172 -0
  62. data/lib/cassandra/load_balancing/policies/round_robin.rb +141 -0
  63. data/lib/cassandra/load_balancing/policies/token_aware.rb +149 -0
  64. data/lib/cassandra/load_balancing/policies/white_list.rb +100 -0
  65. data/lib/cassandra/materialized_view.rb +92 -0
  66. data/lib/cassandra/null_logger.rb +56 -0
  67. data/lib/cassandra/protocol.rb +102 -0
  68. data/lib/cassandra/protocol/coder.rb +1085 -0
  69. data/lib/cassandra/protocol/cql_byte_buffer.rb +418 -0
  70. data/lib/cassandra/protocol/cql_protocol_handler.rb +448 -0
  71. data/lib/cassandra/protocol/request.rb +41 -0
  72. data/lib/cassandra/protocol/requests/auth_response_request.rb +51 -0
  73. data/lib/cassandra/protocol/requests/batch_request.rb +117 -0
  74. data/lib/cassandra/protocol/requests/credentials_request.rb +51 -0
  75. data/lib/cassandra/protocol/requests/execute_request.rb +122 -0
  76. data/lib/cassandra/protocol/requests/options_request.rb +39 -0
  77. data/lib/cassandra/protocol/requests/prepare_request.rb +59 -0
  78. data/lib/cassandra/protocol/requests/query_request.rb +112 -0
  79. data/lib/cassandra/protocol/requests/register_request.rb +38 -0
  80. data/lib/cassandra/protocol/requests/startup_request.rb +49 -0
  81. data/lib/cassandra/protocol/requests/void_query_request.rb +24 -0
  82. data/lib/cassandra/protocol/response.rb +28 -0
  83. data/lib/cassandra/protocol/responses/already_exists_error_response.rb +50 -0
  84. data/lib/cassandra/protocol/responses/auth_challenge_response.rb +36 -0
  85. data/lib/cassandra/protocol/responses/auth_success_response.rb +36 -0
  86. data/lib/cassandra/protocol/responses/authenticate_response.rb +36 -0
  87. data/lib/cassandra/protocol/responses/error_response.rb +142 -0
  88. data/lib/cassandra/protocol/responses/event_response.rb +30 -0
  89. data/lib/cassandra/protocol/responses/function_failure_error_response.rb +52 -0
  90. data/lib/cassandra/protocol/responses/prepared_result_response.rb +62 -0
  91. data/lib/cassandra/protocol/responses/raw_rows_result_response.rb +59 -0
  92. data/lib/cassandra/protocol/responses/read_failure_error_response.rb +71 -0
  93. data/lib/cassandra/protocol/responses/read_timeout_error_response.rb +61 -0
  94. data/lib/cassandra/protocol/responses/ready_response.rb +43 -0
  95. data/lib/cassandra/protocol/responses/result_response.rb +42 -0
  96. data/lib/cassandra/protocol/responses/rows_result_response.rb +39 -0
  97. data/lib/cassandra/protocol/responses/schema_change_event_response.rb +73 -0
  98. data/lib/cassandra/protocol/responses/schema_change_result_response.rb +70 -0
  99. data/lib/cassandra/protocol/responses/set_keyspace_result_response.rb +37 -0
  100. data/lib/cassandra/protocol/responses/status_change_event_response.rb +39 -0
  101. data/lib/cassandra/protocol/responses/supported_response.rb +36 -0
  102. data/lib/cassandra/protocol/responses/topology_change_event_response.rb +33 -0
  103. data/lib/cassandra/protocol/responses/unavailable_error_response.rb +58 -0
  104. data/lib/cassandra/protocol/responses/unprepared_error_response.rb +48 -0
  105. data/lib/cassandra/protocol/responses/void_result_response.rb +34 -0
  106. data/lib/cassandra/protocol/responses/write_failure_error_response.rb +73 -0
  107. data/lib/cassandra/protocol/responses/write_timeout_error_response.rb +63 -0
  108. data/lib/cassandra/protocol/v1.rb +326 -0
  109. data/lib/cassandra/protocol/v3.rb +358 -0
  110. data/lib/cassandra/protocol/v4.rb +478 -0
  111. data/lib/cassandra/reconnection.rb +49 -0
  112. data/lib/cassandra/reconnection/policies.rb +20 -0
  113. data/lib/cassandra/reconnection/policies/constant.rb +46 -0
  114. data/lib/cassandra/reconnection/policies/exponential.rb +79 -0
  115. data/lib/cassandra/result.rb +276 -0
  116. data/lib/cassandra/retry.rb +154 -0
  117. data/lib/cassandra/retry/policies.rb +21 -0
  118. data/lib/cassandra/retry/policies/default.rb +53 -0
  119. data/lib/cassandra/retry/policies/downgrading_consistency.rb +73 -0
  120. data/lib/cassandra/retry/policies/fallthrough.rb +39 -0
  121. data/lib/cassandra/session.rb +270 -0
  122. data/lib/cassandra/statement.rb +32 -0
  123. data/lib/cassandra/statements.rb +23 -0
  124. data/lib/cassandra/statements/batch.rb +146 -0
  125. data/lib/cassandra/statements/bound.rb +65 -0
  126. data/lib/cassandra/statements/prepared.rb +235 -0
  127. data/lib/cassandra/statements/simple.rb +118 -0
  128. data/lib/cassandra/statements/void.rb +38 -0
  129. data/lib/cassandra/table.rb +240 -0
  130. data/lib/cassandra/time.rb +103 -0
  131. data/lib/cassandra/time_uuid.rb +78 -0
  132. data/lib/cassandra/timestamp_generator.rb +37 -0
  133. data/lib/cassandra/timestamp_generator/simple.rb +38 -0
  134. data/lib/cassandra/timestamp_generator/ticking_on_duplicate.rb +58 -0
  135. data/lib/cassandra/trigger.rb +67 -0
  136. data/lib/cassandra/tuple.rb +131 -0
  137. data/lib/cassandra/types.rb +1704 -0
  138. data/lib/cassandra/udt.rb +443 -0
  139. data/lib/cassandra/util.rb +464 -0
  140. data/lib/cassandra/uuid.rb +110 -0
  141. data/lib/cassandra/uuid/generator.rb +212 -0
  142. data/lib/cassandra/version.rb +21 -0
  143. data/lib/datastax/cassandra.rb +47 -0
  144. data/lib/ycql.rb +842 -0
  145. metadata +243 -0
@@ -0,0 +1,784 @@
1
+ # encoding: utf-8
2
+
3
+ #--
4
+ # Copyright DataStax, Inc.
5
+ #
6
+ # Licensed under the Apache License, Version 2.0 (the "License");
7
+ # you may not use this file except in compliance with the License.
8
+ # You may obtain a copy of the License at
9
+ #
10
+ # http://www.apache.org/licenses/LICENSE-2.0
11
+ #
12
+ # Unless required by applicable law or agreed to in writing, software
13
+ # distributed under the License is distributed on an "AS IS" BASIS,
14
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
15
+ # See the License for the specific language governing permissions and
16
+ # limitations under the License.
17
+ #++
18
+
19
+ module Cassandra
20
+ # Included in all Errors raised by the driver to allow rescuing from any
21
+ # driver-specific error.
22
+ # @example Catching all driver errors
23
+ # begin
24
+ # cluster = Cassandra.cluster
25
+ # session = cluster.connect
26
+ # rescue Cassandra::Error => e
27
+ # puts "#{e.class.name}: #{e.message}"
28
+ # end
29
+ # @see Cassandra::Errors
30
+ module Error
31
+ end
32
+
33
+ module Errors
34
+ # Mixed into any host-specific errors. Requests resulting in these errors
35
+ # are attempted on other hosts. Once all hosts failed with this type of
36
+ # error, a {Cassandra::Errors::NoHostsAvailable} error is raised with
37
+ # details of failures.
38
+ #
39
+ # @see Errors::NoHostsAvailable
40
+ module HostError
41
+ end
42
+
43
+ # Raised when something unexpected happened. This indicates a server-side
44
+ # bug.
45
+ #
46
+ # @see https://github.com/apache/cassandra/blob/cassandra-2.0.16/doc/native_protocol_v1.spec#L654-L655 Description
47
+ # of Server Error in Apache Cassandra native protocol spec v1
48
+ class ServerError < ::StandardError
49
+ include Error, HostError
50
+
51
+ # @private
52
+ def initialize(message,
53
+ payload,
54
+ warnings,
55
+ keyspace,
56
+ statement,
57
+ options,
58
+ hosts,
59
+ consistency,
60
+ retries)
61
+ super(message)
62
+ @payload = payload
63
+ @warnings = warnings
64
+ @keyspace = keyspace
65
+ @statement = statement
66
+ @options = options
67
+ @hosts = hosts
68
+ @consistency = consistency
69
+ @retries = retries
70
+ end
71
+
72
+ # Query execution information, such as number of retries and all tried hosts, etc.
73
+ # @return [Cassandra::Execution::Info]
74
+ def execution_info
75
+ @info ||= Execution::Info.new(@payload,
76
+ @warnings,
77
+ @keyspace,
78
+ @statement,
79
+ @options,
80
+ @hosts,
81
+ @consistency,
82
+ @retries,
83
+ nil)
84
+ end
85
+ end
86
+
87
+ # Mixed into all internal driver errors.
88
+ class InternalError < ::RuntimeError
89
+ include Error, HostError
90
+ end
91
+
92
+ # Raised when data decoding fails.
93
+ class DecodingError < ::RuntimeError
94
+ include Error, HostError
95
+ end
96
+
97
+ # Raised when data encoding fails.
98
+ class EncodingError < ::RuntimeError
99
+ include Error, HostError
100
+ end
101
+
102
+ # Raised when a connection level error occured.
103
+ class IOError < ::IOError
104
+ include Error, HostError
105
+ end
106
+
107
+ # Raised when a timeout has occured.
108
+ class TimeoutError < ::Timeout::Error
109
+ include Error
110
+ end
111
+
112
+ # Mixed into all request execution errors.
113
+ module ExecutionError
114
+ include Error
115
+
116
+ # @private
117
+ def initialize(message,
118
+ payload,
119
+ warnings,
120
+ keyspace,
121
+ statement,
122
+ options,
123
+ hosts,
124
+ consistency,
125
+ retries)
126
+ super(message)
127
+ @payload = payload
128
+ @warnings = warnings
129
+ @keyspace = keyspace
130
+ @statement = statement
131
+ @options = options
132
+ @hosts = hosts
133
+ @consistency = consistency
134
+ @retries = retries
135
+ end
136
+
137
+ # Query execution information, such as number of retries and all tried hosts, etc.
138
+ # @return [Cassandra::Execution::Info]
139
+ def execution_info
140
+ @info ||= Execution::Info.new(@payload,
141
+ @warnings,
142
+ @keyspace,
143
+ @statement,
144
+ @options,
145
+ @hosts,
146
+ @consistency,
147
+ @retries,
148
+ nil)
149
+ end
150
+ end
151
+
152
+ # Raised when coordinator determines that a request cannot be executed
153
+ # because there are not enough replicas. In this scenario, the request is
154
+ # not sent to the nodes at all.
155
+ #
156
+ # @note This error can be handled by a {Cassandra::Retry::Policy} to
157
+ # determine the desired outcome.
158
+ #
159
+ # @see https://github.com/apache/cassandra/blob/cassandra-2.0.16/doc/native_protocol_v1.spec#L662-L672 Description
160
+ # of Unavailable Error in Apache Cassandra native protocol spec v1
161
+ class UnavailableError < ::StandardError
162
+ include ExecutionError
163
+ # Consistency level that triggered the error.
164
+ #
165
+ # @return [Symbol] the original consistency level for the request, one of
166
+ # {Cassandra::CONSISTENCIES}
167
+ attr_reader :consistency
168
+
169
+ # @return [Integer] the number of replicas required to achieve requested
170
+ # consistency level
171
+ attr_reader :required
172
+
173
+ # @return [Integer] the number of replicas available for the request
174
+ attr_reader :alive
175
+
176
+ # @private
177
+ def initialize(message,
178
+ payload,
179
+ warnings,
180
+ keyspace,
181
+ statement,
182
+ options,
183
+ hosts,
184
+ r_consistency,
185
+ retries,
186
+ consistency,
187
+ required,
188
+ alive)
189
+ super(message,
190
+ payload,
191
+ warnings,
192
+ keyspace,
193
+ statement,
194
+ options,
195
+ hosts,
196
+ r_consistency,
197
+ retries)
198
+ @consistency = consistency
199
+ @required = required
200
+ @alive = alive
201
+ end
202
+ end
203
+
204
+ # Raised when the request cannot be processed because the coordinator node
205
+ # is overloaded
206
+ #
207
+ # @see https://github.com/apache/cassandra/blob/cassandra-2.0.16/doc/native_protocol_v1.spec#L673-L674 Description
208
+ # of Overloaded Error in Apache Cassandra native protocol spec v1
209
+ class OverloadedError < ::StandardError
210
+ include ExecutionError, HostError
211
+ end
212
+
213
+ # Raise when the request was a read request but the coordinator node is
214
+ # bootstrapping
215
+ #
216
+ # @see https://github.com/apache/cassandra/blob/cassandra-2.0.16/doc/native_protocol_v1.spec#L675-L676 Description
217
+ # of Is Bootstrapping Error in Apache Cassandra native protocol spec v1
218
+ class IsBootstrappingError < ::StandardError
219
+ include ExecutionError, HostError
220
+ end
221
+
222
+ # Raised when truncation failed.
223
+ #
224
+ # @see https://github.com/apache/cassandra/blob/cassandra-2.0.16/doc/native_protocol_v1.spec#L677 Description of
225
+ # Truncate Error in Apache Cassandra native protocol spec v1
226
+ class TruncateError < ::StandardError
227
+ include ExecutionError
228
+ end
229
+
230
+ # Raised when a write request timed out.
231
+ #
232
+ # @see https://github.com/apache/cassandra/blob/cassandra-2.0.16/doc/native_protocol_v1.spec#L678-L703 Description
233
+ # of Write Timeout Error in Apache Cassandra native protocol spec v1
234
+ class WriteTimeoutError < ::StandardError
235
+ include ExecutionError
236
+
237
+ # @return [Symbol] the type of write request that timed out, one of
238
+ # {Cassandra::WRITE_TYPES}
239
+ attr_reader :type
240
+ # @return [Symbol] the original consistency level for the request, one of
241
+ # {Cassandra::CONSISTENCIES}
242
+ attr_reader :consistency
243
+ # @return [Integer] the number of acks required to achieve requested
244
+ # consistency level
245
+ attr_reader :required
246
+ # @return [Integer] the number of acks received by the time the query
247
+ # timed out
248
+ attr_reader :received
249
+
250
+ # @private
251
+ def initialize(message,
252
+ payload,
253
+ warnings,
254
+ keyspace,
255
+ statement,
256
+ options,
257
+ hosts,
258
+ r_consistency,
259
+ retries,
260
+ type,
261
+ consistency,
262
+ required,
263
+ received)
264
+ super(message,
265
+ payload,
266
+ warnings,
267
+ keyspace,
268
+ statement,
269
+ options,
270
+ hosts,
271
+ r_consistency,
272
+ retries)
273
+ @type = type
274
+ @consistency = consistency
275
+ @required = required
276
+ @received = received
277
+ end
278
+ end
279
+
280
+ # Raised when a read request timed out.
281
+ #
282
+ # @see https://github.com/apache/cassandra/blob/cassandra-2.0.16/doc/native_protocol_v1.spec#L704-L721 Description
283
+ # of Read Timeout Error in Apache Cassandra native protocol spec v1
284
+ class ReadTimeoutError < ::StandardError
285
+ include ExecutionError
286
+
287
+ # @return [Boolean] whether actual data (as opposed to data checksum) was
288
+ # present in the received responses.
289
+ attr_reader :retrieved
290
+ alias retrieved? retrieved
291
+
292
+ # @return [Symbol] the original consistency level for the request, one of
293
+ # {Cassandra::CONSISTENCIES}
294
+ attr_reader :consistency
295
+ # @return [Integer] the number of responses required to achieve requested
296
+ # consistency level
297
+ attr_reader :required
298
+ # @return [Integer] the number of responses received by the time the
299
+ # query timed out
300
+ attr_reader :received
301
+
302
+ # @private
303
+ def initialize(message,
304
+ payload,
305
+ warnings,
306
+ keyspace,
307
+ statement,
308
+ options,
309
+ hosts,
310
+ r_consistency,
311
+ retries,
312
+ retrieved,
313
+ consistency,
314
+ required,
315
+ received)
316
+ super(message,
317
+ payload,
318
+ warnings,
319
+ keyspace,
320
+ statement,
321
+ options,
322
+ hosts,
323
+ r_consistency,
324
+ retries)
325
+ @retrieved = retrieved
326
+ @consistency = consistency
327
+ @required = required
328
+ @received = received
329
+ end
330
+ end
331
+
332
+ # Raised when a write request fails.
333
+ #
334
+ # @see https://github.com/apache/cassandra/blob/cassandra-3.4/doc/native_protocol_v4.spec#L1106-L1134 Description
335
+ # of Write Failure Error in Apache Cassandra native protocol spec v4
336
+ class WriteError < ::StandardError
337
+ include ExecutionError
338
+
339
+ # @return [Symbol] the type of write request that timed out, one of
340
+ # {Cassandra::WRITE_TYPES}
341
+ attr_reader :type
342
+ # @return [Symbol] the original consistency level for the request, one of
343
+ # {Cassandra::CONSISTENCIES}
344
+ attr_reader :consistency
345
+ # @return [Integer] the number of acks required
346
+ attr_reader :required
347
+ # @return [Integer] the number of acks received
348
+ attr_reader :received
349
+ # @return [Integer] the number of writes failed
350
+ attr_reader :failed
351
+ # @return [Hash<IPAddr, Integer>] map of <ip, error-code>. This is new in v5 and is nil in previous versions
352
+ # of the Casssandra protocol.
353
+ attr_reader :failures_by_node
354
+
355
+ # @private
356
+ def initialize(message,
357
+ payload,
358
+ warnings,
359
+ keyspace,
360
+ statement,
361
+ options,
362
+ hosts,
363
+ r_consistency,
364
+ retries,
365
+ type,
366
+ consistency,
367
+ required,
368
+ failed,
369
+ received,
370
+ failures_by_node)
371
+ super(message,
372
+ payload,
373
+ warnings,
374
+ keyspace,
375
+ statement,
376
+ options,
377
+ hosts,
378
+ r_consistency,
379
+ retries)
380
+ @type = type
381
+ @consistency = consistency
382
+ @required = required
383
+ @failed = failed
384
+ @received = received
385
+ @failures_by_node = failures_by_node
386
+ end
387
+ end
388
+
389
+ # Raised when a read request fails.
390
+ #
391
+ # @see https://github.com/apache/cassandra/blob/cassandra-3.4/doc/native_protocol_v4.spec#L1084-L1098 Description
392
+ # of Read Failure Error in Apache Cassandra native protocol spec v4
393
+ class ReadError < ::StandardError
394
+ include ExecutionError
395
+
396
+ # @return [Boolean] whether actual data (as opposed to data checksum) was
397
+ # present in the received responses.
398
+ attr_reader :retrieved
399
+ # @return [Symbol] the original consistency level for the request, one of
400
+ # {Cassandra::CONSISTENCIES}
401
+ attr_reader :consistency
402
+ # @return [Integer] the number of responses required
403
+ attr_reader :required
404
+ # @return [Integer] the number of responses received
405
+ attr_reader :received
406
+ # @return [Integer] the number of reads failed
407
+ attr_reader :failed
408
+ # @return [Hash<IPaddr, Integer>] map of <ip, error-code>. This is new in v5 and is nil in previous versions
409
+ # of the Casssandra protocol.
410
+ attr_reader :failures_by_node
411
+
412
+ # @private
413
+ def initialize(message,
414
+ payload,
415
+ warnings,
416
+ keyspace,
417
+ statement,
418
+ options,
419
+ hosts,
420
+ r_consistency,
421
+ retries,
422
+ retrieved,
423
+ consistency,
424
+ required,
425
+ failed,
426
+ received,
427
+ failures_by_node)
428
+ super(message,
429
+ payload,
430
+ warnings,
431
+ keyspace,
432
+ statement,
433
+ options,
434
+ hosts,
435
+ r_consistency,
436
+ retries)
437
+ @retrieved = retrieved
438
+ @consistency = consistency
439
+ @required = required
440
+ @failed = failed
441
+ @received = received
442
+ @failures_by_node = failures_by_node
443
+ end
444
+
445
+ def retrieved?
446
+ @retrieved
447
+ end
448
+ end
449
+
450
+ # Raised when function execution fails.
451
+ #
452
+ # @see https://github.com/apache/cassandra/blob/cassandra-3.4/doc/native_protocol_v4.spec#L1099-L1105 Description
453
+ # of Function Failure Error in Apache Cassandra native protocol spec v4
454
+ class FunctionCallError < ::StandardError
455
+ include ExecutionError
456
+
457
+ # @return [String] keyspace
458
+ attr_reader :keyspace
459
+ # @return [String] name
460
+ attr_reader :name
461
+ # @return [String] signature
462
+ attr_reader :signature
463
+
464
+ # @private
465
+ def initialize(message,
466
+ payload,
467
+ warnings,
468
+ r_keyspace,
469
+ statement,
470
+ options,
471
+ hosts,
472
+ consistency,
473
+ retries,
474
+ keyspace,
475
+ name,
476
+ signature)
477
+ super(message,
478
+ payload,
479
+ warnings,
480
+ r_keyspace,
481
+ statement,
482
+ options,
483
+ hosts,
484
+ consistency,
485
+ retries)
486
+ @keyspace = keyspace
487
+ @name = name
488
+ @signature = signature
489
+ end
490
+ end
491
+
492
+ # Client error represents bad driver state or mis-configuration
493
+ class ClientError < ::StandardError
494
+ include Error
495
+ end
496
+
497
+ # Raised when some client message triggered a protocol violation (for
498
+ # instance a QUERY message is sent before a STARTUP one has been sent)
499
+ #
500
+ # @see https://github.com/apache/cassandra/blob/cassandra-2.0.16/doc/native_protocol_v1.spec#L656-L658 Description
501
+ # of Protocol Error in Apache Cassandra native protocol spec v1
502
+ class ProtocolError < ClientError
503
+ # @private
504
+ def initialize(message,
505
+ payload,
506
+ warnings,
507
+ keyspace,
508
+ statement,
509
+ options,
510
+ hosts,
511
+ consistency,
512
+ retries)
513
+ super(message)
514
+ @payload = payload
515
+ @warnings = warnings
516
+ @keyspace = keyspace
517
+ @statement = statement
518
+ @options = options
519
+ @hosts = hosts
520
+ @consistency = consistency
521
+ @retries = retries
522
+ end
523
+
524
+ # Query execution information, such as number of retries and all tried hosts, etc.
525
+ # @return [Cassandra::Execution::Info]
526
+ def execution_info
527
+ @info ||= Execution::Info.new(@payload,
528
+ @warnings,
529
+ @keyspace,
530
+ @statement,
531
+ @options,
532
+ @hosts,
533
+ @consistency,
534
+ @retries,
535
+ nil)
536
+ end
537
+ end
538
+
539
+ # Raised when cannot authenticate to Cassandra
540
+ #
541
+ # @see https://github.com/apache/cassandra/blob/cassandra-2.0.16/doc/native_protocol_v1.spec#L659-L660 Description
542
+ # of Bad Credentials Error in Apache Cassandra native protocol spec v1
543
+ class AuthenticationError < ClientError
544
+ # @private
545
+ def initialize(message,
546
+ payload,
547
+ warnings,
548
+ keyspace,
549
+ statement,
550
+ options,
551
+ hosts,
552
+ consistency,
553
+ retries)
554
+ super(message)
555
+ @payload = payload
556
+ @warnings = warnings
557
+ @keyspace = keyspace
558
+ @statement = statement
559
+ @options = options
560
+ @hosts = hosts
561
+ @consistency = consistency
562
+ @retries = retries
563
+ end
564
+
565
+ # Query execution information, such as number of retries and all tried hosts, etc.
566
+ # @return [Cassandra::Execution::Info]
567
+ def execution_info
568
+ @info ||= Execution::Info.new(@payload,
569
+ @warnings,
570
+ @keyspace,
571
+ @statement,
572
+ @options,
573
+ @hosts,
574
+ @consistency,
575
+ @retries,
576
+ nil)
577
+ end
578
+ end
579
+
580
+ # Mixed into all request validation errors.
581
+ module ValidationError
582
+ include Error
583
+
584
+ # @private
585
+ def initialize(message,
586
+ payload,
587
+ warnings,
588
+ keyspace,
589
+ statement,
590
+ options,
591
+ hosts,
592
+ consistency,
593
+ retries)
594
+ super(message)
595
+ @payload = payload
596
+ @warnings = warnings
597
+ @keyspace = keyspace
598
+ @statement = statement
599
+ @options = options
600
+ @hosts = hosts
601
+ @consistency = consistency
602
+ @retries = retries
603
+ end
604
+
605
+ # Query execution information, such as number of retries and all tried hosts, etc.
606
+ # @return [Cassandra::Execution::Info]
607
+ def execution_info
608
+ @info ||= Execution::Info.new(@payload,
609
+ @warnings,
610
+ @keyspace,
611
+ @statement,
612
+ @options,
613
+ @hosts,
614
+ @consistency,
615
+ @retries,
616
+ nil)
617
+ end
618
+ end
619
+
620
+ # Raised when a prepared statement tries to be executed and the provided
621
+ # prepared statement ID is not known by this host
622
+ #
623
+ # @note Seeing this error can be considered a Ruby Driver bug as it should
624
+ # handle automatic re-preparing internally.
625
+ #
626
+ # @see https://github.com/apache/cassandra/blob/cassandra-2.0.16/doc/native_protocol_v1.spec#L738-L741 Description
627
+ # of Unprepared Error in Apache Cassandra native protocol spec v1
628
+ class UnpreparedError < ::StandardError
629
+ include ValidationError
630
+ # @return [String] prepared statement id that triggered the error
631
+ attr_reader :id
632
+
633
+ # @private
634
+ def initialize(message,
635
+ payload,
636
+ warnings,
637
+ keyspace,
638
+ statement,
639
+ options,
640
+ hosts,
641
+ consistency,
642
+ retries,
643
+ id)
644
+ super(message,
645
+ payload,
646
+ warnings,
647
+ keyspace,
648
+ statement,
649
+ options,
650
+ hosts,
651
+ consistency,
652
+ retries)
653
+ @id = id
654
+ end
655
+ end
656
+
657
+ # Raised when the submitted query has a syntax error.
658
+ #
659
+ # @see https://github.com/apache/cassandra/blob/cassandra-2.0.16/doc/native_protocol_v1.spec#L723 Description of
660
+ # Syntax Error in Apache Cassandra native protocol spec v1
661
+ class SyntaxError < ::StandardError
662
+ include ValidationError
663
+ end
664
+
665
+ # Raised when the logged user doesn't have the right to perform the query.
666
+ #
667
+ # @see https://github.com/apache/cassandra/blob/cassandra-2.0.16/doc/native_protocol_v1.spec#L724-L725 Description
668
+ # of Unauthorized Error in Apache Cassandra native protocol spec v1
669
+ class UnauthorizedError < ::StandardError
670
+ include ValidationError
671
+ end
672
+
673
+ # Raised when the query is syntactically correct but invalid.
674
+ #
675
+ # @example Creating a table without selecting a keyspace
676
+ # begin
677
+ # session.execute("CREATE TABLE users (user_id INT PRIMARY KEY)")
678
+ # rescue Cassandra::Errors::InvalidError
679
+ # end
680
+ #
681
+ # @see https://github.com/apache/cassandra/blob/cassandra-2.0.16/doc/native_protocol_v1.spec#L726 Description
682
+ # of Invalid Error in Apache Cassandra native protocol spec v1
683
+ class InvalidError < ::StandardError
684
+ include ValidationError
685
+ end
686
+
687
+ # Raised when the query is invalid because of some configuration issue.
688
+ #
689
+ # @example Dropping non-existent keyspace
690
+ # begin
691
+ # client.execute("DROP KEYSPACE unknown_keyspace")
692
+ # rescue Cassandra::Errors::ConfigurationError
693
+ # end
694
+ #
695
+ # @see https://github.com/apache/cassandra/blob/cassandra-2.0.16/doc/native_protocol_v1.spec#L727 Description of
696
+ # Config Error in Apache Cassandra native protocol spec v1
697
+ class ConfigurationError < ::StandardError
698
+ include ValidationError
699
+ end
700
+
701
+ # Raised when the query attempted to create a keyspace or a table that was
702
+ # already existing.
703
+ #
704
+ # @example Creating a table twice
705
+ # session.execute("USE my_keyspace")
706
+ # session.execute("CREATE TABLE users (user_id INT PRIMARY KEY)")
707
+ # begin
708
+ # session.execute("CREATE TABLE users (user_id INT PRIMARY KEY)")
709
+ # rescue Cassandra::Errors::AlreadyExistsError => e
710
+ # p ['already exists', e.keyspace, e.table]
711
+ # end
712
+ #
713
+ # @see https://github.com/apache/cassandra/blob/cassandra-2.0.16/doc/native_protocol_v1.spec#L728-L737 Description
714
+ # of Already Exists Error in Apache Cassandra native protocol spec v1
715
+ class AlreadyExistsError < ConfigurationError
716
+ # @return [String] keyspace
717
+ attr_reader :keyspace
718
+
719
+ # @return [String, nil] table or `nil`
720
+ attr_reader :table
721
+
722
+ # @private
723
+ def initialize(message,
724
+ payload,
725
+ warnings,
726
+ r_keyspace,
727
+ statement,
728
+ options,
729
+ hosts,
730
+ consistency,
731
+ retries,
732
+ keyspace,
733
+ table)
734
+ super(message,
735
+ payload,
736
+ warnings,
737
+ r_keyspace,
738
+ statement,
739
+ options,
740
+ hosts,
741
+ consistency,
742
+ retries)
743
+ @keyspace = keyspace
744
+ @table = table
745
+ end
746
+ end
747
+
748
+ # This error is thrown when all attempted hosts raised a
749
+ # {Cassandra::Errors::HostError} during connection or query execution.
750
+ #
751
+ # @see Cassandra::Cluster#connect
752
+ # @see Cassandra::Session#execute
753
+ class NoHostsAvailable < ::StandardError
754
+ include Error
755
+
756
+ # @return [Hash{Cassandra::Host => Cassandra::Errors::HostError}] a map
757
+ # of hosts to underlying exceptions
758
+ attr_reader :errors
759
+
760
+ # @private
761
+ def initialize(errors = nil)
762
+ if errors
763
+ first = true
764
+ message = 'All attempted hosts failed'
765
+ errors.each do |(host, error)|
766
+ if first
767
+ first = false
768
+ message << ': '
769
+ else
770
+ message << ', '
771
+ end
772
+ message << "#{host.ip} (#{error.class.name}: #{error.message})"
773
+ end
774
+ else
775
+ message = 'All hosts down'
776
+ end
777
+
778
+ super(message)
779
+
780
+ @errors = errors || {}
781
+ end
782
+ end
783
+ end
784
+ end