@ -8,6 +8,15 @@ if (!defined('_ECRIRE_INC_VERSION')) {
return;
}
if (!defined('_TERRITOIRE_ASYNCHRONE_PAR_JOB')) {
/**
* Mode de peuplement asynchrone:
* - `job`: utilisation de job_queue_add
* - `url`: utilisation d'une action.
*/
define('_TERRITOIRE_ASYNCHRONE_PAR_JOB', true);
}
/**
* Peuple soit les régions du monde, soit les pays ou soit les subdivisions d'un pays.
@ -33,7 +42,8 @@ function territoire_peupler($type, $pays, $options = array()) {
'arg' => false,
'sha' => false,
'type' => $type,
'pays' => $pays
'pays' => $pays,
'sync' => true
);
// Le peuplement dépend du type :
@ -42,6 +52,7 @@ function territoire_peupler($type, $pays, $options = array()) {
include_spip('inc/territoires_services');
include_spip('inc/territoires_utils');
if (type_pays_est_valide($type, $pays)) {
$timestamp['debut'] = microtime(true);
$erreur = true;
$type_identique = false;
@ -56,6 +67,7 @@ function territoire_peupler($type, $pays, $options = array()) {
// On récupère tous les index fournis par la collection et pas uniquement celui des territoires concernés.
// Ainsi, les autres index éventuels restent disponibles.
$collection = territoires_acquerir($type, $pays);
$timestamp['acquisition'] = microtime(true);
if (!empty($collection[$configuration['champs']['index']])) {
// On extrait que l'index correspondant au type demandé
$territoires = $collection[$configuration['champs']['index']];
@ -74,6 +86,7 @@ function territoire_peupler($type, $pays, $options = array()) {
// -- on préserve les éditions manuelles et les liens pour les réinjecter ensuite lors du
// rechargement
$sauvegardes = territoires_preserver($type, $pays);
$timestamp['preservation'] = microtime(true);
// -- on vide les territoires avant de les remettre (inutile de gérer les erreurs
// car l'insertion les détectera).
@ -86,6 +99,7 @@ function territoire_peupler($type, $pays, $options = array()) {
territoire_depeupler('infrasubdivision', $pays);
}
territoire_depeupler($type, $pays);
$timestamp['vidage'] = microtime(true);
// -- on insère chaque territoire comme un objet
include_spip('action/editer_objet');
@ -142,6 +156,7 @@ function territoire_peupler($type, $pays, $options = array()) {
break;
}
}
$timestamp['insertion'] = microtime(true);
if (!$erreur_insertion) {
// Traitements des extras
@ -166,6 +181,7 @@ function territoire_peupler($type, $pays, $options = array()) {
if ($extras) {
sql_insertq_multi('spip_territoires_extras', $extras);
}
$timestamp['extras'] = microtime(true);
}
// On rétablit les liens vers les territoires et les logos
@ -182,6 +198,7 @@ function territoire_peupler($type, $pays, $options = array()) {
'id_table' => 'id_objet'
);
liens_retablir('logos', $sauvegardes, $ids, $config_lien);
$timestamp['retablissement'] = microtime(true);
// Permettre à d'autres plugins de compléter le peuplement.
// -- par exemple le plugin Contours rétablit les liens vers les contours GIS (spip_liens_gis),
@ -206,15 +223,28 @@ function territoire_peupler($type, $pays, $options = array()) {
'ext' => $meta_extras,
);
ecrire_config("${meta}/${consigne}", $contenu);
$timestamp['fin'] = microtime(true);
$erreur = false;
}
spip_log("Les territoires (Type '${type}' - Pays '${pays}') ont été chargées", 'territoires' . _LOG_DEBUG);
foreach ($timestamp as $_periode => $_timestamp) {
if ($_periode === 'debut') {
$timestamp_debut = $_timestamp;
} else {
$timestamp_fin = $_timestamp;
$duree = ($timestamp_fin - $timestamp_debut) * 1000;
$timestamp_debut = $timestamp_fin;
spip_log("Période ${_periode}: ${duree} ms", 'territoires' . _LOG_DEBUG);
}
}
$duree = $timestamp['fin'] - $timestamp['debut'];
spip_log("Durée totale: ${duree} s", 'territoires' . _LOG_DEBUG);
}
} else {
spip_log("Aucun territoire pour (Type '${type}' - Pays '${pays}') retourné par Nomenclatures", 'territoires' . _LOG_ERREUR);
}
// Si le territoire est en erreur, on passe on stocke le cas d'erreur.
// Si le territoire est en erreur, on stocke le cas d'erreur.
if ($erreur) {
if ($type_identique) {
$retour['sha'] = true;
@ -233,16 +263,86 @@ function territoire_peupler($type, $pays, $options = array()) {
return $retour;
}
/**
* Appelle la fonction de peuplement de territoires en asynchrone.
*
* @api
*
* @param string $type Type de territoires. Prends les valeurs `zone`, `country`, `subdivision` ou `infrasubdivision`.
* @param string $pays Code ISO 3166-1 alpha2 du pays si le type est `subdivision` ou `infrasubdivision` sinon une chaine vide.
* @param array $options Tableau des options de peuplement:
* - `force` : si `true` force le repeuplement même si le sha est identique (`false` par défaut).
* - `extras`: tableau des types d'extras à peupler soit `code` pour les codes alternatifs
* et `info` pour le caractéristiques (table spip_territoires_extras)
*
* @return array Tableau retour de la fonction permettant de connaitre le résultat du traitement (utile pour l'affichage
* du message dans le formulaire de peuplement).
*/
function territoire_peupler_asynchrone($type, $pays, $options = array(), $mode_asynchrone = 'job') {
// On initialise le retour à une ok ce qui est le cas le plus fréquent car on ne fait que créer le job.
$retour = array(
'ok' => true,
'arg' => false,
'sha' => false,
'type' => $type,
'pays' => $pays,
'sync' => false
);
if (_TERRITOIRE_ASYNCHRONE_PAR_JOB) {
// Lancement du peuplement dans un job à déclenchement immédiat et de priorité maximale pour éviter d'attendre.
include_spip('inc/utils');
$arguments = array(
$type,
$pays,
$options
);
$retour['job'] = job_queue_add(
'territoire_peupler',
'Peuplement de territoires',
$arguments,
'inc/territoire',
true
);
if (!$retour['job']) {
$retour['ok'] = false;
}
} else {
// Construction de la chaine des arguments passés à l'action.
// -- type et pays sont toujours fournis même si le pays est la chaine vide.
$arguments = "${type}:${pays}";
// -- ajout des éventuelles options : on passe les options par leur identifiant
if (!empty($options['force'])) {
$arguments .= ":force";
}
if (!empty($options['extras'])) {
$arguments .= ':' . implode(':', $options['extras']);
}
// Génération de l'URL qui lancera le peuplement en asynchrone.
include_spip('inc/actions');
$url = generer_action_auteur('peupler_territoires', $arguments);
// Lancement du peuplement en asynchrone.
include_spip ('inc/queue');
$retour['ok'] = queue_lancer_url_http_async($url);
}
return $retour;
}
/**
* Supprime de la base soit les régions du monde, soit les pays ou soit les subdivisions d'un pays.
*
* @api
*
* @param string $type Type de territoires. Prends les valeurs `zone`, `country`, `subdivision` ou `infrasubdivision`.
* @param string $pays Code ISO 3166-1 alpha2 du pays si le type est `subdivision` ou `infrasubdivision` sinon une chaine vide.
* @param string $type Type de territoires. Prends les valeurs `zone`, `country`, `subdivision` ou `infrasubdivision`.
* @param string $pays Code ISO 3166-1 alpha2 du pays si le type est `subdivision` ou `infrasubdivision` sinon une chaine vide.
* @param array $options Tableau des options de dépeuplement:
* - `force` : si `true` force le vidage même si la meta n'est pas présente (cas d'erreur
* sur timeout par exemple. La valeur par défaut est `false`.
* sur timeout par exemple) . La valeur par défaut est `false`.
*
* @return array Tableau retour de la fonction permettant de connaitre le résultat du traitement (utile pour l'affichage
* du message dans le formulaire de peuplement).
@ -255,7 +355,8 @@ function territoire_depeupler($type, $pays = '', $options = array()) {
'arg' => false,
'sha' => false,
'type' => $type,
'pays' => $pays
'pays' => $pays,
'sync' => true
);
// Le vidage dépend du type :