Koha-Contrib-Sudoc

 view release on metacpan or  search on metacpan

lib/Koha/Contrib/Sudoc/Koha.pm  view on Meta::CPAN

use Try::Tiny;


has conf_file => ( is => 'rw', isa => 'Str' );

has dbh => ( is => 'rw' );

has conf => ( is => 'rw' );

has _zconn => ( is => 'rw', isa => 'HashRef' );

has es => ( is => 'rw' );

has es_index => ( is=> 'rw' );

has sth_biblio => (is => 'rw' );

has biblionumber_where => (
    is => 'rw',
    isa => 'Str',
    lazy => 1,
    default => sub {
        my $self = shift;
        my $dbh = $self->dbh;
        my $where = $self->dbh->selectall_arrayref("
            SELECT tagfield, tagsubfield
              FROM marc_subfield_structure
             WHERE kohafield ='biblio.biblionumber'
               AND frameworkcode=''",
            {}
        );
        $where = join('', @{$where->[0]});
        my $tag = substr($where, 0, 3);
        $where = substr($where, 0, 3) if $tag lt '010';
        return $where;
    },
);


sub BUILD {
    my $self = shift;

    # Use KOHA_CONF environment variable by default
    $self->conf_file( $ENV{KOHA_CONF} )  unless $self->conf_file;

    $self->conf( XMLin( $self->conf_file,
        keyattr => ['id'], forcearray => ['listen', 'server', 'serverinfo'],
        suppressempty => '     ') );

    # Database Handler
    my $c = $self->conf->{config};
    $self->dbh( DBI->connect(
        "DBI:"     . $c->{db_scheme} .
        ":dbname=" . $c->{database} .
        ";host="   . $c->{hostname} .
        ";port="   . $c->{port},
        $c->{user}, $c->{pass} )
    ) or carp $DBI::errstr;
    if ( $c->{db_scheme} eq 'mysql' ) {
        # Force utf8 communication between MySQL and koha
        $self->dbh->{ mysql_enable_utf8 } = 1;
        $self->dbh->do( "set NAMES 'utf8'" );
        my $tz = $ENV{TZ};
        ($tz) and $self->dbh->do( qq(SET time_zone = "$tz") );
    }

    if ( C4::Context->preference('SearchEngine') eq 'Elasticsearch' ) {
        my $param = $c->{elasticsearch};
        my $es = Search::Elasticsearch->new(
            Koha::SearchEngine::Elasticsearch::get_elasticsearch_params()
        );
        $self->es( $es );
        $self->es_index( {
            biblios     => $param->{index_name} . '_biblios',
            authorities => $param->{index_name} . '_authorities',
        } );
    }

    # Zebra connections
    $self->_zconn( { biblio => undef, auth => undef } );

    # Récupération d'une notice biblio brute
    # Since version 17.05 marcxml biblio record is stored in biblio_metadata table.
    my $version = C4::Context->preference('Version');
    $self->sth_biblio( $self->dbh->prepare(
        $version =~ /^([0-9]{2})/ && $1 >= 17
        ? "SELECT metadata FROM biblio_metadata WHERE biblionumber=? "
        : "SELECT marcxml FROM biblioitems WHERE biblionumber=? "
    ) );
}


# Réinitialisation des deux connexions
sub zconn_reset {
    my $self = shift;

    return if $self->es; # Ne rien faire en mode ES

    my $zcs = $self->_zconn;
    for my $server ( keys %$zcs ) {
        my $zc = $zcs->{$server};
        $zc->destroy() if $zc;
        undef $zcs->{$server};
    }
}


sub zconn {
    my ($self, $server) = @_;

    my $zc = $self->_zconn->{$server};
    #return $zc  if $zc && $zc->errcode() == 0 && $zc->_check();
    return $zc  if $zc;

    #FIXME: à réactiver pour s'assurer que de nouvelles connexions ne sont
    # créées inutilement.
    #print "zconn: nouvelle connexion\n";
    my $c        = $self->conf;
    my $name     = $server eq 'biblio' ? 'biblioserver' : 'authorityserver';
    #my $syntax   = "Unimarc";
    my $host     = $c->{listen}->{$name}->{content};



( run in 0.640 second using v1.01-cache-2.11-cpan-6aa56a78535 )