Save timestamps for directory objects as actual data to keep them consistent with the data objects

This commit is contained in:
galfert 2012-10-01 17:43:56 +02:00
parent c0078e66e1
commit d4151b64df
2 changed files with 33 additions and 25 deletions

View File

@ -48,8 +48,9 @@ module RemoteStorage
def get_directory_listing(user, directory) def get_directory_listing(user, directory)
directory_object = directory_bucket.get("#{user}:#{directory}") directory_object = directory_bucket.get("#{user}:#{directory}")
timestamp = directory_object.data.to_i
headers["Content-Type"] = "application/json" headers["Content-Type"] = "application/json"
headers["Last-Modified"] = directory_object.last_modified.to_s(:rfc822) headers["Last-Modified"] = Time.at(timestamp).to_s(:rfc822)
listing = directory_listing(user, directory) listing = directory_listing(user, directory)
@ -73,8 +74,10 @@ module RemoteStorage
:directory_bin => [directory_index]}) :directory_bin => [directory_index]})
object.store object.store
create_missing_directory_objects(user, directory) object.reload
update_directory_object(user, directory) timestamp = object.last_modified.to_i
create_missing_directory_objects(user, directory, timestamp)
update_directory_object(user, directory, timestamp)
rescue ::Riak::HTTPFailedRequest rescue ::Riak::HTTPFailedRequest
halt 422 halt 422
end end
@ -118,13 +121,12 @@ module RemoteStorage
listing = {} listing = {}
sub_directories(user, directory).each do |entry| sub_directories(user, directory).each do |entry|
timestamp = DateTime.rfc2822(entry["last_modified"]).to_time.to_i
directory_name = CGI.unescape(entry["name"]).split("/").last directory_name = CGI.unescape(entry["name"]).split("/").last
listing.merge!({ "#{directory_name}/" => timestamp }) listing.merge!({ "#{directory_name}/" => entry["timestamp"] })
end end
directory_entries(user, directory).each do |entry| directory_entries(user, directory).each do |entry|
timestamp = DateTime.rfc2822(entry["last_modified"]).to_time.to_i timestamp = DateTime.rfc2822(entry["last_modified"]).to_i
listing.merge!({ entry["name"] => timestamp }) listing.merge!({ entry["name"] => timestamp })
end end
@ -157,10 +159,10 @@ module RemoteStorage
function(v){ function(v){
keys = v.key.split(':'); keys = v.key.split(':');
key_name = keys[keys.length-1]; key_name = keys[keys.length-1];
last_modified_date = v.values[0]['metadata']['X-Riak-Last-Modified']; timestamp = v.values[0]['data']
return [{ return [{
name: key_name, name: key_name,
last_modified: last_modified_date, timestamp: timestamp,
}]; }];
} }
EOH EOH
@ -171,23 +173,23 @@ module RemoteStorage
run run
end end
def create_missing_directory_objects(user, directory) def create_missing_directory_objects(user, directory, timestamp)
parent_directories = directory.split("/") parent_directories = directory.split("/")
parent_directories.pop parent_directories.pop
while parent_directories.any? while parent_directories.any?
parent_directory = parent_directories.join("/") parent_directory = parent_directories.join("/")
unless directory_bucket.exist?("#{user}:#{parent_directory}") unless directory_bucket.exist?("#{user}:#{parent_directory}")
update_directory_object(user, parent_directory) update_directory_object(user, parent_directory, timestamp)
end end
parent_directories.pop parent_directories.pop
end end
unless directory_bucket.exist?("#{user}:") unless directory_bucket.exist?("#{user}:")
update_directory_object(user, "") update_directory_object(user, "", timestamp)
end end
end end
def update_directory_object(user, directory) def update_directory_object(user, directory, timestamp)
if directory.match /\// if directory.match /\//
parent_directory = directory[0..directory.rindex("/")-1] parent_directory = directory[0..directory.rindex("/")-1]
elsif directory != "" elsif directory != ""
@ -195,7 +197,8 @@ module RemoteStorage
end end
directory_object = directory_bucket.new("#{user}:#{directory}") directory_object = directory_bucket.new("#{user}:#{directory}")
directory_object.raw_data = "" directory_object.content_type = "text/plain; charset=utf-8"
directory_object.data = timestamp.to_s
directory_object.indexes.merge!({:user_id_bin => [user]}) directory_object.indexes.merge!({:user_id_bin => [user]})
if parent_directory if parent_directory
directory_object.indexes.merge!({:directory_bin => [parent_directory]}) directory_object.indexes.merge!({:directory_bin => [parent_directory]})

View File

@ -80,12 +80,14 @@ describe "Directories" do
end end
it "does not update existing directory objects" do it "does not update existing directory objects" do
tasks_timestamp = directory_bucket.get("jimmy:tasks").last_modified old_timestamp = (Time.now.to_i - 2).to_s
wait_a_second tasks_object = directory_bucket.get("jimmy:tasks")
tasks_object.data = old_timestamp
tasks_object.store
put "/jimmy/tasks/private/projects/world-domination/start", "write a manifesto" put "/jimmy/tasks/private/projects/world-domination/start", "write a manifesto"
tasks_object = directory_bucket.get("jimmy:tasks") tasks_object.reload.data.must_equal old_timestamp
tasks_object.last_modified.must_equal tasks_timestamp
end end
end end
end end
@ -147,8 +149,11 @@ describe "Directories" do
it "creates a new directory object" do it "creates a new directory object" do
put "/jimmy/tasks/home/trash", "take out the trash" put "/jimmy/tasks/home/trash", "take out the trash"
object = directory_bucket.get("jimmy:tasks/home") object = data_bucket.get("jimmy:tasks/home:trash")
object.last_modified.wont_be_nil directory = directory_bucket.get("jimmy:tasks/home")
directory.data.wont_be_nil
directory.data.to_i.must_equal object.last_modified.to_i
end end
it "sets the correct index for the directory object" do it "sets the correct index for the directory object" do
@ -163,11 +168,11 @@ describe "Directories" do
object = directory_bucket.get("jimmy:tasks") object = directory_bucket.get("jimmy:tasks")
object.indexes["directory_bin"].must_include "/" object.indexes["directory_bin"].must_include "/"
object.last_modified.wont_be_nil object.data.wont_be_nil
object = directory_bucket.get("jimmy:") object = directory_bucket.get("jimmy:")
object.indexes["directory_bin"].must_be_empty object.indexes["directory_bin"].must_be_empty
object.last_modified.wont_be_nil object.data.wont_be_nil
end end
end end
@ -175,17 +180,17 @@ describe "Directories" do
before do before do
@directory = directory_bucket.new("jimmy:tasks/home") @directory = directory_bucket.new("jimmy:tasks/home")
@directory.content_type = "text/plain" @directory.content_type = "text/plain"
@directory.raw_data = "" @directory.data = 2.seconds.ago.to_i.to_s
@directory.store @directory.store
@old_timestamp = @directory.reload.last_modified
end end
it "updates the timestamp of the directory" do it "updates the timestamp of the directory" do
wait_a_second
put "/jimmy/tasks/home/trash", "take out the trash" put "/jimmy/tasks/home/trash", "take out the trash"
object = data_bucket.get("jimmy:tasks/home:trash")
@directory.reload @directory.reload
@directory.last_modified.must_be :>, @old_timestamp
@directory.data.to_i.must_equal object.last_modified.to_i
end end
end end
end end