$91 GRAYBYTE WORDPRESS FILE MANAGER $45

SERVER : premium201.web-hosting.com #1 SMP Wed Mar 26 12:08:09 UTC 2025
SERVER IP : 172.67.217.254 | ADMIN IP 216.73.216.23
OPTIONS : CRL = ON | WGT = ON | SDO = OFF | PKEX = OFF
DEACTIVATED : NONE

/opt/alt/ruby18/lib64/ruby/1.8/

HOME
Current File : /opt/alt/ruby18/lib64/ruby/1.8//pstore.rb
# = PStore -- Transactional File Storage for Ruby Objects
#
# pstore.rb -
#   originally by matz
#   documentation by Kev Jackson and James Edward Gray II
#
# See PStore for documentation.


require "fileutils"
require "digest/md5"

#
# PStore implements a file based persistence mechanism based on a Hash.  User
# code can store hierarchies of Ruby objects (values) into the data store file
# by name (keys).  An object hierarchy may be just a single object.  User code 
# may later read values back from the data store or even update data, as needed.
# 
# The transactional behavior ensures that any changes succeed or fail together.
# This can be used to ensure that the data store is not left in a transitory
# state, where some values were updated but others were not.
# 
# Behind the scenes, Ruby objects are stored to the data store file with 
# Marshal.  That carries the usual limitations.  Proc objects cannot be 
# marshalled, for example.
#
# == Usage example:
# 
#  require "pstore"
#  
#  # a mock wiki object...
#  class WikiPage
#    def initialize( page_name, author, contents )
#      @page_name = page_name
#      @revisions = Array.new
#      
#      add_revision(author, contents)
#    end
#    
#    attr_reader :page_name
#    
#    def add_revision( author, contents )
#      @revisions << { :created  => Time.now,
#                      :author   => author,
#                      :contents => contents }
#    end
#    
#    def wiki_page_references
#      [@page_name] + @revisions.last[:contents].scan(/\b(?:[A-Z]+[a-z]+){2,}/)
#    end
#    
#    # ...
#  end
#  
#  # create a new page...
#  home_page = WikiPage.new( "HomePage", "James Edward Gray II",
#                            "A page about the JoysOfDocumentation..." )
#  
#  # then we want to update page data and the index together, or not at all...
#  wiki = PStore.new("wiki_pages.pstore")
#  wiki.transaction do  # begin transaction; do all of this or none of it
#    # store page...
#    wiki[home_page.page_name] = home_page
#    # ensure that an index has been created...
#    wiki[:wiki_index] ||= Array.new
#    # update wiki index...
#    wiki[:wiki_index].push(*home_page.wiki_page_references)
#  end                   # commit changes to wiki data store file
#  
#  ### Some time later... ###
#  
#  # read wiki data...
#  wiki.transaction(true) do  # begin read-only transaction, no changes allowed
#    wiki.roots.each do |data_root_name|
#      p data_root_name
#      p wiki[data_root_name]
#    end
#  end
#
class PStore
  binmode = defined?(File::BINARY) ? File::BINARY : 0
  RDWR_ACCESS = File::RDWR | File::CREAT | binmode
  RD_ACCESS = File::RDONLY | binmode
  WR_ACCESS = File::WRONLY | File::CREAT | File::TRUNC | binmode

  # The error type thrown by all PStore methods.
  class Error < StandardError
  end

  # 
  # To construct a PStore object, pass in the _file_ path where you would like 
  # the data to be stored.
  # 
  def initialize(file)
    dir = File::dirname(file)
    unless File::directory? dir
      raise PStore::Error, format("directory %s does not exist", dir)
    end
    if File::exist? file and not File::readable? file
      raise PStore::Error, format("file %s not readable", file)
    end
    @transaction = false
    @filename = file
    @abort = false
  end

  # Raises PStore::Error if the calling code is not in a PStore#transaction.
  def in_transaction
    raise PStore::Error, "not in transaction" unless @transaction
  end
  # 
  # Raises PStore::Error if the calling code is not in a PStore#transaction or
  # if the code is in a read-only PStore#transaction.
  # 
  def in_transaction_wr()
    in_transaction()
    raise PStore::Error, "in read-only transaction" if @rdonly
  end
  private :in_transaction, :in_transaction_wr

  #
  # Retrieves a value from the PStore file data, by _name_.  The hierarchy of 
  # Ruby objects stored under that root _name_ will be returned.
  # 
  # *WARNING*:  This method is only valid in a PStore#transaction.  It will
  # raise PStore::Error if called at any other time.
  #
  def [](name)
    in_transaction
    @table[name]
  end
  #
  # This method is just like PStore#[], save that you may also provide a 
  # _default_ value for the object.  In the event the specified _name_ is not 
  # found in the data store, your _default_ will be returned instead.  If you do 
  # not specify a default, PStore::Error will be raised if the object is not 
  # found.
  # 
  # *WARNING*:  This method is only valid in a PStore#transaction.  It will
  # raise PStore::Error if called at any other time.
  #
  def fetch(name, default=PStore::Error)
    in_transaction
    unless @table.key? name
      if default==PStore::Error
	raise PStore::Error, format("undefined root name `%s'", name)
      else
	return default
      end
    end
    @table[name]
  end
  #
  # Stores an individual Ruby object or a hierarchy of Ruby objects in the data
  # store file under the root _name_.  Assigning to a _name_ already in the data
  # store clobbers the old data.
  # 
  # == Example:
  # 
  #  require "pstore"
  #  
  #  store = PStore.new("data_file.pstore")
  #  store.transaction do  # begin transaction
  #    # load some data into the store...
  #    store[:single_object] = "My data..."
  #    store[:obj_heirarchy] = { "Kev Jackson" => ["rational.rb", "pstore.rb"],
  #                              "James Gray"  => ["erb.rb", "pstore.rb"] }
  #  end                   # commit changes to data store file
  # 
  # *WARNING*:  This method is only valid in a PStore#transaction and it cannot
  # be read-only.  It will raise PStore::Error if called at any other time.
  #
  def []=(name, value)
    in_transaction_wr()
    @table[name] = value
  end
  #
  # Removes an object hierarchy from the data store, by _name_.
  # 
  # *WARNING*:  This method is only valid in a PStore#transaction and it cannot
  # be read-only.  It will raise PStore::Error if called at any other time.
  #
  def delete(name)
    in_transaction_wr()
    @table.delete name
  end

  #
  # Returns the names of all object hierarchies currently in the store.
  # 
  # *WARNING*:  This method is only valid in a PStore#transaction.  It will
  # raise PStore::Error if called at any other time.
  #
  def roots
    in_transaction
    @table.keys
  end
  #
  # Returns true if the supplied _name_ is currently in the data store.
  # 
  # *WARNING*:  This method is only valid in a PStore#transaction.  It will
  # raise PStore::Error if called at any other time.
  #
  def root?(name)
    in_transaction
    @table.key? name
  end
  # Returns the path to the data store file.
  def path
    @filename
  end

  #
  # Ends the current PStore#transaction, committing any changes to the data
  # store immediately.
  # 
  # == Example:
  # 
  #  require "pstore"
  #   
  #  store = PStore.new("data_file.pstore")
  #  store.transaction do  # begin transaction
  #    # load some data into the store...
  #    store[:one] = 1
  #    store[:two] = 2
  #  
  #    store.commit        # end transaction here, committing changes
  #  
  #    store[:three] = 3   # this change is never reached
  #  end
  # 
  # *WARNING*:  This method is only valid in a PStore#transaction.  It will
  # raise PStore::Error if called at any other time.
  #
  def commit
    in_transaction
    @abort = false
    throw :pstore_abort_transaction
  end
  #
  # Ends the current PStore#transaction, discarding any changes to the data
  # store.
  # 
  # == Example:
  # 
  #  require "pstore"
  #   
  #  store = PStore.new("data_file.pstore")
  #  store.transaction do  # begin transaction
  #    store[:one] = 1     # this change is not applied, see below...
  #    store[:two] = 2     # this change is not applied, see below...
  #  
  #    store.abort         # end transaction here, discard all changes
  #  
  #    store[:three] = 3   # this change is never reached
  #  end
  # 
  # *WARNING*:  This method is only valid in a PStore#transaction.  It will
  # raise PStore::Error if called at any other time.
  #
  def abort
    in_transaction
    @abort = true
    throw :pstore_abort_transaction
  end

  #
  # Opens a new transaction for the data store.  Code executed inside a block
  # passed to this method may read and write data to and from the data store 
  # file.
  # 
  # At the end of the block, changes are committed to the data store
  # automatically.  You may exit the transaction early with a call to either 
  # PStore#commit or PStore#abort.  See those methods for details about how
  # changes are handled.  Raising an uncaught Exception in the block is 
  # equivalent to calling PStore#abort.
  # 
  # If _read_only_ is set to +true+, you will only be allowed to read from the
  # data store during the transaction and any attempts to change the data will
  # raise a PStore::Error.
  # 
  # Note that PStore does not support nested transactions.
  #
  def transaction(read_only=false)  # :yields:  pstore
    raise PStore::Error, "nested transaction" if @transaction
    begin
      @rdonly = read_only
      @abort = false
      @transaction = true
      value = nil
      new_file = @filename + ".new"

      content = nil
      unless read_only
        file = File.open(@filename, RDWR_ACCESS)
        file.flock(File::LOCK_EX)
        commit_new(file) if FileTest.exist?(new_file)
        content = file.read()
      else
        begin
          file = File.open(@filename, RD_ACCESS)
          file.flock(File::LOCK_SH)
          content = (File.open(new_file, RD_ACCESS) {|n| n.read} rescue file.read())
        rescue Errno::ENOENT
          content = ""
        end
      end

      if content != ""
	@table = load(content)
        if !read_only
          size = content.size
          md5 = Digest::MD5.digest(content)
        end
      else
	@table = {}
      end
      content = nil		# unreference huge data

      begin
	catch(:pstore_abort_transaction) do
	  value = yield(self)
	end
      rescue Exception
	@abort = true
	raise
      ensure
	if !read_only and !@abort
          tmp_file = @filename + ".tmp"
	  content = dump(@table)
	  if !md5 || size != content.size || md5 != Digest::MD5.digest(content)
            File.open(tmp_file, WR_ACCESS) {|t| t.write(content)}
            File.rename(tmp_file, new_file)
            commit_new(file)
          end
          content = nil		# unreference huge data
	end
      end
    ensure
      @table = nil
      @transaction = false
      file.close if file
    end
    value
  end

  # This method is just a wrapped around Marshal.dump.
  def dump(table)  # :nodoc:
    Marshal::dump(table)
  end

  # This method is just a wrapped around Marshal.load.
  def load(content)  # :nodoc:
    Marshal::load(content)
  end

  # This method is just a wrapped around Marshal.load.
  def load_file(file)  # :nodoc:
    Marshal::load(file)
  end

  private
  # Commits changes to the data store file.
  def commit_new(f)
    f.truncate(0)
    f.rewind
    new_file = @filename + ".new"
    File.open(new_file, RD_ACCESS) do |nf|
      FileUtils.copy_stream(nf, f)
    end
    File.unlink(new_file)
  end
