diff options
author | (no author) <(no author)@b2dd03c8-39d4-4d8f-98ff-823fe69b080e> | 2000-04-14 14:35:50 +0000 |
---|---|---|
committer | (no author) <(no author)@b2dd03c8-39d4-4d8f-98ff-823fe69b080e> | 2000-04-14 14:35:50 +0000 |
commit | ed131ebad88c2948d7b40f93ff6ce39f1eb8a2f7 (patch) | |
tree | 7bbf62c5e0d0bb8ff971637cf432c6f16824f8f6 /lib/pstore.rb | |
parent | be1fea072cd0d22788ef8a931c0c6b64a2503b5d (diff) |
This commit was manufactured by cvs2svn to create tag 'v1_4_4'.
git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/tags/v1_4_4@668 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
Diffstat (limited to 'lib/pstore.rb')
-rw-r--r-- | lib/pstore.rb | 38 |
1 files changed, 23 insertions, 15 deletions
diff --git a/lib/pstore.rb b/lib/pstore.rb index 2aa9864b58..97b3794326 100644 --- a/lib/pstore.rb +++ b/lib/pstore.rb @@ -13,6 +13,7 @@ # end require "marshal" +require "ftools" class PStore class Error < StandardError @@ -51,6 +52,10 @@ class PStore in_transaction @table[name] = value end + def delete(name) + in_transaction + @table.delete name + end def roots in_transaction @@ -77,12 +82,19 @@ class PStore raise PStore::Error, "nested transaction" if @transaction begin @transaction = true - value = file = nil - begin - File::open(@filename, "r") do |file| - @table = Marshal.load(file) - end - rescue Errno::ENOENT + value = nil + backup = @filename+"~" + if File::exist?(@filename) + file = File::open(@filename, "r+") + orig = true + else + file = File::open(@filename, "w+") + end + file.flock(File::LOCK_EX) + if orig + File::copy @filename, backup + @table = Marshal::load(file) + else @table = {} end begin @@ -95,16 +107,11 @@ class PStore ensure unless @abort begin - File::rename @filename, @filename+"~" - rescue Errno::ENOENT - no_orig = true - end - begin - File::open(@filename, "w") do |file| - Marshal::dump(@table, file) - end + file.rewind + Marshal::dump(@table, file) rescue - File::rename @filename+"~", @filename unless no_orig + File::rename backup, @filename if File::exist?(backup) + raise end end @abort = false @@ -112,6 +119,7 @@ class PStore ensure @table = nil @transaction = false + file.close if file end value end |