#!/usr/bin/perl =pod =head1 NAME Spline::Data - Per Message data =head1 SYNOPSIS use Spline::Data; my $data = Spline::Data->new($ctx); my $value = $data->get($key); $data->set($key, $value); my $data = Spline::Data->load($ctx); =head1 DESCRIPTION =cut package Spline::Data; use strict; use warnings; use Spline::Log qw(set_log_context); use Data::Dumper; use base 'Exporter'; our @EXPORT = qw(); our @EXPORT_OK = qw(); =head2 _generate_id my $id = _gernerate_id(); Generate a random string to tag interleaving log lines belonging to the same message. =cut sub _generate_id() { my @chars = ('A'..'Z', 'a'..'z', '0'..'9'); my $id = ''; $id .= $chars[rand @chars] for 1..10; return $id; }; =head2 new my $data = Spline::Data::new($ctx); =cut sub new { my $class = shift; my $ctx = shift; my $id = _generate_id(); my $self = { ctx => $ctx, data => { log_ctx => $id, } }; set_log_context($id); return bless $self, $class; } =head2 get my $value = $data->get($key); Get the matching value for the supplied key as scalar. If there is no such key in the data, return undef. =cut sub get($$) { my $self = shift; my $key = shift; return $self->{data}->{$key} if defined $self->{data}->{$key}; return undef; } =head2 set $data->set($key, $value); Set the supplied value for the key and save the data in the Milter context. This method will silently create new keys and overwrite possible existent values. =cut sub set($$$) { my $self = shift; my ($key, $value) = @_; $self->{data}->{$key} = $value; $self->_save(); } =head2 _save $data->_save(); Save the data in the Milter context. =cut sub _save($) { my $self = shift; $self->{ctx}->setpriv($self->{data}); } =head2 load my $data = Spline::Data->load($ctx); Get the data from the Milter context and return a Spline::Data object. The data is saved again after receiving it, so that it will persist even if no value is changed. =cut sub load { my $class = shift; my $ctx = shift; my $self = { ctx => $ctx, data => {}, }; $self->{data} = $ctx->getpriv(); _save($self); if (defined $self->{data}->{log_ctx}) { set_log_context($self->{data}->{log_ctx}); } return bless $self, $class; } =head1 AUTHOR Alexander Sulfrian =cut 1; # vim: set et tabstop=4 tw=70: