2016-10-12 22:12:25 -04:00
|
|
|
<?php declare(strict_types=1);
|
2012-04-10 14:06:34 -04:00
|
|
|
/**
|
|
|
|
* Query
|
|
|
|
*
|
2016-09-07 13:17:17 -04:00
|
|
|
* SQL Query Builder / Database Abstraction Layer
|
2012-04-10 14:06:34 -04:00
|
|
|
*
|
2019-12-11 16:49:42 -05:00
|
|
|
* PHP version 7.2
|
2016-09-07 13:17:17 -04:00
|
|
|
*
|
|
|
|
* @package Query
|
|
|
|
* @author Timothy J. Warren <tim@timshomepage.net>
|
2019-12-11 16:49:42 -05:00
|
|
|
* @copyright 2012 - 2019 Timothy J. Warren
|
2016-09-07 13:17:17 -04:00
|
|
|
* @license http://www.opensource.org/licenses/mit-license.html MIT License
|
2019-12-11 16:49:42 -05:00
|
|
|
* @link https://git.timshomepage.net/aviat/Query
|
|
|
|
* @version 3.0.0
|
2012-04-10 14:06:34 -04:00
|
|
|
*/
|
2015-07-16 16:56:13 -04:00
|
|
|
namespace Query\Drivers\Pgsql;
|
2014-04-02 17:08:50 -04:00
|
|
|
|
2016-10-13 21:55:23 -04:00
|
|
|
use Query\Drivers\AbstractDriver;
|
2016-09-07 17:39:19 -04:00
|
|
|
|
2012-04-10 14:06:34 -04:00
|
|
|
/**
|
2016-09-07 17:39:19 -04:00
|
|
|
* PostgreSQL specific class
|
2012-04-10 14:06:34 -04:00
|
|
|
*/
|
2018-01-24 13:14:03 -05:00
|
|
|
class Driver extends AbstractDriver {
|
2012-04-10 14:06:34 -04:00
|
|
|
|
|
|
|
/**
|
|
|
|
* Connect to a PosgreSQL database
|
|
|
|
*
|
2015-07-30 16:40:30 -04:00
|
|
|
* @codeCoverageIgnore
|
2012-04-10 14:06:34 -04:00
|
|
|
* @param string $dsn
|
2012-04-19 11:42:50 -04:00
|
|
|
* @param string $username
|
|
|
|
* @param string $password
|
|
|
|
* @param array $options
|
2012-04-10 14:06:34 -04:00
|
|
|
*/
|
2018-01-24 13:25:42 -05:00
|
|
|
public function __construct(string $dsn, string $username=NULL, string $password=NULL, array $options=[])
|
2012-04-10 14:06:34 -04:00
|
|
|
{
|
2015-11-11 09:25:21 -05:00
|
|
|
if (strpos($dsn, 'pgsql') === FALSE)
|
|
|
|
{
|
|
|
|
$dsn = 'pgsql:'.$dsn;
|
|
|
|
}
|
2014-03-26 20:49:33 -04:00
|
|
|
|
2012-07-05 14:19:49 -04:00
|
|
|
parent::__construct($dsn, $username, $password, $options);
|
2012-04-10 14:06:34 -04:00
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Get a list of schemas for the current connection
|
|
|
|
*
|
|
|
|
* @return array
|
|
|
|
*/
|
2018-01-22 15:43:56 -05:00
|
|
|
public function getSchemas(): ?array
|
2012-04-10 14:06:34 -04:00
|
|
|
{
|
|
|
|
$sql = <<<SQL
|
|
|
|
SELECT DISTINCT "schemaname" FROM "pg_tables"
|
|
|
|
WHERE "schemaname" NOT LIKE 'pg\_%'
|
|
|
|
AND "schemaname" != 'information_schema'
|
|
|
|
SQL;
|
|
|
|
|
2016-10-13 21:55:23 -04:00
|
|
|
return $this->driverQuery($sql);
|
2012-04-10 14:06:34 -04:00
|
|
|
}
|
2014-04-17 16:41:12 -04:00
|
|
|
|
|
|
|
/**
|
|
|
|
* Retrieve foreign keys for the table
|
|
|
|
*
|
|
|
|
* @param string $table
|
|
|
|
* @return array
|
|
|
|
*/
|
2018-01-22 15:43:56 -05:00
|
|
|
public function getFks($table): array
|
2014-04-17 16:41:12 -04:00
|
|
|
{
|
2016-10-13 21:55:23 -04:00
|
|
|
$valueMap = [
|
2014-04-17 16:41:12 -04:00
|
|
|
'c' => 'CASCADE',
|
|
|
|
'r' => 'RESTRICT',
|
2016-09-07 13:10:03 -04:00
|
|
|
];
|
2014-04-17 16:41:12 -04:00
|
|
|
|
2016-10-13 21:55:23 -04:00
|
|
|
$keys = parent::getFks($table);
|
2014-04-17 16:41:12 -04:00
|
|
|
|
|
|
|
foreach($keys as &$key)
|
|
|
|
{
|
2016-09-07 13:10:03 -04:00
|
|
|
foreach(['update', 'delete'] AS $type)
|
2014-04-17 16:41:12 -04:00
|
|
|
{
|
2019-12-11 16:49:06 -05:00
|
|
|
if ( ! isset($valueMap[$key[$type]]))
|
|
|
|
{
|
|
|
|
continue;
|
|
|
|
}
|
2014-04-17 16:41:12 -04:00
|
|
|
|
2016-10-13 21:55:23 -04:00
|
|
|
$key[$type] = $valueMap[$key[$type]];
|
2014-04-17 16:41:12 -04:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
return $keys;
|
|
|
|
}
|
2016-10-13 21:55:23 -04:00
|
|
|
}
|