class BitGirder::Event::File::EventFileWriter

Constants

DEFAULT_ROTATE_SIZE

Public Instance Methods

close() click to toggle source
# File lib/bitgirder/event/file.rb, line 219
def close

    @closed = true
    impl_flush if @io
end
closed?() click to toggle source
# File lib/bitgirder/event/file.rb, line 65
def closed?
    @closed
end
write_event( ev ) click to toggle source
# File lib/bitgirder/event/file.rb, line 206
def write_event( ev )
    
    raise ClosedError if @closed

    str_io = new_string_io
    @codec.encode_event( ev, str_io )

    io_sz = str_io.pos + HEADER_SIZE

    impl_write_event( str_io, io_sz )
end

Private Instance Methods

close_file() click to toggle source
# File lib/bitgirder/event/file.rb, line 135
def close_file
 
    if @io

        @file_factory.close_file( @io )
        @buf = @bin.io.string
        @io, @bin, @file_remain, @buf_remain = nil, nil, -1, -1
    end
end
ensure_io() click to toggle source
# File lib/bitgirder/event/file.rb, line 119
def ensure_io
 
    @buf ||= ( "\x00" * @buffer_size.bytes )

    unless @io

        open_res = @file_factory.open_file
        @io = open_res.io

        update_remain_counts( @rotate_size.bytes - open_res.pos )
        reset_bin_writer
        write_file_header unless open_res.is_reopen
    end
end
impl_flush() click to toggle source
# File lib/bitgirder/event/file.rb, line 146
def impl_flush
 
    completes_file = @file_remain <= @buffer_size.bytes

    @buf.slice!( @bin.io.pos, @buf.size )

    @io.write( @buf )
    send_event( :wrote_buffer, @buf.size )

    # Order matters: need to use @buf before reset_bin_writer
    update_remain_counts( @file_remain - @buf.size )
    reset_bin_writer

    close_file if completes_file || @closed
end
impl_initialize() click to toggle source
# File lib/bitgirder/event/file.rb, line 52
def impl_initialize

    @buffer_size ||= [ @rotate_size, DEFAULT_BUFFER_SIZE ].min

    if @buffer_size > @rotate_size
        raise ArgumentError, 
              "Buffer size #@buffer_size > rotate size #@rotate_size"
    end

    @conv = Io::BinaryConverter.new(    :order => Io::ORDER_LITTLE_ENDIAN )
end
impl_write_event( str_io, io_sz ) click to toggle source
# File lib/bitgirder/event/file.rb, line 193
def impl_write_event( str_io, io_sz )

    ensure_io

    if io_sz > @buf_remain
        write_overflow( str_io, io_sz )
    else
        write_serialized_event( str_io, @bin )
        if ( @buf_remain -= io_sz ) == 0 then impl_flush end
    end
end
new_string_io() click to toggle source
# File lib/bitgirder/event/file.rb, line 78
def new_string_io
    RubyVersions.when_19x( StringIO.new ) do |io|
        io.set_encoding( Encoding::BINARY )
    end
end
reset_bin_writer() click to toggle source
# File lib/bitgirder/event/file.rb, line 85
def reset_bin_writer
        
    @bin =
        Io::BinaryWriter.new(
            :io => StringIO.new( @buf ),
            :order => Io::ORDER_LITTLE_ENDIAN
        )
end
send_event( ev, *argv ) click to toggle source
# File lib/bitgirder/event/file.rb, line 70
def send_event( ev, *argv )
    
    if @event_handler && @event_handler.respond_to?( ev )
        @event_handler.send( ev, *argv )
    end
end
update_remain_counts( file_remain ) click to toggle source
# File lib/bitgirder/event/file.rb, line 112
def update_remain_counts( file_remain )
    
    @file_remain = file_remain
    @buf_remain = [ @file_remain, @buffer_size.bytes ].min
end
write_ev_header( str_io, dest ) click to toggle source
# File lib/bitgirder/event/file.rb, line 163
def write_ev_header( str_io, dest )
    dest.write( @conv.write_int32( str_io.size ) )
end
write_file_header() click to toggle source
# File lib/bitgirder/event/file.rb, line 95
def write_file_header
    
    @bin.write_full( FILE_MAGIC )
    @bin.write_utf8( FILE_VERSION )
    
    if ( hdr_len = @bin.pos ) >= ( rs = @rotate_size.bytes )
        
        @closed = true

        raise WriteError, 
              "File header length #{hdr_len} >= rotate size #{rs}"
    end

    @buf_remain -= @bin.pos
end
write_overflow( str_io, io_sz ) click to toggle source
# File lib/bitgirder/event/file.rb, line 175
def write_overflow( str_io, io_sz )

    impl_flush

    if io_sz > @buffer_size.bytes
        
        if io_sz > @rotate_size.bytes
            raise WriteError, 
                "Record is too large for rotate size #@rotate_size" 
        else
            write_serialized_event( str_io, @io )
        end
    else
        impl_write_event( str_io, io_sz )
    end
end
write_serialized_event( str_io, dest ) click to toggle source
# File lib/bitgirder/event/file.rb, line 168
def write_serialized_event( str_io, dest )
        
    write_ev_header( str_io, dest )
    dest.write( str_io.string[ 0, str_io.size ] )
end