SOP.wtf/includes/ExtendedPdo.php

164 lines
3.5 KiB
PHP

<?php
/**
*
* This file is part of Aura for PHP.
*
* @license https://opensource.org/licenses/MIT MIT
*
*/
namespace Aura\Sql;
use Aura\Sql\Profiler\Profiler;
use Aura\Sql\Profiler\ProfilerInterface;
use PDO;
/**
*
* A lazy-connecting PDO with extended methods.
*
* @package Aura.Sql
*
*/
class ExtendedPdo extends AbstractExtendedPdo
{
/**
*
* Constructor arguments for instantiating the PDO connection.
*
* @var array
*
*/
protected $args = [];
/**
*
* Constructor.
*
* This overrides the parent so that it can take connection attributes as a
* constructor parameter, and set them after connection.
*
* @param string $dsn The data source name for the connection.
*
* @param string $username The username for the connection.
*
* @param string $password The password for the connection.
*
* @param array $options Driver-specific options for the connection.
*
* @param array $queries Queries to execute after the connection.
*
* @param ProfilerInterface $profiler Tracks and logs query profiles.
*
* @see http://php.net/manual/en/pdo.construct.php
*
*/
public function __construct(
$dsn,
$username = null,
$password = null,
array $options = [],
array $queries = [],
ProfilerInterface $profiler = null
) {
// if no error mode is specified, use exceptions
if (! isset($options[PDO::ATTR_ERRMODE])) {
$options[PDO::ATTR_ERRMODE] = PDO::ERRMODE_EXCEPTION;
}
// retain the arguments for later
$this->args = [
$dsn,
$username,
$password,
$options,
$queries
];
// retain a profiler, instantiating a default one if needed
if ($profiler === null) {
$profiler = new Profiler();
}
$this->setProfiler($profiler);
// retain a query parser
$parts = explode(':', $dsn);
$parser = $this->newParser($parts[0]);
$this->setParser($parser);
// set quotes for identifier names
$this->setQuoteName($parts[0]);
}
/**
*
* Connects to the database.
*
* @return null
*
*/
public function connect()
{
if ($this->pdo) {
return;
}
// connect
$this->profiler->start(__FUNCTION__);
list($dsn, $username, $password, $options, $queries) = $this->args;
$this->pdo = new PDO($dsn, $username, $password, $options);
$this->profiler->finish();
// connection-time queries
foreach ($queries as $query) {
$this->exec($query);
}
}
/**
*
* Disconnects from the database.
*
* @return null
*
*/
public function disconnect()
{
$this->profiler->start(__FUNCTION__);
$this->pdo = null;
$this->profiler->finish();
}
/**
*
* The purpose of this method is to hide sensitive data from stack traces.
*
* @return array
*
*/
public function __debugInfo()
{
return [
'args' => [
$this->args[0],
'****',
'****',
$this->args[3],
$this->args[4],
]
];
}
/**
*
* Return the inner PDO (if any)
*
* @return \PDO
*
*/
public function getPdo()
{
$this->connect();
return $this->pdo;
}
}