cql-rb 1.0.0.pre0

Sign up to get free protection for your applications and to get access to all the features.
@@ -0,0 +1,11 @@
1
+ # encoding: utf-8
2
+
3
+ require 'bundler/setup'
4
+ require 'simplecov'; SimpleCov.start
5
+ require 'cql'
6
+
7
+ ENV['CASSANDRA_HOST'] ||= 'localhost'
8
+
9
+
10
+ require 'support/fake_server'
11
+ require 'support/fake_io_reactor'
@@ -0,0 +1,55 @@
1
+ # encoding: utf-8
2
+
3
+ class FakeIoReactor
4
+ attr_reader :connections, :last_used_connection
5
+
6
+ def initialize
7
+ @running = false
8
+ @connections = []
9
+ @queued_responses = Hash.new { |h, k| h[k] = [] }
10
+ @default_host = nil
11
+ end
12
+
13
+ def queue_response(response, host=nil)
14
+ @queued_responses[host] << response
15
+ end
16
+
17
+ def start
18
+ @running = true
19
+ @connections = []
20
+ @connections.each do |connection|
21
+ connection[:future].complete! unless connection[:future].complete?
22
+ end
23
+ Cql::Future.completed
24
+ end
25
+
26
+ def stop
27
+ @running = false
28
+ Cql::Future.completed
29
+ end
30
+
31
+ def running?
32
+ @running
33
+ end
34
+
35
+ def add_connection(host, port)
36
+ @default_host ||= host
37
+ future = Cql::Future.new
38
+ connection = {:host => host, :port => port, :future => future, :requests => []}
39
+ @connections << connection
40
+ future.complete!(connection.object_id) if @running
41
+ future
42
+ end
43
+
44
+ def queue_request(request, connection_id=nil)
45
+ if connection_id
46
+ connection = @connections.find { |c| c.object_id == connection_id }
47
+ else
48
+ connection = @connections.sample
49
+ end
50
+ connection[:requests] << request
51
+ response = @queued_responses[connection[:host]].shift || @queued_responses[nil].shift
52
+ @last_used_connection = connection
53
+ Cql::Future.completed([response, connection.object_id])
54
+ end
55
+ end
@@ -0,0 +1,95 @@
1
+ # encoding: utf-8
2
+
3
+ class FakeServer
4
+ attr_reader :connects, :disconnects
5
+
6
+ def initialize(port)
7
+ @port = port
8
+ @state = {}
9
+ @lock = Mutex.new
10
+ @connects = 0
11
+ @disconnects = 0
12
+ @connections = []
13
+ @received_bytes = ''
14
+ end
15
+
16
+ def start!
17
+ @lock.synchronize do
18
+ return if @running
19
+ @running = true
20
+ end
21
+ @sockets = [TCPServer.new(@port)]
22
+ @started = Cql::Future.new
23
+ @thread = Thread.start do
24
+ Thread.current.abort_on_exception = true
25
+ @started.complete!
26
+ io_loop
27
+ end
28
+ @started.get
29
+ self
30
+ end
31
+
32
+ def stop!
33
+ @lock.synchronize do
34
+ return unless @running
35
+ @running = false
36
+ end
37
+ @thread.join
38
+ @sockets.each(&:close)
39
+ end
40
+
41
+ def broadcast!(bytes)
42
+ @lock.synchronize do
43
+ @connections.each { |c| c.write_nonblock(bytes) }
44
+ end
45
+ end
46
+
47
+ def await_connects!(n=1)
48
+ sleep(0.01) until @connects >= n
49
+ end
50
+
51
+ def await_disconnects!(n=1)
52
+ sleep(0.01) until @disconnects >= n
53
+ end
54
+
55
+ def received_bytes
56
+ @lock.synchronize do
57
+ return @received_bytes.dup
58
+ end
59
+ end
60
+
61
+ private
62
+
63
+ def io_loop
64
+ while @running
65
+ acceptables, _ = IO.select(@sockets, @connections, nil, 0)
66
+ readables, writables, _ = IO.select(@connections, @connections, nil, 0)
67
+
68
+ if acceptables
69
+ acceptables.each do |socket|
70
+ connection, _ = socket.accept_nonblock
71
+ @lock.synchronize do
72
+ @connects += 1
73
+ @connections << connection
74
+ end
75
+ end
76
+ end
77
+
78
+ if readables
79
+ readables.each do |readable|
80
+ begin
81
+ bytes = readable.read_nonblock(2**16)
82
+ @lock.synchronize do
83
+ @received_bytes << bytes
84
+ end
85
+ rescue EOFError
86
+ @lock.synchronize do
87
+ @connections.delete(readable)
88
+ @disconnects += 1
89
+ end
90
+ end
91
+ end
92
+ end
93
+ end
94
+ end
95
+ end
metadata ADDED
@@ -0,0 +1,87 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: cql-rb
3
+ version: !ruby/object:Gem::Version
4
+ version: 1.0.0.pre0
5
+ prerelease: 6
6
+ platform: ruby
7
+ authors:
8
+ - Theo Hultberg
9
+ autorequire:
10
+ bindir: bin
11
+ cert_chain: []
12
+ date: 2013-02-20 00:00:00.000000000 Z
13
+ dependencies: []
14
+ description: A pure Ruby CQL3 driver for Cassandra
15
+ email:
16
+ - theo@iconara.net
17
+ executables: []
18
+ extensions: []
19
+ extra_rdoc_files: []
20
+ files:
21
+ - lib/cql/client.rb
22
+ - lib/cql/future.rb
23
+ - lib/cql/io/io_reactor.rb
24
+ - lib/cql/io.rb
25
+ - lib/cql/protocol/decoding.rb
26
+ - lib/cql/protocol/encoding.rb
27
+ - lib/cql/protocol/request_frame.rb
28
+ - lib/cql/protocol/response_frame.rb
29
+ - lib/cql/protocol.rb
30
+ - lib/cql/uuid.rb
31
+ - lib/cql/version.rb
32
+ - lib/cql.rb
33
+ - bin/cqlexec
34
+ - README.md
35
+ - spec/cql/client_spec.rb
36
+ - spec/cql/future_spec.rb
37
+ - spec/cql/io/io_reactor_spec.rb
38
+ - spec/cql/protocol/decoding_spec.rb
39
+ - spec/cql/protocol/encoding_spec.rb
40
+ - spec/cql/protocol/request_frame_spec.rb
41
+ - spec/cql/protocol/response_frame_spec.rb
42
+ - spec/cql/uuid_spec.rb
43
+ - spec/integration/client_spec.rb
44
+ - spec/integration/protocol_spec.rb
45
+ - spec/spec_helper.rb
46
+ - spec/support/fake_io_reactor.rb
47
+ - spec/support/fake_server.rb
48
+ homepage: http://github.com/iconara/cql-rb
49
+ licenses:
50
+ - Apache
51
+ post_install_message:
52
+ rdoc_options: []
53
+ require_paths:
54
+ - lib
55
+ required_ruby_version: !ruby/object:Gem::Requirement
56
+ none: false
57
+ requirements:
58
+ - - ! '>='
59
+ - !ruby/object:Gem::Version
60
+ version: 1.9.2
61
+ required_rubygems_version: !ruby/object:Gem::Requirement
62
+ none: false
63
+ requirements:
64
+ - - ! '>'
65
+ - !ruby/object:Gem::Version
66
+ version: 1.3.1
67
+ requirements: []
68
+ rubyforge_project:
69
+ rubygems_version: 1.8.23
70
+ signing_key:
71
+ specification_version: 3
72
+ summary: Cassandra CQL3 driver
73
+ test_files:
74
+ - spec/cql/client_spec.rb
75
+ - spec/cql/future_spec.rb
76
+ - spec/cql/io/io_reactor_spec.rb
77
+ - spec/cql/protocol/decoding_spec.rb
78
+ - spec/cql/protocol/encoding_spec.rb
79
+ - spec/cql/protocol/request_frame_spec.rb
80
+ - spec/cql/protocol/response_frame_spec.rb
81
+ - spec/cql/uuid_spec.rb
82
+ - spec/integration/client_spec.rb
83
+ - spec/integration/protocol_spec.rb
84
+ - spec/spec_helper.rb
85
+ - spec/support/fake_io_reactor.rb
86
+ - spec/support/fake_server.rb
87
+ has_rdoc: