cassandra-driver 1.2.0 → 2.0.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.
Files changed (57) hide show
  1. checksums.yaml +8 -8
  2. data/README.md +4 -4
  3. data/lib/cassandra.rb +5 -3
  4. data/lib/cassandra/cluster/client.rb +88 -95
  5. data/lib/cassandra/cluster/control_connection.rb +14 -13
  6. data/lib/cassandra/column.rb +1 -9
  7. data/lib/cassandra/execution/options.rb +24 -1
  8. data/lib/cassandra/executors.rb +2 -0
  9. data/lib/cassandra/load_balancing.rb +0 -2
  10. data/lib/cassandra/protocol.rb +7 -5
  11. data/lib/cassandra/protocol/coder.rb +509 -0
  12. data/lib/cassandra/protocol/cql_byte_buffer.rb +4 -0
  13. data/lib/cassandra/protocol/cql_protocol_handler.rb +38 -57
  14. data/lib/cassandra/protocol/requests/auth_response_request.rb +1 -1
  15. data/lib/cassandra/protocol/requests/batch_request.rb +35 -19
  16. data/lib/cassandra/protocol/requests/credentials_request.rb +1 -1
  17. data/lib/cassandra/protocol/requests/execute_request.rb +3 -16
  18. data/lib/cassandra/protocol/requests/options_request.rb +1 -1
  19. data/lib/cassandra/protocol/requests/prepare_request.rb +1 -1
  20. data/lib/cassandra/protocol/requests/query_request.rb +5 -61
  21. data/lib/cassandra/protocol/requests/register_request.rb +1 -1
  22. data/lib/cassandra/protocol/requests/startup_request.rb +1 -1
  23. data/lib/cassandra/protocol/response.rb +0 -9
  24. data/lib/cassandra/protocol/responses/already_exists_error_response.rb +40 -0
  25. data/lib/cassandra/protocol/responses/auth_challenge_response.rb +0 -4
  26. data/lib/cassandra/protocol/responses/auth_success_response.rb +1 -5
  27. data/lib/cassandra/protocol/responses/authenticate_response.rb +0 -4
  28. data/lib/cassandra/protocol/responses/error_response.rb +0 -12
  29. data/lib/cassandra/protocol/responses/event_response.rb +0 -8
  30. data/lib/cassandra/protocol/responses/prepared_result_response.rb +0 -10
  31. data/lib/cassandra/protocol/responses/raw_rows_result_response.rb +1 -1
  32. data/lib/cassandra/protocol/responses/read_timeout_error_response.rb +42 -0
  33. data/lib/cassandra/protocol/responses/ready_response.rb +0 -4
  34. data/lib/cassandra/protocol/responses/result_response.rb +0 -7
  35. data/lib/cassandra/protocol/responses/rows_result_response.rb +0 -101
  36. data/lib/cassandra/protocol/responses/schema_change_event_response.rb +0 -3
  37. data/lib/cassandra/protocol/responses/set_keyspace_result_response.rb +0 -4
  38. data/lib/cassandra/protocol/responses/status_change_event_response.rb +0 -4
  39. data/lib/cassandra/protocol/responses/supported_response.rb +0 -4
  40. data/lib/cassandra/protocol/responses/unavailable_error_response.rb +41 -0
  41. data/lib/cassandra/protocol/responses/unprepared_error_response.rb +39 -0
  42. data/lib/cassandra/protocol/responses/void_result_response.rb +0 -4
  43. data/lib/cassandra/protocol/responses/write_timeout_error_response.rb +44 -0
  44. data/lib/cassandra/protocol/v1.rb +238 -0
  45. data/lib/cassandra/session.rb +95 -16
  46. data/lib/cassandra/statements/batch.rb +33 -6
  47. data/lib/cassandra/statements/bound.rb +3 -3
  48. data/lib/cassandra/statements/prepared.rb +38 -10
  49. data/lib/cassandra/statements/simple.rb +72 -3
  50. data/lib/cassandra/table.rb +2 -3
  51. data/lib/cassandra/util.rb +18 -0
  52. data/lib/cassandra/version.rb +1 -1
  53. metadata +8 -5
  54. data/lib/cassandra/protocol/frame_decoder.rb +0 -128
  55. data/lib/cassandra/protocol/frame_encoder.rb +0 -48
  56. data/lib/cassandra/protocol/responses/detailed_error_response.rb +0 -75
  57. data/lib/cassandra/protocol/type_converter.rb +0 -389
