Concierge-Sessions
view release on metacpan or search on metacpan
lib/Concierge/Sessions/SQLite.pm view on Meta::CPAN
) VALUES (?, ?, ?, ?, ?, ?, ?, ?)"
);
unless ($sth) {
return { success => 0, message => "Failed to prepare insert statement: " . $self->{dbh}->errstr };
}
my $result = $sth->execute(
$session_id,
$user_id,
$created_at,
$expires_at,
$last_updated,
$timeout,
$status_json,
$data_json
);
unless ($result) {
return { success => 0, message => "Failed to insert session: " . $sth->errstr };
}
return { success => 1, session_id => $session_id };
}
sub get_session_info {
my ($self, $session_id) = @_;
unless ($session_id) {
return { success => 0, message => "Session ID required to retrieve session from SQLite backend" };
}
# Query filters expired sessions but allows indefinite sessions
my $sth = $self->{dbh}->prepare(
"SELECT * FROM sessions WHERE session_id = ? AND (expires_at = 'indefinite' OR expires_at > ?)"
);
unless ($sth) {
return { success => 0, message => "Failed to prepare select statement: " . $self->{dbh}->errstr };
}
my $result = $sth->execute($session_id, time());
unless ($result) {
return { success => 0, message => "Failed to execute session query: " . $sth->errstr };
}
my $session_info = $sth->fetchrow_hashref;
unless ($session_info) {
return { success => 0, message => "Session not found or expired" };
}
# Decode session_info from JSON to hashref
$session_info->{status} = JSON::PP->new->utf8->decode( $session_info->{status} );
$session_info->{data} = JSON::PP->new->utf8->decode( $session_info->{data} );
return { success => 1, info => $session_info };
}
sub update_session {
my ($self, $session_id, $updates) = @_;
unless ($session_id) {
return { success => 0, message => "Session ID required to update session in SQLite backend" };
}
unless ($updates) {
return { success => 1, message => "No updates specified for File backend session update" };
}
# Always update last_updated timestamp
my $now = time();
# Build SET clause dynamically based on what's being updated
my @set_clauses;
my @bind_values;
if (exists $updates->{data}) {
push @set_clauses, 'data = ?';
push @bind_values, JSON::PP->new->utf8->encode($updates->{data} || {});
}
if (exists $updates->{expires_at}) {
push @set_clauses, 'expires_at = ?';
push @bind_values, $updates->{expires_at};
}
# Always update last_updated
push @set_clauses, 'last_updated = ?';
push @bind_values, $now;
# Build SQL statement
my $sql = 'UPDATE sessions SET ' . join(', ', @set_clauses) . ' WHERE session_id = ?';
push @bind_values, $session_id;
my $sth = $self->{dbh}->prepare($sql);
unless ($sth) {
return { success => 0, message => "Failed to prepare update statement: " . $self->{dbh}->errstr };
}
my $result = $sth->execute(@bind_values);
unless ($result) {
return { success => 0, message => "Failed to update session: " . $sth->errstr };
}
unless ($result > 0) {
return { success => 0, message => "Session not found or no changes made" };
}
return { success => 1 };
}
sub delete_session {
my ($self, $session_id) = @_;
unless ($session_id) {
return { success => 0, message => "Session ID required to delete session from SQLite backend" };
}
( run in 0.566 second using v1.01-cache-2.11-cpan-39bf76dae61 )