class Moneta::S3

An S3 implementation of Moneta

Example usage:

require 'rubygems'
require 'moneta'
require 'moneta/s3'

store = Moneta::S3.new(
  :access_key_id => 'ACCESS_KEY_ID', 
  :secret_access_key => 'SECRET_ACCESS_KEY', 
  :bucket => 'a_bucket'
)
store['somefile']

Public Class Methods

new(options = {}) click to toggle source

Initialize the Moneta::S3 store.

Required values passed in the options hash:

  • :access_key_id: The access id key

  • :secret_access_key: The secret key

  • :bucket: The name of bucket. Will be created if it doesn't

exist.

  • :multi_thread: Set to true if using threading

# File lib/moneta/s3.rb, line 32
def initialize(options = {})
  validate_options(options)
  s3 = RightAws::S3.new(
    options[:access_key_id], 
    options[:secret_access_key], 
    {
      :logger => logger, 
      :multi_thread => options.delete(:multi_thread) || false
    }
  )
  @bucket = s3.bucket(options.delete(:bucket), true)
end

Public Instance Methods

[](key) click to toggle source
# File lib/moneta/s3.rb, line 51
def [](key)
  get(key)
end
[]=(key, value) click to toggle source
# File lib/moneta/s3.rb, line 55
def []=(key, value)
  store(key, value)
end
clear() click to toggle source
# File lib/moneta/s3.rb, line 95
def clear
  @bucket.clear
end
delete(key) click to toggle source
# File lib/moneta/s3.rb, line 59
def delete(key)
  k = s3_key(key)
  if k
    value = k.get
    k.delete
    value
  end
end
has_key?(key)
Alias for: key?
key?(key) click to toggle source
# File lib/moneta/s3.rb, line 45
def key?(key)
  !s3_key(key).nil?
end
Also aliased as: has_key?
store(key, value, options = {}) click to toggle source

Store the key/value pair.

Options: *:meta_headers: Meta headers passed to S3 *:perms: Permissions passed to S3 *:headers: Headers sent as part of the PUT request *:expires_in: Number of seconds until expiration

# File lib/moneta/s3.rb, line 75
def store(key, value, options = {})
  debug "store(key=#{key}, value=#{value}, options=#{options.inspect})"
  meta_headers = meta_headers_from_options(options)
  perms = options[:perms]
  headers = options[:headers] || {}
  
  case value
  when IO
    @bucket.put(key, value.read, meta_headers, perms, headers)
  else
    @bucket.put(key, value, meta_headers, perms, headers)
  end
end
update_key(key, options = {}) click to toggle source
# File lib/moneta/s3.rb, line 89
def update_key(key, options = {})
  debug "update_key(key=#{key}, options=#{options.inspect})"
  k = s3_key(key, false)
  k.save_meta(meta_headers_from_options(options)) unless k.nil?
end

Protected Instance Methods

logger() click to toggle source
# File lib/moneta/s3.rb, line 100
def logger
  @logger ||= begin
    logger = Logger.new(STDOUT)
    logger.level = Logger::FATAL
    logger
  end
end

Private Instance Methods

debug(message) click to toggle source
# File lib/moneta/s3.rb, line 158
def debug(message)
  logger.debug "[Moneta::S3] #{message}"
end
get(key) click to toggle source
# File lib/moneta/s3.rb, line 121
def get(key)
  k = s3_key(key)
  k.nil? ? nil : k.get
end
meta_headers_from_options(options={}) click to toggle source
# File lib/moneta/s3.rb, line 149
def meta_headers_from_options(options={})
  meta_headers = options[:meta_headers] || {}
  if options[:expires_in]
    meta_headers['expires-at'] = (Time.now + options[:expires_in]).rfc2822
  end
  debug "setting expires-at: #{meta_headers['expires-at']}"
  meta_headers
end
s3_key(key, nil_if_expired=true) click to toggle source
# File lib/moneta/s3.rb, line 126
def s3_key(key, nil_if_expired=true)
  begin
    s3_key = @bucket.key(key, true)
    if s3_key.exists?
      logger.debug "[Moneta::S3] key exists: #{key}"
      if s3_key.meta_headers.has_key?('expires-at')
        expires_at = Time.parse(s3_key.meta_headers['expires-at'])
        if Time.now > expires_at && nil_if_expired
          # TODO delete the object?
          debug "key expired: #{key} (@#{s3_key.meta_headers['expires-at']})"
          return nil
        end
      end
      return s3_key
    else
      debug "key does not exist: #{key}"
    end
  rescue RightAws::AwsError => e
    debug "key does not exist: #{key}"
  end
  nil
end
validate_options(options) click to toggle source
# File lib/moneta/s3.rb, line 109
def validate_options(options)
  unless options[:access_key_id]
    raise RuntimeError, ":access_key_id is required in options"
  end
  unless options[:secret_access_key]
    raise RuntimeError, ":secret_access_key is required in options"
  end
  unless options[:bucket]
    raise RuntimeError, ":bucket is required in options"
  end
end