checksums.yaml CHANGED
@@ -1,15 +1,15 @@
1
1
  ---
2
2
  !binary "U0hBMQ==":
3
3
  metadata.gz: !binary |-
4
- NzBmYWI0MTgyNjhhMWU2MGNjMjg0NWQzM2M5ODdkZTg4MWVkZjIzMQ==
4
+ ZjdmNmQxODlhMTcwZjMyMmU3N2Y4NWFhMmU4Y2NkNThiMTE5MmFiYw==
5
5
  data.tar.gz: !binary |-
6
- ZmNlZTUxNGEwNDBmYTdiM2U1N2U1MDUzODRkZDM0ZjBjNTA3YzRkOA==
6
+ MzAzNzNjMmZiZDgyMDgzNjM3ZDllOWE0MDg0YzRlZDc5NDEwY2ViZA==
7
7
  SHA512:
8
8
  metadata.gz: !binary |-
9
- Nzg5OGIzNzVlNzkyY2U4MWM3NjQwNTIwMDRkNWM0M2EwYjliYmM2MDg1NjA3
10
- NjZhYmEzYjBiNTdkMWY1MWM2OWY5OTJmYmEzNWMzMzdiYjliNTM4NDE1OWM4
11
- MDc3N2Y1YWFhMDI3MzU3NjQxODYyZGExMDU4YjM5ODYwYTkyMzE=
9
+ MGUxNTIzZjc1ZWUxMTMwYjYxN2QwYjM5ZGRkZDY1YzdkZWRjYzQ1MDRkOTAx
10
+ Nzk5NjI5ODMxYWM3MWEzZmQ2NWM2YmQ3NWRkYzI2ZWRkMjhmMTMzMTIxYjY0
11
+ ODAyYjQxYjg5ZTE0MTZiNjc4NWM3Y2NmODZjNGM3NzM4MWMyNTQ=
12
12
  data.tar.gz: !binary |-
