granularity=$granularity; } /** * \brief Conversion d'une date unix (nomnbres de secondes depuis le 01/01/1970) en date au format iso8601 selon la granularité * @param integer $time date au format unix (nombres de secondes depuis le 01/01/1970) * @return string date au format YYYY-MM-DD ou YYYY-MM-DDThh:mm:ssZ selon la granularité */ function unixtime_to_iso8601($time) { $granularity=str_replace("T","\\T",$this->granularity); $granularity=str_replace("Z","\\Z",$granularity); $granularity=str_replace("YYYY","Y",$granularity); $granularity=str_replace("DD","d",$granularity); $granularity=str_replace("hh","H",$granularity); $granularity=str_replace("mm","i",$granularity); $granularity=str_replace("MM","m",$granularity); $granularity=str_replace("ss","s",$granularity); $date=date($granularity,$time); return $date; } /** * \brief Conversion d'une date au format iso8601 en date au format unix (nomnbres de secondes depuis le 01/01/1970) selon la granularité * @param string $date date au format iso8601 YYYY-MM-DD ou YYYY-MM-DDThh:mm:ssZ selon la granularité * @return integer date au format unix (nombres de secondes depuis le 01/01/1970) */ function iso8601_to_unixtime($date) { $parts=explode("T",$date); if (count($parts)==2) { $day=$parts[0]; $time=$parts[1]; } else { $day=$parts[0]; } $days=explode("-",$day); if ($this->granularity=="YYYY-MM-DDThh:mm:ssZ") { if ($time) $times=explode(":",$time); if ($times[2]) { if (substr($times[2],strlen($times[2])-1,1)=="Z") $times[2]=substr($times[2],0,strlen($times[2])-1); } } $unixtime=mktime($times[0]+0,$times[1]+0,$time[2]+0,$days[1]+0,$days[2]+0,$days[0]+0); return $unixtime; } } /* * oai_out_protocol * \brief Cette classe gère toute l'entrée sortie http et le protocol oai * Cette classe ne connait pas ses enregistrement ni leur types, elle les récupère grace à une instance d'une classe fille de oai_out_get_records * Norme du protocole: http://www.openarchives.org/OAI/openarchivesprotocol.html */ class oai_out_protocol { private $msg=array(); private $repositoryName=""; private $adminEmail; private $sets=array(); private $repositoryIdentifier=""; private $oai_out_get_records_object=NULL; private $known_metadata_formats=array( /*"notice_id" => array( "metadataPrefix" => "notice_id", "metadataNamespace" => "http://sigb.net/pmb/es/oai/notice_id", "schema" => "http://sigb.net/pmb/es/oai/notice_id.xsd" ),*/ "pmb_xml_unimarc" => array( "metadataPrefix" => "pmb_xml_unimarc", "metadataNamespace" => "http://sigb.net/pmb/es/oai/pmb_xml_marc", "schema" => "http://sigb.net/pmb/es/oai/pmb_xml_marc.xsd" ), "oai_dc" => array( "metadataPrefix" => "oai_dc", "metadataNamespace" => "http://www.openarchives.org/OAI/2.0/oai_dc/", "schema" => "http://www.openarchives.org/OAI/2.0/oai_dc.xsd" ) ); private $nb_results=100; private $token_life_expectancy=600; private $compression=true; private $deletion_support="no"; private $errored=false; private $xmlheader_sent=false; private $base_url=""; //Constructeur function oai_out_protocol($oai_out_get_records_object, &$msg, $repositoryName, $adminEmail, $sets, $repositoryIdentifier, $nb_results, $token_life_expectancy, $compression, $deletion_support, $additional_metadataformats, $base_url) { $this->msg = $msg; $this->oai_out_get_records_object=$oai_out_get_records_object; $this->repositoryName = $repositoryName; $this->adminEmail = $adminEmail; $this->sets = $sets; $this->repositoryIdentifier = $repositoryIdentifier; $this->nb_results = $nb_results; $this->token_life_expectancy = $token_life_expectancy; $this->compression = $compression; $this->deletion_support = $deletion_support; $this->known_metadata_formats = array_merge($this->known_metadata_formats, $additional_metadataformats); $this->base_url = $base_url; } //Renvoie l'entête function oai_header() { global $verb; $page_url = $this->base_url; $iso8601 = new iso8601("YYYY-MM-DDThh:mm:ssZ"); $curdate = $iso8601->unixtime_to_iso8601(time()); $this->xmlheader_sent = true; return ' '.$curdate.' errored ? '' : 'verb="'.$verb.'"').'>'.XMLEntities($page_url).''; } //Renvoie le pied de page function oai_footer() { return ''; } //Renvoie une erreur function oai_error($error_code, $error_string) { $this->errored = true; $buffer = XMLEntities($error_string); $buffer = $charset != "utf-8" ? utf8_encode($buffer) : $buffer; $result = ""; $result .= ''.$buffer.''; return $result; } //Renvoie le résultat du verb Identify function oai_identify() { global $charset; global $pmb_version_brut; $result = ""; $result .= ""; $buffer = XMLEntities($this->repositoryName); $buffer = $charset != "utf-8" ? utf8_encode($buffer) : $buffer; $result .= ''.$buffer.''; $result .= ''.XMLEntities($this->base_url).''; $result .= '2.0'; $unix_earliestdate = $this->oai_out_get_records_object->get_earliest_datestamp(); $iso8601 = new iso8601("YYYY-MM-DDThh:mm:ssZ"); $earliestdate = $iso8601->unixtime_to_iso8601($unix_earliestdate); $result .= ''.$earliestdate.''; $result .= ''.$this->deletion_support.''; $result .= 'YYYY-MM-DDThh:mm:ssZ'; $buffer = XMLEntities($this->adminEmail); $buffer = $charset != "utf-8" ? utf8_encode($buffer) : $buffer; $result .= ''.$buffer.''; $buffer = XMLEntities($this->oai_out_get_records_object->get_sample_oai_identifier()); $buffer = $charset != "utf-8" ? utf8_encode($buffer) : $buffer; $buffer_ri = XMLEntities($this->oai_out_get_records_object->repository_identifier); $buffer_ri = $charset !="utf-8" ? utf8_encode($buffer_ri) : $buffer_ri; $result .= ' oai '.$buffer_ri.' : '.$buffer.' '; $result .= ' PMB OAI Connector Erwan Martin emartin@sigb.net PMB Services '.$pmb_version_brut.' http://sigb.net '; $result .= ""; return $result; } //Renvoie le résultat du verb ListSets function oai_list_sets() { $result = ''; $result .= ''; foreach ($this->sets as $aset) { $buffer = XMLEntities($aset["caption"]); $buffer = $charset != "utf-8" ? utf8_encode($buffer) : $buffer; $result .= ' set_'.XMLEntities($aset["id"]).' '.$buffer.' '; } $result .= ''; return $result; } //Renvoie le résultat du verb ListRecords function oai_list_records($root_tag="ListRecords") { global $charset, $dbh, $set, $resumptionToken, $from, $until; //Vérifications préhalables global $metadataPrefix; if (!$metadataPrefix) $metadataPrefix = "oai_dc"; if (substr($metadataPrefix, 0, 8) == "convert:") { } else if (($metadataPrefix != "__oai_identifier") && !in_array($metadataPrefix, array_keys($this->known_metadata_formats))) { $erreur_message = $charset != "utf-8" ? utf8_encode(sprintf($this->msg["cannotDisseminateFormat"], XMLEntities($metadataPrefix))) : sprintf($this->msg["cannotDisseminateFormat"], XMLEntities($metadataPrefix)); return $this->oai_error("cannotDisseminateFormat", $erreur_message); } //Un peu de ménage dans les tokens $sql = "DELETE FROM connectors_out_oai_tokens WHERE NOW() >= connectors_out_oai_token_expirationdate"; mysql_query($sql, $dbh); //On aura besoin d'un objet date iso magique $iso8601 = new iso8601("YYYY-MM-DDThh:mm:ssZ"); $result = ""; $max_records = $this->nb_results; $total_number_of_records=0; $datefrom=false; $dateuntil=false; //Un token? Cherchons le dans la base de donnée et restaurons son environnement if ($resumptionToken) { $sql = "SELECT connectors_out_oai_token_environnement FROM connectors_out_oai_tokens WHERE connectors_out_oai_token_token = '".addslashes($resumptionToken)."'"; $res = mysql_query($sql, $dbh); if (!mysql_num_rows($res)) return $this->oai_error("badResumptionToken", $this->msg["badResumptionToken"]); $row = mysql_fetch_assoc($res); $config = unserialize($row["connectors_out_oai_token_environnement"]); $set_id_list = $config["sets"]; $datefrom = $config["datefrom"]; $dateuntil = $config["dateuntil"]; $metadataPrefix = $config["metadataprefix"]; } //Sinon config de début de recherche else { //Vérifions si on souhaite un set précis if (isset($set) && $set) { $the_set_id = substr($set, 4); //On a un id, vérifions qu'il existe dans la liste $found=false; foreach ($this->sets as $aset) { if ($aset["id"] == $the_set_id) { $found = true; break; } } //Non? Erreur! if (!$found) { $buffer = $charset != 'utf-8' ? utf8_encode($this->msg["unknown_set"]) : $this->msg["unknown_set"]; return $this->oai_error("unknown_set", $buffer); } //Oui? On génère la "liste" des sets else { $set_id_list = array(0=>array("id" => $the_set_id)); } } //Sinon on fouille dans tous les sets else $set_id_list = $this->sets; if (isset($from) && $from) $datefrom = $iso8601->iso8601_to_unixtime($from); if (isset($until) && $until) $dateuntil = $iso8601->iso8601_to_unixtime($until); } //Allons chercher les enregistrements grace à la classe associée $records=array(); foreach($set_id_list as &$aset) { if (!isset($aset["fetched_count"])) $aset["fetched_count"] = 0; //Si on en a déjà assez, on ne fait que compter (pour le total) if (count($records) >= $max_records) { $total_number_of_records += $this->oai_out_get_records_object->get_record_count($aset["id"], $datefrom, $dateuntil); continue; } //Si on a déjà tout extrait dans ce set, on compte et on continue if ($aset["fetched_count"]) { $current_set_count = $this->oai_out_get_records_object->get_record_count($aset["id"], $datefrom, $dateuntil); if ($aset["fetched_count"] == $current_set_count) { $total_number_of_records += $current_set_count; continue; } } //Allons chercher les enregistrements du set $number_to_fetch = $max_records - count($records); $set_records = $this->oai_out_get_records_object->get_records($aset["id"], $metadataPrefix, $aset["fetched_count"], $number_to_fetch, $datefrom, $dateuntil); $aset["fetched_count"] += count($set_records); $current_set_count = $this->oai_out_get_records_object->get_record_count($aset["id"], $datefrom, $dateuntil); $total_number_of_records += $current_set_count; foreach($set_records as $notice_id => $record_content) { if (!isset($records[$notice_id])) { $records[$notice_id] = $record_content; } } } //Si pas d'enregistrement, le protocol veut qu'on renvoie une erreur if (!$records) { $erreur_message = $charset != "utf-8" ? utf8_encode($this->msg["noRecordsMatch"]) : $this->msg["noRecordsMatch"]; return $this->oai_error("noRecordsMatch", $erreur_message); } //Affichons les enregistrements $result .= " <".$root_tag.">"; foreach ($records as $arecords) { $result .= $arecords; } //Calculons le curseur $cursor = 0; foreach($set_id_list as $aset_c) { if (!isset($aset_c["fetched_count"])) continue; $cursor += $aset_c["fetched_count"]; } if ($cursor < $total_number_of_records) { //Enregistrons l'environnement $env=array( "sets" => $set_id_list, "datefrom" => $datefrom, "dateuntil" => $dateuntil, "metadataprefix" => $metadataPrefix ); $token = md5(microtime()); $sql = "INSERT INTO connectors_out_oai_tokens (connectors_out_oai_token_token, connectors_out_oai_token_environnement, connectors_out_oai_token_expirationdate) VALUES ('".$token."', '".addslashes(serialize($env))."', NOW() + INTERVAL ".$this->token_life_expectancy." SECOND)"; mysql_query($sql, $dbh); $token_expiration_date = time() + $this->token_life_expectancy; $result .= ''.$token.''; } $result .= " "; return $result; } function oai_list_identifier() { global $metadataPrefix; $metadataPrefix = "__oai_identifier"; return $this->oai_list_records('ListIdentifiers'); } function oai_get_record() { global $identifier; global $metadataPrefix; global $charset; if (!$metadataPrefix) $metadataPrefix = "oai_dc"; $record = $this->oai_out_get_records_object->get_record($identifier, $metadataPrefix); if ($record === false) { $error_message = $charset != 'utf-8' ? utf8_encode($this->msg["idDoesNotExist"]) : $this->msg["idDoesNotExist"]; return $this->oai_error("idDoesNotExist", $error_message); } $result = ""; $result .= $record; $result .= ""; return $result; } //Renvoie le résultat du verb ListMetadataFormat function oai_list_metadata_formats() { $result = ''; $result .= ''; foreach ($this->known_metadata_formats as $aformat) { $result .= ' '.$aformat["metadataPrefix"].' '.$aformat["schema"].' '.$aformat["metadataNamespace"].' '; } $result .= ''; return $result; } function sets_being_refreshed(){ global $charset, $dbh, $set; global $verb; $set_id_list = array(); //dans certains cas, cela n'a pas d'importance... switch($verb) { case 'ListRecords': case 'GetRecord': //Vérifions si on souhaite un set précis if (isset($set) && $set) { $the_set_id = substr($set, 4); //On a un id, vérifions qu'il existe dans la liste $found=false; foreach ($this->sets as $aset) { if ($aset["id"] == $the_set_id) { $found = true; break; } } //Non? Erreur! if ($found) { $set_id_list = array($the_set_id); } } else{ $set_id_list = array(); foreach($this->sets as $aset){ $set_id_list[] = $aset['id']; } } $query = "select being_refreshed from connectors_out_sets where being_refreshed=1 and connector_out_set_id in (".implode(",",$set_id_list).")"; $res = mysql_query($query); if(mysql_num_rows($res)>0){ $result = true; }else { $result = false; } break; default: $result = false; break; } return $result; } } /* * oai_out_get_records * \brief Cette classe utilisée par la classe oai_out_protocol permet de récupérer les metadatas des enregistrements (en UTF-8) * */ abstract class oai_out_get_records { public $error_code=""; public $error_string=""; private $msg=array(); protected $total_record_count_per_set=array(); //Constructeur public function oai_out_get_records(&$msg) { $this->msg=$msg; } //Renvoi un exemple d'identifier abstract public function get_sample_oai_identifier(); //Renvoi le datestamp du plus viel enregistrement abstract public function get_earliest_datestamp(); //Retourne le nombre d'enregistrements abstract public function get_record_count($set_id, $datefrom=false, $dateuntil=false); //Retrouve un enregistrement abstract public function get_record($rec_id, $format); //Liste les enregistrements abstract public function get_records($set_id="", $format, $first=false, $count=false, $datefrom=false, $dateuntil=false); } /* * oai_out_get_records_notice * \brief Cette classe récupère les enregistrements pour un entrepot oai de notices * */ class oai_out_get_records_notice extends oai_out_get_records { public $oai_cache_duration = 84000; public $source_set_ids=array(); public $repository_identifier=""; public $notice_statut_deletion=0; public $include_items=0; public $include_links=array('genere_lien'=>0); protected $xslt = ""; //Constructeur public function oai_out_get_records_notice(&$msg,$xslt="") { parent::oai_out_get_records($msg); $this->xslt = $xslt; } public function get_sample_oai_identifier() { $result = 123456789; //Allons chercher un notice_id dans un set foreach ($this->source_set_ids as $asetid) { $co_set = new_connector_out_set_typed($asetid); $co_set->update_if_expired(); $values = $co_set->get_values(); //Set vide? On cherche dans un autre if (!$values) continue; //On en a un? On le prend $result = $values[0]; break; } $result = "oai:".$this->repository_identifier.":".$result; return $result; } public function get_earliest_datestamp() { //Allons chercher la date la plus vieille pour chaque set, et ensuite on prendra la plus vieille $current_min_unix_timestamp = time(); foreach ($this->source_set_ids as $asetid) { $co_set = new_connector_out_set_typed($asetid); $co_set->update_if_expired(); $set_min_date = $co_set->get_earliest_updatedate(); $current_min_unix_timestamp = $set_min_date < $current_min_unix_timestamp ? $set_min_date : $current_min_unix_timestamp; } return $current_min_unix_timestamp; } public function get_record($rec_id, $format) { global $charset; //Extractons l'id de la notice $notice_id = substr(strrchr($rec_id, ":"), 1); if (!$notice_id) return false; //Vérifions que la notice est bien dans les sets de la source $notice_sets = connector_out_set_noticecaddie::get_notice_setlist($notice_id); $notice_sets = array_intersect($notice_sets, $this->source_set_ids); if (!$notice_sets) return false; $co_set = new_connector_out_set_typed($notice_sets[0]); $co_set->update_if_expired(); $oai_cache = new external_services_converter_oairecord(1, $this->oai_cache_duration, $co_set->cache->cache_duration_in_seconds(), $this->source_set_ids, $this->repository_identifier, $this->notice_statut_deletion, $this->include_items,$this->xslt,$this->include_links); $records = $oai_cache->convert_batch(array($notice_id), $format, 'utf-8'); /* if ($records && $records[$notice_id]) if (($charset != 'utf-8') && !in_array($format, $this->utf8_formats)) $records[$notice_id] = utf8_encode($records[$notice_id]);*/ return $records ? $records[$notice_id] : false; } public function get_records($set_id=0, $format, $first=false, $count=false, $datefrom=false, $dateuntil=false) { global $charset; //Récupérons du cache les ids des notices $co_set = new_connector_out_set_typed($set_id); $co_set->update_if_expired(); $notice_ids = $co_set->get_values($first, $count, $datefrom, $dateuntil); $this->total_record_count[$set_id] = $co_set->get_value_count($datefrom, $dateuntil); //Récupérons les enregistrements (avec gestion du cache) $oai_cache = new external_services_converter_oairecord(1, $this->oai_cache_duration, $co_set->cache->cache_duration_in_seconds(), $this->source_set_ids, $this->repository_identifier, $this->notice_statut_deletion, $this->include_items,$this->xslt,$this->include_links); $records = $oai_cache->convert_batch($notice_ids, $format, 'utf-8'); /* if ($records) { if (($charset != 'utf-8') && !in_array($format, $this->utf8_formats)) { foreach ($records as $rnotice_id => $rrecord_content) { $records[$rnotice_id] = utf8_encode($rrecord_content); } } }*/ return $records; } public function get_record_count($set_id, $datefrom=false, $dateuntil=false) { if (!isset($this->total_record_count[$set_id])) { $co_set = new_connector_out_set_typed($set_id); $co_set->update_if_expired(); $this->total_record_count[$set_id] = $co_set->get_value_count($datefrom, $dateuntil); } return $this->total_record_count[$set_id]; } } /* * external_services_converter_oairecord * \brief Cette classe génère les enregistrement oai de notices complets et les met en cache * */ class external_services_converter_oairecord extends external_services_converter { private $set_life_duration; private $source_set_ids=array(); private $repository_identifier=""; private $deleted_record_statut=0; private $include_items=0; private $xslt = ""; private $include_links=0; function external_services_converter_oairecord($object_type, $life_duration, $set_life_duration, $source_set_ids, $repository_identifier, $deleted_record_statut, $include_items,$xslt="",$include_links) { parent::external_services_converter($object_type, $life_duration); $this->set_life_duration = $set_life_duration+0; $this->source_set_ids = $source_set_ids; $this->repository_identifier = $repository_identifier; $this->deleted_record_statut = $deleted_record_statut; $this->include_items = $include_items; $this->xslt = $xslt; $this->include_links = $include_links; } function convert_batch($objects, $format, $target_charset='utf-8') { //Va chercher dans le cache les notices encore bonnes parent::convert_batch($objects, "oai_".$format, $target_charset); //Converti les notices qui doivent l'être $this->convert_uncachedoairecords($format, $target_charset); return $this->results; } function convert_batch_to_oairecords($notices_to_convert, $format, $target_charset) { global $dbh; if (!$notices_to_convert) //Rien à faire? On fait rien return; //Allons chercher les dates et les statuts des notices $notice_datestamps=array(); $notice_statuts=array(); $notice_ids = $notices_to_convert; //Par paquets de 100 pour ne pas brusquer mysql $notice_idsz = array_chunk($notice_ids, 100); $iso8601 = new iso8601("YYYY-MM-DDThh:mm:ssZ"); foreach ($notice_idsz as $anotice_ids) { $sql = "SELECT notice_id, UNIX_TIMESTAMP(update_date) AS datestamp, statut FROM notices WHERE notice_id IN (".implode(",", $anotice_ids).")"; $res = mysql_query($sql, $dbh); while($row=mysql_fetch_assoc($res)) { $notice_datestamps[$row["notice_id"]] = $iso8601->unixtime_to_iso8601($row["datestamp"]); $notice_statuts[$row["notice_id"]] = $row["statut"]; } } //Si il existe un status correspondant à la suppression, on génère ces enregistrements et on les supprime de la liste à générer. if ($this->deleted_record_statut) { foreach ($notice_statuts as $notice_id => $anotice_statut) if ($anotice_statut == $this->deleted_record_statut) { $notice_sets = connector_out_set_noticecaddie::get_notice_setlist($notice_id); $notice_sets = array_intersect($notice_sets, $this->source_set_ids); $oai_record = ""; $oai_record .= ""; $oai_record .= '
oai:'.XMLEntities($this->repository_identifier).':'.$notice_id.' '.$notice_datestamps[$notice_id].''; foreach ($notice_sets as $aset_id) { $oai_record .= "set_".$aset_id.""; } $oai_record .= '
'; $oai_record .= "
"; $this->results[$notice_id] = $oai_record; unset($notices_to_convert[array_search($notice_id, $notices_to_convert)]); } } //Convertissons les notices au format demandé si on ne souhaite pas uniquement les entêtes $only_identifier = $format == "__oai_identifier"; if (!$only_identifier) { $converter = new external_services_converter_notices(1, $this->set_life_duration); $converter->params["include_items"] = $this->include_items; $converter->params["include_links"] = $this->include_links; $metadatas = $converter->convert_batch($notices_to_convert, $format, $target_charset,$this->xslt); } //Fabriquons les enregistrements foreach ($notices_to_convert as $notice_id) { $notice_sets = connector_out_set_noticecaddie::get_notice_setlist($notice_id); $notice_sets = array_intersect($notice_sets, $this->source_set_ids); $oai_record = ""; if (!$only_identifier) $oai_record .= ""; $oai_record .= '
oai:'.XMLEntities($this->repository_identifier).':'.$notice_id.' '.$notice_datestamps[$notice_id].''; foreach ($notice_sets as $aset_id) { $oai_record .= "set_".$aset_id.""; } $oai_record .= '
'; if (!$only_identifier) { $oai_record .= ""; $oai_record .= $metadatas[$notice_id]; $oai_record .= ""; } if (!$only_identifier) $oai_record .= "
"; $this->results[$notice_id] = $oai_record; } } function convert_uncachedoairecords($format, $target_charset='utf-8') { $notices_to_convert=array(); foreach ($this->results as $notice_id => $aresult) { if (!$aresult) { $notices_to_convert[] = $notice_id; } } $this->convert_batch_to_oairecords($notices_to_convert, $format, $target_charset); //Cachons les notices converties maintenant. foreach ($notices_to_convert as $anotice_id) { if ($this->results[$anotice_id]) $this->encache_value($anotice_id, $this->results[$anotice_id], "oai_".$format); } } } /* * oai_out_server * \brief Cette classe fait le lien entre toutes les autres et fait tourner le bouzin * */ class oai_out_server { private $msg=array(); private $oai_source_object = NULL; private $sets=array(); //Constructeur function oai_out_server(&$msg, &$oai_source_object) { $this->msg = $msg; $this->oai_source_object = $oai_source_object; } //Fait tourner le serveur function process() { global $verb; //Pour ne pas avoir les entêtes définissant le fichier comme du xml, placer un &nx dans l'url (pour pouvoir utiliser le debugger zend par exemple) global $nx; if (!isset($nx)) header('Content-Type: text/xml'); $outsets = new connector_out_sets(); foreach ($outsets->sets as &$aset) { if (in_array($aset->id, $this->oai_source_object->included_sets)) $this->sets[] = array( "id" => $aset->id, "caption" => $aset->caption ); } //Créons l'object que le serveur va utiliser pour récupérer les enregistrements $get_records_objects = new oai_out_get_records_notice($this->msg,$this->oai_source_object->config['feuille_xslt']); $get_records_objects->oai_cache_duration = $this->oai_source_object->cache_complete_records_seconds; $get_records_objects->source_set_ids = $this->oai_source_object->included_sets; $get_records_objects->repository_identifier = $this->oai_source_object->repositoryIdentifier; $get_records_objects->notice_statut_deletion = $this->oai_source_object->link_status_to_deletion ? $this->oai_source_object->linked_status_to_deletion : 0; $get_records_objects->include_items = $this->oai_source_object->include_items ? $this->oai_source_object->include_items : 0; $get_records_objects->include_links = $this->oai_source_object->include_links ? $this->oai_source_object->include_links : 0; $additional_metadataformat = array(); foreach ($this->oai_source_object->allowed_admin_convert_paths as $convert_path) { $additional_metadataformat["convert:".$convert_path] = array( "metadataPrefix" => "convert:".$convert_path, "metadataNamespace" => "http://sigb.net/pmb/es/oai/"."convert:".$convert_path, "schema" => "http://sigb.net/pmb/es/oai/unknown.xsd" ); } //Créons l'objet protocol $deletion = ($this->oai_source_object->link_status_to_deletion ? 'transient' : 'no'); $base_url = $this->oai_source_object->baseURL; if (!$base_url) { $base_url = curPageBaseURL(); $base_url = substr($default_base_url, 0, strrpos($default_base_url, '/')+1); $base_url .= 'ws/connector_out.php?source_id='.$this->oai_source_object->id; } $oai_out_protocol = new oai_out_protocol($get_records_objects, $this->msg, $this->oai_source_object->repository_name, $this->oai_source_object->admin_email, $this->sets, $this->oai_source_object->repositoryIdentifier, $this->oai_source_object->chunksize, $this->oai_source_object->token_lifeduration, $this->oai_source_object->allow_gzip_compression, $deletion, $additional_metadataformat, $base_url); //Si on peut compresser, on compresse if ($this->oai_source_object->allow_gzip_compression) $test = ob_start("ob_gzhandler"); $response = ""; //Si la source n'est pas bien configurée if (!$this->oai_source_object->repository_name || !$this->oai_source_object->admin_email || !$this->oai_source_object->repositoryIdentifier) { echo $oai_out_protocol->oai_header(); echo $oai_out_protocol->oai_error('unconfigured', $this->msg["unconfigured_source"]); echo $oai_out_protocol->oai_footer(); return; } //Sinon c'est parti else { //on regarde si un des sets manipulés n'est en cours de rafraississement, si oui, on bloque tout et fait patienter le client if($oai_out_protocol->sets_being_refreshed()){ header('HTTP/1.1 503 Service Temporarily Unavailable',true,503); header('Status: 503 Service Temporarily Unavailable'); header('Retry-After: 10'); }else{ switch($verb) { case 'Identify': $response .= $oai_out_protocol->oai_identify(); break; case 'ListRecords': $response .= $oai_out_protocol->oai_list_records(); break; case 'GetRecord': $response .= $oai_out_protocol->oai_get_record(); break; case 'ListSets': $response .= $oai_out_protocol->oai_list_sets(); break; case 'ListIdentifiers': $response .= $oai_out_protocol->oai_list_identifier(); break; case 'ListMetadataFormats': $response .= $oai_out_protocol->oai_list_metadata_formats(); break; default: $response .= $oai_out_protocol->oai_error('badVerb', $this->msg["illegal_verb"]); break; } } //Header $response = $oai_out_protocol->oai_header() . $response; //Footer $response .= $oai_out_protocol->oai_footer(); echo $response; } } } ?>