yugabyte-ycql-driver 3.2.3.1

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 (145) hide show
  1. checksums.yaml +7 -0
  2. data/.yardopts +13 -0
  3. data/README.md +242 -0
  4. data/ext/cassandra_murmur3/cassandra_murmur3.c +178 -0
  5. data/ext/cassandra_murmur3/extconf.rb +2 -0
  6. data/lib/cassandra/address_resolution.rb +36 -0
  7. data/lib/cassandra/address_resolution/policies.rb +2 -0
  8. data/lib/cassandra/address_resolution/policies/ec2_multi_region.rb +56 -0
  9. data/lib/cassandra/address_resolution/policies/none.rb +35 -0
  10. data/lib/cassandra/aggregate.rb +123 -0
  11. data/lib/cassandra/argument.rb +51 -0
  12. data/lib/cassandra/attr_boolean.rb +33 -0
  13. data/lib/cassandra/auth.rb +100 -0
  14. data/lib/cassandra/auth/providers.rb +17 -0
  15. data/lib/cassandra/auth/providers/password.rb +65 -0
  16. data/lib/cassandra/cassandra_logger.rb +80 -0
  17. data/lib/cassandra/cluster.rb +331 -0
  18. data/lib/cassandra/cluster/client.rb +1612 -0
  19. data/lib/cassandra/cluster/connection_pool.rb +78 -0
  20. data/lib/cassandra/cluster/connector.rb +372 -0
  21. data/lib/cassandra/cluster/control_connection.rb +962 -0
  22. data/lib/cassandra/cluster/failed_connection.rb +35 -0
  23. data/lib/cassandra/cluster/metadata.rb +142 -0
  24. data/lib/cassandra/cluster/options.rb +145 -0
  25. data/lib/cassandra/cluster/registry.rb +284 -0
  26. data/lib/cassandra/cluster/schema.rb +405 -0
  27. data/lib/cassandra/cluster/schema/cql_type_parser.rb +112 -0
  28. data/lib/cassandra/cluster/schema/fetchers.rb +1627 -0
  29. data/lib/cassandra/cluster/schema/fqcn_type_parser.rb +175 -0
  30. data/lib/cassandra/cluster/schema/partitioners.rb +21 -0
  31. data/lib/cassandra/cluster/schema/partitioners/murmur3.rb +45 -0
  32. data/lib/cassandra/cluster/schema/partitioners/ordered.rb +37 -0
  33. data/lib/cassandra/cluster/schema/partitioners/random.rb +37 -0
  34. data/lib/cassandra/cluster/schema/replication_strategies.rb +21 -0
  35. data/lib/cassandra/cluster/schema/replication_strategies/network_topology.rb +102 -0
  36. data/lib/cassandra/cluster/schema/replication_strategies/none.rb +39 -0
  37. data/lib/cassandra/cluster/schema/replication_strategies/simple.rb +44 -0
  38. data/lib/cassandra/column.rb +66 -0
  39. data/lib/cassandra/column_container.rb +326 -0
  40. data/lib/cassandra/compression.rb +69 -0
  41. data/lib/cassandra/compression/compressors/lz4.rb +73 -0
  42. data/lib/cassandra/compression/compressors/snappy.rb +69 -0
  43. data/lib/cassandra/custom_data.rb +53 -0
  44. data/lib/cassandra/driver.rb +260 -0
  45. data/lib/cassandra/errors.rb +784 -0
  46. data/lib/cassandra/execution/info.rb +69 -0
  47. data/lib/cassandra/execution/options.rb +267 -0
  48. data/lib/cassandra/execution/profile.rb +153 -0
  49. data/lib/cassandra/execution/profile_manager.rb +71 -0
  50. data/lib/cassandra/execution/trace.rb +192 -0
  51. data/lib/cassandra/executors.rb +113 -0
  52. data/lib/cassandra/function.rb +156 -0
  53. data/lib/cassandra/function_collection.rb +85 -0
  54. data/lib/cassandra/future.rb +794 -0
  55. data/lib/cassandra/host.rb +102 -0
  56. data/lib/cassandra/index.rb +118 -0
  57. data/lib/cassandra/keyspace.rb +473 -0
  58. data/lib/cassandra/listener.rb +87 -0
  59. data/lib/cassandra/load_balancing.rb +121 -0
  60. data/lib/cassandra/load_balancing/policies.rb +20 -0
  61. data/lib/cassandra/load_balancing/policies/dc_aware_round_robin.rb +172 -0
  62. data/lib/cassandra/load_balancing/policies/round_robin.rb +141 -0
  63. data/lib/cassandra/load_balancing/policies/token_aware.rb +149 -0
  64. data/lib/cassandra/load_balancing/policies/white_list.rb +100 -0
  65. data/lib/cassandra/materialized_view.rb +92 -0
  66. data/lib/cassandra/null_logger.rb +56 -0
  67. data/lib/cassandra/protocol.rb +102 -0
  68. data/lib/cassandra/protocol/coder.rb +1085 -0
  69. data/lib/cassandra/protocol/cql_byte_buffer.rb +418 -0
  70. data/lib/cassandra/protocol/cql_protocol_handler.rb +448 -0
  71. data/lib/cassandra/protocol/request.rb +41 -0
  72. data/lib/cassandra/protocol/requests/auth_response_request.rb +51 -0
  73. data/lib/cassandra/protocol/requests/batch_request.rb +117 -0
  74. data/lib/cassandra/protocol/requests/credentials_request.rb +51 -0
  75. data/lib/cassandra/protocol/requests/execute_request.rb +122 -0
  76. data/lib/cassandra/protocol/requests/options_request.rb +39 -0
  77. data/lib/cassandra/protocol/requests/prepare_request.rb +59 -0
  78. data/lib/cassandra/protocol/requests/query_request.rb +112 -0
  79. data/lib/cassandra/protocol/requests/register_request.rb +38 -0
  80. data/lib/cassandra/protocol/requests/startup_request.rb +49 -0
  81. data/lib/cassandra/protocol/requests/void_query_request.rb +24 -0
  82. data/lib/cassandra/protocol/response.rb +28 -0
  83. data/lib/cassandra/protocol/responses/already_exists_error_response.rb +50 -0
  84. data/lib/cassandra/protocol/responses/auth_challenge_response.rb +36 -0
  85. data/lib/cassandra/protocol/responses/auth_success_response.rb +36 -0
  86. data/lib/cassandra/protocol/responses/authenticate_response.rb +36 -0
  87. data/lib/cassandra/protocol/responses/error_response.rb +142 -0
  88. data/lib/cassandra/protocol/responses/event_response.rb +30 -0
  89. data/lib/cassandra/protocol/responses/function_failure_error_response.rb +52 -0
  90. data/lib/cassandra/protocol/responses/prepared_result_response.rb +62 -0
  91. data/lib/cassandra/protocol/responses/raw_rows_result_response.rb +59 -0
  92. data/lib/cassandra/protocol/responses/read_failure_error_response.rb +71 -0
  93. data/lib/cassandra/protocol/responses/read_timeout_error_response.rb +61 -0
  94. data/lib/cassandra/protocol/responses/ready_response.rb +43 -0
  95. data/lib/cassandra/protocol/responses/result_response.rb +42 -0
  96. data/lib/cassandra/protocol/responses/rows_result_response.rb +39 -0
  97. data/lib/cassandra/protocol/responses/schema_change_event_response.rb +73 -0
  98. data/lib/cassandra/protocol/responses/schema_change_result_response.rb +70 -0
  99. data/lib/cassandra/protocol/responses/set_keyspace_result_response.rb +37 -0
  100. data/lib/cassandra/protocol/responses/status_change_event_response.rb +39 -0
  101. data/lib/cassandra/protocol/responses/supported_response.rb +36 -0
  102. data/lib/cassandra/protocol/responses/topology_change_event_response.rb +33 -0
  103. data/lib/cassandra/protocol/responses/unavailable_error_response.rb +58 -0
  104. data/lib/cassandra/protocol/responses/unprepared_error_response.rb +48 -0
  105. data/lib/cassandra/protocol/responses/void_result_response.rb +34 -0
  106. data/lib/cassandra/protocol/responses/write_failure_error_response.rb +73 -0
  107. data/lib/cassandra/protocol/responses/write_timeout_error_response.rb +63 -0
  108. data/lib/cassandra/protocol/v1.rb +326 -0
  109. data/lib/cassandra/protocol/v3.rb +358 -0
  110. data/lib/cassandra/protocol/v4.rb +478 -0
  111. data/lib/cassandra/reconnection.rb +49 -0
  112. data/lib/cassandra/reconnection/policies.rb +20 -0
  113. data/lib/cassandra/reconnection/policies/constant.rb +46 -0
  114. data/lib/cassandra/reconnection/policies/exponential.rb +79 -0
  115. data/lib/cassandra/result.rb +276 -0
  116. data/lib/cassandra/retry.rb +154 -0
  117. data/lib/cassandra/retry/policies.rb +21 -0
  118. data/lib/cassandra/retry/policies/default.rb +53 -0
  119. data/lib/cassandra/retry/policies/downgrading_consistency.rb +73 -0
  120. data/lib/cassandra/retry/policies/fallthrough.rb +39 -0
  121. data/lib/cassandra/session.rb +270 -0
  122. data/lib/cassandra/statement.rb +32 -0
  123. data/lib/cassandra/statements.rb +23 -0
  124. data/lib/cassandra/statements/batch.rb +146 -0
  125. data/lib/cassandra/statements/bound.rb +65 -0
  126. data/lib/cassandra/statements/prepared.rb +235 -0
  127. data/lib/cassandra/statements/simple.rb +118 -0
  128. data/lib/cassandra/statements/void.rb +38 -0
  129. data/lib/cassandra/table.rb +240 -0
  130. data/lib/cassandra/time.rb +103 -0
  131. data/lib/cassandra/time_uuid.rb +78 -0
  132. data/lib/cassandra/timestamp_generator.rb +37 -0
  133. data/lib/cassandra/timestamp_generator/simple.rb +38 -0
  134. data/lib/cassandra/timestamp_generator/ticking_on_duplicate.rb +58 -0
  135. data/lib/cassandra/trigger.rb +67 -0
  136. data/lib/cassandra/tuple.rb +131 -0
  137. data/lib/cassandra/types.rb +1704 -0
  138. data/lib/cassandra/udt.rb +443 -0
  139. data/lib/cassandra/util.rb +464 -0
  140. data/lib/cassandra/uuid.rb +110 -0
  141. data/lib/cassandra/uuid/generator.rb +212 -0
  142. data/lib/cassandra/version.rb +21 -0
  143. data/lib/datastax/cassandra.rb +47 -0
  144. data/lib/ycql.rb +842 -0
  145. metadata +243 -0
