Приложение №20 - Отчет о работе по проекту
.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
  • knowledge.bystrickaya.ru/o-strategii-socialno-ekonomicheskogo-razvitiya-chuvashskoj-respubliki-do-2020-goda-stranica-2.html
  • bystrickaya.ru/zaklyuchenie-safronov-v-a.html
  • zadachi.bystrickaya.ru/ob-ekologicheskoj-situacii-v-rossijskoj-federacii.html
  • kanikulyi.bystrickaya.ru/zadachi-aktivizirovat-znaniya-pedagogov-o-metodah-priemah-i-sredstvah-razvitiya-rechi-doshkolnikov-povisit-u-vospitatelej-kompetentnost-v-oblasti-razvitiya-rechi-doshkolnikov.html
  • college.bystrickaya.ru/340100-itogo-programma-shkoli-opredelila-sleduyushie-napravleniya-raboti-formirovanie-u-uchashihsya-potrebnosti.html
  • desk.bystrickaya.ru/okolo-30-pozharov-proizoshlo-za-minuvshie-sutki-v-podmoskove-informacionnoe-agentstvo-ria-novosti-04052012.html
  • bukva.bystrickaya.ru/tip-chelovek-hudozhestvennij-obraz-kratkie-opisaniya-professij.html
  • lecture.bystrickaya.ru/administraciya-kondinskogo-rajona.html
  • tests.bystrickaya.ru/kratkij-obzor-modelej-stohasticheskogo-programmirovaniya-i-metodov-resheniya-ekonomicheskih-zadach.html
  • shpargalka.bystrickaya.ru/v-esmazam-ekonomikali-teoriya.html
  • ucheba.bystrickaya.ru/pravo-22-chas-obrazovatelnaya-programma-prinyata.html
  • ucheba.bystrickaya.ru/prikaz-ot-21-yanvarya-2008-g-n-14-ob-utverzhdenii-ukazanij-po-zapolneniyu-formi-federalnogo-gosudarstvennogo-statisticheskogo-nablyudeniya-n-1-invest-svedeniya.html
  • universitet.bystrickaya.ru/tema-18-lichnost-i-politika-politologiya-uchebno-metodicheskij-kompleks-cheboksari-2009-politologiya-uchebno-metodicheskij-kompleks.html
  • shkola.bystrickaya.ru/russkij-smisl-v-svete-russkogo-yazika.html
  • tests.bystrickaya.ru/kompleksnoj-programmi-vospitaniya-3-1-klass-pravovoe-vospitanie-7-stranica-4.html
  • tests.bystrickaya.ru/lekciya-istoriya-pridnestrovya.html
  • report.bystrickaya.ru/istoriya-socialnoj-pomoshi-v-rossii-chast-3.html
  • lecture.bystrickaya.ru/azastan-respublikasi-oranis-ministrlgn-bjrii.html
  • textbook.bystrickaya.ru/gryozlandiya-eroshenkov-m-g-e78-skazka-nefertiti.html
  • school.bystrickaya.ru/iii-soderzhanie-kursa-programma-kursa-ekonomika-i-ekonomicheskij-analiz-yaponii-dlya-fakulteta-mezhdunarodnih-otnoshenij-68-chasov.html
  • zadachi.bystrickaya.ru/spisok-literaturi-spravochnoe-posobie-dlya-rukovoditelej-obrazovatelnih-uchrezhdenij-uchebnaya-evakuaciya.html
  • notebook.bystrickaya.ru/izveshenie-o-provedenii-zaprosa-kotirovok-ot-14-10-2010g-648-stranica-19.html
  • uchit.bystrickaya.ru/tehnologiya-formirovaniya-ruchnoj-umelosti-v-produktivnoj-deyatelnosti-tvorcheskaya-masterskaya.html
  • lecture.bystrickaya.ru/araandi-oblisi-dlet-departamentnde.html
  • learn.bystrickaya.ru/glava-tretya-filosofiya-domovodstva-nasiriddina-tusi-avtoreferat-dissertacii-na-soiskanie-uchenoj-stepeni.html
  • write.bystrickaya.ru/etnograficheskaya-nauka-i-aktualnie-voprosi-formirovaniya-i-dalnejshih-etapov-etnicheskoj-istorii-tyurkskih-etnosov.html
  • uchenik.bystrickaya.ru/dokumentooborot-ponyatie-i-trebovaniya.html
  • shkola.bystrickaya.ru/psihologicheskie-osnovi-obrazovatelnoj-deyatelnosti-plan-prospekt.html
  • upbringing.bystrickaya.ru/luchshie-knigi-luchshie-geroi-445011-rossijskaya-federaciya-samarskaya-oblast-pl-svobodi-4-kab7.html
  • letter.bystrickaya.ru/nbrk-stranica-12.html
  • thesis.bystrickaya.ru/pravila-pravila-dostupu-operatorv-provajderv-telekomunkacj-do-budinkv-sporud-dlya-budvnictva-rekonstrukc-ta-ekspluatac-budinkovih-rozpodlnih-merezh-cel-regulirovanie-otnoshenij-po-stroitelstvu-i-rekonstrukcii-drs.html
  • crib.bystrickaya.ru/istoriya-bumagi.html
  • zadachi.bystrickaya.ru/mnozhestvennost-mirov-i-problema-ih-obitaemosti.html
  • thescience.bystrickaya.ru/hichev-anton-semenenko-sergej-11-b-tyazhelie-metalli-v-pochve-odinochestva-v-tvorchestve-m-yu-lermontova-4-pastuhova.html
  • knowledge.bystrickaya.ru/napravlenie-8-setevie-tehnologii-udalennogo-dostupa-dlya-obespecheniya-kompleksnogo-razvitiya-sistemi-professionalnogo-obrazovaniya-vladimirskoj-oblasti.html
  • © bystrickaya.ru
    Мобильный рефератник - для мобильных людей.