Nicht immer alle Session-Werte automatisch laden und parsen
[kivitendo-erp.git] / SL / Auth / SessionValue.pm
diff --git a/SL/Auth/SessionValue.pm b/SL/Auth/SessionValue.pm
new file mode 100644 (file)
index 0000000..6bf65b9
--- /dev/null
@@ -0,0 +1,84 @@
+package SL::Auth::SessionValue;
+
+use strict;
+
+use Scalar::Util qw(weaken);
+use YAML;
+
+use SL::DBUtils;
+
+sub new {
+  my ($class, %params) = @_;
+
+  my $self = bless {}, $class;
+
+  map { $self->{$_} = $params{$_} } qw(auth key value auto_restore);
+
+  $self->{fetched} =                  exists $params{value};
+  $self->{parsed}  = !$params{raw} && exists $params{value};
+
+  # delete $self->{auth};
+  # $::lxdebug->dump(0, "NEW", $self);
+  # $self->{auth} = $params{auth};
+
+  weaken $self->{auth};
+
+  return $self;
+}
+
+sub get {
+  my ($self) = @_;
+  return $self->_fetch->_parse->{value};
+}
+
+sub get_dumped {
+  my ($self) = @_;
+  return YAML::Dump($self->get);
+}
+
+sub _fetch {
+  my ($self) = @_;
+
+  return $self if $self->{fetched};
+
+  my $dbh          = $self->{auth}->dbconnect;
+  my $query        = qq|SELECT sess_value FROM auth.session_content WHERE (session_id = ?) AND (sess_key = ?)|;
+  ($self->{value}) = selectfirst_array_query($::form, $dbh, $query, $self->{auth}->get_session_id, $self->{key});
+  $self->{fetched} = 1;
+
+  return $self;
+}
+
+sub _parse {
+  my ($self) = @_;
+
+  $self->{value}  = YAML::Load($self->{value}) unless $self->{parsed};
+  $self->{parsed} = 1;
+
+  return $self;
+}
+
+sub _load_value {
+  my ($self, $value) = @_;
+
+  return { simple => 1, data => $value } if $value !~ m/^---/;
+
+  my %params = ( simple => 1 );
+  eval {
+    my $data = YAML::Load($value);
+
+    if (ref $data eq 'HASH') {
+      map { $params{$_} = $data->{$_} } keys %{ $data };
+      $params{simple} = 0;
+
+    } else {
+      $params{data}   = $data;
+    }
+
+    1;
+  } or $params{data} = $value;
+
+  return \%params;
+}
+
+1;