@@ -0,0 +1,405 @@
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
+ class Cluster
21
+ # @private
22
+ class Schema
23
+ include MonitorMixin
24
+
25
+ def initialize
26
+ @keyspaces = ::Hash.new
27
+ @listeners = ::Set.new
28
+
29
+ mon_initialize
30
+ end
31
+
32
+ def get_pk_idx(metadata)
33
+ return EMPTY_LIST unless metadata
34
+
35
+ # metadata is an array of column-specs; each column-spec is an array
36
+ # of keyspace_name, tablename, other stuff. We only care about the first two.
37
+ # See read_prepared_metadata_v4 in coder.rb for more details.
38
+ # NB: sandman: I think all of the column specs have the same keyspace and
39
+ # table name in this context, so we can safely grab the first.
40
+
41
+ keyspace_name, table_name = metadata.first
42
+ return EMPTY_LIST unless keyspace_name && table_name
43
+
44
+ keyspace = @keyspaces[keyspace_name]
45
+ return EMPTY_LIST unless keyspace
46
+
47
+ table = keyspace.table(table_name)
48
+ return EMPTY_LIST unless table
49
+
50
+ partition_key = table.partition_key
51
+ return EMPTY_LIST unless partition_key && partition_key.size <= metadata.size
52
+
53
+ partition_key.map do |column|
54
+ i = metadata.index {|(_, _, name, _)| name == column.name}
55
+ return EMPTY_LIST if i.nil?
56
+ i
57
+ end
58
+ end
59
+
60
+ def add_listener(listener)
61
+ synchronize do
62
+ @listeners = @listeners.dup.add(listener)
63
+ end
64
+
65
+ self
66
+ end
67
+
68
+ def remove_listener(listener)
69
+ synchronize do
70
+ @listeners = @listeners.dup.delete(listener)
71
+ end
72
+
73
+ self
74
+ end
75
+
76
+ def replace(keyspaces)
77
+ current_keyspaces = ::Set.new
78
+
79
+ keyspaces.each do |keyspace|
80
+ current_keyspaces << keyspace.name
81
+
82
+ replace_keyspace(keyspace)
83
+ end
84
+
85
+ @keyspaces.each do |name, _keyspace|
86
+ delete_keyspace(name) unless current_keyspaces.include?(name)
87
+ end
88
+
89
+ self
90
+ end
91
+
92
+ def replace_keyspace(keyspace)
93
+ old_keyspace = @keyspaces[keyspace.name]
94
+
95
+ return self if old_keyspace == keyspace
96
+
97
+ synchronize do
98
+ keyspaces = @keyspaces.dup
99
+ keyspaces[keyspace.name] = keyspace
100
+ @keyspaces = keyspaces
101
+ end
102
+
103
+ if old_keyspace
104
+ keyspace_changed(keyspace)
105
+ else
106
+ keyspace_created(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 replace_table(table)
129
+ keyspace = table.keyspace
130
+
131
+ return self unless keyspace
132
+
133
+ old_table = keyspace.table(table.name)
134
+
135
+ return self if old_table == table
136
+
137
+ keyspace = keyspace.update_table(table)
138
+
139
+ synchronize do
140
+ keyspaces = @keyspaces.dup
141
+ keyspaces[keyspace.name] = keyspace
142
+ @keyspaces = keyspaces
143
+ end
144
+
145
+ keyspace_changed(keyspace)
146
+
147
+ self
148
+ end
149
+
150
+ def delete_table(keyspace_name, table_name)
151
+ keyspace = @keyspaces[keyspace_name]
152
+
153
+ return self unless keyspace
154
+
155
+ table = keyspace.table(table_name)
156
+
157
+ return self unless table
158
+
159
+ keyspace = keyspace.delete_table(table_name)
160
+
161
+ synchronize do
162
+ keyspaces = @keyspaces.dup
163
+ keyspaces[keyspace_name] = keyspace
164
+ @keyspaces = keyspaces
165
+ end
166
+
167
+ keyspace_changed(keyspace)
168
+
169
+ self
170
+ end
171
+
172
+ def replace_materialized_view(view)
173
+ keyspace = view.keyspace
174
+
175
+ return self unless keyspace
176
+
177
+ old_view = keyspace.materialized_view(view.name)
178
+
179
+ return self if old_view == view
180
+
181
+ keyspace = keyspace.update_materialized_view(view)
182
+
183
+ synchronize do
184
+ keyspaces = @keyspaces.dup
185
+ keyspaces[keyspace.name] = keyspace
186
+ @keyspaces = keyspaces
187
+ end
188
+
189
+ keyspace_changed(keyspace)
190
+
191
+ self
192
+ end
193
+
194
+ def delete_materialized_view(keyspace_name, view_name)
195
+ keyspace = @keyspaces[keyspace_name]
196
+
197
+ return self unless keyspace
198
+
199
+ view = keyspace.materialized_view(view_name)
200
+
201
+ return self unless view
202
+
203
+ keyspace = keyspace.delete_materialized_view(view_name)
204
+
205
+ synchronize do
206
+ keyspaces = @keyspaces.dup
207
+ keyspaces[keyspace_name] = keyspace
208
+ @keyspaces = keyspaces
209
+ end
210
+
211
+ keyspace_changed(keyspace)
212
+
213
+ self
214
+ end
215
+
216
+ def replace_type(type)
217
+ keyspace = @keyspaces[type.keyspace]
218
+
219
+ return self unless keyspace
220
+
221
+ old_type = keyspace.type(type.name)
222
+
223
+ return self if old_type == type
224
+
225
+ keyspace = keyspace.update_type(type)
226
+
227
+ synchronize do
228
+ keyspaces = @keyspaces.dup
229
+ keyspaces[keyspace.name] = keyspace
230
+ @keyspaces = keyspaces
231
+ end
232
+
233
+ keyspace_changed(keyspace)
234
+
235
+ self
236
+ end
237
+
238
+ def delete_type(keyspace_name, type_name)
239
+ keyspace = @keyspaces[keyspace_name]
240
+
241
+ return self unless keyspace
242
+
243
+ type = keyspace.type(type_name)
244
+
245
+ return self unless type
246
+
247
+ keyspace = keyspace.delete_type(type_name)
248
+
249
+ synchronize do
250
+ keyspaces = @keyspaces.dup
251
+ keyspaces[keyspace_name] = keyspace
252
+ @keyspaces = keyspaces
253
+ end
254
+
255
+ keyspace_changed(keyspace)
256
+
257
+ self
258
+ end
259
+
260
+ def replace_function(function)
261
+ keyspace = @keyspaces[function.keyspace]
262
+
263
+ return self unless keyspace
264
+
265
+ old_function = keyspace.function(function.name, *function.argument_types)
266
+
267
+ return self if old_function == function
268
+
269
+ keyspace = keyspace.update_function(function)
270
+
271
+ synchronize do
272
+ keyspaces = @keyspaces.dup
273
+ keyspaces[keyspace.name] = keyspace
274
+ @keyspaces = keyspaces
275
+ end
276
+
277
+ keyspace_changed(keyspace)
278
+
279
+ self
280
+ end
281
+
282
+ def delete_function(keyspace_name, function_name, function_arg_types)
283
+ keyspace = @keyspaces[keyspace_name]
284
+
285
+ return self unless keyspace
286
+
287
+ function = keyspace.function(function_name, *function_arg_types)
288
+
289
+ return self unless function
290
+
291
+ keyspace = keyspace.delete_function(function_name, function_arg_types)
292
+
293
+ synchronize do
294
+ keyspaces = @keyspaces.dup
295
+ keyspaces[keyspace_name] = keyspace
296
+ @keyspaces = keyspaces
297
+ end
298
+
299
+ keyspace_changed(keyspace)
300
+
301
+ self
302
+ end
303
+
304
+ def replace_aggregate(aggregate)
305
+ keyspace = @keyspaces[aggregate.keyspace]
306
+
307
+ return self unless keyspace
308
+
309
+ old_aggregate = keyspace.aggregate(aggregate.name, *aggregate.argument_types)
310
+
311
+ return self if old_aggregate == aggregate
312
+
313
+ keyspace = keyspace.update_aggregate(aggregate)
314
+
315
+ synchronize do
316
+ keyspaces = @keyspaces.dup
317
+ keyspaces[keyspace.name] = keyspace
318
+ @keyspaces = keyspaces
319
+ end
320
+
321
+ keyspace_changed(keyspace)
322
+
323
+ self
324
+ end
325
+
326
+ def delete_aggregate(keyspace_name, aggregate_name, aggregate_arg_types)
327
+ keyspace = @keyspaces[keyspace_name]
328
+
329
+ return self unless keyspace
330
+
331
+ aggregate = keyspace.aggregate(aggregate_name, *aggregate_arg_types)
332
+
333
+ return self unless aggregate
334
+
335
+ keyspace = keyspace.delete_aggregate(aggregate_name, aggregate_arg_types)
336
+
337
+ synchronize do
338
+ keyspaces = @keyspaces.dup
339
+ keyspaces[keyspace_name] = keyspace
340
+ @keyspaces = keyspaces
341
+ end
342
+
343
+ keyspace_changed(keyspace)
344
+
345
+ self
346
+ end
347
+
348
+ def has_keyspace?(name)
349
+ @keyspaces.include?(name)
350
+ end
351
+
352
+ def keyspace(name)
353
+ @keyspaces[name]
354
+ end
355
+
356
+ def each_keyspace(&block)
357
+ if block_given?
358
+ @keyspaces.each_value(&block)
359
+ self
360
+ else
361
+ @keyspaces.values
362
+ end
363
+ end
364
+ alias keyspaces each_keyspace
365
+
366
+ private
367
+
368
+ def keyspace_created(keyspace)
369
+ @listeners.each do |listener|
370
+ begin
371
+ listener.keyspace_created(keyspace)
372
+ rescue
373
+ nil
374
+ end
375
+ end
376
+ end
377
+
378
+ def keyspace_changed(keyspace)
379
+ @listeners.each do |listener|
380
+ begin
381
+ listener.keyspace_changed(keyspace)
382
+ rescue
383
+ nil
384
+ end
385
+ end
386
+ end
387
+
388
+ def keyspace_dropped(keyspace)
389
+ @listeners.each do |listener|
390
+ begin
391
+ listener.keyspace_dropped(keyspace)
392
+ rescue
393
+ nil
394
+ end
395
+ end
396
+ end
397
+ end
398
+ end
399
+ end
400
+
401
+ require 'cassandra/cluster/schema/cql_type_parser'
402
+ require 'cassandra/cluster/schema/fetchers'
403
+ require 'cassandra/cluster/schema/partitioners'
404
+ require 'cassandra/cluster/schema/replication_strategies'
405
+ require 'cassandra/cluster/schema/fqcn_type_parser'
@@ -0,0 +1,112 @@
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
+ class Cluster
21
+ class Schema
22
+ class CQLTypeParser
23
+ IncompleteTypeError = ::Class.new(::StandardError)
24
+
25
+ # @private
26
+ Node = Struct.new(:parent, :name, :children)
27
+
28
+ def parse(string, types)
29
+ frozen = false
30
+ node = parse_node(string)
31
+
32
+ if node.name == 'frozen'
33
+ frozen = true
34
+ node = node.children.first
35
+ end
36
+
37
+ [lookup_type(node, types), frozen]
38
+ end
39
+
40
+ private
41
+
42
+ def lookup_type(node, types)
43
+ case node.name
44
+ when 'text' then Cassandra::Types.text
45
+ when 'blob' then Cassandra::Types.blob
46
+ when 'ascii' then Cassandra::Types.ascii
47
+ when 'bigint' then Cassandra::Types.bigint
48
+ when 'counter' then Cassandra::Types.counter
49
+ when 'int' then Cassandra::Types.int
50
+ when 'varint' then Cassandra::Types.varint
51
+ when 'boolean' then Cassandra::Types.boolean
52
+ when 'decimal' then Cassandra::Types.decimal
53
+ when 'double' then Cassandra::Types.double
54
+ when 'float' then Cassandra::Types.float
55
+ when 'inet' then Cassandra::Types.inet
56
+ when 'timestamp' then Cassandra::Types.timestamp
57
+ when 'uuid' then Cassandra::Types.uuid
58
+ when 'timeuuid' then Cassandra::Types.timeuuid
59
+ when 'date' then Cassandra::Types.date
60
+ when 'smallint' then Cassandra::Types.smallint
61
+ when 'time' then Cassandra::Types.time
62
+ when 'tinyint' then Cassandra::Types.tinyint
63
+ when 'map' then
64
+ Cassandra::Types.map(*node.children.map { |t| lookup_type(t, types)})
65
+ when 'set' then
66
+ Cassandra::Types.set(lookup_type(node.children.first, types))
67
+ when 'list' then
68
+ Cassandra::Types.list(lookup_type(node.children.first, types))
69
+ when 'tuple' then
70
+ Cassandra::Types.tuple(*node.children.map { |t| lookup_type(t, types)})
71
+ when 'frozen' then
72
+ Cassandra::Types.frozen(lookup_type(node.children.first, types))
73
+ when 'empty' then
74
+ Cassandra::Types.custom('org.apache.cassandra.db.marshal.EmptyType')
75
+ when /\A'/ then
76
+ # Custom type.
77
+ Cassandra::Types.custom(node.name[1..-2])
78
+ else
79
+ types.fetch(node.name) do
80
+ raise IncompleteTypeError, "unable to lookup type #{node.name.inspect}"
81
+ end
82
+ end
83
+ end
84
+
85
+ def parse_node(string)
86
+ root = node = Node.new(nil, '', [])
87
+
88
+ string.each_char do |char|
89
+ case char
90
+ when '<' # starting type params
91
+ child = Node.new(node, '', [])
92
+ node.children << child
93
+ node = child
94
+ when ','
95
+ child = Node.new(node.parent, '', [])
96
+ node.parent.children << child
97
+ node = child
98
+ when '>'
99
+ node = node.parent
100
+ when ' '
101
+ next
102
+ else
103
+ node.name << char unless char == '"'
104
+ end
105
+ end
106
+
107
+ root
108
+ end
109
+ end
110
+ end
111
+ end
112
+ end