cassandra-driver 1.0.0.beta.2-java

Sign up to get free protection for your applications and to get access to all the features.
Files changed (118) hide show
  1. checksums.yaml +7 -0
  2. data/.yardopts +4 -0
  3. data/README.md +125 -0
  4. data/lib/cassandra/auth/providers/password.rb +73 -0
  5. data/lib/cassandra/auth/providers.rb +16 -0
  6. data/lib/cassandra/auth.rb +97 -0
  7. data/lib/cassandra/client/batch.rb +212 -0
  8. data/lib/cassandra/client/client.rb +591 -0
  9. data/lib/cassandra/client/column_metadata.rb +54 -0
  10. data/lib/cassandra/client/connection_manager.rb +72 -0
  11. data/lib/cassandra/client/connector.rb +277 -0
  12. data/lib/cassandra/client/execute_options_decoder.rb +59 -0
  13. data/lib/cassandra/client/null_logger.rb +37 -0
  14. data/lib/cassandra/client/peer_discovery.rb +50 -0
  15. data/lib/cassandra/client/prepared_statement.rb +314 -0
  16. data/lib/cassandra/client/query_result.rb +230 -0
  17. data/lib/cassandra/client/request_runner.rb +71 -0
  18. data/lib/cassandra/client/result_metadata.rb +48 -0
  19. data/lib/cassandra/client/void_result.rb +78 -0
  20. data/lib/cassandra/client.rb +144 -0
  21. data/lib/cassandra/cluster/client.rb +768 -0
  22. data/lib/cassandra/cluster/connector.rb +244 -0
  23. data/lib/cassandra/cluster/control_connection.rb +425 -0
  24. data/lib/cassandra/cluster/metadata.rb +124 -0
  25. data/lib/cassandra/cluster/options.rb +42 -0
  26. data/lib/cassandra/cluster/registry.rb +198 -0
  27. data/lib/cassandra/cluster/schema/partitioners/murmur3.rb +47 -0
  28. data/lib/cassandra/cluster/schema/partitioners/ordered.rb +37 -0
  29. data/lib/cassandra/cluster/schema/partitioners/random.rb +37 -0
  30. data/lib/cassandra/cluster/schema/partitioners.rb +21 -0
  31. data/lib/cassandra/cluster/schema/replication_strategies/network_topology.rb +92 -0
  32. data/lib/cassandra/cluster/schema/replication_strategies/none.rb +39 -0
  33. data/lib/cassandra/cluster/schema/replication_strategies/simple.rb +44 -0
  34. data/lib/cassandra/cluster/schema/replication_strategies.rb +21 -0
  35. data/lib/cassandra/cluster/schema/type_parser.rb +138 -0
  36. data/lib/cassandra/cluster/schema.rb +340 -0
  37. data/lib/cassandra/cluster.rb +215 -0
  38. data/lib/cassandra/column.rb +92 -0
  39. data/lib/cassandra/compression/compressors/lz4.rb +72 -0
  40. data/lib/cassandra/compression/compressors/snappy.rb +66 -0
  41. data/lib/cassandra/compression.rb +66 -0
  42. data/lib/cassandra/driver.rb +111 -0
  43. data/lib/cassandra/errors.rb +79 -0
  44. data/lib/cassandra/execution/info.rb +51 -0
  45. data/lib/cassandra/execution/options.rb +80 -0
  46. data/lib/cassandra/execution/trace.rb +152 -0
  47. data/lib/cassandra/future.rb +675 -0
  48. data/lib/cassandra/host.rb +79 -0
  49. data/lib/cassandra/keyspace.rb +133 -0
  50. data/lib/cassandra/listener.rb +87 -0
  51. data/lib/cassandra/load_balancing/policies/dc_aware_round_robin.rb +149 -0
  52. data/lib/cassandra/load_balancing/policies/round_robin.rb +132 -0
  53. data/lib/cassandra/load_balancing/policies/token_aware.rb +119 -0
  54. data/lib/cassandra/load_balancing/policies/white_list.rb +90 -0
  55. data/lib/cassandra/load_balancing/policies.rb +19 -0
  56. data/lib/cassandra/load_balancing.rb +113 -0
  57. data/lib/cassandra/protocol/cql_byte_buffer.rb +307 -0
  58. data/lib/cassandra/protocol/cql_protocol_handler.rb +323 -0
  59. data/lib/cassandra/protocol/frame_decoder.rb +128 -0
  60. data/lib/cassandra/protocol/frame_encoder.rb +48 -0
  61. data/lib/cassandra/protocol/request.rb +38 -0
  62. data/lib/cassandra/protocol/requests/auth_response_request.rb +47 -0
  63. data/lib/cassandra/protocol/requests/batch_request.rb +76 -0
  64. data/lib/cassandra/protocol/requests/credentials_request.rb +47 -0
  65. data/lib/cassandra/protocol/requests/execute_request.rb +103 -0
  66. data/lib/cassandra/protocol/requests/options_request.rb +39 -0
  67. data/lib/cassandra/protocol/requests/prepare_request.rb +50 -0
  68. data/lib/cassandra/protocol/requests/query_request.rb +153 -0
  69. data/lib/cassandra/protocol/requests/register_request.rb +38 -0
  70. data/lib/cassandra/protocol/requests/startup_request.rb +49 -0
  71. data/lib/cassandra/protocol/requests/void_query_request.rb +24 -0
  72. data/lib/cassandra/protocol/response.rb +38 -0
  73. data/lib/cassandra/protocol/responses/auth_challenge_response.rb +41 -0
  74. data/lib/cassandra/protocol/responses/auth_success_response.rb +41 -0
  75. data/lib/cassandra/protocol/responses/authenticate_response.rb +41 -0
  76. data/lib/cassandra/protocol/responses/detailed_error_response.rb +60 -0
  77. data/lib/cassandra/protocol/responses/error_response.rb +50 -0
  78. data/lib/cassandra/protocol/responses/event_response.rb +39 -0
  79. data/lib/cassandra/protocol/responses/prepared_result_response.rb +64 -0
  80. data/lib/cassandra/protocol/responses/raw_rows_result_response.rb +43 -0
  81. data/lib/cassandra/protocol/responses/ready_response.rb +44 -0
  82. data/lib/cassandra/protocol/responses/result_response.rb +48 -0
  83. data/lib/cassandra/protocol/responses/rows_result_response.rb +139 -0
  84. data/lib/cassandra/protocol/responses/schema_change_event_response.rb +60 -0
  85. data/lib/cassandra/protocol/responses/schema_change_result_response.rb +57 -0
  86. data/lib/cassandra/protocol/responses/set_keyspace_result_response.rb +42 -0
  87. data/lib/cassandra/protocol/responses/status_change_event_response.rb +44 -0
  88. data/lib/cassandra/protocol/responses/supported_response.rb +41 -0
  89. data/lib/cassandra/protocol/responses/topology_change_event_response.rb +34 -0
  90. data/lib/cassandra/protocol/responses/void_result_response.rb +39 -0
  91. data/lib/cassandra/protocol/type_converter.rb +384 -0
  92. data/lib/cassandra/protocol.rb +93 -0
  93. data/lib/cassandra/reconnection/policies/constant.rb +48 -0
  94. data/lib/cassandra/reconnection/policies/exponential.rb +79 -0
  95. data/lib/cassandra/reconnection/policies.rb +20 -0
  96. data/lib/cassandra/reconnection.rb +49 -0
  97. data/lib/cassandra/result.rb +215 -0
  98. data/lib/cassandra/retry/policies/default.rb +47 -0
  99. data/lib/cassandra/retry/policies/downgrading_consistency.rb +71 -0
  100. data/lib/cassandra/retry/policies/fallthrough.rb +39 -0
  101. data/lib/cassandra/retry/policies.rb +21 -0
  102. data/lib/cassandra/retry.rb +142 -0
  103. data/lib/cassandra/session.rb +202 -0
  104. data/lib/cassandra/statement.rb +22 -0
  105. data/lib/cassandra/statements/batch.rb +95 -0
  106. data/lib/cassandra/statements/bound.rb +48 -0
  107. data/lib/cassandra/statements/prepared.rb +81 -0
  108. data/lib/cassandra/statements/simple.rb +58 -0
  109. data/lib/cassandra/statements/void.rb +33 -0
  110. data/lib/cassandra/statements.rb +23 -0
  111. data/lib/cassandra/table.rb +299 -0
  112. data/lib/cassandra/time_uuid.rb +142 -0
  113. data/lib/cassandra/util.rb +167 -0
  114. data/lib/cassandra/uuid.rb +104 -0
  115. data/lib/cassandra/version.rb +21 -0
  116. data/lib/cassandra.rb +428 -0
  117. data/lib/cassandra_murmur3.jar +0 -0
  118. metadata +211 -0
