cassandra-driver 1.0.0.beta.2-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.
Files changed (118) hide show
  1. checksums.yaml +7 -0
  2. data/.yardopts +4 -0
  3. data/README.md +125 -0
  4. data/lib/cassandra/auth/providers/password.rb +73 -0
  5. data/lib/cassandra/auth/providers.rb +16 -0
  6. data/lib/cassandra/auth.rb +97 -0
  7. data/lib/cassandra/client/batch.rb +212 -0
  8. data/lib/cassandra/client/client.rb +591 -0
  9. data/lib/cassandra/client/column_metadata.rb +54 -0
  10. data/lib/cassandra/client/connection_manager.rb +72 -0
  11. data/lib/cassandra/client/connector.rb +277 -0
  12. data/lib/cassandra/client/execute_options_decoder.rb +59 -0
  13. data/lib/cassandra/client/null_logger.rb +37 -0
  14. data/lib/cassandra/client/peer_discovery.rb +50 -0
  15. data/lib/cassandra/client/prepared_statement.rb +314 -0
  16. data/lib/cassandra/client/query_result.rb +230 -0
  17. data/lib/cassandra/client/request_runner.rb +71 -0
  18. data/lib/cassandra/client/result_metadata.rb +48 -0
  19. data/lib/cassandra/client/void_result.rb +78 -0
  20. data/lib/cassandra/client.rb +144 -0
  21. data/lib/cassandra/cluster/client.rb +768 -0
  22. data/lib/cassandra/cluster/connector.rb +244 -0
  23. data/lib/cassandra/cluster/control_connection.rb +425 -0
  24. data/lib/cassandra/cluster/metadata.rb +124 -0
  25. data/lib/cassandra/cluster/options.rb +42 -0
  26. data/lib/cassandra/cluster/registry.rb +198 -0
  27. data/lib/cassandra/cluster/schema/partitioners/murmur3.rb +47 -0
  28. data/lib/cassandra/cluster/schema/partitioners/ordered.rb +37 -0
  29. data/lib/cassandra/cluster/schema/partitioners/random.rb +37 -0
  30. data/lib/cassandra/cluster/schema/partitioners.rb +21 -0
  31. data/lib/cassandra/cluster/schema/replication_strategies/network_topology.rb +92 -0
  32. data/lib/cassandra/cluster/schema/replication_strategies/none.rb +39 -0
  33. data/lib/cassandra/cluster/schema/replication_strategies/simple.rb +44 -0
  34. data/lib/cassandra/cluster/schema/replication_strategies.rb +21 -0
  35. data/lib/cassandra/cluster/schema/type_parser.rb +138 -0
  36. data/lib/cassandra/cluster/schema.rb +340 -0
  37. data/lib/cassandra/cluster.rb +215 -0
  38. data/lib/cassandra/column.rb +92 -0
  39. data/lib/cassandra/compression/compressors/lz4.rb +72 -0
  40. data/lib/cassandra/compression/compressors/snappy.rb +66 -0
  41. data/lib/cassandra/compression.rb +66 -0
  42. data/lib/cassandra/driver.rb +111 -0
  43. data/lib/cassandra/errors.rb +79 -0
  44. data/lib/cassandra/execution/info.rb +51 -0
  45. data/lib/cassandra/execution/options.rb +80 -0
  46. data/lib/cassandra/execution/trace.rb +152 -0
  47. data/lib/cassandra/future.rb +675 -0
  48. data/lib/cassandra/host.rb +79 -0
  49. data/lib/cassandra/keyspace.rb +133 -0
  50. data/lib/cassandra/listener.rb +87 -0
  51. data/lib/cassandra/load_balancing/policies/dc_aware_round_robin.rb +149 -0
  52. data/lib/cassandra/load_balancing/policies/round_robin.rb +132 -0
  53. data/lib/cassandra/load_balancing/policies/token_aware.rb +119 -0
  54. data/lib/cassandra/load_balancing/policies/white_list.rb +90 -0
  55. data/lib/cassandra/load_balancing/policies.rb +19 -0
  56. data/lib/cassandra/load_balancing.rb +113 -0
  57. data/lib/cassandra/protocol/cql_byte_buffer.rb +307 -0
  58. data/lib/cassandra/protocol/cql_protocol_handler.rb +323 -0
  59. data/lib/cassandra/protocol/frame_decoder.rb +128 -0
  60. data/lib/cassandra/protocol/frame_encoder.rb +48 -0
  61. data/lib/cassandra/protocol/request.rb +38 -0
  62. data/lib/cassandra/protocol/requests/auth_response_request.rb +47 -0
  63. data/lib/cassandra/protocol/requests/batch_request.rb +76 -0
  64. data/lib/cassandra/protocol/requests/credentials_request.rb +47 -0
  65. data/lib/cassandra/protocol/requests/execute_request.rb +103 -0
  66. data/lib/cassandra/protocol/requests/options_request.rb +39 -0
  67. data/lib/cassandra/protocol/requests/prepare_request.rb +50 -0
  68. data/lib/cassandra/protocol/requests/query_request.rb +153 -0
  69. data/lib/cassandra/protocol/requests/register_request.rb +38 -0
  70. data/lib/cassandra/protocol/requests/startup_request.rb +49 -0
  71. data/lib/cassandra/protocol/requests/void_query_request.rb +24 -0
  72. data/lib/cassandra/protocol/response.rb +38 -0
  73. data/lib/cassandra/protocol/responses/auth_challenge_response.rb +41 -0
  74. data/lib/cassandra/protocol/responses/auth_success_response.rb +41 -0
  75. data/lib/cassandra/protocol/responses/authenticate_response.rb +41 -0
  76. data/lib/cassandra/protocol/responses/detailed_error_response.rb +60 -0
  77. data/lib/cassandra/protocol/responses/error_response.rb +50 -0
  78. data/lib/cassandra/protocol/responses/event_response.rb +39 -0
  79. data/lib/cassandra/protocol/responses/prepared_result_response.rb +64 -0
  80. data/lib/cassandra/protocol/responses/raw_rows_result_response.rb +43 -0
  81. data/lib/cassandra/protocol/responses/ready_response.rb +44 -0
  82. data/lib/cassandra/protocol/responses/result_response.rb +48 -0
  83. data/lib/cassandra/protocol/responses/rows_result_response.rb +139 -0
  84. data/lib/cassandra/protocol/responses/schema_change_event_response.rb +60 -0
  85. data/lib/cassandra/protocol/responses/schema_change_result_response.rb +57 -0
  86. data/lib/cassandra/protocol/responses/set_keyspace_result_response.rb +42 -0
  87. data/lib/cassandra/protocol/responses/status_change_event_response.rb +44 -0
  88. data/lib/cassandra/protocol/responses/supported_response.rb +41 -0
  89. data/lib/cassandra/protocol/responses/topology_change_event_response.rb +34 -0
  90. data/lib/cassandra/protocol/responses/void_result_response.rb +39 -0
  91. data/lib/cassandra/protocol/type_converter.rb +384 -0
  92. data/lib/cassandra/protocol.rb +93 -0
  93. data/lib/cassandra/reconnection/policies/constant.rb +48 -0
  94. data/lib/cassandra/reconnection/policies/exponential.rb +79 -0
  95. data/lib/cassandra/reconnection/policies.rb +20 -0
  96. data/lib/cassandra/reconnection.rb +49 -0
  97. data/lib/cassandra/result.rb +215 -0
  98. data/lib/cassandra/retry/policies/default.rb +47 -0
  99. data/lib/cassandra/retry/policies/downgrading_consistency.rb +71 -0
  100. data/lib/cassandra/retry/policies/fallthrough.rb +39 -0
  101. data/lib/cassandra/retry/policies.rb +21 -0
  102. data/lib/cassandra/retry.rb +142 -0
  103. data/lib/cassandra/session.rb +202 -0
  104. data/lib/cassandra/statement.rb +22 -0
  105. data/lib/cassandra/statements/batch.rb +95 -0
  106. data/lib/cassandra/statements/bound.rb +48 -0
  107. data/lib/cassandra/statements/prepared.rb +81 -0
  108. data/lib/cassandra/statements/simple.rb +58 -0
  109. data/lib/cassandra/statements/void.rb +33 -0
  110. data/lib/cassandra/statements.rb +23 -0
  111. data/lib/cassandra/table.rb +299 -0
  112. data/lib/cassandra/time_uuid.rb +142 -0
  113. data/lib/cassandra/util.rb +167 -0
  114. data/lib/cassandra/uuid.rb +104 -0
  115. data/lib/cassandra/version.rb +21 -0
  116. data/lib/cassandra.rb +428 -0
  117. data/lib/cassandra_murmur3.jar +0 -0
  118. metadata +211 -0
