cassandra-driver 3.0.3-java → 3.1.0-java
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.
- checksums.yaml +4 -4
- data/README.md +46 -31
- data/lib/cassandra.rb +35 -44
- data/lib/cassandra/cluster.rb +40 -11
- data/lib/cassandra/cluster/client.rb +193 -159
- data/lib/cassandra/cluster/connector.rb +12 -10
- data/lib/cassandra/cluster/control_connection.rb +38 -10
- data/lib/cassandra/cluster/options.rb +8 -4
- data/lib/cassandra/cluster/registry.rb +1 -2
- data/lib/cassandra/cluster/schema/fetchers.rb +122 -26
- data/lib/cassandra/column_container.rb +9 -4
- data/lib/cassandra/custom_data.rb +24 -22
- data/lib/cassandra/driver.rb +30 -13
- data/lib/cassandra/errors.rb +12 -2
- data/lib/cassandra/execution/options.rb +52 -16
- data/lib/cassandra/execution/profile.rb +150 -0
- data/lib/cassandra/execution/profile_manager.rb +71 -0
- data/lib/cassandra/execution/trace.rb +5 -4
- data/lib/cassandra/executors.rb +1 -1
- data/lib/cassandra/index.rb +1 -1
- data/lib/cassandra/keyspace.rb +36 -1
- data/lib/cassandra/protocol.rb +5 -0
- data/lib/cassandra/protocol/coder.rb +2 -1
- data/lib/cassandra/protocol/cql_byte_buffer.rb +21 -0
- data/lib/cassandra/protocol/responses/read_failure_error_response.rb +10 -4
- data/lib/cassandra/protocol/responses/write_failure_error_response.rb +14 -8
- data/lib/cassandra/protocol/v3.rb +2 -1
- data/lib/cassandra/protocol/v4.rb +58 -20
- data/lib/cassandra/result.rb +1 -1
- data/lib/cassandra/session.rb +43 -16
- data/lib/cassandra/statements/bound.rb +5 -1
- data/lib/cassandra/statements/prepared.rb +8 -3
- data/lib/cassandra/table.rb +72 -0
- data/lib/cassandra/trigger.rb +67 -0
- data/lib/cassandra/types.rb +12 -24
- data/lib/cassandra/udt.rb +3 -6
- data/lib/cassandra/uuid/generator.rb +6 -3
- data/lib/cassandra/version.rb +1 -1
- data/lib/cassandra_murmur3.jar +0 -0
- metadata +5 -2
@@ -122,11 +122,8 @@ module Cassandra
|
|
122
122
|
ssl: @connection_options.ssl) do |connection|
|
123
123
|
raise Errors::ClientError, 'Not connected, reactor stopped' unless connection
|
124
124
|
|
125
|
-
|
126
|
-
|
127
|
-
else
|
128
|
-
connection.to_io.setsockopt(Socket::IPPROTO_TCP, Socket::TCP_NODELAY, 0)
|
129
|
-
end
|
125
|
+
connection.to_io.setsockopt(Socket::IPPROTO_TCP, Socket::TCP_NODELAY,
|
126
|
+
@connection_options.nodelay? ? 1 : 0)
|
130
127
|
|
131
128
|
Protocol::CqlProtocolHandler.new(connection,
|
132
129
|
@reactor,
|
@@ -225,10 +222,12 @@ module Cassandra
|
|
225
222
|
::Ione::Future.resolved(connection)
|
226
223
|
when Protocol::ErrorResponse
|
227
224
|
::Ione::Future.failed(
|
228
|
-
r.to_error(nil, VOID_STATEMENT, VOID_OPTIONS, EMPTY_LIST, :one, 0)
|
225
|
+
r.to_error(nil, VOID_STATEMENT, VOID_OPTIONS, EMPTY_LIST, :one, 0)
|
226
|
+
)
|
229
227
|
else
|
230
228
|
::Ione::Future.failed(
|
231
|
-
Errors::InternalError.new("Unexpected response #{r.inspect}")
|
229
|
+
Errors::InternalError.new("Unexpected response #{r.inspect}")
|
230
|
+
)
|
232
231
|
end
|
233
232
|
end
|
234
233
|
end
|
@@ -244,7 +243,8 @@ module Cassandra
|
|
244
243
|
VOID_OPTIONS,
|
245
244
|
EMPTY_LIST,
|
246
245
|
:one,
|
247
|
-
0
|
246
|
+
0
|
247
|
+
)
|
248
248
|
end
|
249
249
|
|
250
250
|
def request_options(connection)
|
@@ -291,10 +291,12 @@ module Cassandra
|
|
291
291
|
::Ione::Future.resolved(connection)
|
292
292
|
when Protocol::ErrorResponse
|
293
293
|
::Ione::Future.failed(
|
294
|
-
r.to_error(nil, VOID_STATEMENT, VOID_OPTIONS, EMPTY_LIST, :one, 0)
|
294
|
+
r.to_error(nil, VOID_STATEMENT, VOID_OPTIONS, EMPTY_LIST, :one, 0)
|
295
|
+
)
|
295
296
|
else
|
296
297
|
::Ione::Future.failed(
|
297
|
-
Errors::InternalError.new("Unexpected response #{r.inspect}")
|
298
|
+
Errors::InternalError.new("Unexpected response #{r.inspect}")
|
299
|
+
)
|
298
300
|
end
|
299
301
|
end
|
300
302
|
end
|
@@ -36,8 +36,10 @@ module Cassandra
|
|
36
36
|
@address_resolver = address_resolution_policy
|
37
37
|
@connector = connector
|
38
38
|
@connection_options = connection_options
|
39
|
+
@connection = nil
|
39
40
|
@schema_fetcher = schema_fetcher
|
40
41
|
@refreshing_statuses = ::Hash.new(false)
|
42
|
+
@refresh_schema_future = nil
|
41
43
|
@status = :closed
|
42
44
|
@refreshing_hosts = false
|
43
45
|
@refreshing_host = ::Hash.new(false)
|
@@ -88,7 +90,8 @@ module Cassandra
|
|
88
90
|
(@status == :closing || @status == :closed) ||
|
89
91
|
@load_balancing_policy.distance(host) == :ignore
|
90
92
|
return connect_to_first_available(
|
91
|
-
@load_balancing_policy.plan(nil, VOID_STATEMENT, VOID_OPTIONS)
|
93
|
+
@load_balancing_policy.plan(nil, VOID_STATEMENT, VOID_OPTIONS)
|
94
|
+
)
|
92
95
|
end
|
93
96
|
end
|
94
97
|
|
@@ -146,18 +149,20 @@ module Cassandra
|
|
146
149
|
|
147
150
|
private
|
148
151
|
|
149
|
-
SELECT_LOCAL
|
152
|
+
SELECT_LOCAL = Protocol::QueryRequest.new(
|
150
153
|
'SELECT * ' \
|
151
154
|
'FROM system.local',
|
152
155
|
EMPTY_LIST,
|
153
156
|
EMPTY_LIST,
|
154
|
-
:one
|
155
|
-
|
157
|
+
:one
|
158
|
+
)
|
159
|
+
SELECT_PEERS = Protocol::QueryRequest.new(
|
156
160
|
'SELECT * ' \
|
157
161
|
'FROM system.peers',
|
158
162
|
EMPTY_LIST,
|
159
163
|
EMPTY_LIST,
|
160
|
-
:one
|
164
|
+
:one
|
165
|
+
)
|
161
166
|
|
162
167
|
SELECT_PEER_QUERY =
|
163
168
|
'SELECT * ' \
|
@@ -229,7 +234,9 @@ module Cassandra
|
|
229
234
|
refresh_schema_async_wrapper
|
230
235
|
end
|
231
236
|
when 'DOWN'
|
232
|
-
|
237
|
+
# RUBY-164: Don't mark host down if there are active connections. We have
|
238
|
+
# logic in connector.rb to call host_down when all connections to a node are lost,
|
239
|
+
# so that covers the requirement.
|
233
240
|
when 'NEW_NODE'
|
234
241
|
address = event.address
|
235
242
|
|
@@ -445,7 +452,7 @@ module Cassandra
|
|
445
452
|
|
446
453
|
peers.shuffle!
|
447
454
|
peers.each do |data|
|
448
|
-
ip = peer_ip(data)
|
455
|
+
ip = peer_ip(data, connection.host)
|
449
456
|
next unless ip
|
450
457
|
ips << ip
|
451
458
|
@registry.host_found(ip, data)
|
@@ -665,9 +672,30 @@ Control connection failed and is unlikely to recover.
|
|
665
672
|
@connector.connect(host)
|
666
673
|
end
|
667
674
|
|
668
|
-
def peer_ip(data)
|
669
|
-
|
670
|
-
|
675
|
+
def peer_ip(data, host_address)
|
676
|
+
peer = data['peer']
|
677
|
+
|
678
|
+
return nil unless peer && data['host_id'] && data['data_center'] && data['rack'] && data['tokens']
|
679
|
+
|
680
|
+
rpc_address = data['rpc_address']
|
681
|
+
|
682
|
+
if rpc_address.nil?
|
683
|
+
@logger.info("The system.peers row for '#{data['peer']}' has no rpc_address. This is likely " \
|
684
|
+
'a gossip or snitch issue. This host will be ignored.')
|
685
|
+
return nil
|
686
|
+
end
|
687
|
+
|
688
|
+
if peer == host_address || rpc_address == host_address
|
689
|
+
# Some DSE versions were inserting a line for the local node in peers (with mostly null values).
|
690
|
+
# This has been fixed, but if we detect that's the case, ignore it as it's not really a big deal.
|
691
|
+
|
692
|
+
@logger.debug("System.peers on node #{host_address} has a line for itself. This is not normal but is a " \
|
693
|
+
'known problem of some DSE versions. Ignoring the entry.')
|
694
|
+
return nil
|
695
|
+
end
|
696
|
+
|
697
|
+
ip = rpc_address
|
698
|
+
ip = peer if ip == '0.0.0.0'
|
671
699
|
|
672
700
|
@address_resolver.resolve(ip)
|
673
701
|
end
|
@@ -25,7 +25,7 @@ module Cassandra
|
|
25
25
|
attr_reader :auth_provider, :compressor, :connect_timeout, :credentials,
|
26
26
|
:heartbeat_interval, :idle_timeout, :port, :schema_refresh_delay,
|
27
27
|
:schema_refresh_timeout, :ssl, :custom_type_handlers
|
28
|
-
attr_boolean :protocol_negotiable, :synchronize_schema, :nodelay
|
28
|
+
attr_boolean :protocol_negotiable, :synchronize_schema, :nodelay, :allow_beta_protocol
|
29
29
|
|
30
30
|
attr_accessor :protocol_version
|
31
31
|
|
@@ -46,7 +46,8 @@ module Cassandra
|
|
46
46
|
schema_refresh_timeout,
|
47
47
|
nodelay,
|
48
48
|
requests_per_connection,
|
49
|
-
custom_types
|
49
|
+
custom_types,
|
50
|
+
allow_beta_protocol)
|
50
51
|
@logger = logger
|
51
52
|
@protocol_version = protocol_version
|
52
53
|
@credentials = credentials
|
@@ -61,6 +62,7 @@ module Cassandra
|
|
61
62
|
@schema_refresh_delay = schema_refresh_delay
|
62
63
|
@schema_refresh_timeout = schema_refresh_timeout
|
63
64
|
@nodelay = nodelay
|
65
|
+
@allow_beta_protocol = allow_beta_protocol
|
64
66
|
@custom_type_handlers = {}
|
65
67
|
custom_types.each do |type_klass|
|
66
68
|
@custom_type_handlers[type_klass.type] = type_klass
|
@@ -71,12 +73,14 @@ module Cassandra
|
|
71
73
|
@requests_per_connection = requests_per_connection
|
72
74
|
|
73
75
|
# If @protocol_version is nil, it means we want the driver to negotiate the
|
74
|
-
# protocol starting with our known max
|
76
|
+
# protocol starting with our known max. If @protocol_version is not nil,
|
75
77
|
# it means the user wants us to use a particular version, so we should not
|
76
78
|
# support negotiation.
|
77
79
|
|
78
80
|
@protocol_negotiable = @protocol_version.nil?
|
79
|
-
@protocol_version ||=
|
81
|
+
@protocol_version ||= allow_beta_protocol ?
|
82
|
+
Cassandra::Protocol::Versions::BETA_VERSION :
|
83
|
+
Cassandra::Protocol::Versions::MAX_SUPPORTED_VERSION
|
80
84
|
end
|
81
85
|
|
82
86
|
def compression
|
@@ -34,8 +34,9 @@ module Cassandra
|
|
34
34
|
select_functions(connection),
|
35
35
|
select_aggregates(connection),
|
36
36
|
select_materialized_views(connection),
|
37
|
-
select_indexes(connection)
|
38
|
-
|
37
|
+
select_indexes(connection),
|
38
|
+
select_triggers(connection))
|
39
|
+
.map do |rows_keyspaces, rows_tables, rows_columns, rows_types, rows_functions, rows_aggregates, rows_views, rows_indexes, rows_triggers|
|
39
40
|
lookup_tables = map_rows_by(rows_tables, 'keyspace_name')
|
40
41
|
lookup_columns = map_rows_by(rows_columns, 'keyspace_name')
|
41
42
|
lookup_types = map_rows_by(rows_types, 'keyspace_name')
|
@@ -43,6 +44,7 @@ module Cassandra
|
|
43
44
|
lookup_aggregates = map_rows_by(rows_aggregates, 'keyspace_name')
|
44
45
|
lookup_views = map_rows_by(rows_views, 'keyspace_name')
|
45
46
|
lookup_indexes = map_rows_by(rows_indexes, 'keyspace_name')
|
47
|
+
lookup_triggers = map_rows_by(rows_triggers, 'keyspace_name')
|
46
48
|
|
47
49
|
rows_keyspaces.map do |keyspace_data|
|
48
50
|
name = keyspace_data['keyspace_name']
|
@@ -54,7 +56,8 @@ module Cassandra
|
|
54
56
|
lookup_functions[name],
|
55
57
|
lookup_aggregates[name],
|
56
58
|
lookup_views[name],
|
57
|
-
lookup_indexes[name]
|
59
|
+
lookup_indexes[name],
|
60
|
+
lookup_triggers[name])
|
58
61
|
end
|
59
62
|
end
|
60
63
|
end
|
@@ -67,8 +70,9 @@ module Cassandra
|
|
67
70
|
select_keyspace_functions(connection, keyspace_name),
|
68
71
|
select_keyspace_aggregates(connection, keyspace_name),
|
69
72
|
select_keyspace_materialized_views(connection, keyspace_name),
|
70
|
-
select_keyspace_indexes(connection, keyspace_name)
|
71
|
-
|
73
|
+
select_keyspace_indexes(connection, keyspace_name),
|
74
|
+
select_keyspace_triggers(connection, keyspace_name))
|
75
|
+
.map do |rows_keyspaces, rows_tables, rows_columns, rows_types, rows_functions, rows_aggregates, rows_views, rows_indexes, rows_triggers|
|
72
76
|
if rows_keyspaces.empty?
|
73
77
|
nil
|
74
78
|
else
|
@@ -79,7 +83,8 @@ module Cassandra
|
|
79
83
|
rows_functions,
|
80
84
|
rows_aggregates,
|
81
85
|
rows_views,
|
82
|
-
rows_indexes
|
86
|
+
rows_indexes,
|
87
|
+
rows_triggers)
|
83
88
|
end
|
84
89
|
end
|
85
90
|
end
|
@@ -87,14 +92,16 @@ module Cassandra
|
|
87
92
|
def fetch_table(connection, keyspace_name, table_name)
|
88
93
|
Ione::Future.all(select_table(connection, keyspace_name, table_name),
|
89
94
|
select_table_columns(connection, keyspace_name, table_name),
|
90
|
-
select_table_indexes(connection, keyspace_name, table_name)
|
91
|
-
|
95
|
+
select_table_indexes(connection, keyspace_name, table_name),
|
96
|
+
select_table_triggers(connection, keyspace_name, table_name))
|
97
|
+
.map do |(rows_tables, rows_columns, rows_indexes, rows_triggers)|
|
92
98
|
if rows_tables.empty?
|
93
99
|
nil
|
94
100
|
else
|
95
101
|
create_table(rows_tables.first,
|
96
102
|
rows_columns,
|
97
|
-
rows_indexes
|
103
|
+
rows_indexes,
|
104
|
+
rows_triggers)
|
98
105
|
end
|
99
106
|
end
|
100
107
|
end
|
@@ -168,6 +175,10 @@ module Cassandra
|
|
168
175
|
FUTURE_EMPTY_LIST
|
169
176
|
end
|
170
177
|
|
178
|
+
def select_triggers(connection)
|
179
|
+
FUTURE_EMPTY_LIST
|
180
|
+
end
|
181
|
+
|
171
182
|
def select_types(connection)
|
172
183
|
FUTURE_EMPTY_LIST
|
173
184
|
end
|
@@ -200,6 +211,10 @@ module Cassandra
|
|
200
211
|
FUTURE_EMPTY_LIST
|
201
212
|
end
|
202
213
|
|
214
|
+
def select_keyspace_triggers(connection, keyspace_name)
|
215
|
+
FUTURE_EMPTY_LIST
|
216
|
+
end
|
217
|
+
|
203
218
|
def select_keyspace_types(connection, keyspace_name)
|
204
219
|
FUTURE_EMPTY_LIST
|
205
220
|
end
|
@@ -228,6 +243,10 @@ module Cassandra
|
|
228
243
|
FUTURE_EMPTY_LIST
|
229
244
|
end
|
230
245
|
|
246
|
+
def select_table_triggers(connection, keyspace_name, table_name)
|
247
|
+
FUTURE_EMPTY_LIST
|
248
|
+
end
|
249
|
+
|
231
250
|
def select_type(connection, keyspace_name, type_name)
|
232
251
|
FUTURE_EMPTY_LIST
|
233
252
|
end
|
@@ -243,7 +262,8 @@ module Cassandra
|
|
243
262
|
def send_select_request(connection, cql, params = EMPTY_LIST, types = EMPTY_LIST)
|
244
263
|
backtrace = caller
|
245
264
|
connection.send_request(
|
246
|
-
Protocol::QueryRequest.new(cql, params, types, :one)
|
265
|
+
Protocol::QueryRequest.new(cql, params, types, :one)
|
266
|
+
).map do |r|
|
247
267
|
case r
|
248
268
|
when Protocol::RowsResultResponse
|
249
269
|
r.rows
|
@@ -348,7 +368,7 @@ module Cassandra
|
|
348
368
|
|
349
369
|
def create_keyspace(keyspace_data, rows_tables, rows_columns,
|
350
370
|
rows_types, rows_functions, rows_aggregates,
|
351
|
-
rows_views, rows_indexes)
|
371
|
+
rows_views, rows_indexes, rows_triggers)
|
352
372
|
keyspace_name = keyspace_data['keyspace_name']
|
353
373
|
replication = create_replication(keyspace_data)
|
354
374
|
types = rows_types.each_with_object({}) do |row, h|
|
@@ -367,10 +387,14 @@ module Cassandra
|
|
367
387
|
end
|
368
388
|
|
369
389
|
lookup_columns = map_rows_by(rows_columns, 'columnfamily_name')
|
390
|
+
lookup_indexes = map_rows_by(rows_indexes, 'columnfamily_name')
|
391
|
+
lookup_triggers = map_rows_by(rows_triggers, 'columnfamily_name')
|
370
392
|
tables = rows_tables.each_with_object({}) do |row, h|
|
371
393
|
table_name = row['columnfamily_name']
|
372
|
-
|
373
|
-
|
394
|
+
h[table_name] = create_table(row,
|
395
|
+
lookup_columns[table_name],
|
396
|
+
lookup_indexes[table_name],
|
397
|
+
lookup_triggers[table_name])
|
374
398
|
end
|
375
399
|
|
376
400
|
Keyspace.new(keyspace_name,
|
@@ -383,7 +407,7 @@ module Cassandra
|
|
383
407
|
{})
|
384
408
|
end
|
385
409
|
|
386
|
-
def create_table(table_data, rows_columns, rows_indexes)
|
410
|
+
def create_table(table_data, rows_columns, rows_indexes, rows_triggers)
|
387
411
|
keyspace_name = table_data['keyspace_name']
|
388
412
|
table_name = table_data['columnfamily_name']
|
389
413
|
key_validator = @type_parser.parse(table_data['key_validator'])
|
@@ -461,7 +485,7 @@ module Cassandra
|
|
461
485
|
column = create_column(row)
|
462
486
|
other_columns << column
|
463
487
|
|
464
|
-
# In C* 1.2.x, index info is in the column metadata; rows_indexes is
|
488
|
+
# In C* 1.2.x, index info is in the column metadata; rows_indexes is [].
|
465
489
|
index_rows << [column, row] unless row['index_type'].nil?
|
466
490
|
end
|
467
491
|
|
@@ -485,7 +509,8 @@ module Cassandra
|
|
485
509
|
# Most of this logic was taken from the Java driver.
|
486
510
|
options = {}
|
487
511
|
# For some versions of C*, this field could have a literal string 'null' value.
|
488
|
-
if !row_column['index_options'].nil? && row_column['index_options'] != 'null' &&
|
512
|
+
if !row_column['index_options'].nil? && row_column['index_options'] != 'null' &&
|
513
|
+
!row_column['index_options'].empty?
|
489
514
|
options = ::JSON.load(row_column['index_options'])
|
490
515
|
end
|
491
516
|
column_name = Util.escape_name(column.name)
|
@@ -548,18 +573,24 @@ module Cassandra
|
|
548
573
|
compression_parameters,
|
549
574
|
is_compact,
|
550
575
|
table_data['crc_check_chance'],
|
551
|
-
table_data['extensions']
|
576
|
+
table_data['extensions'],
|
577
|
+
nil
|
552
578
|
)
|
553
579
|
end
|
554
580
|
end
|
555
581
|
|
556
582
|
class V2_0_x < V1_2_x
|
583
|
+
SELECT_TRIGGERS = 'SELECT * FROM system.schema_triggers'.freeze
|
584
|
+
|
557
585
|
SELECT_KEYSPACE =
|
558
586
|
'SELECT * FROM system.schema_keyspaces WHERE keyspace_name = ?'.freeze
|
559
587
|
SELECT_KEYSPACE_TABLES =
|
560
588
|
'SELECT * FROM system.schema_columnfamilies WHERE keyspace_name = ?'.freeze
|
561
589
|
SELECT_KEYSPACE_COLUMNS =
|
562
590
|
'SELECT * FROM system.schema_columns WHERE keyspace_name = ?'.freeze
|
591
|
+
SELECT_KEYSPACE_TRIGGERS =
|
592
|
+
'SELECT * FROM system.schema_triggers WHERE keyspace_name = ?'.freeze
|
593
|
+
|
563
594
|
SELECT_TABLE =
|
564
595
|
'SELECT * ' \
|
565
596
|
'FROM system.schema_columnfamilies ' \
|
@@ -568,10 +599,14 @@ module Cassandra
|
|
568
599
|
'SELECT * ' \
|
569
600
|
'FROM system.schema_columns ' \
|
570
601
|
'WHERE keyspace_name = ? AND columnfamily_name = ?'.freeze
|
602
|
+
SELECT_TABLE_TRIGGERS =
|
603
|
+
'SELECT * ' \
|
604
|
+
'FROM system.schema_triggers ' \
|
605
|
+
'WHERE keyspace_name = ? AND columnfamily_name = ?'.freeze
|
571
606
|
|
572
607
|
private
|
573
608
|
|
574
|
-
def create_table(table_data, rows_columns, rows_indexes)
|
609
|
+
def create_table(table_data, rows_columns, rows_indexes, rows_triggers)
|
575
610
|
keyspace_name = table_data['keyspace_name']
|
576
611
|
table_name = table_data['columnfamily_name']
|
577
612
|
comparator = @type_parser.parse(table_data['comparator'])
|
@@ -598,7 +633,7 @@ module Cassandra
|
|
598
633
|
clustering_columns[ind] = column
|
599
634
|
clustering_order[ind] = column.order
|
600
635
|
|
601
|
-
clustering_size
|
636
|
+
clustering_size += 1
|
602
637
|
else
|
603
638
|
other_columns << column
|
604
639
|
end
|
@@ -626,9 +661,21 @@ module Cassandra
|
|
626
661
|
index_rows.each do |column, row|
|
627
662
|
create_index(table, column, row)
|
628
663
|
end
|
664
|
+
|
665
|
+
# Create Trigger objects and add them to the table.
|
666
|
+
rows_triggers.each do |row_trigger|
|
667
|
+
table.add_trigger(Cassandra::Trigger.new(table,
|
668
|
+
row_trigger['trigger_name'],
|
669
|
+
row_trigger['trigger_options']))
|
670
|
+
end
|
671
|
+
|
629
672
|
table
|
630
673
|
end
|
631
674
|
|
675
|
+
def select_triggers(connection)
|
676
|
+
send_select_request(connection, SELECT_TRIGGERS)
|
677
|
+
end
|
678
|
+
|
632
679
|
def select_keyspace(connection, keyspace_name)
|
633
680
|
params = [keyspace_name]
|
634
681
|
hints = [Types.varchar]
|
@@ -647,6 +694,12 @@ module Cassandra
|
|
647
694
|
send_select_request(connection, SELECT_KEYSPACE_COLUMNS, params, hints)
|
648
695
|
end
|
649
696
|
|
697
|
+
def select_keyspace_triggers(connection, keyspace_name)
|
698
|
+
params = [keyspace_name]
|
699
|
+
hints = [Types.varchar]
|
700
|
+
send_select_request(connection, SELECT_KEYSPACE_TRIGGERS, params, hints)
|
701
|
+
end
|
702
|
+
|
650
703
|
def select_table(connection, keyspace_name, table_name)
|
651
704
|
params = [keyspace_name, table_name]
|
652
705
|
hints = [Types.varchar, Types.varchar]
|
@@ -659,6 +712,12 @@ module Cassandra
|
|
659
712
|
send_select_request(connection, SELECT_TABLE_COLUMNS, params, hints)
|
660
713
|
end
|
661
714
|
|
715
|
+
def select_table_triggers(connection, keyspace_name, table_name)
|
716
|
+
params = [keyspace_name, table_name]
|
717
|
+
hints = [Types.varchar, Types.varchar]
|
718
|
+
send_select_request(connection, SELECT_TABLE_TRIGGERS, params, hints)
|
719
|
+
end
|
720
|
+
|
662
721
|
def create_table_options(table_data, compaction_strategy, is_compact)
|
663
722
|
compression_parameters = ::JSON.load(table_data['compression_parameters'])
|
664
723
|
if compression_parameters['sstable_compression']
|
@@ -684,7 +743,8 @@ module Cassandra
|
|
684
743
|
compression_parameters,
|
685
744
|
is_compact,
|
686
745
|
table_data['crc_check_chance'],
|
687
|
-
table_data['extensions']
|
746
|
+
table_data['extensions'],
|
747
|
+
nil
|
688
748
|
)
|
689
749
|
end
|
690
750
|
end
|
@@ -758,7 +818,8 @@ module Cassandra
|
|
758
818
|
compression_parameters,
|
759
819
|
is_compact,
|
760
820
|
table_data['crc_check_chance'],
|
761
|
-
table_data['extensions']
|
821
|
+
table_data['extensions'],
|
822
|
+
nil
|
762
823
|
)
|
763
824
|
end
|
764
825
|
end
|
@@ -834,7 +895,9 @@ module Cassandra
|
|
834
895
|
initial_state = Util.encode_object(
|
835
896
|
Protocol::Coder.read_value_v4(
|
836
897
|
Protocol::CqlByteBuffer.new.append_bytes(aggregate_data['initcond']),
|
837
|
-
state_type, nil
|
898
|
+
state_type, nil
|
899
|
+
)
|
900
|
+
)
|
838
901
|
|
839
902
|
# The state-function takes arguments: first the stype, then the args of the aggregate.
|
840
903
|
state_function = functions.get(aggregate_data['state_func'],
|
@@ -896,6 +959,7 @@ module Cassandra
|
|
896
959
|
SELECT_AGGREGATES = 'SELECT * FROM system_schema.aggregates'.freeze
|
897
960
|
SELECT_INDEXES = 'SELECT * FROM system_schema.indexes'.freeze
|
898
961
|
SELECT_VIEWS = 'SELECT * FROM system_schema.views'.freeze
|
962
|
+
SELECT_TRIGGERS = 'SELECT * FROM system_schema.triggers'.freeze
|
899
963
|
|
900
964
|
SELECT_KEYSPACE =
|
901
965
|
'SELECT * FROM system_schema.keyspaces WHERE keyspace_name = ?'.freeze
|
@@ -913,6 +977,8 @@ module Cassandra
|
|
913
977
|
'SELECT * FROM system_schema.functions WHERE keyspace_name = ?'.freeze
|
914
978
|
SELECT_KEYSPACE_AGGREGATES =
|
915
979
|
'SELECT * FROM system_schema.aggregates WHERE keyspace_name = ?'.freeze
|
980
|
+
SELECT_KEYSPACE_TRIGGERS =
|
981
|
+
'SELECT * FROM system_schema.triggers WHERE keyspace_name = ?'.freeze
|
916
982
|
|
917
983
|
SELECT_TABLE =
|
918
984
|
'SELECT * ' \
|
@@ -926,6 +992,10 @@ module Cassandra
|
|
926
992
|
'SELECT * ' \
|
927
993
|
'FROM system_schema.indexes ' \
|
928
994
|
'WHERE keyspace_name = ? AND table_name = ?'.freeze
|
995
|
+
SELECT_TABLE_TRIGGERS =
|
996
|
+
'SELECT * ' \
|
997
|
+
'FROM system_schema.triggers ' \
|
998
|
+
'WHERE keyspace_name = ? AND table_name = ?'.freeze
|
929
999
|
|
930
1000
|
SELECT_VIEW =
|
931
1001
|
'SELECT * ' \
|
@@ -984,6 +1054,10 @@ module Cassandra
|
|
984
1054
|
send_select_request(connection, SELECT_COLUMNS)
|
985
1055
|
end
|
986
1056
|
|
1057
|
+
def select_triggers(connection)
|
1058
|
+
send_select_request(connection, SELECT_TRIGGERS)
|
1059
|
+
end
|
1060
|
+
|
987
1061
|
def select_types(connection)
|
988
1062
|
send_select_request(connection, SELECT_TYPES)
|
989
1063
|
end
|
@@ -1026,6 +1100,12 @@ module Cassandra
|
|
1026
1100
|
send_select_request(connection, SELECT_KEYSPACE_VIEWS, params, hints)
|
1027
1101
|
end
|
1028
1102
|
|
1103
|
+
def select_keyspace_triggers(connection, keyspace_name)
|
1104
|
+
params = [keyspace_name]
|
1105
|
+
hints = [Types.varchar]
|
1106
|
+
send_select_request(connection, SELECT_KEYSPACE_TRIGGERS, params, hints)
|
1107
|
+
end
|
1108
|
+
|
1029
1109
|
def select_keyspace_types(connection, keyspace_name)
|
1030
1110
|
params = [keyspace_name]
|
1031
1111
|
hints = [Types.varchar]
|
@@ -1071,6 +1151,12 @@ module Cassandra
|
|
1071
1151
|
send_select_request(connection, SELECT_VIEW, params, hints)
|
1072
1152
|
end
|
1073
1153
|
|
1154
|
+
def select_table_triggers(connection, keyspace_name, table_name)
|
1155
|
+
params = [keyspace_name, table_name]
|
1156
|
+
hints = [Types.varchar, Types.varchar]
|
1157
|
+
send_select_request(connection, SELECT_TABLE_TRIGGERS, params, hints)
|
1158
|
+
end
|
1159
|
+
|
1074
1160
|
def select_type(connection, keyspace_name, type_name)
|
1075
1161
|
params = [keyspace_name, type_name]
|
1076
1162
|
hints = [Types.varchar, Types.varchar]
|
@@ -1182,7 +1268,7 @@ module Cassandra
|
|
1182
1268
|
end
|
1183
1269
|
|
1184
1270
|
def create_keyspace(keyspace_data, rows_tables, rows_columns, rows_types,
|
1185
|
-
rows_functions, rows_aggregates, rows_views, rows_indexes)
|
1271
|
+
rows_functions, rows_aggregates, rows_views, rows_indexes, rows_triggers)
|
1186
1272
|
keyspace_name = keyspace_data['keyspace_name']
|
1187
1273
|
replication = create_replication(keyspace_data)
|
1188
1274
|
|
@@ -1206,10 +1292,11 @@ module Cassandra
|
|
1206
1292
|
|
1207
1293
|
lookup_columns = map_rows_by(rows_columns, 'table_name')
|
1208
1294
|
lookup_indexes = map_rows_by(rows_indexes, 'table_name')
|
1295
|
+
lookup_triggers = map_rows_by(rows_triggers, 'table_name')
|
1209
1296
|
tables = rows_tables.each_with_object({}) do |row, h|
|
1210
1297
|
table_name = row['table_name']
|
1211
1298
|
h[table_name] = create_table(row, lookup_columns[table_name],
|
1212
|
-
lookup_indexes[table_name], types)
|
1299
|
+
lookup_indexes[table_name], lookup_triggers[table_name], types)
|
1213
1300
|
end
|
1214
1301
|
|
1215
1302
|
views = rows_views.each_with_object({}) do |row, h|
|
@@ -1266,7 +1353,8 @@ module Cassandra
|
|
1266
1353
|
compression,
|
1267
1354
|
is_compact,
|
1268
1355
|
table_data['crc_check_chance'],
|
1269
|
-
table_data['extensions']
|
1356
|
+
table_data['extensions'],
|
1357
|
+
table_data['cdc']
|
1270
1358
|
)
|
1271
1359
|
end
|
1272
1360
|
|
@@ -1285,7 +1373,7 @@ module Cassandra
|
|
1285
1373
|
Column.new(name, type, order, is_static, is_frozen)
|
1286
1374
|
end
|
1287
1375
|
|
1288
|
-
def create_table(table_data, rows_columns, rows_indexes, types = nil)
|
1376
|
+
def create_table(table_data, rows_columns, rows_indexes, rows_triggers, types = nil)
|
1289
1377
|
keyspace_name = table_data['keyspace_name']
|
1290
1378
|
table_name = table_data['table_name']
|
1291
1379
|
table_flags = table_data['flags']
|
@@ -1352,6 +1440,14 @@ module Cassandra
|
|
1352
1440
|
rows_indexes.each do |row|
|
1353
1441
|
create_index(table, row)
|
1354
1442
|
end
|
1443
|
+
|
1444
|
+
# Create Trigger objects and add them to the table.
|
1445
|
+
rows_triggers.each do |row_trigger|
|
1446
|
+
table.add_trigger(Cassandra::Trigger.new(table,
|
1447
|
+
row_trigger['trigger_name'],
|
1448
|
+
row_trigger['options']))
|
1449
|
+
end
|
1450
|
+
|
1355
1451
|
table
|
1356
1452
|
end
|
1357
1453
|
|