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
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