Save timestamps for directory objects as actual data to keep them consistent with the data objects
This commit is contained in:
parent
c0078e66e1
commit
d4151b64df
@ -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]})
|
||||||
|
|||||||
@ -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
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user