# $Id: SQL.pm,v 1.2 2003/01/16 19:41:31 lstein Exp $
package HTTPD::GroupAdmin::SQL;
use strict;
use DBI;
use Carp ();
use vars qw(@ISA $VERSION);
@ISA = qw(HTTPD::GroupAdmin);
$VERSION = (qw$Revision: 1.2 $)[1];
my %Default = (
HOST => "", #server hostname
PORT => "", #server port
DB => "", #database name
USER => "", #database login name
AUTH => "", #database login password
DRIVER => "mSQL", #driver for DBI
GROUPTABLE => "", #table with field names below
NAMEFIELD => "user", #field for the name
GROUPFIELD => "group", #field for the group
);
sub new {
my($class) = shift;
my $self = bless { %Default, @_ } => $class;
$self->_check(qw(DRIVER DB GROUPTABLE));
$self->db($self->{DB});
return $self;
}
sub DESTROY {
my($self) = @_;
$self->{'_DBH'}->disconnect;
}
sub db {
my($self,$db) = @_;
my $old = $self->{DB};
return $old unless $db;
$self->{DB} = $db;
if(defined $self->{'_DBH'}) {
$self->{'_DBH'}->disconnect;
}
my $source = sprintf("dbi:%s:%s",@{$self}{qw(DRIVER DB)});
$source .= ":$self->{HOST}" if $self->{HOST};
$source .= ":$self->{PORT}" if $self->{HOST} && $self->{PORT};
$self->{'_DBH'} = DBI->connect($source,@{$self}{qw(USER AUTH)} )
|| Carp::croak($DBI::errstr);
return $old;
}
package HTTPD::GroupAdmin::SQL::_generic;
use vars qw(@ISA);
@ISA = qw(HTTPD::GroupAdmin::SQL);
sub add {
my($self, $username, $groupname) = @_;
return(0, "add_group: no user name!") unless $username;
return(0, "add_group: no group!") unless $groupname;
return(0, "user '$username' already exists in group '$groupname'")
if $self->exists($groupname,$username);
my $statement =
$self->{GROUPTABLE} ne $self->{USERTABLE} ?
sprintf("INSERT into %s (%s,%s)\n VALUES ('%s','%s')\n",
@{$self}{ qw(GROUPTABLE NAMEFIELD GROUPFIELD) },
$username,$groupname)
:
sprintf("UPDATE %s\n SET %s='%s'\n WHERE %s='%s'\n",
$self->{GROUPTABLE},$self->{GROUPFIELD},$groupname,
$self->{NAMEFIELD},$username);
print STDERR $statement if $self->debug;
$self->{'_DBH'}->do($statement) || Carp::croak($DBI::errstr);
1;
}
sub exists {
my ($self,$groupname,$username) = @_;
return(0, "exists: no group!") unless $groupname;
my $select = "$self->{GROUPFIELD}='$groupname'";
$select = "$self->{GROUPFIELD} like '$groupname'" if ($groupname =~ /%/);
$select .= " AND $self->{NAMEFIELD}='$username'" if defined $username;
my $statement =
sprintf("SELECT DISTINCT %s FROM %s WHERE %s",
@{$self}{qw(GROUPFIELD GROUPTABLE)},
$select);
print STDERR $statement if $self->debug;
my $sth = $self->{'_DBH'}->prepare($statement) || Carp::croak($DBI::errstr);
$sth->execute || Carp::croak($DBI::errstr);
my $result = $sth->rows;
$sth->finish;
return $result;
}
sub delete {
my ($self,$username,$groupname) = @_;
return(0, "delete: no username!") unless defined $username;
# if the group table and the user table are the same, then
# we do not remove the record -- otherwise everything else
# disappears too!
return 1 if $self->{GROUPTABLE} eq $self->{USERTABLE};
$groupname = $self->{NAME} unless defined $groupname;
my $select = "$self->{NAMEFIELD}='$username' AND $self->{GROUPFIELD}='$groupname'" if defined $groupname;
my $statement =
sprintf("DELETE FROM %s WHERE %s = '%s' AND %s = '%s'",
$self->{GROUPTABLE},
$self->{NAMEFIELD},$username,
$self->{GROUPFIELD},$groupname);
print STDERR $statement if $self->debug;
my $rv = $self->{'_DBH'}->do($statement) || Carp::croak($DBI::errstr);
return $rv;
}
sub remove {
my ($self,$groupname) = @_;
return(0, "remove: no groupname!") unless defined $groupname;
my $statement =
sprintf("DELETE FROM %s WHERE %s = '%s'",
@{$self}{qw(GROUPTABLE GROUPFIELD)},$groupname);
print STDERR $statement if $self->debug;
my $rv = $self->{'_DBH'}->do($statement) || Carp::croak($DBI::errstr);
return $rv;
}
sub list {
my($self,$groupname) = @_;
my $statement;
if (defined $groupname) {
$statement =
sprintf("SELECT DISTINCT %s FROM %s WHERE %s = '%s'",
@{$self}{qw(NAMEFIELD GROUPTABLE GROUPFIELD)},
$groupname);
if ($groupname =~ /%/)
{
$statement =
sprintf("SELECT DISTINCT %s FROM %s WHERE %s like '%s'",
@{$self}{qw(NAMEFIELD GROUPTABLE GROUPFIELD)},
$groupname);
}
} else {
$statement =
sprintf("SELECT DISTINCT %s FROM %s",
@{$self}{qw(GROUPFIELD GROUPTABLE GROUPFIELD)});
}
print STDERR $statement if $self->debug;
my $sth = $self->{'_DBH'}->prepare($statement) || Carp::croak($DBI::errstr);
$sth->execute || Carp::croak($DBI::errstr);
my @result = ();
while (my $a = $sth->fetchrow_arrayref) {
push(@result,@$a);
}
return @result;
}
1;