.RU

Приложение №20 - Отчет о работе по проекту


^

Приложение №20
Скрипт, реализующий шлюз:

#!/usr/bin/perl

use strict;

use locale;

use POSIX qw (locale_h);

use frs;

use XML::LibXML;

use XML::LibXML::Common qw(:libxml);

use XML::LibXSLT;

use CGI;

use Encode;


binmode(STDOUT, ":utf8");


setlocale(LC_CTYPE, "ru_RU.ANSI1251");

# Соответствие полей ИПС Сокол и DC

my @fn=qw(TP CT TI AB KW GR UC ID CC LA AU CO DF DT WW SO FD VD UT);

my @qn=qw(subtype type title description subject classifier uclassifier identifier country language creator contributor date coverege source publisher format volume update);

# Конфигурация и параметры по умолчанию

my $dbpath="/usr/local/etc/falcon/bases/";

my $dbname="demo";

my @dbnames;

my $dbuser="alex";

my $xslexport="/usr/local/etc/falcon/conf/dcexport.xsl";


my $start_record=1;

my $qty_record=10;

my $cnt_record=0;

my $qxml = new CGI;


#init style

my $xslt = XML::LibXSLT->new();

my $stylesheet = $xslt->parse_stylesheet_file("/usr/local/etc/falcon/conf/dcexport.xsl");


my $dbnl;


my $qvalues = $qxml->Vars;

my $squery='';

my $i;

my $ql;

my $qln;


my $doc = XML::LibXML::Document->createDocument("1.0", "UTF-8");

my $root = $doc->createElement( "Collection" );


# Разбор параметров


#SRU addition


my $sru_version = $qvalues->{'version'};

my $sru_operation = $qvalues->{'operation'};

my $sru_recordSchema = $qvalues->{'recordSchema'};


if($sru_version eq '')

{

$sru_version='1.1';

}

if($sru_operation eq '')

{

$sru_operation='searchRetrieve';

}

if($sru_recordSchema eq '')

{

$sru_recordSchema='dc';

}


if ($sru_version ne '1.1' || $sru_operation ne 'searchRetrieve'

|| $sru_recordSchema ne 'dc')

{

$root->setAttribute("size", 0);

$doc->setDocumentElement( $root );

error_print(["Not supported version, operation or recordSchema"]);

print $qxml->header(-type=>'application/xml',-charset=>'utf-8');

$doc = $stylesheet->transform($doc);

print $doc->serialize(1);

exit;

}


my $dbcollection = $qvalues->{'x-queryCollection'};

if($dbcollection eq 'all')

{

$dbcollection='';

}


if($dbcollection ne '')

{

@dbnames=split /\,/, $dbcollection;

$dbname=$dbcollection;

}

else

{

$dbcollection="demo,eearth";

@dbnames=split /\,/, $dbcollection;

$dbname="demo";

}


# Трансляция запроса


my $cql = $qvalues->{'query'};

#$cql = Encode::decode("utf-8", $cql);

#$cql = frs::frs_utf8tovin($cql);


my %cqlv;


if($qvalues->{'startRecord'} ne '')

{

$start_record = $qvalues->{'startRecord'};

}


if($qvalues->{'maximumRecords'} ne '')

{

$qty_record= $qvalues->{'maximumRecords'};

}


#print $qxml->header(-type=>'text/html');


#while ($cql =~ /[ed][cr]\.([a-z]+)\=\(([^=]+)\)$/ )

while ($cql =~ /[ed][cr]\.([a-z]+)\=([^=]+)$/ )

