cequel 1.0.4 → 1.1.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/Appraisals +3 -0
- data/CHANGELOG.md +7 -0
- data/CONTRIBUTING.md +1 -1
- data/Gemfile +5 -4
- data/Gemfile.lock +215 -22
- data/README.md +19 -6
- data/Vagrantfile +6 -1
- data/lib/cequel.rb +3 -2
- data/lib/cequel/metal/batch.rb +16 -1
- data/lib/cequel/metal/data_set.rb +63 -39
- data/lib/cequel/metal/deleter.rb +2 -2
- data/lib/cequel/metal/incrementer.rb +2 -2
- data/lib/cequel/metal/inserter.rb +8 -6
- data/lib/cequel/metal/keyspace.rb +127 -34
- data/lib/cequel/metal/logger.rb +1 -1
- data/lib/cequel/metal/row.rb +3 -4
- data/lib/cequel/metal/updater.rb +2 -2
- data/lib/cequel/metal/writer.rb +18 -12
- data/lib/cequel/record/associations.rb +7 -1
- data/lib/cequel/record/bound.rb +1 -1
- data/lib/cequel/record/callbacks.rb +10 -6
- data/lib/cequel/record/data_set_builder.rb +13 -2
- data/lib/cequel/record/persistence.rb +14 -12
- data/lib/cequel/record/properties.rb +3 -3
- data/lib/cequel/record/railtie.rb +1 -1
- data/lib/cequel/record/record_set.rb +12 -12
- data/lib/cequel/record/schema.rb +5 -1
- data/lib/cequel/schema/keyspace.rb +1 -1
- data/lib/cequel/schema/table_property.rb +1 -1
- data/lib/cequel/type.rb +44 -10
- data/lib/cequel/uuids.rb +46 -0
- data/lib/cequel/version.rb +1 -1
- data/spec/examples/metal/data_set_spec.rb +93 -0
- data/spec/examples/metal/keyspace_spec.rb +74 -0
- data/spec/examples/record/associations_spec.rb +84 -0
- data/spec/examples/record/persistence_spec.rb +23 -0
- data/spec/examples/record/properties_spec.rb +1 -1
- data/spec/examples/record/record_set_spec.rb +12 -3
- data/spec/examples/record/schema_spec.rb +1 -1
- data/spec/examples/record/secondary_index_spec.rb +1 -1
- data/spec/examples/schema/table_reader_spec.rb +2 -3
- data/spec/examples/spec_helper.rb +8 -0
- data/spec/examples/type_spec.rb +7 -5
- data/spec/examples/uuids_spec.rb +22 -0
- data/spec/support/helpers.rb +25 -19
- data/templates/config/cequel.yml +5 -5
- metadata +40 -33
data/lib/cequel/metal/batch.rb
CHANGED
@@ -25,9 +25,12 @@ module Cequel
|
|
25
25
|
# @see Keyspace#batch
|
26
26
|
#
|
27
27
|
def initialize(keyspace, options = {})
|
28
|
+
options.assert_valid_keys(:auto_apply, :unlogged, :consistency)
|
28
29
|
@keyspace = keyspace
|
29
30
|
@auto_apply = options[:auto_apply]
|
30
31
|
@unlogged = options.fetch(:unlogged, false)
|
32
|
+
@consistency = options.fetch(:consistency,
|
33
|
+
keyspace.default_consistency)
|
31
34
|
reset
|
32
35
|
end
|
33
36
|
|
@@ -54,7 +57,8 @@ module Cequel
|
|
54
57
|
@statement.prepend(begin_statement)
|
55
58
|
@statement.append("APPLY BATCH\n")
|
56
59
|
end
|
57
|
-
@keyspace.
|
60
|
+
@keyspace.execute_with_consistency(
|
61
|
+
@statement.args.first, @statement.args.drop(1), @consistency)
|
58
62
|
end
|
59
63
|
|
60
64
|
#
|
@@ -74,6 +78,17 @@ module Cequel
|
|
74
78
|
!unlogged?
|
75
79
|
end
|
76
80
|
|
81
|
+
# @private
|
82
|
+
def execute_with_consistency(cql, bind_vars, query_consistency)
|
83
|
+
if query_consistency && query_consistency != @consistency
|
84
|
+
raise ArgumentError,
|
85
|
+
"Attempting to perform query with consistency " \
|
86
|
+
"#{query_consistency.to_s.upcase} in batch with consistency " \
|
87
|
+
"#{@consistency.upcase}"
|
88
|
+
end
|
89
|
+
execute(cql, *bind_vars)
|
90
|
+
end
|
91
|
+
|
77
92
|
private
|
78
93
|
|
79
94
|
def reset
|
@@ -44,10 +44,12 @@ module Cequel
|
|
44
44
|
attr_reader :sort_order
|
45
45
|
# @return [Integer] maximum number of rows to return, `nil` if no limit
|
46
46
|
attr_reader :row_limit
|
47
|
+
# @return [Symbol] what consistency level queries from this data set will
|
48
|
+
# use
|
49
|
+
# @since 1.1.0
|
50
|
+
attr_reader :query_consistency
|
47
51
|
|
48
|
-
def_delegator :keyspace, :
|
49
|
-
private :execute_cql
|
50
|
-
def_delegator :keyspace, :write
|
52
|
+
def_delegator :keyspace, :write_with_consistency
|
51
53
|
|
52
54
|
#
|
53
55
|
# @param table_name [Symbol] column family for this data set
|
@@ -79,7 +81,7 @@ module Cequel
|
|
79
81
|
# CQL documentation for INSERT
|
80
82
|
#
|
81
83
|
def insert(data, options = {})
|
82
|
-
inserter
|
84
|
+
inserter { insert(data) }.execute(options)
|
83
85
|
end
|
84
86
|
|
85
87
|
#
|
@@ -125,10 +127,10 @@ module Cequel
|
|
125
127
|
#
|
126
128
|
def update(*args, &block)
|
127
129
|
if block
|
128
|
-
updater(
|
130
|
+
updater(&block).execute(args.extract_options!)
|
129
131
|
else
|
130
132
|
data = args.shift
|
131
|
-
updater
|
133
|
+
updater { set(data) }.execute(args.extract_options!)
|
132
134
|
end
|
133
135
|
end
|
134
136
|
|
@@ -151,7 +153,7 @@ module Cequel
|
|
151
153
|
# CQL documentation for counter columns
|
152
154
|
#
|
153
155
|
def increment(deltas, options = {})
|
154
|
-
incrementer
|
156
|
+
incrementer { increment(deltas) }.execute(options)
|
155
157
|
end
|
156
158
|
alias_method :incr, :increment
|
157
159
|
|
@@ -168,7 +170,7 @@ module Cequel
|
|
168
170
|
# @since 0.5.0
|
169
171
|
#
|
170
172
|
def decrement(deltas, options = {})
|
171
|
-
incrementer
|
173
|
+
incrementer { decrement(deltas) }.execute(options)
|
172
174
|
end
|
173
175
|
alias_method :decr, :decrement
|
174
176
|
|
@@ -193,7 +195,7 @@ module Cequel
|
|
193
195
|
# @see #update
|
194
196
|
#
|
195
197
|
def list_prepend(column, elements, options = {})
|
196
|
-
updater
|
198
|
+
updater { list_prepend(column, elements) }.execute(options)
|
197
199
|
end
|
198
200
|
|
199
201
|
#
|
@@ -216,7 +218,7 @@ module Cequel
|
|
216
218
|
# @since 1.0.0
|
217
219
|
#
|
218
220
|
def list_append(column, elements, options = {})
|
219
|
-
updater
|
221
|
+
updater { list_append(column, elements) }.execute(options)
|
220
222
|
end
|
221
223
|
|
222
224
|
#
|
@@ -238,7 +240,7 @@ module Cequel
|
|
238
240
|
# @since 1.0.0
|
239
241
|
#
|
240
242
|
def list_replace(column, index, value, options = {})
|
241
|
-
updater
|
243
|
+
updater { list_replace(column, index, value) }.execute(options)
|
242
244
|
end
|
243
245
|
|
244
246
|
#
|
@@ -260,7 +262,7 @@ module Cequel
|
|
260
262
|
# @since 1.0.0
|
261
263
|
#
|
262
264
|
def list_remove(column, value, options = {})
|
263
|
-
updater
|
265
|
+
updater { list_remove(column, value) }.execute(options)
|
264
266
|
end
|
265
267
|
|
266
268
|
#
|
@@ -284,7 +286,7 @@ module Cequel
|
|
284
286
|
#
|
285
287
|
def list_remove_at(column, *positions)
|
286
288
|
options = positions.extract_options!
|
287
|
-
deleter
|
289
|
+
deleter { list_remove_at(column, *positions) }.execute(options)
|
288
290
|
end
|
289
291
|
|
290
292
|
#
|
@@ -307,7 +309,7 @@ module Cequel
|
|
307
309
|
#
|
308
310
|
def map_remove(column, *keys)
|
309
311
|
options = keys.extract_options!
|
310
|
-
deleter
|
312
|
+
deleter { map_remove(column, *keys) }.execute(options)
|
311
313
|
end
|
312
314
|
|
313
315
|
#
|
@@ -328,7 +330,7 @@ module Cequel
|
|
328
330
|
# @since 1.0.0
|
329
331
|
#
|
330
332
|
def set_add(column, values, options = {})
|
331
|
-
updater
|
333
|
+
updater { set_add(column, values) }.execute(options)
|
332
334
|
end
|
333
335
|
|
334
336
|
#
|
@@ -349,7 +351,7 @@ module Cequel
|
|
349
351
|
# @since 1.0.0
|
350
352
|
#
|
351
353
|
def set_remove(column, value, options = {})
|
352
|
-
updater
|
354
|
+
updater { set_remove(column, value) }.execute(options)
|
353
355
|
end
|
354
356
|
|
355
357
|
#
|
@@ -370,7 +372,7 @@ module Cequel
|
|
370
372
|
# @since 1.0.0
|
371
373
|
#
|
372
374
|
def map_update(column, updates, options = {})
|
373
|
-
updater
|
375
|
+
updater { map_update(column, updates) }.execute(options)
|
374
376
|
end
|
375
377
|
|
376
378
|
#
|
@@ -422,11 +424,11 @@ module Cequel
|
|
422
424
|
def delete(*columns, &block)
|
423
425
|
options = columns.extract_options!
|
424
426
|
if block
|
425
|
-
deleter(
|
427
|
+
deleter(&block).execute(options)
|
426
428
|
elsif columns.empty?
|
427
|
-
deleter
|
429
|
+
deleter { delete_row }.execute(options)
|
428
430
|
else
|
429
|
-
deleter
|
431
|
+
deleter { delete_columns(*columns) }.execute(options)
|
430
432
|
end
|
431
433
|
end
|
432
434
|
|
@@ -545,6 +547,25 @@ module Cequel
|
|
545
547
|
end
|
546
548
|
end
|
547
549
|
|
550
|
+
# rubocop:disable LineLength
|
551
|
+
|
552
|
+
#
|
553
|
+
# Change the consistency for queries performed by this data set
|
554
|
+
#
|
555
|
+
# @param consistency [Symbol] a consistency level
|
556
|
+
# @return [DataSet] new data set tuned to the given consistency
|
557
|
+
#
|
558
|
+
# @see http://www.datastax.com/documentation/cassandra/2.0/cassandra/dml/dml_config_consistency_c.html
|
559
|
+
# @since 1.1.0
|
560
|
+
#
|
561
|
+
def consistency(consistency)
|
562
|
+
clone.tap do |data_set|
|
563
|
+
data_set.query_consistency = consistency
|
564
|
+
end
|
565
|
+
end
|
566
|
+
|
567
|
+
# rubocop:enable LineLength
|
568
|
+
|
548
569
|
#
|
549
570
|
# Enumerate over rows in this data set. Along with #each, all other
|
550
571
|
# Enumerable methods are implemented.
|
@@ -560,14 +581,15 @@ module Cequel
|
|
560
581
|
#
|
561
582
|
def each
|
562
583
|
return enum_for(:each) unless block_given?
|
563
|
-
execute_cql(*cql)
|
584
|
+
result = execute_cql(*cql)
|
585
|
+
result.each { |row| yield Row.from_result_row(row) }
|
564
586
|
end
|
565
587
|
|
566
588
|
#
|
567
589
|
# @return [Hash] the first row in this data set
|
568
590
|
#
|
569
591
|
def first
|
570
|
-
row = execute_cql(*limit(1).cql).
|
592
|
+
row = execute_cql(*limit(1).cql).first
|
571
593
|
Row.from_result_row(row)
|
572
594
|
end
|
573
595
|
|
@@ -575,7 +597,7 @@ module Cequel
|
|
575
597
|
# @return [Fixnum] the number of rows in this data set
|
576
598
|
#
|
577
599
|
def count
|
578
|
-
execute_cql(*count_cql).
|
600
|
+
execute_cql(*count_cql).first['count']
|
579
601
|
end
|
580
602
|
|
581
603
|
#
|
@@ -606,7 +628,7 @@ module Cequel
|
|
606
628
|
#
|
607
629
|
def inspect
|
608
630
|
"#<#{self.class.name}: " \
|
609
|
-
"#{
|
631
|
+
"#{Keyspace.sanitize(cql.first, cql.drop(1))}>"
|
610
632
|
end
|
611
633
|
|
612
634
|
#
|
@@ -630,28 +652,30 @@ module Cequel
|
|
630
652
|
end
|
631
653
|
end
|
632
654
|
|
633
|
-
# @private
|
634
|
-
def updater(options = {}, &block)
|
635
|
-
Updater.new(self, options, &block)
|
636
|
-
end
|
637
|
-
|
638
|
-
# @private
|
639
|
-
def deleter(options = {}, &block)
|
640
|
-
Deleter.new(self, options, &block)
|
641
|
-
end
|
642
|
-
|
643
655
|
protected
|
644
656
|
|
645
|
-
attr_writer :row_limit
|
657
|
+
attr_writer :row_limit, :query_consistency
|
646
658
|
|
647
659
|
private
|
648
660
|
|
649
|
-
def
|
650
|
-
|
661
|
+
def execute_cql(cql, *bind_vars)
|
662
|
+
keyspace.execute_with_consistency(cql, bind_vars, query_consistency)
|
663
|
+
end
|
664
|
+
|
665
|
+
def inserter(&block)
|
666
|
+
Inserter.new(self, &block)
|
667
|
+
end
|
668
|
+
|
669
|
+
def incrementer(&block)
|
670
|
+
Incrementer.new(self, &block)
|
671
|
+
end
|
672
|
+
|
673
|
+
def updater(&block)
|
674
|
+
Updater.new(self, &block)
|
651
675
|
end
|
652
676
|
|
653
|
-
def
|
654
|
-
|
677
|
+
def deleter(&block)
|
678
|
+
Deleter.new(self, &block)
|
655
679
|
end
|
656
680
|
|
657
681
|
def initialize_copy(source)
|
data/lib/cequel/metal/deleter.rb
CHANGED
@@ -61,7 +61,7 @@ module Cequel
|
|
61
61
|
|
62
62
|
private
|
63
63
|
|
64
|
-
def write_to_statement(statement)
|
64
|
+
def write_to_statement(statement, options)
|
65
65
|
if @delete_row
|
66
66
|
statement.append("DELETE FROM #{table_name}")
|
67
67
|
elsif statements.empty?
|
@@ -71,7 +71,7 @@ module Cequel
|
|
71
71
|
.append(statements.join(','), *bind_vars)
|
72
72
|
.append(" FROM #{table_name}")
|
73
73
|
end
|
74
|
-
statement.append(generate_upsert_options)
|
74
|
+
statement.append(generate_upsert_options(options))
|
75
75
|
end
|
76
76
|
|
77
77
|
def empty?
|
@@ -35,10 +35,10 @@ module Cequel
|
|
35
35
|
|
36
36
|
private
|
37
37
|
|
38
|
-
def write_to_statement(statement)
|
38
|
+
def write_to_statement(statement, options)
|
39
39
|
statement
|
40
40
|
.append("UPDATE #{table_name}")
|
41
|
-
.append(generate_upsert_options)
|
41
|
+
.append(generate_upsert_options(options))
|
42
42
|
.append(
|
43
43
|
" SET " << statements.join(', '),
|
44
44
|
*bind_vars
|
@@ -11,7 +11,7 @@ module Cequel
|
|
11
11
|
#
|
12
12
|
# (see Writer#initialize)
|
13
13
|
#
|
14
|
-
def initialize(data_set
|
14
|
+
def initialize(data_set)
|
15
15
|
@row = {}
|
16
16
|
super
|
17
17
|
end
|
@@ -19,10 +19,12 @@ module Cequel
|
|
19
19
|
#
|
20
20
|
# (see Writer#execute)
|
21
21
|
#
|
22
|
-
def execute
|
22
|
+
def execute(options = {})
|
23
23
|
statement = Statement.new
|
24
|
-
|
25
|
-
|
24
|
+
consistency = options.fetch(:consistency, data_set.query_consistency)
|
25
|
+
write_to_statement(statement, options)
|
26
|
+
data_set.write_with_consistency(
|
27
|
+
statement.cql, statement.bind_vars, consistency)
|
26
28
|
end
|
27
29
|
|
28
30
|
#
|
@@ -55,12 +57,12 @@ module Cequel
|
|
55
57
|
end
|
56
58
|
end
|
57
59
|
|
58
|
-
def write_to_statement(statement)
|
60
|
+
def write_to_statement(statement, options)
|
59
61
|
statement.append("INSERT INTO #{table_name}")
|
60
62
|
statement.append(
|
61
63
|
" (#{column_names.join(', ')}) VALUES (#{statements.join(', ')}) ",
|
62
64
|
*bind_vars)
|
63
|
-
statement.append(generate_upsert_options)
|
65
|
+
statement.append(generate_upsert_options(options))
|
64
66
|
end
|
65
67
|
end
|
66
68
|
end
|
@@ -1,4 +1,6 @@
|
|
1
1
|
# -*- encoding : utf-8 -*-
|
2
|
+
require 'set'
|
3
|
+
|
2
4
|
module Cequel
|
3
5
|
module Metal
|
4
6
|
#
|
@@ -9,29 +11,72 @@ module Cequel
|
|
9
11
|
class Keyspace
|
10
12
|
extend Forwardable
|
11
13
|
include Logging
|
14
|
+
include MonitorMixin
|
12
15
|
|
13
16
|
# @return [Hash] configuration options for this keyspace
|
14
17
|
attr_reader :configuration
|
15
18
|
# @return [String] name of the keyspace
|
16
19
|
attr_reader :name
|
20
|
+
# @return [Array<String>] list of hosts to connect to
|
21
|
+
attr_reader :hosts
|
22
|
+
# @return Integer port to connect to Cassandra nodes on
|
23
|
+
attr_reader :port
|
24
|
+
# @return [Symbol] the default consistency for queries in this keyspace
|
25
|
+
# @since 1.1.0
|
26
|
+
attr_writer :default_consistency
|
17
27
|
|
18
28
|
#
|
19
29
|
# @!method write(statement, *bind_vars)
|
20
30
|
#
|
21
|
-
#
|
22
|
-
#
|
31
|
+
# Write data to this keyspace using a CQL query. Will be included the
|
32
|
+
# current batch operation if one is present.
|
23
33
|
#
|
24
|
-
#
|
25
|
-
#
|
34
|
+
# @param (see #execute)
|
35
|
+
# @return [void]
|
26
36
|
#
|
27
37
|
def_delegator :write_target, :execute, :write
|
28
38
|
|
39
|
+
# @!method write_with_consistency(statement, bind_vars, consistency)
|
40
|
+
#
|
41
|
+
# Write data to this keyspace using a CQL query at the given
|
42
|
+
# consistency. Will be included the current batch operation if one is
|
43
|
+
# present.
|
44
|
+
#
|
45
|
+
# @param (see #execute_with_consistency)
|
46
|
+
# @return [void]
|
47
|
+
#
|
48
|
+
def_delegator :write_target, :execute_with_consistency,
|
49
|
+
:write_with_consistency
|
50
|
+
|
29
51
|
#
|
30
52
|
# @!method batch
|
31
53
|
# (see Cequel::Metal::BatchManager#batch)
|
32
54
|
#
|
33
55
|
def_delegator :batch_manager, :batch
|
34
56
|
|
57
|
+
#
|
58
|
+
# Combine a statement with bind vars into a fully-fledged CQL query. This
|
59
|
+
# will no longer be needed once the CQL driver supports bound values
|
60
|
+
# natively.
|
61
|
+
#
|
62
|
+
# @param statement [String] CQL statement with ? placeholders for bind
|
63
|
+
# vars
|
64
|
+
# @param bind_vars [Array] bind variables corresponding to ? in the
|
65
|
+
# statement
|
66
|
+
# @return [String] CQL statement with quoted values in place of bind
|
67
|
+
# variables
|
68
|
+
#
|
69
|
+
def self.sanitize(statement, bind_vars)
|
70
|
+
each_bind_var = bind_vars.each
|
71
|
+
statement.gsub('?') { Type.quote(each_bind_var.next) }
|
72
|
+
end
|
73
|
+
|
74
|
+
#
|
75
|
+
# @!method sanitize
|
76
|
+
# (see Cequel::Metal::Keyspace.sanitize)
|
77
|
+
#
|
78
|
+
def_delegator 'self.class', :sanitize
|
79
|
+
|
35
80
|
#
|
36
81
|
# @api private
|
37
82
|
# @param configuration [Options]
|
@@ -40,13 +85,14 @@ module Cequel
|
|
40
85
|
#
|
41
86
|
def initialize(configuration={})
|
42
87
|
configure(configuration)
|
88
|
+
@lock = Monitor.new
|
43
89
|
end
|
44
90
|
|
45
91
|
#
|
46
92
|
# Configure this keyspace from a hash of options
|
47
93
|
#
|
48
94
|
# @param configuration [Options] configuration options
|
49
|
-
# @option configuration [String] :host ('127.0.0.1:
|
95
|
+
# @option configuration [String] :host ('127.0.0.1:9042') host/port of
|
50
96
|
# single Cassandra instance to connect to
|
51
97
|
# @option configuration [Array<String>] :hosts list of Cassandra
|
52
98
|
# instances to connect to
|
@@ -59,10 +105,14 @@ module Cequel
|
|
59
105
|
# @return [void]
|
60
106
|
#
|
61
107
|
def configure(configuration = {})
|
108
|
+
if configuration.key?(:thrift)
|
109
|
+
warn "Cequel no longer uses the Thrift transport to communicate " \
|
110
|
+
"with Cassandra. The :thrift option is deprecated and ignored."
|
111
|
+
end
|
62
112
|
@configuration = configuration
|
63
|
-
|
64
|
-
|
65
|
-
|
113
|
+
|
114
|
+
@hosts, @port = extract_hosts_and_port(configuration)
|
115
|
+
|
66
116
|
@name = configuration[:keyspace]
|
67
117
|
# reset the connections
|
68
118
|
clear_active_connections!
|
@@ -83,18 +133,42 @@ module Cequel
|
|
83
133
|
DataSet.new(table_name.to_sym, self)
|
84
134
|
end
|
85
135
|
|
136
|
+
#
|
137
|
+
# @return [Cql::Client::Client] the low-level client provided by the
|
138
|
+
# adapter
|
139
|
+
# @api private
|
140
|
+
#
|
141
|
+
def client
|
142
|
+
synchronize { @client ||= build_client }
|
143
|
+
end
|
144
|
+
|
86
145
|
#
|
87
146
|
# Execute a CQL query in this keyspace
|
88
147
|
#
|
89
148
|
# @param statement [String] CQL string
|
90
149
|
# @param bind_vars [Object] values for bind variables
|
91
|
-
# @return [
|
150
|
+
# @return [Enumerable] the results of the query
|
151
|
+
#
|
152
|
+
# @see #execute_with_consistency
|
92
153
|
#
|
93
154
|
def execute(statement, *bind_vars)
|
155
|
+
execute_with_consistency(statement, bind_vars, default_consistency)
|
156
|
+
end
|
157
|
+
|
158
|
+
#
|
159
|
+
# Execute a CQL query in this keyspace with the given consistency
|
160
|
+
#
|
161
|
+
# @param statement [String] CQL string
|
162
|
+
# @param bind_vars [Array] array of values for bind variables
|
163
|
+
# @param consistency [Symbol] consistency at which to execute query
|
164
|
+
# @return [Enumerable] the results of the query
|
165
|
+
#
|
166
|
+
# @since 1.1.0
|
167
|
+
#
|
168
|
+
def execute_with_consistency(statement, bind_vars, consistency)
|
94
169
|
log('CQL', statement, *bind_vars) do
|
95
|
-
|
96
|
-
|
97
|
-
end
|
170
|
+
client.execute(sanitize(statement, bind_vars),
|
171
|
+
consistency || default_consistency)
|
98
172
|
end
|
99
173
|
end
|
100
174
|
|
@@ -104,47 +178,66 @@ module Cequel
|
|
104
178
|
# @return [void]
|
105
179
|
#
|
106
180
|
def clear_active_connections!
|
107
|
-
if defined? @
|
108
|
-
remove_instance_variable(:@
|
181
|
+
if defined? @client
|
182
|
+
remove_instance_variable(:@client)
|
109
183
|
end
|
110
184
|
end
|
111
185
|
|
186
|
+
#
|
187
|
+
# @return [Symbol] the default consistency for queries in this keyspace
|
188
|
+
# @since 1.1.0
|
189
|
+
#
|
190
|
+
def default_consistency
|
191
|
+
@default_consistency || :quorum
|
192
|
+
end
|
193
|
+
|
112
194
|
private
|
113
195
|
|
114
|
-
|
115
|
-
private :with_connection
|
196
|
+
attr_reader :lock
|
116
197
|
|
117
198
|
def_delegator :batch_manager, :current_batch
|
118
199
|
private :current_batch
|
119
200
|
|
120
|
-
|
121
|
-
|
122
|
-
options[:keyspace] = name if name
|
123
|
-
CassandraCQL::Database.new(
|
124
|
-
@hosts,
|
125
|
-
options,
|
126
|
-
@thrift_options
|
127
|
-
)
|
128
|
-
end
|
201
|
+
def_delegator :lock, :synchronize
|
202
|
+
private :lock
|
129
203
|
|
130
|
-
def
|
131
|
-
|
132
|
-
|
133
|
-
size: @configuration.fetch(:pool, 1),
|
134
|
-
timeout: @configuration.fetch(:pool_timeout, 0)
|
135
|
-
}
|
136
|
-
@connection_pool = ConnectionPool.new(options) do
|
137
|
-
build_connection
|
204
|
+
def build_client
|
205
|
+
Cql::Client.connect(hosts: hosts, port: port).tap do |client|
|
206
|
+
client.use(name) if name
|
138
207
|
end
|
139
208
|
end
|
140
209
|
|
141
210
|
def batch_manager
|
142
|
-
@batch_manager ||= BatchManager.new(self)
|
211
|
+
synchronize { @batch_manager ||= BatchManager.new(self) }
|
143
212
|
end
|
144
213
|
|
145
214
|
def write_target
|
146
215
|
current_batch || self
|
147
216
|
end
|
217
|
+
|
218
|
+
def extract_hosts_and_port(configuration)
|
219
|
+
hosts, ports = [], Set[]
|
220
|
+
ports << configuration[:port] if configuration.key?(:port)
|
221
|
+
Array.wrap(configuration.fetch(
|
222
|
+
:host, configuration.fetch(:hosts, '127.0.0.1'))).each do |host_port|
|
223
|
+
|
224
|
+
host, port = host_port.split(':')
|
225
|
+
hosts << host
|
226
|
+
if port
|
227
|
+
warn "Specifying a hostname as host:port is deprecated. Specify " \
|
228
|
+
"only the host IP or hostname in :hosts, and specify a " \
|
229
|
+
"port for all nodes using the :port option."
|
230
|
+
ports << port.to_i
|
231
|
+
end
|
232
|
+
end
|
233
|
+
|
234
|
+
if ports.size > 1
|
235
|
+
fail ArgumentError, "All Cassandra nodes must listen on the same " \
|
236
|
+
"port; specified multiple ports #{ports.join(', ')}"
|
237
|
+
end
|
238
|
+
|
239
|
+
[hosts, ports.first || 9042]
|
240
|
+
end
|
148
241
|
end
|
149
242
|
end
|
150
243
|
end
|