yugabyte-ycql-driver 3.2.3.1
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +7 -0
- data/.yardopts +13 -0
- data/README.md +242 -0
- data/ext/cassandra_murmur3/cassandra_murmur3.c +178 -0
- data/ext/cassandra_murmur3/extconf.rb +2 -0
- data/lib/cassandra/address_resolution.rb +36 -0
- data/lib/cassandra/address_resolution/policies.rb +2 -0
- data/lib/cassandra/address_resolution/policies/ec2_multi_region.rb +56 -0
- data/lib/cassandra/address_resolution/policies/none.rb +35 -0
- data/lib/cassandra/aggregate.rb +123 -0
- data/lib/cassandra/argument.rb +51 -0
- data/lib/cassandra/attr_boolean.rb +33 -0
- data/lib/cassandra/auth.rb +100 -0
- data/lib/cassandra/auth/providers.rb +17 -0
- data/lib/cassandra/auth/providers/password.rb +65 -0
- data/lib/cassandra/cassandra_logger.rb +80 -0
- data/lib/cassandra/cluster.rb +331 -0
- data/lib/cassandra/cluster/client.rb +1612 -0
- data/lib/cassandra/cluster/connection_pool.rb +78 -0
- data/lib/cassandra/cluster/connector.rb +372 -0
- data/lib/cassandra/cluster/control_connection.rb +962 -0
- data/lib/cassandra/cluster/failed_connection.rb +35 -0
- data/lib/cassandra/cluster/metadata.rb +142 -0
- data/lib/cassandra/cluster/options.rb +145 -0
- data/lib/cassandra/cluster/registry.rb +284 -0
- data/lib/cassandra/cluster/schema.rb +405 -0
- data/lib/cassandra/cluster/schema/cql_type_parser.rb +112 -0
- data/lib/cassandra/cluster/schema/fetchers.rb +1627 -0
- data/lib/cassandra/cluster/schema/fqcn_type_parser.rb +175 -0
- data/lib/cassandra/cluster/schema/partitioners.rb +21 -0
- data/lib/cassandra/cluster/schema/partitioners/murmur3.rb +45 -0
- data/lib/cassandra/cluster/schema/partitioners/ordered.rb +37 -0
- data/lib/cassandra/cluster/schema/partitioners/random.rb +37 -0
- data/lib/cassandra/cluster/schema/replication_strategies.rb +21 -0
- data/lib/cassandra/cluster/schema/replication_strategies/network_topology.rb +102 -0
- data/lib/cassandra/cluster/schema/replication_strategies/none.rb +39 -0
- data/lib/cassandra/cluster/schema/replication_strategies/simple.rb +44 -0
- data/lib/cassandra/column.rb +66 -0
- data/lib/cassandra/column_container.rb +326 -0
- data/lib/cassandra/compression.rb +69 -0
- data/lib/cassandra/compression/compressors/lz4.rb +73 -0
- data/lib/cassandra/compression/compressors/snappy.rb +69 -0
- data/lib/cassandra/custom_data.rb +53 -0
- data/lib/cassandra/driver.rb +260 -0
- data/lib/cassandra/errors.rb +784 -0
- data/lib/cassandra/execution/info.rb +69 -0
- data/lib/cassandra/execution/options.rb +267 -0
- data/lib/cassandra/execution/profile.rb +153 -0
- data/lib/cassandra/execution/profile_manager.rb +71 -0
- data/lib/cassandra/execution/trace.rb +192 -0
- data/lib/cassandra/executors.rb +113 -0
- data/lib/cassandra/function.rb +156 -0
- data/lib/cassandra/function_collection.rb +85 -0
- data/lib/cassandra/future.rb +794 -0
- data/lib/cassandra/host.rb +102 -0
- data/lib/cassandra/index.rb +118 -0
- data/lib/cassandra/keyspace.rb +473 -0
- data/lib/cassandra/listener.rb +87 -0
- data/lib/cassandra/load_balancing.rb +121 -0
- data/lib/cassandra/load_balancing/policies.rb +20 -0
- data/lib/cassandra/load_balancing/policies/dc_aware_round_robin.rb +172 -0
- data/lib/cassandra/load_balancing/policies/round_robin.rb +141 -0
- data/lib/cassandra/load_balancing/policies/token_aware.rb +149 -0
- data/lib/cassandra/load_balancing/policies/white_list.rb +100 -0
- data/lib/cassandra/materialized_view.rb +92 -0
- data/lib/cassandra/null_logger.rb +56 -0
- data/lib/cassandra/protocol.rb +102 -0
- data/lib/cassandra/protocol/coder.rb +1085 -0
- data/lib/cassandra/protocol/cql_byte_buffer.rb +418 -0
- data/lib/cassandra/protocol/cql_protocol_handler.rb +448 -0
- data/lib/cassandra/protocol/request.rb +41 -0
- data/lib/cassandra/protocol/requests/auth_response_request.rb +51 -0
- data/lib/cassandra/protocol/requests/batch_request.rb +117 -0
- data/lib/cassandra/protocol/requests/credentials_request.rb +51 -0
- data/lib/cassandra/protocol/requests/execute_request.rb +122 -0
- data/lib/cassandra/protocol/requests/options_request.rb +39 -0
- data/lib/cassandra/protocol/requests/prepare_request.rb +59 -0
- data/lib/cassandra/protocol/requests/query_request.rb +112 -0
- data/lib/cassandra/protocol/requests/register_request.rb +38 -0
- data/lib/cassandra/protocol/requests/startup_request.rb +49 -0
- data/lib/cassandra/protocol/requests/void_query_request.rb +24 -0
- data/lib/cassandra/protocol/response.rb +28 -0
- data/lib/cassandra/protocol/responses/already_exists_error_response.rb +50 -0
- data/lib/cassandra/protocol/responses/auth_challenge_response.rb +36 -0
- data/lib/cassandra/protocol/responses/auth_success_response.rb +36 -0
- data/lib/cassandra/protocol/responses/authenticate_response.rb +36 -0
- data/lib/cassandra/protocol/responses/error_response.rb +142 -0
- data/lib/cassandra/protocol/responses/event_response.rb +30 -0
- data/lib/cassandra/protocol/responses/function_failure_error_response.rb +52 -0
- data/lib/cassandra/protocol/responses/prepared_result_response.rb +62 -0
- data/lib/cassandra/protocol/responses/raw_rows_result_response.rb +59 -0
- data/lib/cassandra/protocol/responses/read_failure_error_response.rb +71 -0
- data/lib/cassandra/protocol/responses/read_timeout_error_response.rb +61 -0
- data/lib/cassandra/protocol/responses/ready_response.rb +43 -0
- data/lib/cassandra/protocol/responses/result_response.rb +42 -0
- data/lib/cassandra/protocol/responses/rows_result_response.rb +39 -0
- data/lib/cassandra/protocol/responses/schema_change_event_response.rb +73 -0
- data/lib/cassandra/protocol/responses/schema_change_result_response.rb +70 -0
- data/lib/cassandra/protocol/responses/set_keyspace_result_response.rb +37 -0
- data/lib/cassandra/protocol/responses/status_change_event_response.rb +39 -0
- data/lib/cassandra/protocol/responses/supported_response.rb +36 -0
- data/lib/cassandra/protocol/responses/topology_change_event_response.rb +33 -0
- data/lib/cassandra/protocol/responses/unavailable_error_response.rb +58 -0
- data/lib/cassandra/protocol/responses/unprepared_error_response.rb +48 -0
- data/lib/cassandra/protocol/responses/void_result_response.rb +34 -0
- data/lib/cassandra/protocol/responses/write_failure_error_response.rb +73 -0
- data/lib/cassandra/protocol/responses/write_timeout_error_response.rb +63 -0
- data/lib/cassandra/protocol/v1.rb +326 -0
- data/lib/cassandra/protocol/v3.rb +358 -0
- data/lib/cassandra/protocol/v4.rb +478 -0
- data/lib/cassandra/reconnection.rb +49 -0
- data/lib/cassandra/reconnection/policies.rb +20 -0
- data/lib/cassandra/reconnection/policies/constant.rb +46 -0
- data/lib/cassandra/reconnection/policies/exponential.rb +79 -0
- data/lib/cassandra/result.rb +276 -0
- data/lib/cassandra/retry.rb +154 -0
- data/lib/cassandra/retry/policies.rb +21 -0
- data/lib/cassandra/retry/policies/default.rb +53 -0
- data/lib/cassandra/retry/policies/downgrading_consistency.rb +73 -0
- data/lib/cassandra/retry/policies/fallthrough.rb +39 -0
- data/lib/cassandra/session.rb +270 -0
- data/lib/cassandra/statement.rb +32 -0
- data/lib/cassandra/statements.rb +23 -0
- data/lib/cassandra/statements/batch.rb +146 -0
- data/lib/cassandra/statements/bound.rb +65 -0
- data/lib/cassandra/statements/prepared.rb +235 -0
- data/lib/cassandra/statements/simple.rb +118 -0
- data/lib/cassandra/statements/void.rb +38 -0
- data/lib/cassandra/table.rb +240 -0
- data/lib/cassandra/time.rb +103 -0
- data/lib/cassandra/time_uuid.rb +78 -0
- data/lib/cassandra/timestamp_generator.rb +37 -0
- data/lib/cassandra/timestamp_generator/simple.rb +38 -0
- data/lib/cassandra/timestamp_generator/ticking_on_duplicate.rb +58 -0
- data/lib/cassandra/trigger.rb +67 -0
- data/lib/cassandra/tuple.rb +131 -0
- data/lib/cassandra/types.rb +1704 -0
- data/lib/cassandra/udt.rb +443 -0
- data/lib/cassandra/util.rb +464 -0
- data/lib/cassandra/uuid.rb +110 -0
- data/lib/cassandra/uuid/generator.rb +212 -0
- data/lib/cassandra/version.rb +21 -0
- data/lib/datastax/cassandra.rb +47 -0
- data/lib/ycql.rb +842 -0
- metadata +243 -0
checksums.yaml
ADDED
@@ -0,0 +1,7 @@
|
|
1
|
+
---
|
2
|
+
SHA1:
|
3
|
+
metadata.gz: 0420f05d4a063e020526b1869f3c2a4bf61b7eb7
|
4
|
+
data.tar.gz: 594ee209ed49626772e68fcbe0b9331f1e0d8412
|
5
|
+
SHA512:
|
6
|
+
metadata.gz: ef47feef7a8915c1bc87ef13f21ebc07b01520dc67690cdaa98ba8e7d691c428a9ef6a2c7c52d0e1607e910e82fbc86a7a630f4a4b681f7e80fc58922e77bae8
|
7
|
+
data.tar.gz: e298797101462cd87d89d0408204f34ea8dca108e2fd4ebe0ec34255d2d6bdc71d02eed339a37a161799867eddb27c3ca5b7c375dad88f666d01be1c1f67f428
|
data/.yardopts
ADDED
@@ -0,0 +1,13 @@
|
|
1
|
+
--no-private
|
2
|
+
--markup markdown
|
3
|
+
--type-tag expected_errors:"Expected Errors"
|
4
|
+
--tag jira_ticket:"JIRA Ticket"
|
5
|
+
--type-tag expected_result:"Expected Result"
|
6
|
+
--tag test_assumptions:"Test Assumptions"
|
7
|
+
--tag test_category:"Test Category"
|
8
|
+
|
9
|
+
lib/**/*.rb
|
10
|
+
integration/**/*.rb
|
11
|
+
-- README
|
12
|
+
|
13
|
+
load_plugins: true
|
data/README.md
ADDED
@@ -0,0 +1,242 @@
|
|
1
|
+
# YugaByte Ruby Driver for YugaByte DB's Cassandra compatible YCQL API
|
2
|
+
|
3
|
+
*If you're reading this on GitHub, please note that this is the readme for the development version and that some
|
4
|
+
features described here might not yet have been released. You can view the documentation for the latest released
|
5
|
+
version [here](http://docs.datastax.com/en/developer/ruby-driver/latest).*
|
6
|
+
|
7
|
+
[![Build Status](https://travis-ci.org/datastax/ruby-driver.svg?branch=master)](https://travis-ci.org/datastax/ruby-driver)
|
8
|
+
|
9
|
+
A Ruby client driver for YugaByte DB's Cassandra compatible YCQL API. This driver works exclusively with
|
10
|
+
the Cassandra Query Language version 3 (CQL3) and Cassandra's native protocol.
|
11
|
+
|
12
|
+
- Code: https://github.com/yugabyte/cassandra-ruby-driver
|
13
|
+
- Docs: http://docs.datastax.com/en/developer/ruby-driver
|
14
|
+
- Mailing List: https://groups.google.com/a/lists.datastax.com/forum/#!forum/ruby-driver-user
|
15
|
+
|
16
|
+
This driver is based on [the cql-rb gem](https://github.com/iconara/cql-rb) by [Theo Hultberg](https://github.com/iconara) and we added support for:
|
17
|
+
|
18
|
+
* [Asynchronous execution](http://docs.datastax.com/en/developer/ruby-driver/3.1/features/asynchronous_io/)
|
19
|
+
* One-off, [prepared](http://docs.datastax.com/en/developer/ruby-driver/3.1/features/basics/prepared_statements/) and [batch statements](http://docs.datastax.com/en/developer/ruby-driver/3.1/features/basics/batch_statements/)
|
20
|
+
* Automatic peer discovery and cluster metadata with [support for change notifications](http://docs.datastax.com/en/developer/ruby-driver/3.1/features/state_listeners/)
|
21
|
+
* Various [load-balancing](http://docs.datastax.com/en/developer/ruby-driver/3.1/features/load_balancing/), [retry](http://docs.datastax.com/en/developer/ruby-driver/3.1/features/retry_policies/) and [reconnection](http://docs.datastax.com/en/developer/ruby-driver/3.1/features/reconnection/) policies with [ability to write your own](http://docs.datastax.com/en/developer/ruby-driver/3.1/features/load_balancing/implementing_a_policy/)
|
22
|
+
* [SSL encryption](http://docs.datastax.com/en/developer/ruby-driver/3.1/features/security/ssl_encryption/)
|
23
|
+
* [Flexible and robust error handling](http://docs.datastax.com/en/developer/ruby-driver/3.1/features/error_handling/)
|
24
|
+
* [Per-request execution information and tracing](http://docs.datastax.com/en/developer/ruby-driver/3.1/features/debugging/)
|
25
|
+
* [Configurable address resolution](http://docs.datastax.com/en/developer/ruby-driver/3.1/features/address_resolution/)
|
26
|
+
|
27
|
+
[Check out the slides from Ruby Driver Explained](https://speakerdeck.com/avalanche123/ruby-driver-explained) for a detailed overview of the Ruby Driver architecture.
|
28
|
+
|
29
|
+
## Compatibility
|
30
|
+
|
31
|
+
This driver works exclusively with the Cassandra Query Language v3 (CQL3) and Cassandra's native protocol.
|
32
|
+
|
33
|
+
__Note__: Rubinius is not supported.
|
34
|
+
|
35
|
+
__Note__: Big-endian systems are not supported.
|
36
|
+
|
37
|
+
## Quick start
|
38
|
+
|
39
|
+
```ruby
|
40
|
+
require 'ycql'
|
41
|
+
|
42
|
+
cluster = Cassandra.cluster # connects to localhost by default
|
43
|
+
|
44
|
+
cluster.each_host do |host| # automatically discovers all peers
|
45
|
+
puts "Host #{host.ip}: id=#{host.id} datacenter=#{host.datacenter} rack=#{host.rack}"
|
46
|
+
end
|
47
|
+
|
48
|
+
keyspace = 'system_schema'
|
49
|
+
session = cluster.connect(keyspace) # create session, optionally scoped to a keyspace, to execute queries
|
50
|
+
|
51
|
+
future = session.execute_async('SELECT keyspace_name, table_name FROM tables') # fully asynchronous api
|
52
|
+
future.on_success do |rows|
|
53
|
+
rows.each do |row|
|
54
|
+
puts "The keyspace #{row['keyspace_name']} has a table called #{row['table_name']}"
|
55
|
+
end
|
56
|
+
end
|
57
|
+
future.join
|
58
|
+
```
|
59
|
+
|
60
|
+
__Note__: The host you specify is just a seed node, the driver will automatically discover all peers in the cluster.
|
61
|
+
|
62
|
+
Read more:
|
63
|
+
|
64
|
+
* [`Cassandra.cluster` options](http://docs.datastax.com/en/developer/ruby-driver/3.1/api/cassandra/#cluster-class_method)
|
65
|
+
* [`Session#execute_async` options](http://docs.datastax.com/en/developer/ruby-driver/3.1/api/cassandra/session/#execute_async-instance_method)
|
66
|
+
* [Usage documentation](http://docs.datastax.com/en/developer/ruby-driver/3.1/features)
|
67
|
+
|
68
|
+
## Installation
|
69
|
+
|
70
|
+
Install via rubygems
|
71
|
+
|
72
|
+
```bash
|
73
|
+
gem install yugabyte-ycql-driver
|
74
|
+
```
|
75
|
+
|
76
|
+
Install via Gemfile
|
77
|
+
|
78
|
+
```ruby
|
79
|
+
gem 'yugabyte-ycql-driver'
|
80
|
+
```
|
81
|
+
|
82
|
+
__Note__: if you want to use compression you should also install [snappy](http://rubygems.org/gems/snappy) or [lz4-ruby](http://rubygems.org/gems/lz4-ruby). [Read more about compression.](http://docs.datastax.com/en/developer/ruby-driver/3.1/features/#compression)
|
83
|
+
|
84
|
+
|
85
|
+
## Upgrading from cql-rb
|
86
|
+
|
87
|
+
Some of the new features added to the driver have unfortunately led to changes in the original cql-rb API.
|
88
|
+
In the examples directory, you can find [an example of how to wrap the ruby driver to achieve almost complete
|
89
|
+
interface parity with cql-rb](https://github.com/datastax/ruby-driver/blob/v3.2.3/examples/cql-rb-wrapper.rb)
|
90
|
+
to assist you with gradual upgrade.
|
91
|
+
|
92
|
+
## What's new in v3.2
|
93
|
+
This minor release adds support for MRI 2.4.x and also contains a few miscellaneous defect fixes. It also removes
|
94
|
+
support for Ruby versions prior to 2.2. This was already officially the case, but the minimum version limit is
|
95
|
+
now enforced.
|
96
|
+
|
97
|
+
See the [changelog](https://github.com/datastax/ruby-driver/blob/v3.2.3/CHANGELOG.md) for more information on all
|
98
|
+
changes in this version and past versions.
|
99
|
+
|
100
|
+
## What's new in v3.1
|
101
|
+
|
102
|
+
This minor release introduces features and fixes around resiliency, schema metadata, usability, and performance. One
|
103
|
+
of the most user-impacting of these is the introduction of
|
104
|
+
[execution profiles](http://docs.datastax.com/en/developer/ruby-driver/3.1/features/basics/execution_profiles).
|
105
|
+
Execution profiles allow you to group various execution options into a 'profile' and you reference the desired
|
106
|
+
profile at execution time. Get the scoop
|
107
|
+
[here](http://docs.datastax.com/en/developer/ruby-driver/3.1/features/basics/execution_profiles).
|
108
|
+
|
109
|
+
## What's new in v3.0
|
110
|
+
|
111
|
+
### Features:
|
112
|
+
|
113
|
+
* Add support for Apache Cassandra native protocol v4
|
114
|
+
* Add support for smallint, tinyint, date (`Cassandra::Date`) and time (`Cassandra::Time`) data types.
|
115
|
+
* Include schema metadata for User Defined Functions and User Defined Aggregates.
|
116
|
+
* Augment the `Cassandra::Table` object to expose many more attributes: `id`, `options`, `keyspace`, `partition_key`, `clustering_columns`, and `clustering_order`. This makes it significantly easier to write administration scripts that report various attributes of your schema, which may help to highlight areas for improvement.
|
117
|
+
* Include client ip addresses in request traces, only on Cassandra 3.x.
|
118
|
+
* Add new retry policy decision `Cassandra::Retry::Policy#try_next_host`.
|
119
|
+
* Support specifying statement idempotence with the new `idempotent` option when executing.
|
120
|
+
* Support sending custom payloads when preparing or executing statements using the new `payload` option.
|
121
|
+
* Expose custom payloads received with responses on server exceptions and `Cassandra::Execution::Info` instances.
|
122
|
+
* Expose server warnings on server exceptions and `Cassandra::Execution::Info` instances.
|
123
|
+
* Add `connections_per_local_node`, `connections_per_remote_node`, `requests_per_connection` cluster configuration options to tune parallel query execution and resource usage.
|
124
|
+
* Add `Cassandra::Logger` class to make it easy for users to enable debug logging in the client.
|
125
|
+
* Add `protocol_version` configuration option to allow the user to force the protocol version to use for communication with nodes.
|
126
|
+
* Add support for materialized views and indexes in the schema metadata.
|
127
|
+
* Support the `ReadError`, `WriteError`, and `FunctionCallError` Cassandra error responses introduced in Cassandra 2.2.
|
128
|
+
* Add support for unset variables in bound statements.
|
129
|
+
* Support DSE security (`DseAuthenticator`, configured for LDAP).
|
130
|
+
* Add a timeout option to `Cassandra::Future#get`.
|
131
|
+
|
132
|
+
### Breaking Changes from 2.x:
|
133
|
+
|
134
|
+
* `Cassandra::Future#join` is now an alias to Cassandra::Future#get and will raise an error if the future is resolved with one.
|
135
|
+
* Default consistency level is now LOCAL_ONE.
|
136
|
+
* Enable tcp no-delay by default.
|
137
|
+
* Unavailable errors are retried on the next host in the load balancing plan by default.
|
138
|
+
* Statement execution no longer retried on timeouts, unless the statement is marked as idempotent in the call to `Cassandra::Session#execute*` or when creating a `Cassandra::Statement` object.
|
139
|
+
* `Cassandra::Statements::Batch#add` and `Cassandra::Session#execute*` signatures have changed in how one specifies query parameters. Specify the query parameters array as the value of the arguments key:
|
140
|
+
|
141
|
+
```ruby
|
142
|
+
batch.add(query, ['val1', 'val2'])
|
143
|
+
# becomes
|
144
|
+
batch.add(query, arguments: ['val1', 'val2'])
|
145
|
+
|
146
|
+
batch.add(query, {p1: 'val1'})
|
147
|
+
# becomes
|
148
|
+
batch.add(query, arguments: {p1: 'val1'})
|
149
|
+
```
|
150
|
+
* The Datacenter-aware load balancing policy (`Cassandra::LoadBalancing::Policies::DCAwareRoundRobin`) defaults to using
|
151
|
+
nodes in the local DC only. In prior releases, the policy would fall back to remote nodes after exhausting local nodes.
|
152
|
+
Specify a positive value (or nil for unlimited) for `max_remote_hosts_to_use` when initializing the policy to allow remote node use.
|
153
|
+
* Unspecified variables in statements previously resulted in an exception. Now they are essentially ignored or treated as null.
|
154
|
+
|
155
|
+
## Code examples
|
156
|
+
|
157
|
+
The DataStax Ruby Driver uses the awesome [Cucumber Framework](http://cukes.info/) for
|
158
|
+
both end-to-end, or acceptance, testing and constructing documentation. All of the
|
159
|
+
features supported by the driver have appropriate acceptance tests with easy-to-copy code
|
160
|
+
examples in the `features/` directory.
|
161
|
+
|
162
|
+
## Running tests
|
163
|
+
|
164
|
+
If you don't feel like reading through the following instructions on how to run
|
165
|
+
ruby-driver tests, feel free to [check out .travis.yml for the entire build code](https://github.com/datastax/ruby-driver/blob/v3.2.3/.travis.yml).
|
166
|
+
|
167
|
+
* Check out the driver codebase and install test dependencies:
|
168
|
+
|
169
|
+
```bash
|
170
|
+
git clone https://github.com/yugabyte/cassandra-ruby-driver.git
|
171
|
+
cd ruby-driver
|
172
|
+
bundle install --without docs
|
173
|
+
```
|
174
|
+
|
175
|
+
* [Install ccm](http://www.datastax.com/dev/blog/ccm-a-development-tool-for-creating-local-cassandra-clusters)
|
176
|
+
|
177
|
+
* Run tests against different versions of Cassandra:
|
178
|
+
|
179
|
+
```bash
|
180
|
+
CASSANDRA_VERSION=3.1.1 bundle exec cucumber # runs end-to-end tests (or bundle exec rake cucumber)
|
181
|
+
CASSANDRA_VERSION=3.0.0 bundle exec rspec # runs unit tests (or bundle exec rake rspec)
|
182
|
+
CASSANDRA_VERSION=2.1.12 bundle exec rake integration # run integration tests
|
183
|
+
CASSANDRA_VERSION=2.1.12 bundle exec rake test # run both as well as integration tests
|
184
|
+
```
|
185
|
+
|
186
|
+
## Changelog & versioning
|
187
|
+
|
188
|
+
Check out the [releases on GitHub](https://github.com/yugabyte/cassandra-ruby-driver/releases) and
|
189
|
+
[changelog](https://github.com/yugabyte/cassandra-ruby-driver/blob/v3.2.3/CHANGELOG.md). Version
|
190
|
+
numbering follows the [semantic versioning](http://semver.org/) scheme.
|
191
|
+
|
192
|
+
Private and experimental APIs, defined as whatever is not in the
|
193
|
+
[public API documentation][1], i.e. classes and methods marked as `@private`, will change
|
194
|
+
without warning. If you've been recommended to try an experimental API by the maintainers,
|
195
|
+
please let them know if you depend on that API. Experimental APIs will eventually become
|
196
|
+
public, and knowing how they are used helps in determining their maturity.
|
197
|
+
|
198
|
+
Prereleases will be stable, in the sense that they will have finished and properly tested
|
199
|
+
features only, but may introduce APIs that will change before the final release. Please
|
200
|
+
use the prereleases and report bugs, but don't deploy them to production without
|
201
|
+
consulting the maintainers, or doing extensive testing yourself. If you do deploy to
|
202
|
+
production please let the maintainers know as this helps in determining the maturity of
|
203
|
+
the release.
|
204
|
+
|
205
|
+
## Known bugs & limitations
|
206
|
+
|
207
|
+
* Specifying a `protocol_version` option of 1 or 2 in cluster options will fail with a
|
208
|
+
`NoHostsAvailable` error rather than a `ProtocolError` against Cassandra node versions 3.0-3.4.
|
209
|
+
* Because the driver reactor is using `IO.select`, the maximum number of tcp connections allowed is 1024.
|
210
|
+
* Because the driver uses `IO#write_nonblock`, Windows is not supported.
|
211
|
+
|
212
|
+
Please [refer to the usage documentation for more information on common pitfalls](http://docs.datastax.com/en/developer/ruby-driver/3.1/features/)
|
213
|
+
|
214
|
+
## Contributing
|
215
|
+
|
216
|
+
For contributing read [CONTRIBUTING.md](https://github.com/yugabyte/cassandra-ruby-driver/blob/master/CONTRIBUTING.md)
|
217
|
+
|
218
|
+
## Credits
|
219
|
+
|
220
|
+
This driver is based on the original work of [Theo Hultberg](https://github.com/iconara)
|
221
|
+
on [cql-rb](https://github.com/iconara/cql-rb/) and adds a series of advanced features
|
222
|
+
that are common across all other DataStax drivers for Apache Cassandra.
|
223
|
+
|
224
|
+
The development effort to provide an up to date, high performance, fully featured Ruby
|
225
|
+
Driver for Apache Cassandra will continue on this project, while
|
226
|
+
[cql-rb](https://github.com/iconara/cql-rb/) has been discontinued.
|
227
|
+
|
228
|
+
## Copyright
|
229
|
+
|
230
|
+
Copyright DataStax, Inc.
|
231
|
+
|
232
|
+
Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file
|
233
|
+
except in compliance with the License. You may obtain a copy of the License at
|
234
|
+
|
235
|
+
[http://www.apache.org/licenses/LICENSE-2.0](http://www.apache.org/licenses/LICENSE-2.0)
|
236
|
+
|
237
|
+
Unless required by applicable law or agreed to in writing, software distributed under the
|
238
|
+
License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND,
|
239
|
+
either express or implied. See the License for the specific language governing permissions
|
240
|
+
and limitations under the License.
|
241
|
+
|
242
|
+
[1]: http://docs.datastax.com/en/developer/ruby-driver/3.1/api
|
@@ -0,0 +1,178 @@
|
|
1
|
+
// Copyright DataStax, Inc.
|
2
|
+
//
|
3
|
+
// Licensed under the Apache License, Version 2.0 (the "License");
|
4
|
+
// you may not use this file except in compliance with the License.
|
5
|
+
// You may obtain a copy of the License at
|
6
|
+
//
|
7
|
+
// http://www.apache.org/licenses/LICENSE-2.0
|
8
|
+
//
|
9
|
+
// Unless required by applicable law or agreed to in writing, software
|
10
|
+
// distributed under the License is distributed on an "AS IS" BASIS,
|
11
|
+
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
12
|
+
// See the License for the specific language governing permissions and
|
13
|
+
// limitations under the License.
|
14
|
+
|
15
|
+
#include <ruby.h>
|
16
|
+
|
17
|
+
/*-----------------------------------------------------------------------------
|
18
|
+
* MurmurHash3 was written by Austin Appleby, and is placed in the public
|
19
|
+
* domain. The author hereby disclaims copyright to this source code.
|
20
|
+
*/
|
21
|
+
|
22
|
+
//-----------------------------------------------------------------------------
|
23
|
+
// Platform-specific functions and macros
|
24
|
+
|
25
|
+
#ifdef _MSC_VER
|
26
|
+
typedef unsigned __int64 uint64_t;
|
27
|
+
typedef __int64 int64_t;
|
28
|
+
|
29
|
+
#define FORCE_INLINE __forceinline
|
30
|
+
#else
|
31
|
+
#include <stdint.h>
|
32
|
+
#ifdef __GNUC__
|
33
|
+
#define FORCE_INLINE __attribute__((always_inline)) inline
|
34
|
+
#else
|
35
|
+
#define FORCE_INLINE inline
|
36
|
+
#endif
|
37
|
+
#endif
|
38
|
+
|
39
|
+
#define BIG_CONSTANT(x) (x##LLU)
|
40
|
+
|
41
|
+
static FORCE_INLINE int64_t
|
42
|
+
rotl(int64_t x, int8_t r)
|
43
|
+
{
|
44
|
+
// cast to unsigned for logical right bitshift (to match C* MM3 implementation)
|
45
|
+
return (x << r) | ((int64_t) (((uint64_t) x) >> (64 - r)));
|
46
|
+
}
|
47
|
+
|
48
|
+
static FORCE_INLINE int64_t
|
49
|
+
getblock(const int64_t* p, int i)
|
50
|
+
{
|
51
|
+
return p[i];
|
52
|
+
}
|
53
|
+
|
54
|
+
static FORCE_INLINE int64_t
|
55
|
+
fmix(int64_t k)
|
56
|
+
{
|
57
|
+
// cast to unsigned for logical right bitshift (to match C* MM3 implementation)
|
58
|
+
k ^= ((uint64_t) k) >> 33;
|
59
|
+
k *= BIG_CONSTANT(0xff51afd7ed558ccd);
|
60
|
+
k ^= ((uint64_t) k) >> 33;
|
61
|
+
k *= BIG_CONSTANT(0xc4ceb9fe1a85ec53);
|
62
|
+
k ^= ((uint64_t) k) >> 33;
|
63
|
+
|
64
|
+
return k;
|
65
|
+
}
|
66
|
+
|
67
|
+
static VALUE
|
68
|
+
rb_murmur3_hash(VALUE self, VALUE rb_string)
|
69
|
+
{
|
70
|
+
char* bytes;
|
71
|
+
int64_t length;
|
72
|
+
|
73
|
+
Check_Type(rb_string, T_STRING);
|
74
|
+
|
75
|
+
bytes = RSTRING_PTR(rb_string);
|
76
|
+
length = RSTRING_LEN(rb_string);
|
77
|
+
|
78
|
+
const int nblocks = length / 16;
|
79
|
+
int i;
|
80
|
+
|
81
|
+
int64_t h1 = 0;
|
82
|
+
int64_t h2 = 0;
|
83
|
+
|
84
|
+
int64_t c1 = BIG_CONSTANT(0x87c37b91114253d5);
|
85
|
+
int64_t c2 = BIG_CONSTANT(0x4cf5ad432745937f);
|
86
|
+
|
87
|
+
//----------
|
88
|
+
// body
|
89
|
+
|
90
|
+
const int64_t* blocks = (const int64_t*)(bytes);
|
91
|
+
|
92
|
+
for(i = 0; i < nblocks; i++)
|
93
|
+
{
|
94
|
+
int64_t k1 = getblock(blocks, i * 2 + 0);
|
95
|
+
int64_t k2 = getblock(blocks, i * 2 + 1);
|
96
|
+
|
97
|
+
k1 *= c1;
|
98
|
+
k1 = rotl(k1, 31);
|
99
|
+
k1 *= c2;
|
100
|
+
h1 ^= k1;
|
101
|
+
|
102
|
+
h1 = rotl(h1, 27);
|
103
|
+
h1 += h2;
|
104
|
+
h1 = h1 * 5 + 0x52dce729;
|
105
|
+
|
106
|
+
k2 *= c2;
|
107
|
+
k2 = rotl(k2, 33);
|
108
|
+
k2 *= c1;
|
109
|
+
h2 ^= k2;
|
110
|
+
|
111
|
+
h2 = rotl(h2, 31);
|
112
|
+
h2 += h1;
|
113
|
+
h2 = h2 * 5 + 0x38495ab5;
|
114
|
+
}
|
115
|
+
|
116
|
+
//----------
|
117
|
+
// tail
|
118
|
+
|
119
|
+
const int8_t* tail = (const int8_t*) (bytes + nblocks * 16);
|
120
|
+
|
121
|
+
int64_t k1 = 0;
|
122
|
+
int64_t k2 = 0;
|
123
|
+
|
124
|
+
switch(length & 15)
|
125
|
+
{
|
126
|
+
case 15: k2 ^= ((int64_t) tail[14]) << 48;
|
127
|
+
case 14: k2 ^= ((int64_t) tail[13]) << 40;
|
128
|
+
case 13: k2 ^= ((int64_t) tail[12]) << 32;
|
129
|
+
case 12: k2 ^= ((int64_t) tail[11]) << 24;
|
130
|
+
case 11: k2 ^= ((int64_t) tail[10]) << 16;
|
131
|
+
case 10: k2 ^= ((int64_t) tail[ 9]) << 8;
|
132
|
+
case 9: k2 ^= ((int64_t) tail[ 8]) << 0;
|
133
|
+
k2 *= c2;
|
134
|
+
k2 = rotl(k2, 33);
|
135
|
+
k2 *= c1;
|
136
|
+
h2 ^= k2;
|
137
|
+
case 8: k1 ^= ((int64_t) tail[7]) << 56;
|
138
|
+
case 7: k1 ^= ((int64_t) tail[6]) << 48;
|
139
|
+
case 6: k1 ^= ((int64_t) tail[5]) << 40;
|
140
|
+
case 5: k1 ^= ((int64_t) tail[4]) << 32;
|
141
|
+
case 4: k1 ^= ((int64_t) tail[3]) << 24;
|
142
|
+
case 3: k1 ^= ((int64_t) tail[2]) << 16;
|
143
|
+
case 2: k1 ^= ((int64_t) tail[1]) << 8;
|
144
|
+
case 1: k1 ^= ((int64_t) tail[0]) << 0;
|
145
|
+
k1 *= c1;
|
146
|
+
k1 = rotl(k1, 31);
|
147
|
+
k1 *= c2;
|
148
|
+
h1 ^= k1;
|
149
|
+
};
|
150
|
+
|
151
|
+
//----------
|
152
|
+
// finalization
|
153
|
+
|
154
|
+
h1 ^= length;
|
155
|
+
h2 ^= length;
|
156
|
+
|
157
|
+
h1 += h2;
|
158
|
+
h2 += h1;
|
159
|
+
|
160
|
+
h1 = fmix(h1);
|
161
|
+
h2 = fmix(h2);
|
162
|
+
|
163
|
+
h1 += h2;
|
164
|
+
h2 += h1;
|
165
|
+
|
166
|
+
return LL2NUM(h1);
|
167
|
+
}
|
168
|
+
|
169
|
+
void
|
170
|
+
Init_cassandra_murmur3()
|
171
|
+
{
|
172
|
+
VALUE mCassandra, mMurmur3;
|
173
|
+
|
174
|
+
mCassandra = rb_define_module_under(rb_cObject, "Cassandra");
|
175
|
+
mMurmur3 = rb_define_module_under(mCassandra, "Murmur3");
|
176
|
+
|
177
|
+
rb_define_module_function(mMurmur3, "hash", rb_murmur3_hash, 1);
|
178
|
+
}
|
@@ -0,0 +1,36 @@
|
|
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
|
+
# Address Resolution policy allows translating a node ip address from what is
|
21
|
+
# recorded in Cassandra's system tables to an actual ip address for the driver
|
22
|
+
# to use. It is very useful in various multi-region scenarios (e.g. on EC2).
|
23
|
+
module AddressResolution
|
24
|
+
class Policy
|
25
|
+
# Resolves a node ip address.
|
26
|
+
#
|
27
|
+
# @param address [IPAddr] node ip address from Cassandra's system table
|
28
|
+
#
|
29
|
+
# @return [IPAddr] actual ip address of the node
|
30
|
+
def resolve(address)
|
31
|
+
end
|
32
|
+
end
|
33
|
+
end
|
34
|
+
end
|
35
|
+
|
36
|
+
require 'cassandra/address_resolution/policies'
|