13
- MjVhYTZmZjEwYjFjMDY5ZTU2NzIzYmQ1ZGU3MzE3OWMxYTMzMzYwN2NjZmMx
14
- ZGFiZGI2NTg1ZjJhMzlmYTc4MDI1MmUxNWI0ZjA5YjVmODVlYmRlOWQzYmEy
15
- YWM5NWEwNjE0ODM4YWFiYmY1OTFjZDJlYzIyZmU4MmQ1YWRkNDY=
13
+ NjZkOWZjYzdiM2IyYmU3YWVmOGNhODk0MjA3NWZlYzhjOGUxN2RhOTgzZGZm
14
+ YmM3NTFhYTA1YjQ1ZTY2MzJmOGQ3MzI3NGVkYzRjZDA5YmU1N2ZlODg2ZDI2
15
+ ZGY5MmI4MjcyYmI5NTRkOTA3NmI2OGFiNjc4MTY5ZjY4YTU0YjA=
data/README.md CHANGED
@@ -93,12 +93,12 @@ __Note__: if you want to use compression you should also install [snappy](http:/
93
93
 
94
94
  Some of the new features added to the driver have unfortunately led to changes in the original cql-rb API. In the examples directory, you can find [an example of how to wrap the ruby driver to achieve almost complete interface parity with cql-rb](https://github.com/datastax/ruby-driver/blob/master/examples/cql-rb-wrapper.rb) to assist you with gradual upgrade.
95
95
 
96
- ## What's new in v1.2.0
96
+ ## What's new in v2.0.0
97
97
 
98
- Bug Fixes:
98
+ Current release lays groundwork for the upcoming support of native protocol v3 and Apache Cassandra 2.1. This release introduces the following major public API changes:
99
99
 
100
- * [RUBY-83] Timestamps loses microseconds when retrieved from database
101
- * [RUBY-85] Driver doesn't always reconnect
100
+ * Positional arguments to `Session#execute` must be passed via `:arguments` option key.
101
+ * `Batch#add` and `Prepared#bind` accept an array of arguments instead of variable arguments (`args` instead of `*args`).
102
102
 
103
103
  ## Code examples
104
104
 
@@ -503,11 +503,15 @@ module Cassandra
503
503
  driver = Driver.new(options)
504
504
  driver.connect(hosts)
505
505
  end
506
+
507
+ # @private
508
+ EMPTY_LIST = [].freeze
506
509
  end
507
510
 
508
- require 'cassandra/errors'
509
511
  require 'cassandra/uuid'
510
512
  require 'cassandra/time_uuid'
513
+
514
+ require 'cassandra/errors'
511
515
  require 'cassandra/compression'
512
516
  require 'cassandra/protocol'
513
517
  require 'cassandra/auth'
@@ -548,6 +552,4 @@ module Cassandra
548
552
  VOID_OPTIONS = Execution::Options.new({:consistency => :one})
549
553
  # @private
550
554
  NO_HOSTS = Errors::NoHostsAvailable.new
551
- # @private
552
- EMPTY_LIST = [].freeze
553
555
  end
@@ -199,7 +199,7 @@ module Cassandra
199
199
 
200
200
 
201
201
  def query(statement, options)
202
- request = Protocol::QueryRequest.new(statement.cql, statement.params, nil, options.consistency, options.serial_consistency, options.page_size, options.paging_state, options.trace?)
202
+ request = Protocol::QueryRequest.new(statement.cql, statement.params, statement.params_types, options.consistency, options.serial_consistency, options.page_size, options.paging_state, options.trace?)
203
203
  timeout = options.timeout
204
204
  promise = @futures.promise
205
205
 
@@ -228,7 +228,7 @@ module Cassandra
228
228
  def execute(statement, options)
229
229
  timeout = options.timeout
230
230
  result_metadata = statement.result_metadata
231
- request = Protocol::ExecuteRequest.new(nil, statement.params_metadata, statement.params, result_metadata.nil?, options.consistency, options.serial_consistency, options.page_size, options.paging_state, options.trace?)
231
+ request = Protocol::ExecuteRequest.new(nil, statement.params_types, statement.params, result_metadata.nil?, options.consistency, options.serial_consistency, options.page_size, options.paging_state, options.trace?)
232
232
  promise = @futures.promise
233
233
 
234
234
  keyspace = @keyspace
@@ -276,8 +276,8 @@ module Cassandra
276
276
  BOOTSTRAPPING_ERROR_CODE = 0x1002
277
277
  UNPREPARED_ERROR_CODE = 0x2500
278
278
 
279
- SELECT_SCHEMA_PEERS = Protocol::QueryRequest.new("SELECT peer, rpc_address, schema_version FROM system.peers", nil, nil, :one)
280
- SELECT_SCHEMA_LOCAL = Protocol::QueryRequest.new("SELECT schema_version FROM system.local WHERE key='local'", nil, nil, :one)
279
+ SELECT_SCHEMA_PEERS = Protocol::QueryRequest.new("SELECT peer, rpc_address, schema_version FROM system.peers", EMPTY_LIST, EMPTY_LIST, :one)
280
+ SELECT_SCHEMA_LOCAL = Protocol::QueryRequest.new("SELECT schema_version FROM system.local WHERE key='local'", EMPTY_LIST, EMPTY_LIST, :one)
281
281
 
282
282
  def connected(f)
283
283
  if f.resolved?
@@ -545,12 +545,12 @@ module Cassandra
545
545
  id = synchronize { @prepared_statements[host][cql] }
546
546
 
547
547
  if id
548
- request.add_prepared(id, statement.params_metadata, statement.params)
548
+ request.add_prepared(id, statement.params, statement.params_types)
549
549
  else
550
550
  unprepared[cql] << statement
551
551
  end
552
552
  else
553
- request.add_query(cql, statement.params)
553
+ request.add_query(cql, statement.params, statement.params_types)
554
554
  end
555
555
  end
556
556
 
@@ -567,7 +567,7 @@ module Cassandra
567
567
  prepared_ids = f.value
568
568
  to_prepare.each_with_index do |(_, statements), i|
569
569
  statements.each do |statement|
570
- request.add_prepared(prepared_ids[i], statement.params_metadata, statement.params)
570
+ request.add_prepared(prepared_ids[i], statement.params, statement.params_types)
571
571
  end
572
572
  end
573
573
 
@@ -640,54 +640,92 @@ module Cassandra
640
640
  f.on_complete do |f|
641
641
  if f.resolved?
642
642
  r = f.value
643
- case r
644
- when Protocol::DetailedErrorResponse
645
- details = r.details
646
- decision = begin
647
- case r.code
648
- when UNAVAILABLE_ERROR_CODE
649
- @retry_policy.unavailable(statement, details[:cl], details[:required], details[:alive], retries)
650
- when WRITE_TIMEOUT_ERROR_CODE
651
- @retry_policy.write_timeout(statement, details[:cl], details[:write_type], details[:blockfor], details[:received], retries)
652
- when READ_TIMEOUT_ERROR_CODE
653
- @retry_policy.read_timeout(statement, details[:cl], details[:blockfor], details[:received], details[:data_present], retries)
654
- when UNPREPARED_ERROR_CODE
655
- cql = statement.cql
656
-
657
- synchronize do
658
- @preparing_statements[host].delete(cql)
659
- @prepared_statements[host].delete(cql)
660
- end
661
643
 
662
- prepare = prepare_statement(host, connection, cql, timeout)
663
- prepare.on_complete do |_|
664
- if prepare.resolved?
665
- request.id = prepare.value
666
- do_send_request_by_plan(host, connection, promise, keyspace, statement, options, request, plan, timeout, errors, hosts)
667
- else
668
- prepare.on_failure do |e|
669
- case e
670
- when Errors::HostError
671
- errors ||= {}
672
- errors[host] = e
673
- execute_by_plan(promise, keyspace, statement, options, request, plan, timeout, errors, hosts)
674
- else
675
- promise.break(e)
676
- end
644
+ begin
645
+ decision = nil
646
+
647
+ case r
648
+ when Protocol::UnavailableErrorResponse
649
+ decision = @retry_policy.unavailable(statement, r.consistency, r.required, r.alive, retries)
650
+ when Protocol::WriteTimeoutErrorResponse
651
+ decision = @retry_policy.write_timeout(statement, r.consistency, r.write_type, r.blockfor, r.received, retries)
652
+ when Protocol::ReadTimeoutErrorResponse
653
+ decision = @retry_policy.read_timeout(statement, r.consistency, r.blockfor, r.received, r.data_present, retries)
654
+ when Protocol::UnpreparedErrorResponse
655
+ cql = statement.cql
656
+
657
+ synchronize do
658
+ @preparing_statements[host].delete(cql)
659
+ @prepared_statements[host].delete(cql)
660
+ end
661
+
662
+ prepare = prepare_statement(host, connection, cql, timeout)
663
+ prepare.on_complete do |_|
664
+ if prepare.resolved?
665
+ request.id = prepare.value
666
+ do_send_request_by_plan(host, connection, promise, keyspace, statement, options, request, plan, timeout, errors, hosts)
667
+ else
668
+ prepare.on_failure do |e|
669
+ case e
670
+ when Errors::HostError
671
+ errors ||= {}
672
+ errors[host] = e
673
+ execute_by_plan(promise, keyspace, statement, options, request, plan, timeout, errors, hosts)
674
+ else
675
+ promise.break(e)
677
676
  end
678
677
  end
679
678
  end
679
+ end
680
+ when Protocol::ErrorResponse
681
+ error = r.to_error(statement)
680
682
 
681
- nil
683
+ case error
684
+ when Errors::HostError
685
+ errors ||= {}
686
+ errors[host] = error
687
+
688
+ case request
689
+ when Protocol::QueryRequest, Protocol::PrepareRequest
690
+ send_request_by_plan(promise, keyspace, statement, options, request, plan, timeout, errors, hosts)
691
+ when Protocol::ExecuteRequest
692
+ execute_by_plan(promise, keyspace, statement, options, request, plan, timeout, errors, hosts)
693
+ when Protocol::BatchRequest
694
+ batch_by_plan(promise, keyspace, statement, options, plan, timeout, errors, hosts)
695
+ end
682
696
  else
683
- promise.break(r.to_error(statement))
684
-
685
- nil
697
+ promise.break(error)
698
+ end
699
+ when Protocol::SetKeyspaceResultResponse
700
+ @keyspace = r.keyspace
701
+ promise.fulfill(Results::Void.new(r.trace_id, keyspace, statement, options, hosts, request.consistency, retries, self, @futures))
702
+ when Protocol::PreparedResultResponse
703
+ cql = request.cql
704
+ synchronize do
705
+ @prepared_statements[host][cql] = r.id
706
+ @preparing_statements[host].delete(cql)
686
707
  end
687
- rescue => e
688
- promise.break(e)
689
708
 
690
- nil
709
+ promise.fulfill(Statements::Prepared.new(cql, r.metadata, r.result_metadata, r.trace_id, keyspace, statement, options, hosts, request.consistency, retries, self, @futures, @schema))
710
+ when Protocol::RawRowsResultResponse
711
+ r.materialize(statement.result_metadata)
712
+ promise.fulfill(Results::Paged.new(r.rows, r.paging_state, r.trace_id, keyspace, statement, options, hosts, request.consistency, retries, self, @futures))
713
+ when Protocol::RowsResultResponse
714
+ promise.fulfill(Results::Paged.new(r.rows, r.paging_state, r.trace_id, keyspace, statement, options, hosts, request.consistency, retries, self, @futures))
715
+ when Protocol::SchemaChangeResultResponse
716
+ @schema.delete_keyspace(r.keyspace) if r.change == 'DROPPED' && r.table.empty?
717
+
718
+ @logger.debug('Waiting for schema to propagate to all hosts after a change')
719
+ wait_for_schema_agreement(connection, @reconnection_policy.schedule).on_complete do |f|
720
+ unless f.resolved?
721
+ f.on_failure do |e|
722
+ @logger.error("Schema agreement failure (#{e.class.name}: #{e.message})")
723
+ end
724
+ end
725
+ promise.fulfill(Results::Void.new(r.trace_id, keyspace, statement, options, hosts, request.consistency, retries, self, @futures))
726
+ end
727
+ else
728
+ promise.fulfill(Results::Void.new(r.trace_id, keyspace, statement, options, hosts, request.consistency, retries, self, @futures))
691
729
  end
692
730
 
693
731
  if decision
@@ -703,53 +741,8 @@ module Cassandra
703
741
  promise.break(r.to_error(statement))
704
742
  end
705
743
  end
706
- when Protocol::ErrorResponse
707
- case r.code
708
- when OVERLOADED_ERROR_CODE, SERVER_ERROR_CODE, BOOTSTRAPPING_ERROR_CODE
709
- errors ||= {}
710
- errors[host] = r.to_error(statement)
711
-
712
- case request
713
- when Protocol::QueryRequest, Protocol::PrepareRequest
714
- send_request_by_plan(promise, keyspace, statement, options, request, plan, timeout, errors, hosts)
715
- when Protocol::ExecuteRequest
716
- execute_by_plan(promise, keyspace, statement, options, request, plan, timeout, errors, hosts)
717
- when Protocol::BatchRequest
718
- batch_by_plan(promise, keyspace, statement, options, plan, timeout, errors, hosts)
719
- end
720
- else
721
- promise.break(r.to_error(statement))
722
- end
723
- when Protocol::SetKeyspaceResultResponse
724
- @keyspace = r.keyspace
725
- promise.fulfill(Results::Void.new(r.trace_id, keyspace, statement, options, hosts, request.consistency, retries, self, @futures))
726
- when Protocol::PreparedResultResponse
727
- cql = request.cql
728
- synchronize do
729
- @prepared_statements[host][cql] = r.id
730
- @preparing_statements[host].delete(cql)
731
- end
732
-
733
- promise.fulfill(Statements::Prepared.new(cql, r.metadata, r.result_metadata, r.trace_id, keyspace, statement, options, hosts, request.consistency, retries, self, @futures, @schema))
734
- when Protocol::RawRowsResultResponse
735
- r.materialize(statement.result_metadata)
736
- promise.fulfill(Results::Paged.new(r.rows, r.paging_state, r.trace_id, keyspace, statement, options, hosts, request.consistency, retries, self, @futures))
737
- when Protocol::RowsResultResponse
738
- promise.fulfill(Results::Paged.new(r.rows, r.paging_state, r.trace_id, keyspace, statement, options, hosts, request.consistency, retries, self, @futures))
739
- when Protocol::SchemaChangeResultResponse
740
- @schema.delete_keyspace(r.keyspace) if r.change == 'DROPPED' && r.table.empty?
741
-
742
- @logger.debug('Waiting for schema to propagate to all hosts after a change')
743
- wait_for_schema_agreement(connection, @reconnection_policy.schedule).on_complete do |f|
744
- unless f.resolved?
745
- f.on_failure do |e|
746
- @logger.error("Schema agreement failure (#{e.class.name}: #{e.message})")
747
- end
748
- end
749
- promise.fulfill(Results::Void.new(r.trace_id, keyspace, statement, options, hosts, request.consistency, retries, self, @futures))
750
- end
751
- else
752
- promise.fulfill(Results::Void.new(r.trace_id, keyspace, statement, options, hosts, request.consistency, retries, self, @futures))
744
+ rescue => e
745
+ promise.break(e)
753
746
  end
754
747
  else
755
748
  f.on_failure do |e|
@@ -820,7 +813,7 @@ module Cassandra
820
813
 
821
814
  return pending_switch || Ione::Future.resolved if pending_keyspace == keyspace
822
815
 
823
- request = Protocol::QueryRequest.new("USE #{Util.escape_name(keyspace)}", nil, nil, :one)
816
+ request = Protocol::QueryRequest.new("USE #{Util.escape_name(keyspace)}", EMPTY_LIST, EMPTY_LIST, :one)
824
817
 
825
818
  f = connection.send_request(request, timeout).map do |r|
826
819
  case r
@@ -152,11 +152,12 @@ module Cassandra
152
152
 
153
153
  private
154
154
 
155
- SELECT_LOCAL = Protocol::QueryRequest.new('SELECT rack, data_center, host_id, release_version, tokens, partitioner FROM system.local', nil, nil, :one)
156
- SELECT_PEERS = Protocol::QueryRequest.new('SELECT peer, rack, data_center, host_id, rpc_address, release_version, tokens FROM system.peers', nil, nil, :one)
157
- SELECT_KEYSPACES = Protocol::QueryRequest.new('SELECT * FROM system.schema_keyspaces', nil, nil, :one)
158
- SELECT_TABLES = Protocol::QueryRequest.new('SELECT * FROM system.schema_columnfamilies', nil, nil, :one)
159
- SELECT_COLUMNS = Protocol::QueryRequest.new('SELECT * FROM system.schema_columns', nil, nil, :one)
155
+ SELECT_LOCAL = Protocol::QueryRequest.new('SELECT rack, data_center, host_id, release_version, tokens, partitioner FROM system.local', EMPTY_LIST, EMPTY_LIST, :one)
156
+ SELECT_PEERS = Protocol::QueryRequest.new('SELECT peer, rack, data_center, host_id, rpc_address, release_version, tokens FROM system.peers', EMPTY_LIST, EMPTY_LIST, :one)
157
+ SELECT_KEYSPACES = Protocol::QueryRequest.new('SELECT * FROM system.schema_keyspaces', EMPTY_LIST, EMPTY_LIST, :one)
158
+ SELECT_TABLES = Protocol::QueryRequest.new('SELECT * FROM system.schema_columnfamilies', EMPTY_LIST, EMPTY_LIST, :one)
159
+ SELECT_COLUMNS = Protocol::QueryRequest.new('SELECT * FROM system.schema_columns', EMPTY_LIST, EMPTY_LIST, :one)
160
+ SELECT_TYPES = Protocol::QueryRequest.new('SELECT * FROM system.schema_usertypes', EMPTY_LIST, EMPTY_LIST, :one)
160
161
 
161
162
  def reconnect_async(schedule)
162
163
  timeout = schedule.next
@@ -314,9 +315,9 @@ module Cassandra
314
315
 
315
316
  return Ione::Future.failed(Errors::ClientError.new('Not connected')) if connection.nil?
316
317
 
317
- keyspaces = send_select_request(connection, Protocol::QueryRequest.new("SELECT * FROM system.schema_keyspaces WHERE keyspace_name = '%s'" % keyspace, nil, nil, :one))
318
- tables = send_select_request(connection, Protocol::QueryRequest.new("SELECT * FROM system.schema_columnfamilies WHERE keyspace_name = '%s'" % keyspace, nil, nil, :one))
319
- columns = send_select_request(connection, Protocol::QueryRequest.new("SELECT * FROM system.schema_columns WHERE keyspace_name = '%s'" % keyspace, nil, nil, :one))
318
+ keyspaces = send_select_request(connection, Protocol::QueryRequest.new("SELECT * FROM system.schema_keyspaces WHERE keyspace_name = '%s'" % keyspace, EMPTY_LIST, EMPTY_LIST, :one))
319
+ tables = send_select_request(connection, Protocol::QueryRequest.new("SELECT * FROM system.schema_columnfamilies WHERE keyspace_name = '%s'" % keyspace, EMPTY_LIST, EMPTY_LIST, :one))
320
+ columns = send_select_request(connection, Protocol::QueryRequest.new("SELECT * FROM system.schema_columns WHERE keyspace_name = '%s'" % keyspace, EMPTY_LIST, EMPTY_LIST, :one))
320
321
 
321
322
  Ione::Future.all(keyspaces, tables, columns).map do |(keyspaces, tables, columns)|
322
323
  host = @registry.host(connection.host)
@@ -369,8 +370,8 @@ module Cassandra
369
370
  return Ione::Future.failed(Errors::ClientError.new('Not connected')) if connection.nil?
370
371
 
371
372
  params = [keyspace, table]
372
- tables = send_select_request(connection, Protocol::QueryRequest.new("SELECT * FROM system.schema_columnfamilies WHERE keyspace_name = '%s' AND columnfamily_name = '%s'" % params, nil, nil, :one))
373
- columns = send_select_request(connection, Protocol::QueryRequest.new("SELECT * FROM system.schema_columns WHERE keyspace_name = '%s' AND columnfamily_name = '%s'" % params, nil, nil, :one))
373
+ tables = send_select_request(connection, Protocol::QueryRequest.new("SELECT * FROM system.schema_columnfamilies WHERE keyspace_name = '%s' AND columnfamily_name = '%s'" % params, EMPTY_LIST, EMPTY_LIST, :one))
374
+ columns = send_select_request(connection, Protocol::QueryRequest.new("SELECT * FROM system.schema_columns WHERE keyspace_name = '%s' AND columnfamily_name = '%s'" % params, EMPTY_LIST, EMPTY_LIST, :one))
374
375
 
375
376
  Ione::Future.all(tables, columns).map do |(tables, columns)|
376
377
  host = @registry.host(connection.host)
@@ -541,7 +542,7 @@ module Cassandra
541
542
  if ip == connection.host
542
543
  request = SELECT_LOCAL
543
544
  else
544
- request = Protocol::QueryRequest.new("SELECT rack, data_center, host_id, rpc_address, release_version, tokens FROM system.peers WHERE peer = '%s'" % address, nil, nil, :one)
545
+ request = Protocol::QueryRequest.new("SELECT rack, data_center, host_id, rpc_address, release_version, tokens FROM system.peers WHERE peer = '%s'" % address, EMPTY_LIST, EMPTY_LIST, :one)
545
546
  end
546
547
 
547
548
  send_select_request(connection, request).map do |rows|
@@ -661,12 +662,12 @@ Control connection failed and is unlikely to recover.
661
662
 
662
663
  futures = ::Array.new
663
664
 
664
- refresh_keyspaces.each do |(keyspace, _)|
665
+ refresh_keyspaces.each_key do |keyspace|
665
666
  futures << refresh_keyspace_async_maybe_retry(keyspace)
666
667
  end
667
668
 
668
669
  refresh_tables.each do |(keyspace, tables)|
669
- tables.each do |(table, _)|
670
+ tables.each_key do |table|
670
671
  futures << refresh_table_async_maybe_retry(keyspace, table)
671
672
  end
672
673
  end
@@ -65,15 +65,7 @@ module Cassandra
65
65
 
66
66
  # @return [String] a cql representation of this column
67
67
  def to_cql
68
- type = case @type
69
- when Array
70
- type, *args = @type
71
- "#{type.to_s}<#{args.map(&:to_s).join(', ')}>"
72
- else
73
- @type.to_s
74
- end
75
-
76
- cql = "#{@name} #{type}"
68
+ cql = "#{@name} #{Util.type_to_cql(@type)}"
77
69
  cql << ' static' if @static
78
70
  cql
79
71
  end
@@ -30,6 +30,8 @@ module Cassandra
30
30
  attr_reader :page_size
31
31
  # @return [Numeric] request timeout interval
32
32
  attr_reader :timeout
33
+ # @return [Array] positional arguments for the statement
34
+ attr_reader :arguments
33
35
 
34
36
  # @return [String] paging state
35
37
  #
@@ -53,6 +55,7 @@ module Cassandra
53
55
  timeout = options[:timeout]
54
56
  serial_consistency = options[:serial_consistency]
55
57
  paging_state = options[:paging_state]
58
+ arguments = options[:arguments]
56
59
 
57
60
  Util.assert_one_of(CONSISTENCIES, consistency) { ":consistency must be one of #{CONSISTENCIES.inspect}, #{consistency.inspect} given" }
58
61
 
@@ -75,12 +78,19 @@ module Cassandra
75
78
  Util.assert_not_empty(paging_state) { ":paging_state must not be empty" }
76
79
  end
77
80
 
81
+ if arguments.nil?
82
+ arguments = EMPTY_LIST
83
+ else
84
+ Util.assert_instance_of(::Array, arguments) { ":arguments must be an Array, #{arguments.inspect} given" }
85
+ end
86
+
78
87
  @consistency = consistency
79
88
  @page_size = page_size
80
89
  @trace = !!trace
81
90
  @timeout = timeout
82
91
  @serial_consistency = serial_consistency
83
92
  @paging_state = paging_state
93
+ @arguments = arguments
84
94
  end
85
95
 
86
96
  # @return [Boolean] whether request tracing was enabled
@@ -88,6 +98,18 @@ module Cassandra
88
98
  @trace
89
99
  end
90
100
 
101
+ def eql?(other)
102
+ other.is_a?(Options) &&
103
+ other.consistency == @consistency &&
104
+ other.page_size == @page_size &&
105
+ other.trace? == @trace &&
106
+ other.timeout == @timeout &&
107
+ other.serial_consistency == @serial_consistency &&
108
+ other.paging_state == @paging_state &&
109
+ other.arguments == @arguments
110
+ end
111
+ alias :== :eql?
112
+
91
113
  # @private
92
114
  def override(*options)
93
115
  merged = options.unshift(to_h).inject do |base, opts|
@@ -106,7 +128,8 @@ module Cassandra
106
128
  :page_size => @page_size,
107
129
  :trace => @trace,
108
130
  :timeout => @timeout,
109
- :serial_consistency => @serial_consistency
131
+ :serial_consistency => @serial_consistency,
132
+ :arguments => @arguments || EMPTY_LIST
110
133
  }
111
134
  end
112
135
  end