Module: DynaModel::Document::ClassMethods

Defined in:
lib/dyna_model/document.rb

Instance Method Summary collapse

Instance Method Details

#create_table(options = {}) ⇒ Object



97
98
99
100
101
102
103
104
105
106
107
108
109
110
# File 'lib/dyna_model/document.rb', line 97

def create_table options = {}
  table_name = self.dynamo_db_table_name(options[:shard_name])
  if self.dynamo_db_client.list_tables[:table_names].include?(table_name)
    puts "Table #{table_name} already exists"
    return false
  end
  self.dynamo_db_client.create_table(self.table_schema.merge({
    table_name: table_name
  }))
  while ( = self.describe_table(options))[:table][:table_status] == "CREATING"
    sleep 1
  end
  
end

#delete_table(options = {}) ⇒ Object



116
117
118
119
120
121
122
123
124
125
126
127
128
# File 'lib/dyna_model/document.rb', line 116

def delete_table(options={})
  table_name = self.dynamo_db_table_name(options[:shard_name])
  return false unless self.dynamo_db_client.list_tables[:table_names].include?(table_name)
  self.dynamo_db_client.delete_table(table_name: table_name)
  begin
    while ( = self.describe_table) && [:table][:table_status] == "DELETING"
      sleep 1
    end
  rescue AWS::DynamoDB::Errors::ResourceNotFoundException => e
    DynaModel::Config.logger.info "Table deleted"
  end
  true
end

#describe_table(options = {}) ⇒ Object



112
113
114
# File 'lib/dyna_model/document.rb', line 112

def describe_table(options={})
  self.dynamo_db_client.describe_table(table_name: self.dynamo_db_table_name(options[:shard_name]))
end

#dynamo_db_client(config = {}) ⇒ Object



156
157
158
159
160
161
162
163
164
165
# File 'lib/dyna_model/document.rb', line 156

def dynamo_db_client(config={})
  options = {}
  options[:use_ssl] = DynaModel::Config.use_ssl
  options[:use_ssl] = config[:use_ssl] if config.has_key?(:use_ssl)
  options[:dynamo_db_endpoint] = config[:endpoint] || DynaModel::Config.endpoint
  options[:dynamo_db_port] = config[:port] || DynaModel::Config.port
  options[:api_version] ||= config[:api_version] || '2012-08-10'

  @dynamo_db_client ||= AWS::DynamoDB::Client.new(options)
end

#dynamo_db_table(shard_name = nil) ⇒ Object



147
148
149
150
# File 'lib/dyna_model/document.rb', line 147

def dynamo_db_table(shard_name = nil)
  @table_map ||= {}
  @table_map[self.dynamo_db_table_name(shard_name)] ||= Table.new(self)
end

#dynamo_db_table_name(shard_name = nil) ⇒ Object



152
153
154
# File 'lib/dyna_model/document.rb', line 152

def dynamo_db_table_name(shard_name = nil)
  "#{AWS::Record.table_prefix}#{self.shard_name(shard_name)}"
end

#resize_table(options = {}) ⇒ Object



130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
# File 'lib/dyna_model/document.rb', line 130

def resize_table(options={})
  table_name = self.dynamo_db_table_name(options[:shard_name])
  return false unless self.dynamo_db_client.list_tables[:table_names].include?(table_name)
  self.dynamo_db_client.update_table({
    provisioned_throughput: {
      read_capacity_units: (options[:read_capacity_units] || self.table_schema[:provisioned_throughput][:read_capacity_units]).to_i,
      write_capacity_units: (options[:write_capacity_units] || self.table_schema[:provisioned_throughput][:write_capacity_units]).to_i
    },
    table_name: table_name
  })
  while ( = self.describe_table) && [:table][:table_status] == "UPDATING"
    sleep 1
  end
  DynaModel::Config.logger.info "Table resized to #{[:table][:provisioned_throughput]}"
  true
end