SessionStore.pm.svn-base
上传用户:market2
上传日期:2018-11-18
资源大小:18786k
文件大小:2k
源码类别:

外挂编程

开发平台:

Windows_Unix

  1. package Base::Ragnarok::SessionStore;
  2. use strict;
  3. use Time::HiRes qw(time);
  4. use Carp::Assert;
  5. use constant SESSION_TIMEOUT => 60;
  6. sub new {
  7. my ($class) = @_;
  8. my %self = (
  9. sessions => {},
  10. sessionsByTime => [],
  11. sessionCount => 0
  12. );
  13. return bless %self, $class;
  14. }
  15. sub add {
  16. my ($self, $session) = @_;
  17. assert(defined $session->{sessionID}) if DEBUG;
  18. $session->{time} = time;
  19. $self->{sessions}{$session->{sessionID}} = $session;
  20. push @{$self->{sessionsByTime}}, $session;
  21. }
  22. sub get {
  23. my ($self, $sessionID) = @_;
  24. return $self->{sessions}{$sessionID};
  25. }
  26. sub getIndex {
  27. my ($self, $session) = @_;
  28. for (my $i = 0; $i < @{$self->{sessionsByTime}}; $i++) {
  29. if ($self->{sessionsByTime}[$i] == $session) {
  30. return $i;
  31. }
  32. }
  33. return -1;
  34. }
  35. sub mark {
  36. my ($self, $sessionID) = @_;
  37. my $session = $self->{sessions}{$sessionID};
  38. if ($session) {
  39. my $index = $self->getIndex($session);
  40. $session->{time} = time;
  41. splice(@{$self->{sessionsByTime}}, $index, 1);
  42. push @{$self->{sessionsByTime}}, $session;
  43. }
  44. }
  45. sub remove {
  46. my ($self, $sessionID) = @_;
  47. my $session = $self->{sessions}{$sessionID};
  48. if ($session) {
  49. my $index = $self->getIndex($session);
  50. splice(@{$self->{sessionsByTime}}, $index, 1);
  51. }
  52. }
  53. sub removeTimedOutSessions {
  54. my ($self) = @_;
  55. while (@{$self->{sessionsByTime}} && time - $self->{sessionsByTime}[0]{time} > SESSION_TIMEOUT) {
  56. my $sessionID = $self->{sessionsByTime}[0]{sessionID};
  57. delete $self->{sessions}{$sessionID};
  58. shift @{$self->{sessionsByTime}};
  59. }
  60. }
  61. ##
  62. # int $Base_Ragnarok_SessionStore->generateSessionID()
  63. #
  64. # Generate a unique session ID.
  65. sub generateSessionID {
  66. my ($self) = @_;
  67. my $ID = $self->{sessionCount};
  68. $self->{sessionCount} = ($self->{sessionCount} + 1) % 0xFFFFFFFF;
  69. return $ID;
  70. }
  71. 1;