lib/fakes3/bucket.rb in fakes3-0.1.0 vs lib/fakes3/bucket.rb in fakes3-0.1.1

- old
+ new

@@ -1,18 +1,62 @@ require 'builder' +require 'thread' require 'fakes3/s3_object' +require 'fakes3/red_black_tree' module FakeS3 class Bucket attr_accessor :name,:creation_date,:objects def initialize(name,creation_date,objects) @name = name @creation_date = creation_date - @objects = [] + @objects = SortedSet.new + @objects = RedBlackTree.new objects.each do |obj| - @objects << obj + @objects.add(obj) end + @mutex = Mutex.new + end + + def <<(object) + # Unfortunately have to synchronize here since the RB Tree is not thread + # safe. Probably can get finer granularity if performance is important + @mutex.synchronize do + exists = @objects.search(object.name) + if exists.nil? + @objects.add(object.name,object) + end + end + end + + def delete(object_name) + @objects.delete_via_key(object_name) + end + + def query_for_range(options) + marker = options[:marker] + prefix = options[:prefix] + max_keys = options[:max_keys] || 1000 + delimiter = options[:delimiter] + + matches = [] + is_truncated = false + + @mutex.synchronize do + matches, is_truncated = @objects.search_for_range( + marker,prefix,max_keys,delimiter) + end + + bq = BucketQuery.new + bq.bucket = self + bq.marker = marker + bq.prefix = prefix + bq.max_keys = max_keys + bq.delimiter = delimiter + bq.matches = matches + bq.is_truncated = is_truncated + return bq end end end