update Piwik to version 2.16 (fixes #91)
This commit is contained in:
parent
296343bf3b
commit
d885a4baa9
5833 changed files with 418860 additions and 226988 deletions
|
|
@ -1,6 +1,6 @@
|
|||
<?php
|
||||
/**
|
||||
* Piwik - Open source web analytics
|
||||
* Piwik - free/libre analytics platform
|
||||
*
|
||||
* @link http://piwik.org
|
||||
* @license http://www.gnu.org/licenses/gpl-3.0.html GPL v3 or later
|
||||
|
|
@ -9,14 +9,12 @@
|
|||
namespace Piwik\Db;
|
||||
|
||||
use Exception;
|
||||
use Piwik\AssetManager;
|
||||
use Piwik\Common;
|
||||
use Piwik\Config;
|
||||
|
||||
use Piwik\Container\StaticContainer;
|
||||
use Piwik\Db;
|
||||
use Piwik\DbHelper;
|
||||
use Piwik\Log;
|
||||
use Piwik\SettingsPiwik;
|
||||
use Piwik\SettingsServer;
|
||||
|
||||
class BatchInsert
|
||||
|
|
@ -34,13 +32,12 @@ class BatchInsert
|
|||
public static function tableInsertBatchIterate($tableName, $fields, $values, $ignoreWhenDuplicate = true)
|
||||
{
|
||||
$fieldList = '(' . join(',', $fields) . ')';
|
||||
$ignore = $ignoreWhenDuplicate ? 'IGNORE' : '';
|
||||
$ignore = $ignoreWhenDuplicate ? 'IGNORE' : '';
|
||||
|
||||
foreach ($values as $row) {
|
||||
$query = "INSERT $ignore
|
||||
INTO " . $tableName . "
|
||||
$fieldList
|
||||
VALUES (" . Common::getSqlStringFieldsArray($row) . ")";
|
||||
$query = "INSERT $ignore INTO " . $tableName . "
|
||||
$fieldList
|
||||
VALUES (" . Common::getSqlStringFieldsArray($row) . ")";
|
||||
Db::query($query, $row);
|
||||
}
|
||||
}
|
||||
|
|
@ -54,18 +51,20 @@ class BatchInsert
|
|||
* @param array $values array of data to be inserted
|
||||
* @param bool $throwException Whether to throw an exception that was caught while trying
|
||||
* LOAD DATA INFILE, or not.
|
||||
* @param string $charset The charset to use, defaults to utf8
|
||||
* @throws Exception
|
||||
* @return bool True if the bulk LOAD was used, false if we fallback to plain INSERTs
|
||||
*/
|
||||
public static function tableInsertBatch($tableName, $fields, $values, $throwException = false)
|
||||
public static function tableInsertBatch($tableName, $fields, $values, $throwException = false, $charset = 'utf8')
|
||||
{
|
||||
$filePath = PIWIK_USER_PATH . '/tmp/assets/' . $tableName . '-' . Common::generateUniqId() . '.csv';
|
||||
$filePath = SettingsPiwik::rewriteTmpPathWithHostname($filePath);
|
||||
|
||||
$loadDataInfileEnabled = Config::getInstance()->General['enable_load_data_infile'];
|
||||
|
||||
if ($loadDataInfileEnabled
|
||||
&& Db::get()->hasBulkLoader()) {
|
||||
|
||||
$path = self::getBestPathForLoadData();
|
||||
$filePath = $path . $tableName . '-' . Common::generateUniqId() . '.csv';
|
||||
|
||||
try {
|
||||
$fileSpec = array(
|
||||
'delim' => "\t",
|
||||
|
|
@ -76,13 +75,9 @@ class BatchInsert
|
|||
},
|
||||
'eol' => "\r\n",
|
||||
'null' => 'NULL',
|
||||
'charset' => $charset
|
||||
);
|
||||
|
||||
// hack for charset mismatch
|
||||
if (!DbHelper::isDatabaseConnectionUTF8() && !isset(Config::getInstance()->database['charset'])) {
|
||||
$fileSpec['charset'] = 'latin1';
|
||||
}
|
||||
|
||||
self::createCSVFile($filePath, $fileSpec, $values);
|
||||
|
||||
if (!is_readable($filePath)) {
|
||||
|
|
@ -95,20 +90,40 @@ class BatchInsert
|
|||
return true;
|
||||
}
|
||||
} catch (Exception $e) {
|
||||
Log::info("LOAD DATA INFILE failed or not supported, falling back to normal INSERTs... Error was: %s", $e->getMessage());
|
||||
|
||||
if ($throwException) {
|
||||
throw $e;
|
||||
}
|
||||
}
|
||||
|
||||
// if all else fails, fallback to a series of INSERTs
|
||||
if (file_exists($filePath)) {
|
||||
@unlink($filePath);
|
||||
}
|
||||
}
|
||||
|
||||
// if all else fails, fallback to a series of INSERTs
|
||||
@unlink($filePath);
|
||||
self::tableInsertBatchIterate($tableName, $fields, $values);
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
private static function getBestPathForLoadData()
|
||||
{
|
||||
try {
|
||||
$path = Db::fetchOne('SELECT @@secure_file_priv'); // was introduced in 5.0.38
|
||||
} catch (Exception $e) {
|
||||
// we do not rethrow exception as an error is expected if MySQL is < 5.0.38
|
||||
// in this case tableInsertBatch might still work
|
||||
}
|
||||
|
||||
if (empty($path) || !is_dir($path) || !is_writable($path)) {
|
||||
$path = StaticContainer::get('path.tmp') . '/assets/';
|
||||
} elseif (!Common::stringEndsWith($path, '/')) {
|
||||
$path .= '/';
|
||||
}
|
||||
|
||||
return $path;
|
||||
}
|
||||
|
||||
/**
|
||||
* Batch insert into table from CSV (or other delimited) file.
|
||||
*
|
||||
|
|
@ -124,7 +139,7 @@ class BatchInsert
|
|||
{
|
||||
// Chroot environment: prefix the path with the absolute chroot path
|
||||
$chrootPath = Config::getInstance()->General['absolute_chroot_path'];
|
||||
if(!empty($chrootPath)) {
|
||||
if (!empty($chrootPath)) {
|
||||
$filePath = $chrootPath . $filePath;
|
||||
}
|
||||
|
||||
|
|
@ -161,19 +176,20 @@ class BatchInsert
|
|||
";
|
||||
|
||||
/*
|
||||
* First attempt: assume web server and MySQL server are on the same machine;
|
||||
* this requires that the db user have the FILE privilege; however, since this is
|
||||
* a global privilege, it may not be granted due to security concerns
|
||||
*/
|
||||
* First attempt: assume web server and MySQL server are on the same machine;
|
||||
* this requires that the db user have the FILE privilege; however, since this is
|
||||
* a global privilege, it may not be granted due to security concerns
|
||||
*/
|
||||
$keywords = array('');
|
||||
|
||||
/*
|
||||
* Second attempt: using the LOCAL keyword means the client reads the file and sends it to the server;
|
||||
* the LOCAL keyword may trigger a known PHP PDO_MYSQL bug when MySQL not built with --enable-local-infile
|
||||
* @see http://bugs.php.net/bug.php?id=54158
|
||||
*/
|
||||
* Second attempt: using the LOCAL keyword means the client reads the file and sends it to the server;
|
||||
* the LOCAL keyword may trigger a known PHP PDO\MYSQL bug when MySQL not built with --enable-local-infile
|
||||
* @see http://bugs.php.net/bug.php?id=54158
|
||||
*/
|
||||
$openBaseDir = ini_get('open_basedir');
|
||||
$safeMode = ini_get('safe_mode');
|
||||
$safeMode = ini_get('safe_mode');
|
||||
|
||||
if (empty($openBaseDir) && empty($safeMode)) {
|
||||
// php 5.x - LOAD DATA LOCAL INFILE is disabled if open_basedir restrictions or safe_mode enabled
|
||||
$keywords[] = 'LOCAL ';
|
||||
|
|
@ -191,22 +207,21 @@ class BatchInsert
|
|||
|
||||
return true;
|
||||
} catch (Exception $e) {
|
||||
// echo $sql . ' ---- ' . $e->getMessage();
|
||||
$code = $e->getCode();
|
||||
$message = $e->getMessage() . ($code ? "[$code]" : '');
|
||||
if (!Db::get()->isErrNo($e, '1148')) {
|
||||
Log::info("LOAD DATA INFILE failed... Error was: %s", $message);
|
||||
}
|
||||
$exceptions[] = "\n Try #" . (count($exceptions) + 1) . ': ' . $queryStart . ": " . $message;
|
||||
}
|
||||
}
|
||||
|
||||
if (count($exceptions)) {
|
||||
throw new Exception(implode(",", $exceptions));
|
||||
$message = "LOAD DATA INFILE failed... Error was: " . implode(",", $exceptions);
|
||||
Log::info($message);
|
||||
throw new Exception($message);
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Create CSV (or other delimited) files
|
||||
*
|
||||
|
|
@ -215,13 +230,13 @@ class BatchInsert
|
|||
* @param array $rows Array of array corresponding to rows of values
|
||||
* @throws Exception if unable to create or write to file
|
||||
*/
|
||||
static protected function createCSVFile($filePath, $fileSpec, $rows)
|
||||
protected static function createCSVFile($filePath, $fileSpec, $rows)
|
||||
{
|
||||
// Set up CSV delimiters, quotes, etc
|
||||
$delim = $fileSpec['delim'];
|
||||
$quote = $fileSpec['quote'];
|
||||
$eol = $fileSpec['eol'];
|
||||
$null = $fileSpec['null'];
|
||||
$eol = $fileSpec['eol'];
|
||||
$null = $fileSpec['null'];
|
||||
$escapespecial_cb = $fileSpec['escapespecial_cb'];
|
||||
|
||||
$fp = @fopen($filePath, 'wb');
|
||||
|
|
@ -248,6 +263,7 @@ class BatchInsert
|
|||
throw new Exception('Error writing to the tmp file ' . $filePath);
|
||||
}
|
||||
}
|
||||
|
||||
fclose($fp);
|
||||
|
||||
@chmod($filePath, 0777);
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue