YAML::Store (Class)

In: yaml/store.rb
Parent: PStore

Methods

new   transaction  

Public Class methods

Constructor

[Source]

# File yaml/store.rb, line 13
                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

Public Instance methods

Override Pstore#transaction

[Source]

# File yaml/store.rb, line 26
                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
                                        File::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

[Validate]