@@ -0,0 +1,21 @@
1
+ # encoding: utf-8
2
+
3
+ #--
4
+ # Copyright 2013-2014 DataStax, Inc.
5
+ #
6
+ # Licensed under the Apache License, Version 2.0 (the "License");
7
+ # you may not use this file except in compliance with the License.
8
+ # You may obtain a copy of the License at
9
+ #
10
+ # http://www.apache.org/licenses/LICENSE-2.0
11
+ #
12
+ # Unless required by applicable law or agreed to in writing, software
13
+ # distributed under the License is distributed on an "AS IS" BASIS,
14
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
15
+ # See the License for the specific language governing permissions and
16
+ # limitations under the License.
17
+ #++
18
+
19
+ require 'cassandra/cluster/schema/replication_strategies/simple'
20
+ require 'cassandra/cluster/schema/replication_strategies/network_topology'
21
+ require 'cassandra/cluster/schema/replication_strategies/none'
@@ -0,0 +1,138 @@
1
+ # encoding: utf-8
2
+
3
+ #--
4
+ # Copyright 2013-2014 DataStax, Inc.
5
+ #
6
+ # Licensed under the Apache License, Version 2.0 (the "License");
7
+ # you may not use this file except in compliance with the License.
8
+ # You may obtain a copy of the License at
9
+ #
10
+ # http://www.apache.org/licenses/LICENSE-2.0
11
+ #
12
+ # Unless required by applicable law or agreed to in writing, software
13
+ # distributed under the License is distributed on an "AS IS" BASIS,
14
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
15
+ # See the License for the specific language governing permissions and
16
+ # limitations under the License.
17
+ #++
18
+
19
+ module Cassandra
20
+ class Cluster
21
+ class Schema
22
+ class TypeParser
23
+ # @private
24
+ Node = Struct.new(:parent, :name, :children)
25
+ # @private
26
+ Result = Struct.new(:results, :collections)
27
+
28
+ @@types = {
29
+ "org.apache.cassandra.db.marshal.AsciiType" => :ascii,
30
+ "org.apache.cassandra.db.marshal.LongType" => :bigint,
31
+ "org.apache.cassandra.db.marshal.BytesType" => :blob,
32
+ "org.apache.cassandra.db.marshal.BooleanType" => :boolean,
33
+ "org.apache.cassandra.db.marshal.CounterColumnType" => :counter,
34
+ "org.apache.cassandra.db.marshal.DecimalType" => :decimal,
35
+ "org.apache.cassandra.db.marshal.DoubleType" => :double,
36
+ "org.apache.cassandra.db.marshal.FloatType" => :float,
37
+ "org.apache.cassandra.db.marshal.InetAddressType" => :inet,
38
+ "org.apache.cassandra.db.marshal.Int32Type" => :int,
39
+ "org.apache.cassandra.db.marshal.UTF8Type" => :text,
40
+ "org.apache.cassandra.db.marshal.TimestampType" => :timestamp,
41
+ "org.apache.cassandra.db.marshal.DateType" => :timestamp,
42
+ "org.apache.cassandra.db.marshal.UUIDType" => :uuid,
43
+ "org.apache.cassandra.db.marshal.IntegerType" => :varint,
44
+ "org.apache.cassandra.db.marshal.TimeUUIDType" => :timeuuid,
45
+ "org.apache.cassandra.db.marshal.MapType" => :map,
46
+ "org.apache.cassandra.db.marshal.SetType" => :set,
47
+ "org.apache.cassandra.db.marshal.ListType" => :list
48
+ }.freeze
49
+
50
+ def parse(string)
51
+ create_result(parse_node(string))
52
+ end
53
+
54
+ private
55
+
56
+ def create_result(node)
57
+ collections = nil
58
+ results = []
59
+
60
+ if node.name == "org.apache.cassandra.db.marshal.CompositeType"
61
+ collections = {}
62
+
63
+ if node.children.last.name == "org.apache.cassandra.db.marshal.ColumnToCollectionType"
64
+ node.children.pop.children.each do |child|
65
+ key, name = child.name.split(":")
66
+ key = [key].pack('H*').force_encoding(::Encoding::UTF_8)
67
+
68
+ if name == "org.apache.cassandra.db.marshal.ReversedType"
69
+ collections[key] = lookup_type(child.children.first)
70
+ else
71
+ child.name = name
72
+ collections[key] = lookup_type(child)
73
+ end
74
+ end
75
+ end
76
+
77
+ node.children.each do |child|
78
+ results << create_type(child)
79
+ end
80
+ else
81
+ results << create_type(node)
82
+ end
83
+
84
+ Result.new(results, collections)
85
+ end
86
+
87
+ def create_type(node)
88
+ order = :asc
89
+
90
+ if node.name == "org.apache.cassandra.db.marshal.ReversedType"
91
+ order = :desc
92
+ node = node.children.first
93
+ end
94
+
95
+ [lookup_type(node), order]
96
+ end
97
+
98
+ def lookup_type(node)
99
+ type = @@types[node.name]
100
+
101
+ case type
102
+ when :set, :list
103
+ [type, lookup_type(node.children.first)]
104
+ when :map
105
+ [type, *node.children.map {|child| lookup_type(child)}]
106
+ else
107
+ type
108
+ end
109
+ end
110
+
111
+ def parse_node(string)
112
+ root = node = Node.new(nil, '', [])
113
+
114
+ string.each_char do |char|
115
+ case char
116
+ when '(' # starting type params
117
+ child = Node.new(node, '', [])
118
+ node.children << child
119
+ node = child
120
+ when ','
121
+ child = Node.new(node.parent, '', [])
122
+ node.parent.children << child
123
+ node = child
124
+ when ')'
125
+ node = node.parent
126
+ when ' '
127
+ next
128
+ else
129
+ node.name << char
130
+ end
131
+ end
132
+
133
+ root
134
+ end
135
+ end
136
+ end
137
+ end
138
+ end
@@ -0,0 +1,340 @@
1
+ # encoding: utf-8
2
+
3
+ #--
4
+ # Copyright 2013-2014 DataStax, Inc.
5
+ #
6
+ # Licensed under the Apache License, Version 2.0 (the "License");
7
+ # you may not use this file except in compliance with the License.
8
+ # You may obtain a copy of the License at
9
+ #
10
+ # http://www.apache.org/licenses/LICENSE-2.0
11
+ #
12
+ # Unless required by applicable law or agreed to in writing, software
13
+ # distributed under the License is distributed on an "AS IS" BASIS,
14
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
15
+ # See the License for the specific language governing permissions and
16
+ # limitations under the License.
17
+ #++
18
+
19
+ module Cassandra
20
+ class Cluster
21
+ # @private
22
+ class Schema
23
+ include MonitorMixin
24
+
25
+ def initialize(schema_type_parser)
26
+ @type_parser = schema_type_parser
27
+ @keyspaces = ::Hash.new
28
+ @listeners = ::Set.new
29
+
30
+ mon_initialize
31
+ end
32
+
33
+ def create_partition_key(keyspace, table, values)
34
+ keyspace = @keyspaces[keyspace]
35
+ keyspace && keyspace.create_partition_key(table, values)
36
+ end
37
+
38
+ def add_listener(listener)
39
+ synchronize do
40
+ @listeners = @listeners.dup.add(listener)
41
+ end
42
+
43
+ self
44
+ end
45
+
46
+ def remove_listener(listener)
47
+ synchronize do
48
+ @listeners = @listeners.dup.delete(listener)
49
+ end
50
+
51
+ self
52
+ end
53
+
54
+ def update_keyspaces(host, keyspaces, tables, columns)
55
+ columns = columns.each_with_object(deephash { [] }) do |row, index|
56
+ index[row['keyspace_name']] << row
57
+ end
58
+
59
+ tables = tables.each_with_object(deephash { [] }) do |row, index|
60
+ index[row['keyspace_name']] << row
61
+ end
62
+
63
+ current_keyspaces = ::Set.new
64
+
65
+ keyspaces.each do |row|
66
+ current_keyspaces << keyspace = row['keyspace_name']
67
+
68
+ update_keyspace(host, row, tables[keyspace], columns[keyspace])
69
+ end
70
+
71
+ @keyspaces.each do |name, keyspace|
72
+ delete_keyspace(name) unless current_keyspaces.include?(name)
73
+ end
74
+
75
+ self
76
+ end
77
+
78
+ def update_keyspace(host, keyspace, tables, columns)
79
+ keyspace_name = keyspace['keyspace_name']
80
+
81
+ columns = columns.each_with_object(deephash { ::Hash.new }) do |row, index|
82
+ index[row['columnfamily_name']][row['column_name']] = row
83
+ end
84
+
85
+ tables = tables.each_with_object(Hash.new) do |row, index|
86
+ name = row['columnfamily_name']
87
+ index[name] = create_table(row, columns[name], host.release_version)
88
+ end
89
+
90
+ replication = Keyspace::Replication.new(keyspace['strategy_class'], ::JSON.load(keyspace['strategy_options']))
91
+ keyspace = Keyspace.new(keyspace_name, keyspace['durable_writes'], replication, tables)
92
+
93
+ return self if keyspace == @keyspaces[keyspace_name]
94
+
95
+ created = !@keyspaces.include?(keyspace_name)
96
+
97
+ synchronize do
98
+ keyspaces = @keyspaces.dup
99
+ keyspaces[keyspace_name] = keyspace
100
+ @keyspaces = keyspaces
101
+ end
102
+
103
+ if created
104
+ keyspace_created(keyspace)
105
+ else
106
+ keyspace_changed(keyspace)
107
+ end
108
+
109
+ self
110
+ end
111
+
112
+ def delete_keyspace(keyspace_name)
113
+ keyspace = @keyspaces[keyspace_name]
114
+
115
+ return self unless keyspace
116
+
117
+ synchronize do
118
+ keyspaces = @keyspaces.dup
119
+ keyspaces.delete(keyspace_name)
120
+ @keyspaces = keyspaces
121
+ end
122
+
123
+ keyspace_dropped(keyspace)
124
+
125
+ self
126
+ end
127
+
128
+ def udpate_table(host, keyspace_name, table, columns)
129
+ keyspace = @keyspaces[keyspace_name]
130
+
131
+ return self unless keyspace
132
+
133
+ table = create_table(table, columns, host.release_version)
134
+ keyspace = keyspace.update_table(table)
135
+
136
+ synchronize do
137
+ keyspaces = @keyspaces.dup
138
+ keyspaces[keyspace_name] = keyspace
139
+ @keyspaces = keyspaces
140
+ end
141
+
142
+ keyspace_updated(keyspace)
143
+
144
+ self
145
+ end
146
+
147
+ def has_keyspace?(name)
148
+ @keyspaces.include?(name)
149
+ end
150
+
151
+ def keyspace(name)
152
+ @keyspaces[name]
153
+ end
154
+
155
+ def each_keyspace(&block)
156
+ if block_given?
157
+ @keyspaces.each_value(&block)
158
+ self
159
+ else
160
+ @keyspaces.values
161
+ end
162
+ end
163
+ alias :keyspaces :each_keyspace
164
+
165
+ private
166
+
167
+ def create_table(table, columns, version)
168
+ keyspace = table['keyspace_name']
169
+ name = table['columnfamily_name']
170
+ key_validator = @type_parser.parse(table['key_validator'])
171
+ comparator = @type_parser.parse(table['comparator'])
172
+ column_aliases = ::JSON.load(table['column_aliases'])
173
+
174
+ clustering_size = find_clustering_size(comparator, columns.values,
175
+ column_aliases, version)
176
+
177
+ is_dense = clustering_size != comparator.results.size - 1
178
+ is_compact = is_dense || !comparator.collections
179
+ partition_key = []
180
+ clustering_columns = []
181
+ clustering_order = []
182
+
183
+ compaction_strategy = Table::Compaction.new(
184
+ table['compaction_strategy_class'],
185
+ ::JSON.load(table['compaction_strategy_options'])
186
+ )
187
+ compression_parameters = ::JSON.load(table['compression_parameters'])
188
+
189
+ options = Table::Options.new(table, compaction_strategy, compression_parameters, is_compact, version)
190
+ columns = create_columns(key_validator, comparator, column_aliases, is_dense, clustering_size, table, columns, version, partition_key, clustering_columns, clustering_order)
191
+
192
+ Table.new(keyspace, name, partition_key, clustering_columns, columns, options, clustering_order)
193
+ end
194
+
195
+ def find_clustering_size(comparator, columns, aliases, cassandra_version)
196
+ if cassandra_version.start_with?('1')
197
+ if comparator.collections
198
+ size = comparator.results.size
199
+ (!comparator.collections.empty? || aliases.size == size - 1 && comparator.results.last.first == :text) ? size - 1 : size
200
+ else
201
+ (!aliases.empty? || columns.empty?) ? 1 : 0
202
+ end
203
+ else
204
+ max_index = nil
205
+
206
+ columns.each do |cl|
207
+ if cl['type'].upcase == 'CLUSTERING_KEY'
208
+ index = cl['component_index'] || 0
209
+
210
+ if max_index.nil? || index > max_index
211
+ max_index = index
212
+ end
213
+ end
214
+ end
215
+
216
+ return 0 if max_index.nil?
217
+
218
+ max_index + 1
219
+ end
220
+ end
221
+
222
+ def create_columns(key_validator, comparator, column_aliases, is_dense, clustering_size, table, columns, cassandra_version, partition_key, clustering_columns, clustering_order)
223
+ table_columns = {}
224
+ other_columns = []
225
+
226
+ if cassandra_version.start_with?('1')
227
+ key_aliases = ::JSON.load(table['key_aliases'])
228
+
229
+ key_validator.results.each_with_index do |(type, order), i|
230
+ key_alias = key_aliases.fetch(i) { i.zero? ? "key" : "key#{i + 1}" }
231
+
232
+ partition_key[i] = Column.new(key_alias, type, order)
233
+ end
234
+
235
+ if comparator.results.size > 1
236
+ clustering_size.times do |i|
237
+ column_alias = column_aliases.fetch(i) { "column#{i + 1}" }
238
+ type, order = comparator.results.fetch(i)
239
+
240
+ clustering_columns[i] = Column.new(column_alias, type, order)
241
+ clustering_order[i] = order
242
+ end
243
+ else
244
+ column_alias = column_aliases.first || "column1"
245
+ type, order = comparator.results.first
246
+
247
+ clustering_columns[0] = Column.new(column_alias, type, order)
248
+ clustering_order[0] = order
249
+ end
250
+
251
+ if is_dense
252
+ value_alias = table['value_alias']
253
+ value_alias = 'value' if value_alias.nil? || value_alias.empty?
254
+ type, order = @type_parser.parse(table['default_validator']).results.first
255
+ other_columns << Column.new(value_alias, type, order)
256
+ end
257
+
258
+ columns.each do |name, row|
259
+ other_columns << create_column(row)
260
+ end
261
+ else
262
+ columns.each do |name, row|
263
+ next if row['column_name'].empty?
264
+
265
+ column = create_column(row)
266
+ type = row['type']
267
+ index = row['component_index'] || 0
268
+
269
+ case type.upcase
270
+ when 'PARTITION_KEY'
271
+ partition_key[index] = column
272
+ when 'CLUSTERING_KEY'
273
+ clustering_columns[index] = column
274
+ clustering_order[index] = column.order
275
+ else
276
+ other_columns << column
277
+ end
278
+ end
279
+ end
280
+
281
+ partition_key.each do |column|
282
+ table_columns[column.name] = column
283
+ end
284
+
285
+ clustering_columns.each do |column|
286
+ table_columns[column.name] = column
287
+ end
288
+
289
+ other_columns.each do |column|
290
+ table_columns[column.name] = column
291
+ end
292
+
293
+ table_columns
294
+ end
295
+
296
+ def create_column(column)
297
+ name = column['column_name']
298
+ type, order = @type_parser.parse(column['validator']).results.first
299
+ is_static = (column['type'] == 'STATIC')
300
+
301
+ if column['index_type'].nil?
302
+ index = nil
303
+ elsif column['index_type'].upcase == 'CUSTOM' || !column['index_options']
304
+ index = Column::Index.new(column['index_name'])
305
+ else
306
+ options = ::JSON.load(column['index_options'])
307
+ index = Column::Index.new(column['index_name'], options['class_name'])
308
+ end
309
+
310
+ Column.new(name, type, order, index, is_static)
311
+ end
312
+
313
+ def deephash
314
+ ::Hash.new {|hash, key| hash[key] = yield}
315
+ end
316
+
317
+ def keyspace_created(keyspace)
318
+ @listeners.each do |listener|
319
+ listener.keyspace_created(keyspace) rescue nil
320
+ end
321
+ end
322
+
323
+ def keyspace_changed(keyspace)
324
+ @listeners.each do |listener|
325
+ listener.keyspace_changed(keyspace) rescue nil
326
+ end
327
+ end
328
+
329
+ def keyspace_dropped(keyspace)
330
+ @listeners.each do |listener|
331
+ listener.keyspace_dropped(keyspace) rescue nil
332
+ end
333
+ end
334
+ end
335
+ end
336
+ end
337
+
338
+ require 'cassandra/cluster/schema/partitioners'
339
+ require 'cassandra/cluster/schema/replication_strategies'
340
+ require 'cassandra/cluster/schema/type_parser'