Sha256: 5c1bbf9630949c89a6b7c6391b584bb3359ef0cf73be0c033ba15618b8e5fc75
Contents?: true
Size: 1.42 KB
Versions: 1
Compression:
Stored size: 1.42 KB
Contents
require 'timeout' class FileQueue attr_accessor :file_name, :delimiter def initialize(file_name, delimiter="\n") @delimiter = delimiter @file_name = file_name end def push(obj) if obj.match Regexp.new @delimiter raise "Queue objects cannot contain the queue delimiter" end safe_open 'a' do |file| file.write(obj + @delimiter) end end alias << push def pop value = nil rest = nil safe_open 'r+' do |file| value = file.gets @delimiter rest = file.read file.rewind file.write rest file.truncate(file.pos) end value ? value[0..-(@delimiter.length) - 1] : nil end def length count = 0 safe_open 'r' do |file| count = file.read.count @delimiter end count end def empty? return length == 0 end def clear safe_open 'w' do |file| end end protected def safe_open(mode) File.open(@file_name, mode) do |file| lock file yield file end end # Locks the queue file for exclusive access. # # Raises `FileLockError` if unable to acquire a lock. # # Return is undefined. def lock(file) tries = 1000 until tries == 0 || lock_acquired = file.flock(File::LOCK_NB|File::LOCK_EX) tries -= 1 Thread.pass end (raise FileLockError, "Queue file appears to be permanently lockecd") unless lock_acquired end FileLockError = Class.new(Timeout::Error) end
Version data entries
1 entries across 1 versions & 1 rubygems
Version | Path |
---|---|
filequeue-mcpolemic-0.0.2 | lib/filequeue.rb |