Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
16 changes: 16 additions & 0 deletions src/PHPCensor/Builder.php
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,7 @@
use PHPCensor\Model\Build;
use b8\Config;
use b8\Store\Factory;
use PHPCensor\Store\BuildErrorWriter;
use Psr\Log\LoggerAwareInterface;
use Psr\Log\LoggerInterface;
use Psr\Log\LogLevel;
Expand Down Expand Up @@ -90,6 +91,11 @@ class Builder implements LoggerAwareInterface
*/
protected $buildLogger;

/**
* @var BuildErrorWriter
*/
private $buildErrorWriter;

/**
* Set up the builder.
*
Expand All @@ -114,6 +120,7 @@ public function __construct(Build $build, LoggerInterface $logger = null)
);

$this->interpolator = new BuildInterpolator();
$this->buildErrorWriter = new BuildErrorWriter($this->build->getId());
}

/**
Expand Down Expand Up @@ -245,6 +252,7 @@ public function execute()
$this->build->removeBuildDirectory();
}

$this->buildErrorWriter->flush();
$this->store->save($this->build);
}

Expand Down Expand Up @@ -431,4 +439,12 @@ function () use ($self) {

return $pluginFactory;
}

/**
* @return BuildErrorWriter
*/
public function getBuildErrorWriter()
{
return $this->buildErrorWriter;
}
}
24 changes: 10 additions & 14 deletions src/PHPCensor/Model/Build.php
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@
namespace PHPCensor\Model;

use PHPCensor\Builder;
use PHPCensor\Store\BuildErrorWriter;
use Symfony\Component\Yaml\Parser as YamlParser;
use PHPCensor\Model;
use b8\Store\Factory;
Expand Down Expand Up @@ -840,7 +841,6 @@ public function getCommitMessage()
* @param null $file
* @param null $lineStart
* @param null $lineEnd
* @return BuildError
*/
public function reportError(
Builder $builder,
Expand All @@ -851,19 +851,15 @@ public function reportError(
$lineStart = null,
$lineEnd = null
) {
unset($builder);

$error = new BuildError();
$error->setBuild($this);
$error->setCreatedDate(new \DateTime());
$error->setPlugin($plugin);
$error->setMessage($message);
$error->setSeverity($severity);
$error->setFile($file);
$error->setLineStart($lineStart);
$error->setLineEnd($lineEnd);

return Factory::getStore('BuildError')->save($error);
$writer = $builder->getBuildErrorWriter();
$writer->write(
$plugin,
$message,
$severity,
$file,
$lineStart,
$lineEnd
);
}

/**
Expand Down
2 changes: 1 addition & 1 deletion src/PHPCensor/Model/Build/GithubBuild.php
Original file line number Diff line number Diff line change
Expand Up @@ -222,7 +222,7 @@ public function reportError(
}
}

return parent::reportError($builder, $plugin, $message, $severity, $file, $lineStart, $lineEnd);
parent::reportError($builder, $plugin, $message, $severity, $file, $lineStart, $lineEnd);
}

/**
Expand Down
117 changes: 117 additions & 0 deletions src/PHPCensor/Store/BuildErrorWriter.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,117 @@
<?php

namespace PHPCensor\Store;

use b8\Database;

/**
* Class BuildErrorWriter
*/
class BuildErrorWriter
{
/** @var int */
protected $build_id;

/** @var array */
protected $errors = [];

/** @var int */
protected $buffer_size;

/**
* BuildErrorWriter constructor.
* @param int $build_id
* @param int $buffer_size
*/
public function __construct($build_id, $buffer_size = 10000)
{
$this->build_id = $build_id;
$this->buffer_size = max((int) $buffer_size, 1);
}

/**
* Destructor
*/
public function __destruct()
{
$this->flush();
}

/**
* Write error
* @param string $plugin
* @param string $message
* @param int $severity
* @param string $file
* @param int $line_start
* @param int $line_end
* @param \DateTime $created_date
*/
public function write($plugin, $message, $severity, $file = null, $line_start = null, $line_end = null, $created_date = null)
{
if (is_null($created_date)) {
$created_date = new \DateTime();
}
$this->errors[] = array(
'plugin' => (string)$plugin,
'message' => (string)$message,
'severity' => (int)$severity,
'file' => !is_null($file) ? (string)$file : null,
'line_start' => !is_null($line_start) ? (int)$line_start : null,
'line_end' => !is_null($line_end) ? (int)$line_end : null,
'created_date' => $created_date->format('Y-m-d H:i:s'),
);
if (count($this->errors) >= $this->buffer_size) {
$this->flush();
}
}

/**
* Flush buffer
*/
public function flush()
{
if (empty($this->errors)) {
return;
}

$insert_values_placeholders = [];
$insert_values_data = [];
foreach ($this->errors as $i => $error) {
$insert_values_placeholders[] = '(
:build_id' . $i . ',
:plugin' . $i . ',
:file' . $i . ',
:line_start' . $i . ',
:line_end' . $i . ',
:severity' . $i . ',
:message' . $i . ',
:created_date' . $i . '
)';
$insert_values_data['build_id' . $i] = $this->build_id;
$insert_values_data['plugin' . $i] = $error['plugin'];
$insert_values_data['file' . $i] = $error['file'];
$insert_values_data['line_start' . $i] = $error['line_start'];
$insert_values_data['line_end' . $i] = $error['line_end'];
$insert_values_data['severity' . $i] = $error['severity'];
$insert_values_data['message' . $i] = $error['message'];
$insert_values_data['created_date' . $i] = $error['created_date'];
}
$query = '
INSERT INTO {{build_error}} (
{{build_id}},
{{plugin}},
{{file}},
{{line_start}},
{{line_end}},
{{severity}},
{{message}},
{{created_date}}
)
VALUES ' . join(', ', $insert_values_placeholders) . '
';
$stmt = Database::getConnection('write')->prepareCommon($query);
$stmt->execute($insert_values_data);
$this->errors = [];
}
}