1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221
|
package Data::Session::ID::AutoIncrement;
use parent 'Data::Session::ID';
no autovivification;
use strict;
use warnings;
use Fcntl qw/:DEFAULT :flock/;
use Hash::FieldHash ':all';
our $VERSION = '1.18';
# -----------------------------------------------
sub generate
{
my($self) = @_;
my($id_file) = $self -> id_file;
(! $id_file) && die __PACKAGE__ . '. id_file not specifed in new(...)';
my($message) = __PACKAGE__ . ". Can't %s id_file '$id_file'. %s";
my($fh);
sysopen($fh, $id_file, O_RDWR | O_CREAT, $self -> umask) || die sprintf($message, 'open', $self -> debug ? $! : '');
if (! $self -> no_flock)
{
flock($fh, LOCK_EX) || die sprintf($message, 'lock', $self -> debug ? $! : '');
}
my($id) = <$fh>;
if (! $id || ($id !~ /^\d+$/) )
{
$id = $self -> id_base;
}
$id += $self -> id_step;
seek($fh, 0, 0) || die sprintf($message, 'seek', $self -> debug ? $! : '');
truncate($fh, 0) || die sprintf($message, 'truncate', $self -> debug ? $! : '');
print $fh $id;
close $fh || die sprintf($message, 'close', $self -> debug ? $! : '');
return $id;
} # End of generate.
# -----------------------------------------------
sub id_length
{
my($self) = @_;
return 32;
} # End of id_length.
# -----------------------------------------------
sub new
{
my($class, %arg) = @_;
$class -> init(\%arg);
return from_hash(bless({}, $class), \%arg);
} # End of new.
# -----------------------------------------------
1;
=pod
=head1 NAME
L<Data::Session::ID::AutoIncrement> - A persistent session manager
=head1 Synopsis
See L<Data::Session> for details.
=head1 Description
L<Data::Session::ID::AutoIncrement> allows L<Data::Session> to generate session ids.
To use this module do this:
=over 4
=item o Specify an id generator of type AutoIncrement, as
Data::Session -> new(type => '... id:AutoIncrement ...')
=back
=head1 Case-sensitive Options
See L<Data::Session/Case-sensitive Options> for important information.
=head1 Method: new()
Creates a new object of type L<Data::Session::ID::AutoIncrement>.
C<new()> takes a hash of key/value pairs, some of which might mandatory. Further, some combinations
might be mandatory.
The keys are listed here in alphabetical order.
They are lower-case because they are (also) method names, meaning they can be called to set or get
the value at any time.
=over 4
=item o id_base => $integer
Specifies the base value for the auto-incrementing sessions ids.
This key is normally passed in as Data::Session -> new(id_base => $integer).
Note: The first id returned by generate() is id_base + id_step.
Default: 0.
This key is optional.
=item o id_file => $file_name
Specifies the file name in which to save the 'current' id.
This key is normally passed in as Data::Session -> new(id_file => $file_name).
Note: The next id returned by generate() is 'current' id + id_step.
Default: File::Spec -> catdir(File::Spec -> tmpdir, 'data.session.id').
The reason Data::Session -> new(directory => ...) is not used as the default directory is because
this latter option is for where the session files are stored if the driver is File and the id
generator is not AutoIncrement.
This key is optional.
=item o id_step => $integer
Specifies the amount to be added to the previous id to get the next id.
This key is normally passed in as Data::Session -> new(id_step => $integer).
Default: 1.
This key is optional.
=item o no_flock => $boolean
Specifies (no_flock => 1) to not use flock() to obtain a lock on $file_name (which holds the
'current' id) before processing it, or (no_flock => 0) to use flock().
This key is normally passed in as Data::Session -> new(no_flock => $boolean).
Default: 0.
This key is optional.
=item o umask => $octal_value
Specifies the mode to use when calling sysopen() on $file_name.
This key is normally passed in as Data::Session -> new(umask => $octal_value).
Default: 0660.
This key is optional.
=item o verbose => $integer
Print to STDERR more or less information.
Typical values are 0, 1 and 2.
This key is normally passed in as Data::Session -> new(verbose => $integer).
This key is optional.
=back
=head1 Method: generate()
Generates the next session id, or dies if it can't.
Returns the new id.
=head1 Method: id_length()
Returns 32 because that's the classic value of the size of the id field in the sessions table.
This can be used to generate the SQL to create the sessions table.
=head1 Support
Log a bug on RT: L<https://rt.cpan.org/Public/Dist/Display.html?Name=Data-Session>.
=head1 Author
L<Data::Session> was written by Ron Savage I<E<lt>ron@savage.net.auE<gt>> in 2010.
Home page: L<http://savage.net.au/index.html>.
=head1 Copyright
Australian copyright (c) 2010, Ron Savage.
All Programs of mine are 'OSI Certified Open Source Software';
you can redistribute them and/or modify them under the terms of
The Artistic License, a copy of which is available at:
http://www.opensource.org/licenses/index.html
=cut
|