@@ -0,0 +1,323 @@
1
+ # encoding: utf-8
2
+
3
+ #--
4
+ # Copyright 2013-2014 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
+ module Protocol
21
+ # This class wraps a single connection and translates between request/
22
+ # response frames and raw bytes.
23
+ #
24
+ # You send requests with #send_request, and receive responses through the
25
+ # returned future.
26
+ #
27
+ # Instances of this class are thread safe.
28
+ #
29
+ # @example Sending an OPTIONS request
30
+ # future = protocol_handler.send_request(Cassandra::Protocol::OptionsRequest.new)
31
+ # response = future.get
32
+ # puts "These options are supported: #{response.options}"
33
+ #
34
+ class CqlProtocolHandler
35
+ # @return [String] the current keyspace for the underlying connection
36
+ attr_reader :keyspace
37
+
38
+ def initialize(connection, scheduler, protocol_version, compressor=nil)
39
+ @connection = connection
40
+ @scheduler = scheduler
41
+ @compressor = compressor
42
+ @connection.on_data(&method(:receive_data))
43
+ @connection.on_closed(&method(:socket_closed))
44
+ @promises = Array.new(128) { nil }
45
+ @read_buffer = CqlByteBuffer.new
46
+ @frame_encoder = FrameEncoder.new(protocol_version, @compressor)
47
+ @frame_decoder = FrameDecoder.new(@compressor)
48
+ @current_frame = FrameDecoder::NULL_FRAME
49
+ @request_queue_in = []
50
+ @request_queue_out = []
51
+ @event_listeners = []
52
+ @data = {}
53
+ @lock = Mutex.new
54
+ @closed_promise = Ione::Promise.new
55
+ @keyspace = nil
56
+ end
57
+
58
+ # Returns the hostname of the underlying connection
59
+ #
60
+ # @return [String] the hostname
61
+ def host
62
+ @connection.host
63
+ end
64
+
65
+ # Returns the port of the underlying connection
66
+ #
67
+ # @return [Integer] the port
68
+ def port
69
+ @connection.port
70
+ end
71
+
72
+ # Associate arbitrary data with this protocol handler object. This is
73
+ # useful in situations where additional metadata can be loaded after the
74
+ # connection has been set up, or to keep statistics specific to the
75
+ # connection this protocol handler wraps.
76
+ def []=(key, value)
77
+ @lock.lock
78
+ @data[key] = value
79
+ ensure
80
+ @lock.unlock
81
+ end
82
+
83
+ # @see {#[]=}
84
+ # @return the value associated with the key
85
+ def [](key)
86
+ @lock.lock
87
+ @data[key]
88
+ ensure
89
+ @lock.unlock
90
+ end
91
+
92
+ # @return [true, false] true if the underlying connection is connected
93
+ def connected?
94
+ @connection.connected?
95
+ end
96
+
97
+ # @return [true, false] true if the underlying connection is closed
98
+ def closed?
99
+ @connection.closed?
100
+ end
101
+
102
+ # Register to receive notification when the underlying connection has
103
+ # closed. If the connection closed abruptly the error will be passed
104
+ # to the listener, otherwise it will not receive any parameters.
105
+ #
106
+ # @yieldparam error [nil, Error] the error that caused the connection to
107
+ # close, if any
108
+ def on_closed(&listener)
109
+ @closed_promise.future.on_value(&listener)
110
+ @closed_promise.future.on_failure(&listener)
111
+ end
112
+
113
+ # Register to receive server sent events, like schema changes, nodes going
114
+ # up or down, etc. To actually receive events you also need to send a
115
+ # REGISTER request for the events you wish to receive.
116
+ #
117
+ # @yieldparam event [Cassandra::Protocol::EventResponse] an event sent by the server
118
+ def on_event(&listener)
119
+ @lock.lock
120
+ @event_listeners += [listener]
121
+ ensure
122
+ @lock.unlock
123
+ end
124
+
125
+ # Serializes and send a request over the underlying connection.
126
+ #
127
+ # Returns a future that will resolve to the response. When the connection
128
+ # closes the futures of all active requests will be failed with the error
129
+ # that caused the connection to close, or nil.
130
+ #
131
+ # When `timeout` is specified the future will fail with {Cassandra::TimeoutError}
132
+ # after that many seconds have passed. If a response arrives after that
133
+ # time it will be lost. If a response never arrives for the request the
134
+ # channel occupied by the request will _not_ be reused.
135
+ #
136
+ # @param [Cassandra::Protocol::Request] request
137
+ # @param [Float] timeout an optional number of seconds to wait until
138
+ # failing the request
139
+ # @return [Ione::Future<Cassandra::Protocol::Response>] a future that resolves to
140
+ # the response
141
+ def send_request(request, timeout=nil)
142
+ return Ione::Future.failed(Errors::NotConnectedError.new) if closed?
143
+ promise = RequestPromise.new(request, @frame_encoder)
144
+ id = nil
145
+ @lock.lock
146
+ begin
147
+ if (id = next_stream_id)
148
+ @promises[id] = promise
149
+ end
150
+ ensure
151
+ @lock.unlock
152
+ end
153
+ if id
154
+ @connection.write do |buffer|
155
+ @frame_encoder.encode_frame(request, id, buffer)
156
+ end
157
+ else
158
+ @lock.lock
159
+ begin
160
+ promise.encode_frame
161
+ @request_queue_in << promise
162
+ ensure
163
+ @lock.unlock
164
+ end
165
+ end
166
+ if timeout
167
+ @scheduler.schedule_timer(timeout).on_value do
168
+ promise.time_out!
169
+ end
170
+ end
171
+ promise.future
172
+ end
173
+
174
+ # Closes the underlying connection.
175
+ #
176
+ # @return [Ione::Future] a future that completes when the connection has closed
177
+ def close
178
+ @connection.close
179
+ @closed_promise.future
180
+ end
181
+
182
+ private
183
+
184
+ # @private
185
+ class RequestPromise < Ione::Promise
186
+ attr_reader :request, :frame
187
+
188
+ def initialize(request, frame_encoder)
189
+ @request = request
190
+ @frame_encoder = frame_encoder
191
+ @timed_out = false
192
+ super()
193
+ end
194
+
195
+ def timed_out?
196
+ @timed_out
197
+ end
198
+
199
+ def time_out!
200
+ unless future.completed?
201
+ @timed_out = true
202
+ fail(TimeoutError.new)
203
+ end
204
+ end
205
+
206
+ def encode_frame
207
+ @frame = @frame_encoder.encode_frame(@request)
208
+ end
209
+ end
210
+
211
+ def receive_data(data)
212
+ @read_buffer << data
213
+ @current_frame = @frame_decoder.decode_frame(@read_buffer, @current_frame)
214
+ while @current_frame.complete?
215
+ id = @current_frame.stream_id
216
+ if id == -1
217
+ notify_event_listeners(@current_frame.body)
218
+ else
219
+ complete_request(id, @current_frame.body)
220
+ end
221
+ @current_frame = @frame_decoder.decode_frame(@read_buffer)
222
+ end
223
+ end
224
+
225
+ def notify_event_listeners(event_response)
226
+ event_listeners = nil
227
+ @lock.lock
228
+ begin
229
+ event_listeners = @event_listeners
230
+ return if event_listeners.empty?
231
+ ensure
232
+ @lock.unlock
233
+ end
234
+ event_listeners.each do |listener|
235
+ listener.call(@current_frame.body) rescue nil
236
+ end
237
+ end
238
+
239
+ def complete_request(id, response)
240
+ promise = nil
241
+ @lock.lock
242
+ begin
243
+ promise = @promises[id]
244
+ @promises[id] = nil
245
+ ensure
246
+ @lock.unlock
247
+ end
248
+ if response.is_a?(Protocol::SetKeyspaceResultResponse)
249
+ @keyspace = response.keyspace
250
+ end
251
+ flush_request_queue
252
+ unless promise.timed_out?
253
+ promise.fulfill(response)
254
+ end
255
+ end
256
+
257
+ def flush_request_queue
258
+ @lock.lock
259
+ begin
260
+ if @request_queue_out.empty? && !@request_queue_in.empty?
261
+ @request_queue_out = @request_queue_in
262
+ @request_queue_in = []
263
+ end
264
+ ensure
265
+ @lock.unlock
266
+ end
267
+ while true
268
+ id = nil
269
+ frame = nil
270
+ @lock.lock
271
+ begin
272
+ if @request_queue_out.any? && (id = next_stream_id)
273
+ promise = @request_queue_out.shift
274
+ if promise.timed_out?
275
+ next
276
+ else
277
+ frame = promise.frame
278
+ @promises[id] = promise
279
+ end
280
+ end
281
+ ensure
282
+ @lock.unlock
283
+ end
284
+ if id
285
+ @frame_encoder.change_stream_id(id, frame)
286
+ @connection.write(frame)
287
+ else
288
+ break
289
+ end
290
+ end
291
+ end
292
+
293
+ def socket_closed(cause)
294
+ request_failure_cause = cause || Io::ConnectionClosedError.new
295
+ promises_to_fail = nil
296
+ @lock.synchronize do
297
+ promises_to_fail = @promises.compact
298
+ promises_to_fail.concat(@request_queue_in)
299
+ promises_to_fail.concat(@request_queue_out)
300
+ @promises.fill(nil)
301
+ @request_queue_in.clear
302
+ @request_queue_out.clear
303
+ end
304
+ promises_to_fail.each do |promise|
305
+ promise.fail(request_failure_cause)
306
+ end
307
+ if cause
308
+ @closed_promise.fail(cause)
309
+ else
310
+ @closed_promise.fulfill
311
+ end
312
+ end
313
+
314
+ def next_stream_id
315
+ if (stream_id = @promises.index(nil))
316
+ stream_id
317
+ else
318
+ nil
319
+ end
320
+ end
321
+ end
322
+ end
323
+ end
@@ -0,0 +1,128 @@
1
+ # encoding: utf-8
2
+
3
+ #--
4
+ # Copyright 2013-2014 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
+ module Protocol
21
+ # @private
22
+ class FrameDecoder
23
+ def initialize(compressor=nil)
24
+ @compressor = compressor
25
+ end
26
+
27
+ def decode_frame(buffer, partial_frame=nil)
28
+ partial_frame ||= NULL_FRAME
29
+ if partial_frame == NULL_FRAME
30
+ buffer_length = buffer.length
31
+ return NULL_FRAME if buffer_length < 8
32
+ fields = buffer.read_int
33
+ size = buffer.read_int
34
+ if buffer_length - 8 >= size
35
+ actual_decode(buffer, fields, size)
36
+ else
37
+ PartialFrame.new(fields, size)
38
+ end
39
+ elsif buffer.length >= partial_frame.size
40
+ actual_decode(buffer, partial_frame.fields, partial_frame.size)
41
+ else
42
+ partial_frame
43
+ end
44
+ end
45
+
46
+ private
47
+
48
+ def actual_decode(buffer, fields, size)
49
+ if (fields >> 24) & 0x80 == 0
50
+ raise UnsupportedFrameTypeError, 'Request frames are not supported'
51
+ end
52
+ protocol_version = (fields >> 24) & 0x7f
53
+ compression = (fields >> 16) & 0x01
54
+ tracing = (fields >> 16) & 0x02
55
+ stream_id = (fields >> 8) & 0xff
56
+ stream_id = (stream_id & 0x7f) - (stream_id & 0x80)
57
+ opcode = fields & 0xff
58
+ if compression == 1
59
+ buffer = decompress(buffer, size)
60
+ size = buffer.size
61
+ end
62
+ if tracing == 2
63
+ trace_id = buffer.read_uuid
64
+ size -= 16
65
+ else
66
+ trace_id = nil
67
+ end
68
+ extra_length = buffer.length - size
69
+ response = Response.decode(opcode, protocol_version, buffer, size, trace_id)
70
+ if buffer.length > extra_length
71
+ buffer.discard(buffer.length - extra_length)
72
+ end
73
+ CompleteFrame.new(stream_id, response)
74
+ end
75
+
76
+ def decompress(buffer, size)
77
+ if @compressor
78
+ compressed_body = buffer.read(size)
79
+ CqlByteBuffer.new(@compressor.decompress(compressed_body))
80
+ else
81
+ raise UnexpectedCompressionError, 'Compressed frame received, but no compressor configured'
82
+ end
83
+ end
84
+
85
+ class NullFrame
86
+ def size
87
+ nil
88
+ end
89
+
90
+ def complete?
91
+ false
92
+ end
93
+ end
94
+
95
+ class PartialFrame
96
+ attr_reader :fields, :size
97
+
98
+ def initialize(fields, size)
99
+ @fields = fields
100
+ @size = size
101
+ end
102
+
103
+ def stream_id
104
+ nil
105
+ end
106
+
107
+ def complete?
108
+ false
109
+ end
110
+ end
111
+
112
+ class CompleteFrame
113
+ attr_reader :stream_id, :body
114
+
115
+ def initialize(stream_id, body)
116
+ @stream_id = stream_id
117
+ @body = body
118
+ end
119
+
120
+ def complete?
121
+ true
122
+ end
123
+ end
124
+
125
+ NULL_FRAME = NullFrame.new
126
+ end
127
+ end
128
+ end
@@ -0,0 +1,48 @@
1
+ # encoding: utf-8
2
+
3
+ #--
4
+ # Copyright 2013-2014 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
+ module Protocol
21
+ # @private
22
+ class FrameEncoder
23
+ def initialize(protocol_version=1, compressor=nil)
24
+ @protocol_version = protocol_version
25
+ @compressor = compressor
26
+ end
27
+
28
+ def encode_frame(request, stream_id=0, buffer=nil)
29
+ raise InvalidStreamIdError, 'The stream ID must be between 0 and 127' unless 0 <= stream_id && stream_id < 128
30
+ buffer ||= CqlByteBuffer.new
31
+ flags = request.trace? ? 2 : 0
32
+ body = request.write(@protocol_version, CqlByteBuffer.new)
33
+ if @compressor && request.compressable? && @compressor.compress?(body)
34
+ flags |= 1
35
+ body = @compressor.compress(body)
36
+ end
37
+ header = [@protocol_version, flags, stream_id, request.opcode, body.bytesize]
38
+ buffer << header.pack(Formats::HEADER_FORMAT)
39
+ buffer << body
40
+ buffer
41
+ end
42
+
43
+ def change_stream_id(new_stream_id, buffer, offset=0)
44
+ buffer.update(offset + 2, new_stream_id.chr)
45
+ end
46
+ end
47
+ end
48
+ end
@@ -0,0 +1,38 @@
1
+ # encoding: utf-8
2
+
3
+ #--
4
+ # Copyright 2013-2014 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
+ module Protocol
21
+ class Request
22
+ attr_reader :opcode, :trace
23
+
24
+ def initialize(opcode, trace=false)
25
+ @opcode = opcode
26
+ @trace = trace
27
+ end
28
+
29
+ def trace?
30
+ @trace
31
+ end
32
+
33
+ def compressable?
34
+ true
35
+ end
36
+ end
37
+ end
38
+ end
@@ -0,0 +1,47 @@
1
+ # encoding: utf-8
2
+
3
+ #--
4
+ # Copyright 2013-2014 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
+ module Protocol
21
+ class AuthResponseRequest < Request
22
+ attr_reader :token
23
+
24
+ def initialize(token)
25
+ super(0x0f)
26
+ @token = token
27
+ end
28
+
29
+ def write(protocol_version, buffer)
30
+ buffer.append_bytes(@token)
31
+ end
32
+
33
+ def to_s
34
+ %(AUTH_RESPONSE #{@token.bytesize})
35
+ end
36
+
37
+ def eql?(other)
38
+ self.token == other.token
39
+ end
40
+ alias_method :==, :eql?
41
+
42
+ def hash
43
+ @token.hash
44
+ end
45
+ end
46
+ end
47
+ end
@@ -0,0 +1,76 @@
1
+ # encoding: utf-8
2
+
3
+ #--
4
+ # Copyright 2013-2014 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
+ module Protocol
21
+ class BatchRequest < Request
22
+ LOGGED_TYPE = 0
23
+ UNLOGGED_TYPE = 1
24
+ COUNTER_TYPE = 2
25
+
26
+ attr_reader :type, :part_count
27
+ attr_accessor :consistency, :retries
28
+
29
+ def initialize(type, consistency, trace=false)
30
+ super(0x0D, trace)
31
+ @type = type
32
+ @part_count = 0
33
+ @encoded_queries = CqlByteBuffer.new
34
+ @consistency = consistency
35
+ end
36
+
37
+ def add_query(cql, values=nil, type_hints=nil)
38
+ @encoded_queries.append(QUERY_KIND)
39
+ @encoded_queries.append_long_string(cql)
40
+ QueryRequest.encode_values(@encoded_queries, values, type_hints)
41
+ @part_count += 1
42
+ nil
43
+ end
44
+
45
+ def add_prepared(id, metadata, values)
46
+ @encoded_queries.append(PREPARED_KIND)
47
+ @encoded_queries.append_short_bytes(id)
48
+ ExecuteRequest.encode_values(@encoded_queries, metadata, values)
49
+ @part_count += 1
50
+ nil
51
+ end
52
+
53
+ def write(protocol_version, buffer)
54
+ buffer.append(@type.chr)
55
+ buffer.append_short(@part_count)
56
+ buffer.append(@encoded_queries)
57
+ buffer.append_consistency(@consistency)
58
+ end
59
+
60
+ def to_s
61
+ type_str = case @type
62
+ when LOGGED_TYPE then 'LOGGED'
63
+ when UNLOGGED_TYPE then 'UNLOGGED'
64
+ when COUNTER_TYPE then 'COUNTER'
65
+ end
66
+ %(BATCH #{type_str} #{@part_count} #{@consistency.to_s.upcase})
67
+ end
68
+
69
+ private
70
+
71
+ TYPE_CONVERTER = TypeConverter.new
72
+ QUERY_KIND = "\x00".freeze
73
+ PREPARED_KIND = "\x01".freeze
74
+ end
75
+ end
76
+ end
@@ -0,0 +1,47 @@
1
+ # encoding: utf-8
2
+
3
+ #--
4
+ # Copyright 2013-2014 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
+ module Protocol
21
+ class CredentialsRequest < Request
22
+ attr_reader :credentials
23
+
24
+ def initialize(credentials)
25
+ super(4)
26
+ @credentials = credentials.dup.freeze
27
+ end
28
+
29
+ def write(protocol_version, buffer)
30
+ buffer.append_string_map(@credentials)
31
+ end
32
+
33
+ def to_s
34
+ %(CREDENTIALS #{@credentials})
35
+ end
36
+
37
+ def eql?(rq)
38
+ self.class === rq && rq.credentials.eql?(@credentials)
39
+ end
40
+ alias_method :==, :eql?
41
+
42
+ def hash
43
+ @h ||= @credentials.hash
44
+ end
45
+ end
46
+ end
47
+ end