Bot-Cobalt
view release on metacpan or search on metacpan
lib/Bot/Cobalt/Serializer.pm view on Meta::CPAN
my $module;
return unless $module = $self->_types->{$type};
{
local $@;
eval "require $module";
return if $@;
}
return $module
}
sub _read_serialized {
my ($self, $path, $opts) = @_;
return unless defined $path;
my $lock = 1;
if (defined $opts && ref $opts && reftype $opts eq 'HASH') {
$lock = $opts->{Locking} if defined $opts->{Locking};
}
if (blessed $path && $path->can('slurp_utf8')) {
return $path->slurp_utf8
} else {
open(my $in_fh, '<:encoding(UTF-8)', $path)
or confess "open failed for $path: $!";
if ($lock) {
flock($in_fh, LOCK_SH)
or confess "LOCK_SH failed for $path: $!";
}
my $data = join '', <$in_fh>;
flock($in_fh, LOCK_UN) if $lock;
close($in_fh)
or carp "close failed for $path: $!";
return $data
}
}
sub _write_serialized {
my ($self, $path, $data, $opts) = @_;
return unless $path and defined $data;
my $lock = 1;
my $timeout = 2;
if (defined $opts && ref $opts && reftype $opts eq 'HASH') {
$lock = $opts->{Locking} if defined $opts->{Locking};
$timeout = $opts->{Timeout} if $opts->{Timeout};
}
open(my $out_fh, '>>:encoding(UTF-8)', $path)
or confess "open failed for $path: $!";
if ($lock) {
my $timer = 0;
until ( flock $out_fh, LOCK_EX | LOCK_NB ) {
confess "Failed writefile lock ($path), timed out ($timeout)"
if $timer > $timeout;
sleep 0.01;
$timer += 0.01;
}
}
seek($out_fh, 0, 0)
or confess "seek failed for $path: $!";
truncate($out_fh, 0)
or confess "truncate failed for $path";
print $out_fh $data;
flock($out_fh, LOCK_UN) if $lock;
close($out_fh)
or carp "close failed for $path: $!";
return 1
}
1;
__END__
=pod
=head1 NAME
Bot::Cobalt::Serializer - Bot::Cobalt serialization wrapper
=head1 SYNOPSIS
use Bot::Cobalt::Serializer;
## Spawn a YAML (1.1) handler:
my $serializer = Bot::Cobalt::Serializer->new;
## Spawn a JSON handler:
my $serializer = Bot::Cobalt::Serializer->new('JSON');
## ...same as:
my $serializer = Bot::Cobalt::Serializer->new( Format => 'JSON' );
## Serialize some data to our Format:
my $ref = { Stuff => { Things => [ 'a', 'b'] } };
my $frozen = $serializer->freeze( $ref );
## Turn it back into a Perl data structure:
my $thawed = $serializer->thaw( $frozen );
## Serialize some $ref to a file at $path
## The file will be overwritten
## Returns false on failure
$serializer->writefile( $path, $ref );
## Do the same thing, but without locking
$serializer->writefile( $path, $ref, { Locking => 0 } );
## Turn a serialized file back into a $ref
## Boolean false on failure
my $ref = $serializer->readfile( $path );
## Do the same thing, but without locking
( run in 0.756 second using v1.01-cache-2.11-cpan-d8267643d1d )