end

# :enddoc:

if __FILE__ == $0
  db = PStore.new("/tmp/foo")
  db.transaction do
    p db.roots
    ary = db["root"] = [1,2,3,4]
    ary[1] = [1,1.5]
  end

  1000.times do
    db.transaction do
      db["root"][0] += 1
      p db["root"][0]
    end
  end

  db.transaction(true) do
    p db["root"]
  end
end


Current_dir [ NOT WRITEABLE ] Document_root [ NOT WRITEABLE ]


[ Back ]
NAME
SIZE
LAST TOUCH
USER
CAN-I?
FUNCTIONS
..
--
3 Mar 2024 10.50 PM
root / root
0755
bigdecimal
--
3 Mar 2024 10.48 PM
root / linksafe
0755
cgi
--
3 Mar 2024 10.48 PM
root / linksafe
0755
date
--
3 Mar 2024 10.48 PM
root / linksafe
0755
digest
--
3 Mar 2024 10.48 PM
root / linksafe
0755
dl
--
3 Mar 2024 10.48 PM
root / linksafe
0755
drb
--
3 Mar 2024 10.48 PM
root / linksafe
0755
io
--
3 Mar 2024 10.48 PM
root / linksafe
0755
irb
--
3 Mar 2024 10.48 PM
root / linksafe
0755
net
--
3 Mar 2024 10.48 PM
root / linksafe
0755
openssl
--
3 Mar 2024 10.48 PM
root / linksafe
0755
optparse
--
3 Mar 2024 10.48 PM
root / linksafe
0755
racc
--
3 Mar 2024 10.48 PM
root / linksafe
0755
rdoc
--
3 Mar 2024 10.48 PM
root / linksafe
0755
rexml
--
3 Mar 2024 10.48 PM
root / linksafe
0755
rinda
--
3 Mar 2024 10.48 PM
root / linksafe
0755
rss
--
3 Mar 2024 10.48 PM
root / linksafe
0755
runit
--
3 Mar 2024 10.48 PM
root / linksafe
0755
shell
--
3 Mar 2024 10.48 PM
root / linksafe
0755
soap
--
3 Mar 2024 10.48 PM
root / linksafe
0755
test
--
3 Mar 2024 10.48 PM
root / linksafe
0755
uri
--
3 Mar 2024 10.48 PM
root / linksafe
0755
webrick
--
3 Mar 2024 10.48 PM
root / linksafe
0755
wsdl
--
3 Mar 2024 10.48 PM
root / linksafe
0755
x86_64-linux
--
3 Mar 2024 10.50 PM
root / root
0755
xmlrpc
--
3 Mar 2024 10.48 PM
root / linksafe
0755
xsd
--
3 Mar 2024 10.48 PM
root / linksafe
0755
yaml
--
3 Mar 2024 10.48 PM
root / linksafe
0755
English.rb
5.598 KB
12 Feb 2007 11.01 PM
root / linksafe
0644
Env.rb
0.268 KB
12 Feb 2007 11.01 PM
root / linksafe
0644
abbrev.rb
2.503 KB
12 Feb 2007 11.01 PM
root / linksafe
0644
base64.rb
3.37 KB
16 Jul 2007 3.47 PM
root / linksafe
0644
benchmark.rb
17.729 KB
10 Feb 2008 3.24 PM
root / linksafe
0644
cgi-lib.rb
6.891 KB
12 Feb 2007 11.01 PM
root / linksafe
0644
cgi.rb
73.737 KB
14 Dec 2009 2.40 AM
root / linksafe
0644
complex.rb
12.839 KB
3 Aug 2009 5.59 AM
root / linksafe
0644
csv.rb
24.459 KB
12 Feb 2007 11.01 PM
root / linksafe
0644
date.rb
53.024 KB
8 Jun 2010 4.45 AM
root / linksafe
0644
date2.rb
0.125 KB
12 Feb 2007 11.01 PM
root / linksafe
0644
debug.rb
20.609 KB
12 Feb 2007 11.01 PM
root / linksafe
0644
delegate.rb
8.808 KB
16 Jul 2009 12.35 AM
root / linksafe
0644
digest.rb
1.118 KB
28 Jul 2007 12.40 AM
root / linksafe
0644
drb.rb
0.019 KB
12 Feb 2007 11.01 PM
root / linksafe
0644
e2mmap.rb
4.037 KB
12 Feb 2007 11.01 PM
root / linksafe
0644
erb.rb
21.38 KB
23 Feb 2009 5.44 PM
root / linksafe
0644
eregex.rb
0.476 KB
12 Feb 2007 11.01 PM
root / linksafe
0644
expect.rb
0.618 KB
18 Feb 2008 1.17 AM
root / linksafe
0644
fileutils.rb
42.229 KB
20 May 2011 10.29 PM
root / linksafe
0644
finalize.rb
5.376 KB
12 Feb 2007 11.01 PM
root / linksafe
0644
find.rb
1.836 KB
12 Feb 2007 11.01 PM
root / linksafe
0644
forwardable.rb
6.163 KB
6 Jun 2008 8.05 AM
root / linksafe
0644
ftools.rb
6.168 KB
12 Feb 2007 11.01 PM
root / linksafe
0644
generator.rb
8.1 KB
10 Apr 2008 10.52 AM
root / linksafe
0644
getoptlong.rb
14.877 KB
12 Feb 2007 11.01 PM
root / linksafe
0644
getopts.rb
2.252 KB
12 Feb 2007 11.01 PM
root / linksafe
0644
gserver.rb
6.431 KB
12 Feb 2007 11.01 PM
root / linksafe
0644
importenv.rb
0.576 KB
12 Feb 2007 11.01 PM
root / linksafe
0644
ipaddr.rb
21.957 KB
12 Jul 2008 3.08 PM
root / linksafe
0644
irb.rb
7.43 KB
9 Aug 2009 8.44 AM
root / linksafe
0644
jcode.rb
4.297 KB
12 Feb 2007 11.01 PM
root / linksafe
0644
kconv.rb
8.124 KB
12 Feb 2007 11.01 PM
root / linksafe
0644
logger.rb
17.588 KB
30 May 2011 2.08 AM
root / linksafe
0644
mailread.rb
1.284 KB
12 Feb 2007 11.01 PM
root / linksafe
0644
mathn.rb
5.419 KB
12 Feb 2007 11.01 PM
root / linksafe
0644
matrix.rb
27.208 KB
24 Jan 2009 3.02 PM
root / linksafe
0644
md5.rb
0.401 KB
6 Mar 2007 10.09 AM
root / linksafe
0644
mkmf.rb
50.646 KB
4 Dec 2010 6.34 AM
root / linksafe
0644
monitor.rb
7.926 KB
25 Nov 2009 7.45 AM
root / linksafe
0644
mutex_m.rb
2.072 KB
12 Feb 2007 11.01 PM
root / linksafe
0644
observer.rb
5.154 KB
12 Feb 2007 11.01 PM
root / linksafe
0644
open-uri.rb
20.49 KB
8 Oct 2007 11.16 AM
root / linksafe
0644
open3.rb
2.098 KB
14 Dec 2009 4.28 AM
root / linksafe
0644
openssl.rb
0.562 KB
22 Nov 2010 7.21 AM
root / linksafe
0644
optparse.rb
47.121 KB
20 Feb 2009 11.43 AM
root / linksafe
0644
ostruct.rb
3.354 KB
26 May 2009 12.06 PM
root / linksafe
0644
parsearg.rb
1.554 KB
12 Feb 2007 11.01 PM
root / linksafe
0644
parsedate.rb
1.327 KB
12 Feb 2007 11.01 PM
root / linksafe
0644
pathname.rb
29.386 KB
23 Nov 2010 8.21 AM
root / linksafe
0644
ping.rb
1.481 KB
12 Feb 2007 11.01 PM
root / linksafe
0644
pp.rb
15.966 KB
7 Jun 2007 10.06 AM
root / linksafe
0644
prettyprint.rb
18.335 KB
16 Feb 2007 7.53 PM
root / linksafe
0644
profile.rb
0.088 KB
12 Feb 2007 11.01 PM
root / linksafe
0644
profiler.rb
1.589 KB
12 Feb 2007 11.01 PM
root / linksafe
0644
pstore.rb
11.149 KB
6 Jun 2008 8.05 AM
root / linksafe
0644
rational.rb
12.05 KB
8 Jun 2010 5.02 AM
root / linksafe
0644
readbytes.rb
0.815 KB
12 Feb 2007 11.01 PM
root / linksafe
0644
resolv-replace.rb
1.553 KB
8 Aug 2008 1.58 AM
root / linksafe
0644
resolv.rb
56.831 KB
23 Dec 2010 3.22 AM
root / linksafe
0644
rss.rb
0.492 KB
21 Oct 2007 12.19 PM
root / linksafe
0644
rubyunit.rb
0.176 KB
12 Feb 2007 11.01 PM
root / linksafe
0644
scanf.rb
20.633 KB
20 Jan 2009 3.23 AM
root / linksafe
0644
securerandom.rb
4.267 KB
10 Dec 2011 12.17 PM
root / linksafe
0644
set.rb
27.076 KB
9 Jun 2008 9.20 AM
root / linksafe
0644
sha1.rb
0.408 KB
6 Mar 2007 10.09 AM
root / linksafe
0644
shell.rb
4.655 KB
12 Feb 2007 11.01 PM
root / linksafe
0644
shellwords.rb
3.99 KB
21 Mar 2008 12.16 PM
root / linksafe
0644
singleton.rb
8.077 KB
3 Jul 2008 11.14 AM
root / linksafe
0644
sync.rb
6.086 KB
19 Feb 2009 4.41 PM
root / linksafe
0644
tempfile.rb
4.861 KB
21 Apr 2008 9.43 AM
root / linksafe
0644
thread.rb
0.102 KB
13 Feb 2007 7.39 PM
root / linksafe
0644
thwait.rb
4.316 KB
8 Jun 2010 7.08 AM
root / linksafe
0644
time.rb
31.58 KB
6 Jun 2008 8.05 AM
root / linksafe
0644
timeout.rb
3.005 KB
8 Jun 2010 6.24 AM
root / linksafe
0644
tmpdir.rb
3.694 KB
26 Jan 2009 2.12 AM
root / linksafe
0644
tracer.rb
2.727 KB
12 Feb 2007 11.01 PM
root / linksafe
0644
tsort.rb
7.993 KB
12 Feb 2007 11.01 PM
root / linksafe
0644
un.rb
4.537 KB
12 Feb 2007 11.01 PM
root / linksafe
0644
uri.rb
0.693 KB
15 Apr 2008 9.41 AM
root / linksafe
0644
weakref.rb
2.684 KB
12 Feb 2007 11.01 PM
root / linksafe
0644
webrick.rb
0.792 KB
12 Feb 2007 11.01 PM
root / linksafe
0644
yaml.rb
12.355 KB
19 Apr 2008 11.45 AM
root / linksafe
0644

GRAYBYTE WORDPRESS FILE MANAGER @ 2025 CONTACT ME
Static GIF