$longueur_maxi) { break; } $url = $url2; } $url = substr($url, 1); // On enregistre en utf-8 dans la base $url = rawurldecode($url); if (strlen($url) < $longueur_min) return ''; return $url; } function url_insert(&$set,$confirmer,$separateur){ $has_parent = true; # assurer la coherence des champs techniques si non fournis if (!isset($set['id_parent'])){ $has_parent = false; $set['id_parent'] = 0; } if (!isset($set['segments'])) $set['segments'] = count(explode('/',$set['url'])); $perma = false; if (isset($set['perma']) AND $set['perma']){ unset($set['perma']); $perma = true; } $redate = true; # le separateur ne peut pas contenir de / if (strpos($separateur,'/')!==false) $separateur = "-"; // Si l'insertion echoue, c'est une violation d'unicite. $where_urllike = 'url LIKE '.url_sql_quote_like($set['url'])." AND NOT(type=".sql_quote($set['type'])." AND id_objet=".intval($set['id_objet']).")"; $where_thisurl = $where_urllike.($has_parent?" AND id_parent=".intval($set['id_parent']):""); if ( // si pas de parent defini, il faut que cette url soit unique, independamment de id_parent // il faut utiliser un LIKE pour etre case unsensitive en sqlite (!$has_parent AND sql_countsel("spip_urls",$where_urllike)) OR @sql_insertq('spip_urls', $set) <= 0) { // On veut chiper une ancienne adresse ou prendre celle d'un repertoire deja present? if ( (!is_dir(_DIR_RACINE.$set['url']) AND !file_exists(_DIR_RACINE.$set['url'])) // un vieux url AND $vieux = sql_fetsel('*', 'spip_urls', $where_thisurl,'','perma DESC') // qui n'est pas permanente AND !$vieux['perma'] // et dont l'objet a une url plus recente AND $courant = sql_fetsel('*', 'spip_urls', 'type='.sql_quote($vieux['type']).' AND id_objet='.sql_quote($vieux['id_objet']) .' AND url<>'.sql_quote($set['url']) .' AND date>'.sql_quote($vieux['date']), '', 'date DESC', 1) ) { if ($confirmer AND !_request('ok2')) { die ("Vous voulez chiper l'URL de l'objet ".$courant['type']." " . $courant['id_objet']." qui a maintenant l'url " . $courant['url']); } $where_thisurl = "url=".sql_quote($vieux['url'])." AND id_parent=".intval($vieux['id_parent']); // si oui on le chipe sql_updateq('spip_urls', $set, $where_thisurl); sql_updateq('spip_urls', array('date' => date('Y-m-d H:i:s')), $where_thisurl); spip_log("reattribue url ".$vieux['url'] ." de ".$vieux['type']."#".$vieux['id_objet']." (parent ".$vieux['id_parent'].")" ." A ".$set['type']."#".$set['id_objet']." (parent ".$set['id_parent'].")","urls"._LOG_INFO_IMPORTANTE); } // Sinon else { // Soit c'est un Come Back d'une ancienne url propre de l'objet // Soit c'est un vrai conflit. Rajouter l'ID jusqu'a ce que ca passe, // mais se casser avant que ca ne casse. // il peut etre du a un changement de casse de l'url simplement // pour ce cas, on reecrit systematiquement l'url en plus d'actualiser la date $where = "type=".sql_quote($set['type']) ." AND id_objet=".intval($set['id_objet']) ." AND id_parent=".intval($set['id_parent']) ." AND url LIKE "; if ( !is_dir(_DIR_RACINE.$set['url']) AND !file_exists(_DIR_RACINE.$set['url']) AND sql_countsel('spip_urls', $where .url_sql_quote_like($set['url']))) { sql_updateq('spip_urls', array('url'=>$set['url'], 'date' => date('Y-m-d H:i:s')), $where .url_sql_quote_like($set['url'])); spip_log("reordonne ".$set['type']." ".$set['id_objet'],"urls"); $redate = false; } else { $set['url'] .= $separateur.$set['id_objet']; if (strlen($set['url']) > 200) //serveur out ? retourner au mieux return false; elseif (sql_countsel('spip_urls', $where . url_sql_quote_like($set['url']))) { sql_updateq('spip_urls', array('url'=>$set['url'], 'date' => date('Y-m-d H:i:s')), $where .url_sql_quote_like($set['url'])); $redate = false; } else { // remettre id_parent et perma comme il faut si besoin if (!$has_parent) unset($set['id_parent']); if ($perma) $set['perma'] = true; return url_insert($set, $confirmer, $separateur); } } } } $where_thisurl = 'url='.sql_quote($set['url'])." AND id_parent=".intval($set['id_parent']); // maj if ($redate) sql_updateq('spip_urls', array('date' => date('Y-m-d H:i:s')), $where_thisurl); // si url perma, poser le flag sur la seule url qu'on vient de mettre if ($perma) sql_update('spip_urls', array('perma' => "($where_thisurl)"), "type=".sql_quote($set['type'])." AND id_objet=".intval($set['id_objet'])); spip_log("Creation de l'url propre '" . $set['url'] . "' pour ".$set['type']." ".$set['id_objet']." (parent ".$set['id_parent']." perma ".($perma?"1":"0").")","urls"); return true; } function url_sql_quote_like($url){ return sql_quote(str_replace(array("%","_"),array("\\%","\\_"),$url))." ESCAPE ".sql_quote('\\'); } function url_verrouiller($objet,$id_objet,$url){ $where = "id_objet=".intval($id_objet)." AND type=".sql_quote($objet); $where .= " AND url=".sql_quote($url); // pour verrouiller une url, on fixe sa date dans le futur, dans 10 ans sql_updateq('spip_urls', array('date' => date('Y-m-d H:i:s',time()+10*365.25*24*3600)), $where); } function url_delete($objet,$id_objet,$url=""){ $where = "id_objet=".intval($id_objet)." AND type=".sql_quote($objet); if (strlen($url)) $where .= " AND url=".sql_quote($url); sql_delete("spip_urls",$where); } ?>