Class: CassandraCQL::Database

Inherits:
Object
  • Object
show all
Defined in:
lib/cassandra-cql/database.rb

Instance Attribute Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(servers, options = {}, thrift_client_options = {}) ⇒ Database

Returns a new instance of Database.



25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
# File 'lib/cassandra-cql/database.rb', line 25

def initialize(servers, options={}, thrift_client_options={})
  @options = {
    :keyspace => 'system'
  }.merge(options)

  @thrift_client_options = {
    :exception_class_overrides => CassandraCQL::Thrift::InvalidRequestException,
    :connect_timeout => 5
  }.merge(thrift_client_options)

  @keyspace = @options[:keyspace]
  @cql_version = @options[:cql_version]
  @servers = servers
  connect!
  execute("USE #{@keyspace}")
end

Instance Attribute Details

#connectionObject (readonly)

Returns the value of attribute connection.



23
24
25
# File 'lib/cassandra-cql/database.rb', line 23

def connection
  @connection
end

#keyspaceObject

Returns the value of attribute keyspace.



23
24
25
# File 'lib/cassandra-cql/database.rb', line 23

def keyspace
  @keyspace
end

#schemaObject (readonly)

Returns the value of attribute schema.



23
24
25
# File 'lib/cassandra-cql/database.rb', line 23

def schema
  @schema
end

Instance Method Details

#active?Boolean Also known as: ping

Returns:

  • (Boolean)


66
67
68
69
70
71
72
# File 'lib/cassandra-cql/database.rb', line 66

def active?
  # TODO: This should be replaced with a CQL call that doesn't exist yet
  @connection.describe_version 
  true
rescue Exception
  false
end

#connect!Object



47
48
49
50
51
52
53
54
55
56
57
58
59
60
# File 'lib/cassandra-cql/database.rb', line 47

def connect!
  @connection = ThriftClient.new(CassandraCQL::Thrift::Client, @servers, @thrift_client_options)

  if @options[:username] and @options[:password]
    login!(@options[:username], @options[:password])
  end

  obj = self
  @connection.add_callback(:post_connect) do
    @connection.set_cql_version(@cql_version) if @cql_version
    @connection.(@auth_request) if @auth_request
    execute("USE #{@keyspace}")
  end
end

#disconnect!Object



62
63
64
# File 'lib/cassandra-cql/database.rb', line 62

def disconnect!
  @connection.disconnect! if active?
end

#execute(statement, *bind_vars) ⇒ Object



97
98
99
100
101
102
103
104
105
106
# File 'lib/cassandra-cql/database.rb', line 97

def execute(statement, *bind_vars)
  result = statement_class.new(self, statement).execute(bind_vars)
  if block_given?
    yield result
  else
    result
  end
rescue CassandraCQL::Thrift::InvalidRequestException
  raise Error::InvalidRequestException.new($!.why)
end

#execute_cql_query(cql, compression = CassandraCQL::Thrift::Compression::NONE) ⇒ Object



108
109
110
111
112
113
114
115
116
# File 'lib/cassandra-cql/database.rb', line 108

def execute_cql_query(cql, compression=CassandraCQL::Thrift::Compression::NONE)
  if use_cql3?
    @connection.execute_cql3_query(cql, compression, CassandraCQL::Thrift::ConsistencyLevel::QUORUM) #TODO consistency level
  else
    @connection.execute_cql_query(cql, compression)
  end
rescue CassandraCQL::Thrift::InvalidRequestException
  raise Error::InvalidRequestException.new($!.why)
end

#keyspacesObject



122
123
124
125
# File 'lib/cassandra-cql/database.rb', line 122

def keyspaces
  # TODO: This should be replaced with a CQL call that doesn't exist yet
  @connection.describe_keyspaces.map { |keyspace| Schema.new(keyspace) }
end

#login!(username, password) ⇒ Object



132
133
134
135
136
137
138
139
140
# File 'lib/cassandra-cql/database.rb', line 132

def login!(username, password)
  request = CassandraCQL::Thrift::AuthenticationRequest.new
  request.credentials = {'username' => username, 'password' => password}
  ret = @connection.(request)
  # To avoid a double login on the initial connect, we set
  # @auth_request after the first successful login.
  @auth_request = request
  ret
end

#prepare(statement, options = {}, &block) ⇒ Object



88
89
90
91
92
93
94
95
# File 'lib/cassandra-cql/database.rb', line 88

def prepare(statement, options={}, &block)
  stmt = statement_class.new(self, statement)
  if block_given?
    yield stmt
  else
    stmt
  end
end

#reset!Object Also known as: reconnect!



75
76
77
78
# File 'lib/cassandra-cql/database.rb', line 75

def reset!
  disconnect!
  connect!
end

#statement_classObject



81
82
83
84
85
86
# File 'lib/cassandra-cql/database.rb', line 81

def statement_class
  return @statement_class if @statement_class

  version_module = 'V' + CassandraCQL.CASSANDRA_VERSION.gsub('.', '')
  return @statement_class = CassandraCQL.const_get(version_module).const_get(:Statement)
end

#use_cql3?Boolean

Returns:

  • (Boolean)


42
43
44
45
# File 'lib/cassandra-cql/database.rb', line 42

def use_cql3?
  (@cql_version.nil? || @cql_version.split('.').first.to_i >= 3) &&
    CassandraCQL::Thrift::Client.method_defined?(:execute_cql3_query)
end