Prosody
view release on metacpan or search on metacpan
lib/Prosody/Storage/SQL.pm view on Meta::CPAN
package Prosody::Storage::SQL;
BEGIN {
$Prosody::Storage::SQL::AUTHORITY = 'cpan:GETTY';
}
{
$Prosody::Storage::SQL::VERSION = '0.007';
}
# ABSTRACT: access a database of mod_storage_sql
use Moose;
use Moose::Util::TypeConstraints;
use Prosody::Storage::SQL::DB;
use JSON;
use Encode;
has driver => (
is => 'ro',
isa => enum(["SQLite3","MySQL","PostgreSQL"]),
required => 1,
);
has database => (
is => 'ro',
isa => 'Str',
required => 1,
);
has username => (
is => 'ro',
isa => 'Str',
predicate => 'has_username',
);
has password => (
is => 'ro',
isa => 'Str',
predicate => 'has_password',
);
has host => (
is => 'ro',
isa => 'Str',
predicate => 'has_host',
);
has _db => (
is => 'ro',
isa => 'Prosody::Storage::SQL::DB',
lazy => 1,
default => sub {
my ( $self ) = @_;
my $vars = {
quote_char => '"',
name_sep => '.',
};
if ($self->driver eq 'SQLite3') {
$vars->{sqlite_unicode} = 1;
} elsif ($self->driver eq 'MySQL') {
$vars->{mysql_enable_utf8} = 1,
} elsif ($self->driver eq 'PostgreSQL') {
$vars->{pg_enable_utf8} = 1,
};
Prosody::Storage::SQL::DB->connect($self->dsn, $self->username, $self->password, $vars);
},
);
sub rs { shift->resultset(@_) }
sub resultset { shift->_db->resultset('Prosody') }
has dsn => (
is => 'ro',
lazy => 1,
default => sub {
my ( $self ) = @_;
my $driver;
$driver = 'SQLite' if $self->driver eq "SQLite3";
$driver = 'mysql' if $self->driver eq "MySQL";
$driver = 'Pg' if $self->driver eq "PostgreSQL";
return 'dbi:'.$driver.':dbname='.$self->database.( $self->has_host ? ';host='.$self->host : '' )
},
);
sub host_list {
my ( $self ) = @_;
my @hosts = $self->rs->search({},{
columns => [ qw/host/ ],
distinct => 1,
});
my @hostlist;
for (@hosts) { push @hostlist, $_->host }
return @hostlist;
}
sub user_list {
my ( $self, $host ) = @_;
my %query;
$query{host} = $host if $host;
my @users = $self->rs->search(\%query,{
columns => [ qw/user/ ],
distinct => 1,
});
my @userlist;
for (@users) { push @userlist, $_->user }
return @userlist;
}
sub all_user {
my ( $self, $host ) = @_;
my %query;
$query{host} = $host if $host;
my @keys = $self->rs->search(\%query);
my %v;
for (@keys) {
$v{$_->user.'@'.$_->host}->{$_->store}->{$_->key} = $self->get_value($_);
}
return \%v;
}
sub user {
( run in 0.721 second using v1.01-cache-2.11-cpan-140bd7fdf52 )