private function fixThesaurus2(&$domth, &$tenode, $depth, \unicode $unicode) { $sy = $tenode->appendChild($domth->createElement("sy")); $sy->setAttribute("lng", $v = $tenode->getAttribute("lng")); $sy->setAttribute("v", $v = $tenode->getAttribute("v")); $sy->setAttribute("w", $unicode->remove_indexer_chars($v)); if (($k = $tenode->getAttribute("k")) != "") { $sy->setAttribute("k", $k); } $tenode->removeAttribute("lng"); $tenode->removeAttribute("v"); $tenode->removeAttribute("w"); $tenode->removeAttribute("k"); if ($tenode->getAttribute("nextid") == "") { $tenode->setAttribute("nextid", "0"); } $todel = []; for ($n = $tenode->firstChild; $n; $n = $n->nextSibling) { if ($n->nodeName == "ta") { $todel[] = $n; } if ($n->nodeName == "te") { $this->fixThesaurus2($domth, $n, $depth + 1, $unicode); } } foreach ($todel as $n) { $n->parentNode->removeChild($n); } }
public function patch($version, \DOMDocument $domct, \DOMDocument $domth, Connection $connbas, \unicode $unicode) { $needreindex = false; if ($version == "2.0.4") { $xp = new DOMXPath($domth); $sy = $xp->query("//sy"); for ($i = 0; $i < $sy->length; $i++) { if ($k = $sy->item($i)->getAttribute("k")) { $v = $sy->item($i)->getAttribute("v"); if (strpos($v, "(") === false) { $sy->item($i)->setAttribute("v", $v . " (" . $k . ")"); printf("// context '({$k})' pasted to value '{$v}'\n"); $needreindex = true; } else { printf("// <font color=\"#ff8000\">warning</font> : <sy id='%s' v='%s' ...> already had context (left unchanged)\n", $sy->item($i)->getAttribute("id"), htmlentities($v)); } $newk = trim($unicode->remove_indexer_chars($k)); if ($newk != $k) { $sy->item($i)->setAttribute("k", $newk); $needreindex = true; } } } $domth->documentElement->setAttribute("version", "2.0.5"); $domth->documentElement->setAttribute("modification_date", date("YmdHis")); if ($needreindex) { print "// need to reindex, deleting cterms (keeping rejected)\n"; $xp = new DOMXPath($domct); $nodes = $xp->query("//te[not(starts-with(@id, 'R')) and count(te[starts-with(@id, 'R')])=0]"); $nodestodel = []; for ($i = 0; $i < $nodes->length; $i++) { $nodestodel[] = $nodes->item($i); } $ctdel = 0; foreach ($nodestodel as $node) { $sql2 = "DELETE FROM thit WHERE value LIKE :like"; $stmt = $connbas->prepare($sql2); $stmt->execute([':like' => str_replace(".", "d", $node->getAttribute("id")) . "d%"]); $stmt->closeCursor(); $node->parentNode->removeChild($node); $ctdel++; } print "// {$ctdel} nodes removed\n"; $sql2 = "UPDATE record SET status=((status | 15) & ~2)"; $stmt = $connbas->prepare($sql2); $stmt->execute(); $stmt->closeCursor(); } $sy = $xp->query("//sy"); for ($i = 0; $i < $sy->length; $i++) { if ($k = $sy->item($i)->getAttribute("k")) { if (strpos($v = $sy->item($i)->getAttribute("v"), "(") === false) { $sy->item($i)->setAttribute("v", $v . " (" . $k . ")"); } else { printf("// <font color=\"#ff8000\">warning</font> : <sy id='%s' v='%s' ...> already had context (left unchanged)\n", $sy->item($i)->getAttribute("id"), htmlentities($v)); } $sy->item($i)->setAttribute("k", $unicode->remove_indexer_chars($k)); } } $domct->documentElement->removeAttribute("id"); $this->fixRejected($connbas, $domct->documentElement, false); $this->fixIds($connbas, $domct->documentElement); $domct->documentElement->setAttribute("version", "2.0.5"); $domct->documentElement->setAttribute("modification_date", date("YmdHis")); $version = "2.0.5"; } return $version; }