Helper::loadFromFile a procedury a triggery
- Jirda
- Člen | 103
Zdravim,
mam takovej problem. Mam dump databaze vygenerovany z admineru a rad bych jej mel ulozeny u projektu, s tim, ze si ho budu importovat pres loadFromFile metodu.
Problem je, ze ten dump neprojde. Problemem je pravdepodobne fakt, ze adminer v dumpu pouziva DELIMITER ;; a DELIMITER ;, ktery se zda, neni podporovan.
Zkousel jsem to odstranit, s tim, ze odstranim i delimitery u tech procedur a triggeru, ale pak to zas narazi na jine problemy, ze se ztrati kontext.
Nema s tim nekdo zkusenosti? Vtipne je, ze kdyz vlozim dump do admineru, tak ten to zpracuje v poradku.
Diky.
- thunderbuff
- Člen | 164
V jednom velkém projektu mi několik měsíců bez jediného problému slouží toto:
<?php
/**
* Import taken from Adminer, slightly modified
* Note: This implementation is aware of delimiters used for trigger definitions (unlike Nette\Database)
*
* @author Jakub Vrána, Jan Tvrdík, Michael Moravec
* @license Apache License
*/
private function executeFile($file)
{
$query = file_get_contents($file);
$delimiter = ';';
$offset = 0;
while ($query != '') {
if (!$offset && preg_match('~^\\s*DELIMITER\\s+(.+)~i', $query, $match)) {
$delimiter = $match[1];
$query = substr($query, strlen($match[0]));
} else {
preg_match('(' . preg_quote($delimiter) . '|[\'`"]|/\\*|-- |#|$)', $query, $match, PREG_OFFSET_CAPTURE, $offset); // should always match
$found = $match[0][0];
$offset = $match[0][1] + strlen($found);
if (!$found && rtrim($query) === '') {
break;
}
if (!$found || $found == $delimiter) { // end of a query
$q = substr($query, 0, $match[0][1]);
$this->db->exec($q);
$query = substr($query, $offset);
$offset = 0;
} else { // find matching quote or comment end
while (preg_match('~' . ($found == '/*' ? '\\*/' : (preg_match('~-- |#~', $found) ? "\n" : "$found|\\\\.")) . '|$~s', $query, $match, PREG_OFFSET_CAPTURE, $offset)) { //! respect sql_mode NO_BACKSLASH_ESCAPES
$s = $match[0][0];
$offset = $match[0][1] + strlen($s);
if ($s[0] !== '\\') {
break;
}
}
}
}
}
}
?>
- Filip Procházka
- Moderator | 4668
Kdo používáte kdyby/doctrine tak tam mám už nějakou dobu zkopírovaný ten import z admineru (vylepšený Honzou Tvrdíkem)