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
# 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
  }.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)


55
56
57
58
59
60
61
# File 'lib/cassandra-cql/database.rb', line 55

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



41
42
43
44
45
46
47
48
49
# File 'lib/cassandra-cql/database.rb', line 41

def connect!
  @connection = ThriftClient.new(CassandraCQL::Thrift::Client, @servers, @thrift_client_options)
  obj = self
  @connection.add_callback(:post_connect) do
    @connection.set_cql_version(@cql_version) if @cql_version
    execute("USE #{@keyspace}")
    @connection.(@auth_request) if @auth_request
  end
end

#disconnect!Object



51
52
53
# File 'lib/cassandra-cql/database.rb', line 51

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

#execute(statement, *bind_vars) ⇒ Object



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

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



97
98
99
100
101
# File 'lib/cassandra-cql/database.rb', line 97

def execute_cql_query(cql, compression=CassandraCQL::Thrift::Compression::NONE)
  @connection.execute_cql_query(cql, compression)
rescue CassandraCQL::Thrift::InvalidRequestException
  raise Error::InvalidRequestException.new($!.why)
end

#keyspacesObject



107
108
109
110
# File 'lib/cassandra-cql/database.rb', line 107

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



117
118
119
120
121
122
123
124
125
# File 'lib/cassandra-cql/database.rb', line 117

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



77
78
79
80
81
82
83
84
# File 'lib/cassandra-cql/database.rb', line 77

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!



64
65
66
67
# File 'lib/cassandra-cql/database.rb', line 64

def reset!
  disconnect!
  connect!
end

#statement_classObject



70
71
72
73
74
75
# File 'lib/cassandra-cql/database.rb', line 70

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