142 lines
3.7 KiB
Perl
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;
|