{

$ql=$2; $qln=$1; $ql =~ s/\*/%/g;


while ($ql =~ /(\?+)/)

{

$ql = $`. "%". length($1). $';

}


$cqlv{$qln}=$ql;


# $cql =~ s/[ed][cr]\.([a-z]+)\=\(([^=]+)\)$//;

$cql =~ s/[ed][cr]\.([a-z]+)\=([^=]+)$//;

}


my $qmeta='';


for ($i=0; $i <= $#fn; $i++)

{

if(length($cqlv{$qn[$i]})>0)

{

if($fn[$i] eq 'CT')

{

$qmeta=$cqlv{$qn[$i]};

next;

}

if(length($squery)>0)

{

$squery=$squery." AND ";

}

$squery=$squery."(".$cqlv{$qn[$i]}.") IN ".$fn[$i];

}

}


if(length($cqlv{'anywhere'})>0)

{

if(length($squery)>0)

{

$squery=$squery." AND ";

}

$squery=$squery."(".$cqlv{'anywhere'}.") ";

}


$squery=~s/\\\'/\'/g;


my $query;


# Морфологический анализ


if(length($squery)>0)

{

$query=frs::frs_expandquery($squery,0);

}

else

{

$query='';

}


my $fquery;


if($query ne '' && $qmeta ne '')

{

$fquery='('.$query.') AND ('.$qmeta. ') IN CT';

}

elsif($qmeta ne '')

{

$fquery='('.$qmeta. ') IN CT';

}

else

{

$fquery=$query;

}


# В базе рефератов только Публикации!!!


my $pqmeta=0;

if($qmeta =~/убликац/ || $qmeta eq '')

#if($qmeta eq 'Публикации' || $qmeta eq 'публикации' || $qmeta eq '')

{

$pqmeta=1;

}


my($rc,$rv);


my $tcnt_record=0;


my $ndbstart=-1;

my $ndbend=-1;

my @dbrstart;

my @dbrsize;


my $rrc=0;

my $rrv='';

# Опрашиваем базы – 1-й проход – только количество

for($i=0;$i<=$#dbnames;$i++)

{

$dbname=$dbnames[$i]; $cnt_record=0;


if($query eq '' && $qmeta eq '')

{

($rc,$rv) = falcon_rno('');

if($rc<0)

{

$rrc=$rc; $rrv=$rv;

}

}

else

{

if($dbname eq 'eearth')

{

($rc,$rv) = falcon_get($fquery,$start_record-1,0,0);

if($rc<0)

{

$rrc=$rc; $rrv=$rv;

}

}

elsif($pqmeta && $query ne '')

{

($rc,$rv) = falcon_get($query,$start_record-1,0,0);

if($rc<0)

{

$rrc=$rc; $rrv=$rv;

}

}

elsif($pqmeta)

{

($rc,$rv) = falcon_rno('');

if($rc<0)

{

$rrc=$rc; $rrv=$rv;

}

}

else

{

($rc,$rv) = falcon_get("чисмвичмв",$start_record-1,0,0);

if($rc<0)

{

$rrc=$rc; $rrv=$rv;

}

}

}


if($tcnt_record<$start_record && $start_record<=$tcnt_record+$cnt_record)

{

$ndbstart=$i;

}

if($tcnt_record<$start_record+$qty_record-1 &&

$start_record+$qty_record-1<=$tcnt_record+$cnt_record)

{

$ndbend=$i;

}

$dbrstart[$i]=$tcnt_record;

$tcnt_record+=$cnt_record;

$dbrsize[$i]=$cnt_record;

}


if($ndbstart<0)

{

$ndbstart=$#dbnames+1;

}

if($ndbend<0)

{

$ndbend=$#dbnames;

}


# Есть количество записей по каждой базе и где смотреть выдачу

# Начинаем формировать результирующий XML


$root->setAttribute("size", $tcnt_record);

$doc->setDocumentElement( $root );


# Если была ошибка сформируем результат


if ($rrc<0)

{

error_print($rrv);

print $qxml->header(-type=>'application/xml',-charset=>'utf-8');

$doc = $stylesheet->transform($doc);

print $doc->serialize(1);

exit;

}


# Второй проход – собираем выдачу

for($i=0;$i<=$#dbnames;$i++)

{

next if($i<$ndbstart);

last if($i>$ndbend);


$dbname=$dbnames[$i]; $cnt_record=0;


if($query eq '' && ($qmeta eq '' || ($pqmeta && $dbname ne 'eearth')))

{

my @a;

if($i==$ndbstart)

{

@a = ($start_record-$dbrstart[$i] .. $start_record+$qty_record-1-$dbrstart[$i]);

}

elsif ($i!=$ndbend)

{

@a = (1 .. $dbrsize[$i]);

}

else

{

@a = (1 .. $start_record+$qty_record-1-$dbrstart[$i]);

}

$dbnl = join(",", @a);


($rc,$rv) = falcon_rno($dbnl);

}

else

{

my $sr;

my $qr;

if($i==$ndbstart)

{

$sr=$start_record-$dbrstart[$i];

$qr=$qty_record;

}

elsif ($i!=$ndbend)

{

$sr=1;

$qr=$dbrsize[$i];

}

else

{

$sr=1;

$qr=$start_record+$qty_record-1-$dbrstart[$i];

}

if($dbname eq 'eearth')

{

($rc,$rv) = falcon_get($fquery,$sr-1,$qr,0);

}

elsif($pqmeta)

{

($rc,$rv) = falcon_get($query,$sr-1,$qr,0);

}

else

{

($rc,$rv) = falcon_get("чисмвичмв",$sr-1,$qr,0);

}

}

if ($rc>0)

{

falcon_print($rv,$dbrstart[$i]);

}

elsif ($rc<0)

{

error_print($rv);

}

}


# Начинаем выдачу ответа


print $qxml->header(-type=>'application/xml',-charset=>'utf-8');


# Преобразуем документ к DC


$doc = $stylesheet->transform($doc);

print $doc->serialize(1);


# Процедура обработки запроса в ИПС Сокол


# proto: falcon_get($query,$start_point_from_zero,$quantity,$debug)

# if $start and $qty are omitted it gets all record from 0

sub falcon_get {

my $query = shift;

my $start = shift || 0;

my $qty = shift || 0;

my $debug = shift || 0;

my $end;

unless (defined($query) && ($query ne "")) {

return wantarray ? (-1, ["Не задан запрос для поиска."]) : -1;

} else {

my $dbh = frs::frs_open($dbpath,$dbname,$dbuser,"unknown",1);

unless ($dbh >= 0) {

frs::frs_close($dbh);

return wantarray ? (-1, ["Сбой при обращении к базе данных."]) : -1;

} else {

my $sth = frs::frs_setquerybystring($dbh,$query,"wcb");

if ((my $syn = frs::frs_getsyntaxerror($dbh))) {

$syn = ($debug) ? ("Char: " . ($syn)) : "";

return wantarray ? (-1, ["Синтаксическая ошибка в запросе."]) : -1;

} else {

unless (@$sth) {

frs::frs_close($dbh);

return wantarray ? (0, ["К сожалению, по Вашему запросу ничего не найдено."]) : 0;

} else {

my $rows = frs::frs_getnumfoundrecords($dbh);

$cnt_record=$rows;

unless (($start >=0) && ($start < $rows)) {

frs::frs_close($dbh);

return wantarray ? (0, ["Нет больше записей по Вашему запросу."]) : 0;

} else {

# if ((($start + $qty) > $rows) || ($qty < 1)) {

if (($start + $qty) > $rows) {

$end = $rows - 1;

} else {

$end = $start + $qty - 1;

}

my %rec;

my @out;

for (my $i = $start; $i<=$end; $i++) {

frs::frs_gotorecord($dbh,$sth->[$i]);

foreach (@fn) {

$rec{$_} = frs::frs_getdatabyfield($dbh,$_,2); #2=utf8

}

# $rec{'DBN'}=$sth->[$i];

$rec{'DBN'}=$i+1;

$rec{'CLN'}=$dbname;

$rec{'SRN'}='VINITI';


push(@out, { %rec });

}

frs::frs_close($dbh);

return wantarray ? ($rows,\@out) : $rows;

}

}

}

}

}

}


# Процедуры выборки блока записей из ИПС по номерам


# proto: falcon_rno($rnos)

sub falcon_rno {

my $rnos = shift;

my $dbh = frs::frs_open($dbpath,$dbname,$dbuser,"unknown",1);

my %rec;

my @out;

my @rno=split /\,/, $rnos;

my $j;

$cnt_record=0;

unless ($dbh >= 0)

{

frs::frs_close($dbh);

return wantarray ? (0, ["Сбой при обращении к базе данных."]) : 0;

}

else

{

$cnt_record=frs::frs_getnumrecords($dbh);

for($j=0;$j<=$#rno;$j++)

{

if(@rno[$j]frs::frs_getnumrecords($dbh))

{

next;

# frs::frs_close($dbh);

# return wantarray ? (0, ["Отсутствует запись с таким id."]) : 0;

}

frs::frs_gotorecord($dbh,@rno[$j]);

foreach (@fn)

{

$rec{$_} = frs::frs_getdatabyfield($dbh,$_,2); #2=utf8

}

$rec{'DBN'}=@rno[$j];

$rec{'CLN'}=$dbname;

$rec{'SRN'}='VINITI';

# $cnt_record++;

push(@out, { %rec });

}

}

frs::frs_close($dbh);

return wantarray ? (1,\@out) : 1;

}


# Процедура формирования XML сообщения об ошибке


sub error_print {

my $errors = shift;

foreach (@$errors) {

$root->appendTextChild("Error",XML::LibXML::Common::encodeToUTF8("windows-1251", $_));

}

}

# Процедура формирования линейного XML из выдачи ИПС Сокол


sub falcon_print {

my $data = shift;

my $delta = shift;

my $f;

my $out;

my $cnt;

foreach (@$data)

{


my $db = $root->addNewChild( "", "Record" );

$db->setAttribute("rno", $_->{'DBN'}+$delta);

$cnt=0;

foreach $f (@fn)

{

$out=$_->{$f};

if(length($out)>0 && $out ne "\n")

{

$db->appendTextChild($f,$out);

$cnt++;

}

}

if($cnt)

{

$db->appendTextChild("CLN",$_->{'CLN'});

$db->appendTextChild("SRN",$_->{'SRN'});

}

}

}


sub wcb

{

return 0;

}



programma-disciplini-vtoroj-vostochnij-yazik-yaponskij-yazik-versiya-stranica-2.html
programma-disciplini-vvedenie-v-istoriyu-i-filosofiyu-nauchnogo-eksperimenta-dlya-dlya-napravleniya-030100-62-filosofiya-podgotovki-bakalavra-avtori-drozdova-d-n-stolyarova-o-e.html
programma-disciplini-vvedenie-v-politologiyu-.html
programma-disciplini-vvedenie-v-professiyu-dlya-napravleniyaspecialnosti.html
programma-disciplini-vvedenie-v-specialnost-dlya-napravleniya-030600-62-zhurnalistika-podgotovki-bakalavra-avtori-lisenko-a-g.html
programma-disciplini-vvedenie-v-teoriyu-kommunikacii-dlya-specialnosti-030200-62-politologiya-i.html
  • lektsiya.bystrickaya.ru/prikaz-23-03-2012-239-r-p-pereyaslavka-omerah-po-organizacii-letnego-otdiha-ozdorovleniya-i-zanyatosti.html
  • literatura.bystrickaya.ru/scenarij-devid-hejter-i-aleks-ce.html
  • paragraph.bystrickaya.ru/lyudi-i-dengi-sbornik-statej-predstavlyaet-obzor-teoreticheskih-i-eksperimentalnih-rabot-po-socialnoj-rabote-i.html
  • esse.bystrickaya.ru/programma-speckursa-osnovi-mezhkulturnoj-kommunikacii-rekomenduetsya-dlya-napravleniya-podgotovki-040200-sociologiya.html
  • college.bystrickaya.ru/22-principi-klassifikacii-shkol-strategij-diplomirovannij-specialist-5-let-obucheniya.html
  • school.bystrickaya.ru/7-programma-formirovaniya-osnovnaya-obrazovatelnaya-programma-nachalnogo-obshego-obrazovaniya-vologodskoj-oblasti.html
  • shpargalka.bystrickaya.ru/verhovnij-sud-rossijskoj-federacii-opredelenie-ot-24-iyunya-2011-g-n-74-g11-17.html
  • ucheba.bystrickaya.ru/prilozhenie-2-fedorov-l-a-sovetskoe-biologicheskoe-oruzhie-istoriya-ekologiya-politika-m-msoes-2006-302-s.html
  • gramota.bystrickaya.ru/ya-laboratoriya-oao-severstal-clo.html
  • books.bystrickaya.ru/bilet-16-bileti-na-3-j-klass.html
  • testyi.bystrickaya.ru/5-voprosi-dlya-podgotovki-k-ekzamenu-metodicheskie-ukazaniya-i-zadaniya-po-vipolneniyu-kontrolnoj-raboti-disciplini.html
  • holiday.bystrickaya.ru/ne-virtualnoe-prostranstvo-predstavleni-k-obsuzhdeniyu-polozheniya-zakonoproekta-o-regulirovanii-interneta.html
  • kontrolnaya.bystrickaya.ru/r-yu-ishimcev-respublika-kazahstan-ao-alyuminij-kazahstana-nachalnik-sektora-asutp-ivc-clait-637020-respublika-kazahstan-g-pavlodar-vostochnaya-promzona-ao-alyuminij-kazahstana-8-913-922-3092-e-mail.html
  • laboratornaya.bystrickaya.ru/rabota-11-uchebnaya-programma-4-vvedenie-4-obem-disciplini-i-vidi-uchebnoj-raboti-4.html
  • reading.bystrickaya.ru/lekciya-dlya-studentov-biologicheskih-specialnostej.html
  • student.bystrickaya.ru/10-velikie-zvezdnie-chasi-epoh-kniga-tajna-oriona.html
  • essay.bystrickaya.ru/doklad-dobrij-den.html
  • testyi.bystrickaya.ru/annotaciya-programmi-programma-professionalnoj-podgotovki-po-professii-18880-stolyar-stroitelnij-stranica-9.html
  • assessments.bystrickaya.ru/bellman-r-dinamicheskoe-programmirovanie.html
  • notebook.bystrickaya.ru/ispolzovanie-elektromagnitnoj-terapii-lechebnoe-kreslo-neocontr-o-l-v-lechenii-nederzhaniya-mochi-u-zhenshin.html
  • universitet.bystrickaya.ru/the-new-times-konstantin-katanyan-29072008-030-str-24-25-radio-24-mayak-novosti-28-07-2008-yakovlev-evgenij-21-00-24.html
  • zanyatie.bystrickaya.ru/sizif-na-evereste-moej-materi-otkrivshej-peredo.html
  • tests.bystrickaya.ru/konspekt-uroka-po-anglijskomu-yaziku-4-klass-tema-uroka-scotland-an-english-speaking-country.html
  • shpora.bystrickaya.ru/vzaimodejstvie-gosdumi-s-federalnimi-organami-tv-7-pervij-kanal-novosti-18-07-2005-15-00-00-18-00-00-7.html
  • university.bystrickaya.ru/glava-5-soderzhanie-i-organizaciya-rabot-po-obespecheniyu-deyatelnosti-sluzhbi-upravleniya-personalom.html
  • esse.bystrickaya.ru/razdel-2-specifika-v-rabote-po-organizacii-i-provedeniyu-socialnih-turov-dlya-lic-s-ogranichennoj-deesposobnostyu-invalidov-i-lyudej-pozhilogo-vozrasta.html
  • laboratornaya.bystrickaya.ru/razdel-2-r-a-s-h-o-d-i-doklad-o-socialno-ekonomicheskoj.html
  • kontrolnaya.bystrickaya.ru/rabochaya-programma-uchebnoj-disciplini-ekonomika-truda-bakalavr-po-napravleniyu-080100-62-ekonomika.html
  • vospitanie.bystrickaya.ru/zhizn-dana-na-dobrie-dela.html
  • holiday.bystrickaya.ru/o-rezultatah-ispolneniya-rosfinnadzorom-i-ego-territorialnimi-organami-gosudarstvennoj-funkcii-organa-valyutnogo-kontrolya-v-2008-g.html
  • bukva.bystrickaya.ru/policy-memo-global-warming-essay-research-paper.html
  • writing.bystrickaya.ru/54-osobennosti-deprivacii-psihologicheskogo-razvitiya-v-doshkolnom-vozraste-m-yu-kondratev-kollektiv.html
  • knigi.bystrickaya.ru/sposobi-perevoda-stradatelnih-oborotov-na-russkij-yazik-vse-slova-delyatsya-na-razryadi-nazivaemie-chastyami-rechi.html
  • bukva.bystrickaya.ru/metodicheskie-rekomendacii-poyasnitelnaya-zapiska-obrazovatelnaya-programma-kursa-po-viboru-yazik-chelovek-karera.html
  • thescience.bystrickaya.ru/iii-cel-i-zadachi-realizacii-strategii-territorialnoe-planirovanie-shuchanskogo-rajona-obrazovanie.html
  • © bystrickaya.ru
    Мобильный рефератник - для мобильных людей.