зеркало из https://github.com/github/ruby.git
* lib/pstore.rb (transaction): allow overriding dump and load.
[ruby-dev:23567] * lib/yaml/store.rb: follow lib/pstore.rb's change. git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@6420 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
This commit is contained in:
Родитель
87fb7bb66d
Коммит
979de48915
|
@ -73,6 +73,13 @@ Mon May 24 10:46:26 2004 Kazuhiro NISHIYAMA <zn@mbf.nifty.com>
|
|||
* lib/rdoc/generators/template/html/html.rb: SYSTEM identifiers
|
||||
must be absolute URIs
|
||||
|
||||
Sun May 23 04:53:50 2004 Kazuhiro NISHIYAMA <zn@mbf.nifty.com>
|
||||
|
||||
* lib/pstore.rb (transaction): allow overriding dump and load.
|
||||
[ruby-dev:23567]
|
||||
|
||||
* lib/yaml/store.rb: follow lib/pstore.rb's change.
|
||||
|
||||
Sat May 22 11:54:10 2004 Nobuyoshi Nakada <nobu@ruby-lang.org>
|
||||
|
||||
* MANIFEST: add test/openssl/test_x509store.rb.
|
||||
|
|
|
@ -1549,14 +1549,9 @@ class CGI
|
|||
body = ""
|
||||
end
|
||||
if @output_hidden
|
||||
hidden = @output_hidden.collect{|k,v|
|
||||
"<INPUT TYPE=HIDDEN NAME=\"#{k}\" VALUE=\"#{v}\">"
|
||||
body += @output_hidden.collect{|k,v|
|
||||
"<INPUT TYPE=\"HIDDEN\" NAME=\"#{k}\" VALUE=\"#{v}\">"
|
||||
}.to_s
|
||||
if defined? fieldset
|
||||
body += fieldset{ hidden }
|
||||
else
|
||||
body += hidden
|
||||
end
|
||||
end
|
||||
super(attributes){body}
|
||||
end
|
||||
|
|
|
@ -98,7 +98,7 @@ class PStore
|
|||
|
||||
content = nil
|
||||
file = File.open(@filename, File::RDWR | File::CREAT)
|
||||
if !read_only
|
||||
unless read_only
|
||||
file.flock(File::LOCK_EX)
|
||||
commit_new(file) if FileTest.exist?(new_file)
|
||||
content = file.read()
|
||||
|
@ -112,7 +112,7 @@ class PStore
|
|||
end
|
||||
|
||||
if content != ""
|
||||
@table = Marshal::load(content)
|
||||
@table = load(content)
|
||||
if !read_only
|
||||
size = content.size
|
||||
md5 = Digest::MD5.digest(content)
|
||||
|
@ -132,7 +132,7 @@ class PStore
|
|||
ensure
|
||||
if !read_only and !@abort
|
||||
tmp_file = @filename + ".tmp"
|
||||
content = Marshal::dump(@table)
|
||||
content = dump(@table)
|
||||
if !md5 || size != content.size || md5 != Digest::MD5.digest(content)
|
||||
File.open(tmp_file, "w") {|t|
|
||||
t.write(content)
|
||||
|
@ -151,6 +151,18 @@ class PStore
|
|||
value
|
||||
end
|
||||
|
||||
def dump(table)
|
||||
Marshal::dump(table)
|
||||
end
|
||||
|
||||
def load(content)
|
||||
Marshal::load(content)
|
||||
end
|
||||
|
||||
def load_file(file)
|
||||
Marshal::load(file)
|
||||
end
|
||||
|
||||
private
|
||||
def commit_new(f)
|
||||
f.truncate(0)
|
||||
|
|
|
@ -189,11 +189,14 @@ class ConditionVariable
|
|||
# Releases the lock held in +mutex+ and waits; reacquires the lock on wakeup.
|
||||
#
|
||||
def wait(mutex)
|
||||
mutex.exclusive_unlock do
|
||||
@waiters.push(Thread.current)
|
||||
Thread.stop
|
||||
begin
|
||||
mutex.exclusive_unlock do
|
||||
@waiters.push(Thread.current)
|
||||
Thread.stop
|
||||
end
|
||||
ensure
|
||||
mutex.lock
|
||||
end
|
||||
mutex.lock
|
||||
end
|
||||
|
||||
#
|
||||
|
|
|
@ -3,74 +3,27 @@
|
|||
#
|
||||
require 'yaml'
|
||||
require 'pstore'
|
||||
require 'fileutils'
|
||||
|
||||
module YAML
|
||||
class YAML::Store < PStore
|
||||
def initialize( *o )
|
||||
@opt = YAML::DEFAULTS.dup
|
||||
if String === o.first
|
||||
super(o.shift)
|
||||
end
|
||||
if o.last.is_a? Hash
|
||||
@opt.update(o.pop)
|
||||
end
|
||||
end
|
||||
|
||||
class Store < PStore
|
||||
#
|
||||
# Constructor
|
||||
#
|
||||
def initialize( *o )
|
||||
@opt = YAML::DEFAULTS.dup
|
||||
if String === o.first
|
||||
super(o.shift)
|
||||
end
|
||||
if o.last.is_a? Hash
|
||||
@opt.update(o.pop)
|
||||
end
|
||||
end
|
||||
def dump(table)
|
||||
@table.to_yaml(@opt)
|
||||
end
|
||||
|
||||
#
|
||||
# Override Pstore#transaction
|
||||
#
|
||||
def transaction
|
||||
raise YAML::Error, "nested transaction" if @transaction
|
||||
raise YAML::Error, "no filename for transaction" unless @filename
|
||||
begin
|
||||
@transaction = true
|
||||
value = nil
|
||||
backup = @filename+"~"
|
||||
if File::exist?(@filename)
|
||||
file = File::open(@filename, "rb+")
|
||||
orig = true
|
||||
else
|
||||
@table = {}
|
||||
file = File::open(@filename, "wb+")
|
||||
file.write( @table.to_yaml( @opt ) )
|
||||
end
|
||||
file.flock(File::LOCK_EX)
|
||||
if orig
|
||||
FileUtils::copy @filename, backup
|
||||
@table = YAML::load( file )
|
||||
end
|
||||
begin
|
||||
catch(:pstore_abort_transaction) do
|
||||
value = yield(self)
|
||||
end
|
||||
rescue Exception
|
||||
@abort = true
|
||||
raise
|
||||
ensure
|
||||
unless @abort
|
||||
begin
|
||||
file.rewind
|
||||
file.write( @table.to_yaml( @opt ) )
|
||||
file.truncate(file.pos)
|
||||
rescue
|
||||
File::rename backup, @filename if File::exist?(backup)
|
||||
raise
|
||||
end
|
||||
end
|
||||
@abort = false
|
||||
end
|
||||
ensure
|
||||
@table = nil
|
||||
@transaction = false
|
||||
file.close if file
|
||||
end
|
||||
value
|
||||
end
|
||||
end
|
||||
def load(content)
|
||||
YAML::load(content)
|
||||
end
|
||||
|
||||
def load_file(file)
|
||||
YAML::load(file)
|
||||
end
|
||||
end
|
||||
|
|
Загрузка…
Ссылка в новой задаче