mirror of
				https://github.com/ruby/ruby.git
				synced 2022-11-09 12:17:21 -05:00 
			
		
		
		
	* 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:
		
							parent
							
								
									87fb7bb66d
								
							
						
					
					
						commit
						979de48915
					
				
					 5 changed files with 50 additions and 80 deletions
				
			
		| 
						 | 
				
			
			@ -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
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue