dumpUrl)) { $dumpPath = $this->dumpUrl; } else { $dumpPath = PIWIK_INCLUDE_PATH . '/tmp/logdump.sql.gz'; $bytesRead = $this->downloadDumpInPath($dumpPath); // sanity check if ($bytesRead <= 40 * 1024 * 1024) { $str = "Could not download sql dump! You can manually download %s into %s"; throw new Exception(sprintf($str, $this->dumpUrl, $dumpPath)); } } // unzip the dump if (substr($dumpPath, -3) === ".gz") { $deflatedDumpPath = PIWIK_INCLUDE_PATH . '/tmp/logdump.sql'; // TODO: should depend on name of URL exec("gunzip -c \"" . $dumpPath . "\" > \"$deflatedDumpPath\"", $output, $return); if ($return !== 0) { throw new Exception("gunzip failed: " . implode("\n", $output)); } } else { $deflatedDumpPath = $dumpPath; } // load the data into the correct database $user = Config::getInstance()->database['username']; $password = Config::getInstance()->database['password']; $host = Config::getInstance()->database['host']; Config::getInstance()->database['tables_prefix'] = $this->tablesPrefix; $cmd = "mysql -h \"$host\" -u \"$user\" \"--password=$password\" {$this->dbName} < \"" . $deflatedDumpPath . "\" 2>&1"; exec($cmd, $output, $return); if ($return !== 0) { throw new Exception("Failed to load sql dump: " . implode("\n", $output)); } // make sure archiving will be called Rules::setBrowserTriggerArchiving(true); // reload access Access::getInstance()->reloadAccess(); $testVars = new TestingEnvironmentVariables(); $testVars->configOverride = array( 'database' => array( 'tables_prefix' => $this->tablesPrefix ) ); $testVars->save(); } /** * maybe this could use downloadAndUnzip(self::$geoLiteCityDbUrl, $geoIpOutputDir, 'GeoIPCity.dat'); * * @param $dumpPath * @return int */ protected function downloadDumpInPath($dumpPath) { $bufferSize = 1024 * 1024; $dump = fopen($this->dumpUrl, 'rb'); $outfile = fopen($dumpPath, 'wb'); $bytesRead = 0; while (!feof($dump)) { fwrite($outfile, fread($dump, $bufferSize), $bufferSize); $bytesRead += $bufferSize; } fclose($dump); fclose($outfile); return $bytesRead; } }