$self->current_store->open( @_ );
+ # so that we don't have to check if it's defined
+ $self->debug( 0 ) unless $self->debug;
+
return $self;
}
confess "unknown store module $module not one of ", dump( $self->possible_stores ) unless $s;
- warn "## current store = $s\n" if $self->debug;
+# warn "#### current store = $s\n" if $self->debug > 4;
return $s;
}
=head2 update_state
- $store->update_state( ID => $ID, $state );
- $store->update_state( uid => $uid, $state );
+ $store->update_state( $state );
=cut
sub update_state {
my $self = shift;
- my ( $k, $v, $state ) = @_;
+ my ( $state ) = @_;
- confess "need ID or uid" unless $k =~ m/^(ID|uid)$/;
- confess "need $k value" unless $v;
confess "need state" unless $state;
- warn "## update_state( $k => $v, ", dump( $state ), " )\n" if $self->debug;
-
- my $uid;
-
- if ( $k eq 'ID' ) {
- if ( $uid = $self->ID_to_uid( $v, $state ) ) {
- # nop
- } else {
- warn "## no uid for $v, first seen?\n" if $self->debug;
- return;
- }
- } else {
- $uid = $v;
- }
+ my $uid = $self->state_to_uid( $state );
+ warn "#### update_state( ", dump( $state ), " ) for $uid\n" if $self->debug > 2;
$self->current_store->update_uid_state( $uid, $state );
}
=head2 get_state
- my $state = $store->get_state( ID => $ID );
- my $state = $store->get_state( uid => $uid );
+ my $state = $store->get_state( $uid );
Returns normal unblessed hash (actually, in-memory copy of state in database).
sub get_state {
my $self = shift;
- my ( $k, $v ) = @_;
- confess "need ID or uid" unless $k =~ m/^(ID|uid)$/;
- confess "need $k value" unless $v;
+ my ( $uid ) = @_;
+ confess "need uid" unless $uid;
- warn "## get_state( $k => $v )\n" if $self->debug;
+ warn "#### get_state( $uid )\n" if $self->debug > 4;
- my $uid;
+ return $self->current_store->get_state( $uid );
- if ( $k eq 'ID' ) {
- if ( $uid = $self->ID_to_uid( $v ) ) {
- # nop
- } else {
- warn "## no uid for $v so no state!\n" if $self->debug;
- return;
- }
- } else {
- $uid = $v;
- }
+}
- return $self->current_store->get_state( $uid );
+=head2 set_state
+
+ $store->set_state( $uid, $state );
+
+=cut
+
+sub set_state {
+ my $self = shift;
+ return $self->current_store->set_state( @_ );
}
+
=head2 all_uids
my @cpe = $store->all_uids;
return @cpes;
}
-=head2 ID_to_uid
+=head2 state_to_uid
- my $CPE_uid = $store->ID_to_uid( $ID, $state );
+ my $CPE_uid = $store->ID_to_uid( $state );
-It uses C<< DeviceID.SerialNumber >> from C<Inform> message as unique ID
+It uses C<< DeviceId.SerialNumber >> from C<Inform> message as unique ID
for each CPE.
=cut
-my $session;
-
-sub ID_to_uid {
+sub state_to_uid {
my $self = shift;
- my ( $ID, $state ) = @_;
-
- confess "need ID" unless $ID;
-
- warn "ID_to_uid",dump( $ID, $state ),$/ if $self->debug;
-
- $session->{ $ID }->{last_seen} = time();
-
- my $uid;
-
- if ( $uid = $session->{ $ID }->{ ID_to_uid } ) {
- return $uid;
- } elsif ( $uid = $state->{DeviceID}->{SerialNumber} ) {
- warn "## created new session for $uid session $ID\n" if $self->debug;
- $session->{ $ID } = {
- last_seen => time(),
- ID_to_uid => $uid,
- };
- return $uid;
- } else {
- warn "## can't find uid for ID $ID, first seen?\n";
- return;
- }
+ my ( $state ) = @_;
- # TODO: expire sessions longer than 30m
+ warn "#### state_to_uid",dump( $state ),$/ if $self->debug > 4;
- warn "current session = ",dump( $session );
+ my $uid = $state->{DeviceId}->{SerialNumber} ||
+ confess "no DeviceId.SerialNumber in ",dump( $state );
+ chomp($uid);
- return;
+ return $uid;
}
1;