webgui/lib/DBIx/FullTextSearch/Table.pm
2004-02-29 14:21:10 +00:00

142 lines
3.7 KiB
Perl

package DBIx::FullTextSearch::TableString;
use vars qw! @ISA !;
@ISA = qw! DBIx::FullTextSearch::String DBIx::FullTextSearch::Table !;
sub index_document {
my ($self, $id, $data) = @_;
my @data_sets = $self->get_the_data_from_table($id);
push @data_sets, $data if $data;
$self->SUPER::index_document($id, \@data_sets);
}
package DBIx::FullTextSearch::TableNum;
use vars qw! @ISA !;
@ISA = qw! DBIx::FullTextSearch::Table !;
sub index_document {
my ($self, $id, $extra_data) = @_;
my @data_sets = $self->get_the_data_from_table($id);
push @data_sets, $extra_data if $extra_data;
$self->SUPER::index_document($id, \@data_sets);
}
package DBIx::FullTextSearch::Table;
use DBIx::FullTextSearch;
use strict;
use vars qw! @ISA !;
@ISA = qw! DBIx::FullTextSearch !;
sub _open_tables {
my $self = shift;
if (defined $self->{'doc_id_table'}) {
eval 'use DBIx::FullTextSearch::String';
bless $self, 'DBIx::FullTextSearch::TableString';
}
else {
bless $self, 'DBIx::FullTextSearch::TableNum';
}
}
# we do not create any new tables, we just check that the parameters are
# OK (the table and columns exist, etc.)
sub _create_tables {
my $fts = shift;
my ($table, $column, $id) = @{$fts}{ qw! table_name column_name
column_id_name ! };
if (not defined $table and $column =~ /\./) {
($table, $column) = ($column =~ /^(.*)\.(.*)$/s);
}
my $id_type;
if (not defined $table) {
return "The parameter table_name has to be specified with the table frontend.";
}
if (not defined $column) {
return "The parameter column_name has to be specified with the table frontend.";
}
my $dbh = $fts->{'dbh'};
my $sth = $dbh->prepare("show columns from $table");
$sth->{'PrintError'} = 0;
$sth->{'RaiseError'} = 0;
$sth->execute or return "The table `$table' doesn't exist.";
my $info = $dbh->selectall_arrayref($sth,
{ 'PrintError' => 0, 'RaiseError' => 0 });
if (not defined $info) {
return "The table `$table' doesn't exist.";
}
# use Data::Dumper; print Dumper $info;
if (not defined $id) {
# search for column with primary key
my $pri_num = 0;
for my $i (0 .. $#$info) {
if ($info->[$i][3] eq 'PRI') {
$pri_num++;
$id = $info->[$i][0];
$id_type = $info->[$i][1];
}
}
if ($pri_num > 1) {
return 'The primary key has to be one-column.';
}
if ($pri_num == 0) {
return "No primary key found in the table `$table'.";
}
}
else {
# find '$id' column
for my $i (0 .. $#$info) {
if ($info->[$i][0] eq $id){
$id_type = $info->[$i][1];
last;
}
}
}
unless(defined $id_type){
return "No key named '$id' found in the table '$table'";
}
my $testcol = $dbh->prepare("select $column from $table where 1 = 0");
$testcol->execute or
return "Column `$column' doesn't exist in table `$table'.";
$testcol->finish;
$fts->{'column_id_name'} = $id;
my $errstr;
if ($id_type =~ /([a-z]*int)/) {
$fts->{'doc_id_bits'} = $DBIx::FullTextSearch::INT_TO_BITS{$1};
bless $fts, 'DBIx::FullTextSearch::TableNum';
}
else {
my ($length) = ($id_type =~ /^\w+\((\d+)\)$/);
$fts->{'name_length'} = $1;
eval 'use DBIx::FullTextSearch::String';
bless $fts, 'DBIx::FullTextSearch::TableString';
$errstr = $fts->DBIx::FullTextSearch::String::_create_tables($fts);
}
### use Data::Dumper; print Dumper $fts;
return $errstr;
}
sub get_the_data_from_table {
my ($self, $id) = @_;
my $dbh = $self->{'dbh'};
my $get_data = ( defined $self->{'get_data_sth'}
? $self->{'get_data_sth'}
: $self->{'get_data_sth'} = $dbh->prepare("
select $self->{'column_name'} from $self->{'table_name'}
where $self->{'column_id_name'} = ?
") );
my @data_ary = $dbh->selectrow_array($get_data, {}, $id);
return wantarray ? @data_ary : join(" ", @data_ary);
}
1;