Helper::loadFromFile a procedury a triggery

Upozornění: Tohle vlákno je hodně staré a informace nemusí být platné pro současné Nette.
Jirda
Člen | 103
+
0
-

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
+
0
-

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;
						}
					}
				}
			}
		}
	}



?>
enumag
Člen | 2118
+
0
-

thunderbuff: Jo taky jsem si říkal že by bylo fajn použít import z Admineru. Neměl bys skladem i export?

Editoval enumag (31. 8. 2013 11:10)

Filip Procházka
Moderator | 4668
+
0
-

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)