| DBedit documentation | view source | Contained in the DBedit distribution. |
Copyright (C) 2002 Globewide Network Academy Relased under the SCHEME license see LICENSE.SCHEME.txt for details =cut
use DBI; use DBstorage; use Symbol;
@DBstorage::DBI::ISA = qw(DBstorage);
use strict;
sub new { my $proto = shift; my $class = ref($proto) || $proto; my $connect = shift; my $self = {}; bless ($self, $class); $self->{'dbh'} = DBI->connect($connect); $self->{'nocursor'} = 1; return $self; }
sub DESTROY { my($self) = @_; $self->{'dbh'}->disconnect(); }
sub find { my $self = shift; my $filename = shift; my $keyref = shift; my $foundref = shift; my $lastref = shift; my($field); my(@field_list) = (); %{$foundref} = (); my ($predicate_list) = $self->predicate_list($keyref, " and "); my ($command); if ($filename !~ /^select /i) { $command = "select * from " . $filename; } else { $command = $filename; }
if ($command !~ / where /i) {
$command .= " where " . $predicate_list;
} else {
$command .= " and " . $predicate_list;
}
if ($self->{'debug'}) {
print "SQL Command: $command";
}
$self->{'sth'} = $self->{'dbh'}->prepare($command);
$self->{'sth'}->execute;
if (defined($self->{'sth'})) {
%{$foundref} = %{$self->{'sth'}->fetchrow_hashref};
}
$self->{'sth'}->finish;
}
sub get_nth { my $self = shift; my $filename = shift; my $record = shift; my $foundref = shift; my $lastref = shift; $self->{'sth'} = $self->{'dbh'}->prepare($filename); $self->{'sth'}->execute; $self->{'sth'}->fetchrow_arrayref; %{$foundref} = %{$self->{'sth'}->fetchrow_hashref}; $self->{'sth'}->finish; }
sub attrib { my $self = shift; my $file = shift; }
sub delete { my $self = shift; my $table = shift; my $keyref = shift; my $delete_all = shift; my($command) = "delete from $table where "; $command .= $self->predicate_list($keyref, " and "); if ($self->{'debug'}) { print "SQL Command: $command<br>"; } $self->{'dbh'}->do($command);
}
sub append { my $self = shift; my $table = shift; my $keyref = shift; my($command) = "insert into $table "; my($key); foreach $key (keys %{$keyref}) { if ($keyref->{$key} eq "") { delete $keyref->{$key}; } } my(@fields) = keys %{$keyref}; my(@values) = map {$self->quote($_);} @{$keyref}{@fields};
$command .= "(" . join (", ", @fields) . ")";
$command .= " values ";
$command .= "(" . join (", ", @values) . ")";
$| = 1;
if ($self->{'debug'}) {
print "SQL Command: $command<br>\n";
}
return $self->{'dbh'}->do($command);
}
sub replace { my $self = shift; my $filename = shift; my $keyref = shift; my $replace_ref = shift; my $replace_all = shift; my($command) = "update $filename "; $command .= " set " . $self->predicate_list_with_null($replace_ref, " , "); $command .= " where " . $self->predicate_list($keyref, " and "); if ($self->{'debug'}) { print "SQL Command: $command<br>"; } $self->{'dbh'}->do($command); }
sub replace_regexp { my $self = shift; my $filename = shift; my $keyref = shift; my $replace_ref = shift; my $replace_all = shift; }
sub create { my ($self, $filename, $fieldref) = @_; my ($command) = "create table $filename "; my ($field, @field_list); if ($self->{'debug'}) { print "SQL Command: $command<br>"; }
foreach $field (keys %{$fieldref}) {
push (@field_list, "$field $fieldref->{$field}");
}
$command .= "(" . join (", ", @field_list) . ")";
$self->{'dbh'}->do($command);
}
sub open { my $self = shift; my $filename = shift; my $filehandle = shift; my $line; my $command;
if ($filename =~ /^select/i) {
$command = $filename;
} else {
$command = "select * from $filename";
}
if ($self->{'debug'}) {
print "SQL Command: $command<br>";
}
$self->{'sth'} = $self->{'dbh'}->prepare($command);
$self->{'sth'}->execute;
$self->{'FIELDS'} = $self->{'sth'}->{'NAME'};
if ($self->{'sth'} eq undef) {
return 0;
} else {
return 1;
}
}
sub read { my $self = shift; my $hashref = shift; my($ref) = $self->{'sth'}->fetchrow_hashref;
if ($ref eq undef) {
return 0;
} else {
%{$hashref} = %{$ref};
return 1;
}
}
sub read_array { my $self = shift; my $arrayref = shift; my $ref = $self->{'sth'}->fetchrow_arrayref;
if ($ref eq undef) {
return 0;
} else {
@{$arrayref} = @{$ref};
return 1;
}
}
sub close { my $self = shift; $self->{'sth'}->finish(); }
sub fields { my $self = shift; return @{$self->{'FIELDS'}}; }
sub type { my $self = shift; }
sub predicate_list { my $self = shift; my $hashref = shift; my $join = shift; my(@field_list) = (); my($field);
foreach $field (keys %{$hashref}) {
if ($field ne "") {
if ($hashref->{$field} ne "") {
push(@field_list, "$field = " .
$self->quote($hashref->{$field}));;
} else {
push(@field_list, "($field = '' or $field is null)");
}
}
}
return join($join, @field_list);
}
sub predicate_list_with_null { my $self = shift; my $hashref = shift; my $join = shift; my(@field_list) = (); my($field);
foreach $field (keys %{$hashref}) {
if ($hashref->{$field} ne "") {
push(@field_list, "$field = " .
$self->quote($hashref->{$field}));;
} else {
push(@field_list, "$field = NULL");
}
}
return join($join, @field_list);
}
sub errstr { my $self = shift; return $self->{'dbh'}->errstr(); }
sub quote { my $self = shift; my $item = shift; return $self->{'dbh'}->quote($item); }
sub do { my $self = shift; my $command = shift; return $self->{'dbh'}->do($command); }
sub commit { my $self = shift; my $ofile = shift; my $nfile = shift;
my ($dbh) = $self->{'dbh'};
my ($old_auto_commit) = $dbh->{'AutoCommit'};
my ($old_raise_error) = $dbh->{'RaiseError'};
$dbh->{'AutoCommit'} = 0;
$dbh->{'RaiseError'} = 1;
eval {
$dbh->do("drop table $ofile");
$dbh->do("alter table $nfile rename to $ofile");
$dbh->commit();
};
if ($@) {
warn "Transaction aborted because $@";
$dbh->rollback();
}
$dbh->{'AutoCommit'} = $old_auto_commit;
$dbh->{'RaiseError'} = $old_raise_error;
}
1;
| DBedit documentation | view source | Contained in the DBedit distribution. |