/** * The main loop * * @return void * **/ public function startConsole() { require_once 'ShallowParser.php'; $parser = new Boris_ShallowParser(); $buf = ''; $prompt = '>> '; // Oh so infinite for (;;) { // Read the line from the CLI. If we haven't yet terminated the current statement, // add an asterisk to the prompt as a little visual hint $line = readline($buf == '' ? $prompt : str_pad('?> ', strlen($prompt), ' ', STR_PAD_LEFT)); // Add to the history if ($line == 'clear') { $this->clear(); continue; } readline_add_history($line); if ($line === false) { break; } $buf .= $line; if ($this->profiling) { Varien_Profiler::reset('test'); Varien_Profiler::start('test'); } if ($this->database) { $res = Mage::getSingleton('core/resource')->getConnection('core_read'); $profiler = $res->getProfiler(); $profiler->setEnabled(true); $profiler->clear(); } // This is some clever stuff from Boris. It parses the current command // and finds out what the heck is going on in there and if it's finished // yet. if ($statements = $parser->statements($buf)) { $buf = ''; $fromglobalfunction = false; // Then try each statement foreach ($statements as $stmt) { try { // The exciting bit $result = eval($stmt); if ($result !== 'fromglobalfunction') { $this->output($result); } else { $fromglobalfunction = true; } } catch (Exception $e) { $this->out("! " . $e->getMessage(), 'red'); continue; } } if ($this->profiling) { Varien_Profiler::stop('test'); } if ($this->database) { if ($profiler->getEnabled()) { $totalTime = $profiler->getTotalElapsedSecs(); $queryCount = $profiler->getTotalNumQueries(); $longestTime = 0; $longestQuery = null; if ($queryCount) { foreach ($profiler->getQueryProfiles() as $query) { if ($query->getElapsedSecs() > $longestTime) { $longestTime = $query->getElapsedSecs(); $this->out($query->getQuery(), "yellow", null, false); $this->outTime($query->getElapsedSecs()); } } } } } if ($this->profiling && !$fromglobalfunction) { $this->outTime(Varien_Profiler::fetch('test'), "Duration: "); } } } }