diff --git a/lib/remote_storage/riak.rb b/lib/remote_storage/riak.rb index c237d2b..2ef3c39 100644 --- a/lib/remote_storage/riak.rb +++ b/lib/remote_storage/riak.rb @@ -92,7 +92,7 @@ module RemoteStorage server.halt 412 unless required_match == object.etag end - object_exists = !object.raw_data.nil? + object_exists = !object.raw_data.nil? || !object.meta["binary_key"].nil? existing_object_size = object_size(object) server.halt 412 if object_exists && server.env["HTTP_IF_NONE_MATCH"] == "*" @@ -173,11 +173,14 @@ module RemoteStorage end def log_operation(user, directory, count, new_size=0, old_size=0) + size = (-old_size + new_size) + return if count == 0 && size == 0 + log_entry = opslog_bucket.new log_entry.content_type = "application/json" log_entry.data = { "count" => count, - "size" => (-old_size + new_size), + "size" => size, "category" => extract_category(directory) } log_entry.indexes.merge!({:user_id_bin => [user]}) diff --git a/spec/riak_spec.rb b/spec/riak_spec.rb index 1e1c3ba..bc3ea04 100644 --- a/spec/riak_spec.rb +++ b/spec/riak_spec.rb @@ -397,6 +397,43 @@ describe "App with Riak backend" do log_entry.data["category"].must_equal "documents" log_entry.indexes["user_id_bin"].must_include "jimmy" end + + context "overwriting existing file with same file" do + before do + header "Content-Type", "image/jpeg; charset=binary" + filename = File.join(File.expand_path(File.dirname(__FILE__)), "fixtures", "rockrule.jpeg") + @image = File.open(filename, "r").read + put "/jimmy/documents/jaypeg", @image + end + + it "doesn't log the operation" do + objects = [] + opslog_bucket.keys.each { |k| objects << opslog_bucket.get(k) rescue nil } + + objects.size.must_equal 1 + end + end + + context "overwriting existing file with different file" do + before do + header "Content-Type", "image/jpeg; charset=binary" + filename = File.join(File.expand_path(File.dirname(__FILE__)), "fixtures", "rockrule.jpeg") + @image = File.open(filename, "r").read + put "/jimmy/documents/jaypeg", @image+"foo" + end + + it "logs the operation changing only the size" do + objects = [] + opslog_bucket.keys.each { |k| objects << opslog_bucket.get(k) rescue nil } + + objects.size.must_equal 2 + + log_entry = objects.select{|o| o.data["count"] == 0}.first + log_entry.data["size"].must_equal 3 + log_entry.data["category"].must_equal "documents" + log_entry.indexes["user_id_bin"].must_include "jimmy" + end + end end context "no binary charset in content-type header" do