setConnectionParameters($connectionInfo); } elseif (is_resource($connectionInfo)) { $this->setResource($connectionInfo); } } /** * Set connection parameters * * @param array $connectionParameters * @return Connection */ public function setConnectionParameters(array $connectionParameters) { $this->connectionParameters = $connectionParameters; return $this; } /** * Set driver * * @param Pgsql $driver * @return Connection */ public function setDriver(Pgsql $driver) { $this->driver = $driver; return $this; } /** * @param Profiler\ProfilerInterface $profiler * @return Connection */ public function setProfiler(Profiler\ProfilerInterface $profiler) { $this->profiler = $profiler; return $this; } /** * @return null|Profiler\ProfilerInterface */ public function getProfiler() { return $this->profiler; } /** * Set resource * * @param resource $resource * @return Connection */ public function setResource($resource) { $this->resource = $resource; return; } /** * Get current schema * * @return null|string */ public function getCurrentSchema() { if (!$this->isConnected()) { $this->connect(); } $result = pg_query($this->resource, 'SELECT CURRENT_SCHEMA AS "currentschema"'); if ($result == false) { return null; } return pg_fetch_result($result, 0, 'currentschema'); } /** * Get resource * * @return resource */ public function getResource() { if (!$this->isConnected()) { $this->connect(); } return $this->resource; } /** * Connect to the database * * @return Connection * @throws Exception\RuntimeException on failure */ public function connect() { if (is_resource($this->resource)) { return $this; } // localize $p = $this->connectionParameters; // given a list of key names, test for existence in $p $findParameterValue = function (array $names) use ($p) { foreach ($names as $name) { if (isset($p[$name])) { return $p[$name]; } } return null; }; $connection = array(); $connection['host'] = $findParameterValue(array('hostname', 'host')); $connection['user'] = $findParameterValue(array('username', 'user')); $connection['password'] = $findParameterValue(array('password', 'passwd', 'pw')); $connection['dbname'] = $findParameterValue(array('database', 'dbname', 'db', 'schema')); $connection['port'] = (isset($p['port'])) ? (int) $p['port'] : null; $connection['socket'] = (isset($p['socket'])) ? $p['socket'] : null; $connection = array_filter($connection); // remove nulls $connection = http_build_query($connection, null, ' '); // @link http://php.net/pg_connect set_error_handler(function ($number, $string) { throw new Exception\RuntimeException( __METHOD__ . ': Unable to connect to database', null, new Exception\ErrorException($string, $number) ); }); $this->resource = pg_connect($connection); restore_error_handler(); if ($this->resource === false) { throw new Exception\RuntimeException(sprintf( '%s: Unable to connect to database', __METHOD__ )); } return $this; } /** * @return bool */ public function isConnected() { return (is_resource($this->resource)); } /** * @return void */ public function disconnect() { pg_close($this->resource); } /** * @return void */ public function beginTransaction() { if ($this->inTransaction) { throw new Exception\RuntimeException('Nested transactions are not supported'); } if (!$this->isConnected()) { $this->connect(); } pg_query($this->resource, 'BEGIN'); $this->inTransaction = true; } /** * @return void */ public function commit() { if (!$this->inTransaction) { return; // We ignore attempts to commit non-existing transaction } pg_query($this->resource, 'COMMIT'); $this->inTransaction = false; } /** * @return void */ public function rollback() { if (!$this->inTransaction) { return; } pg_query($this->resource, 'ROLLBACK'); $this->inTransaction = false; } /** * @param string $sql * @throws Exception\InvalidQueryException * @return resource|\Zend\Db\ResultSet\ResultSetInterface */ public function execute($sql) { if (!$this->isConnected()) { $this->connect(); } if ($this->profiler) { $this->profiler->profilerStart($sql); } $resultResource = pg_query($this->resource, $sql); if ($this->profiler) { $this->profiler->profilerFinish($sql); } // if the returnValue is something other than a pg result resource, bypass wrapping it if ($resultResource === false) { throw new Exception\InvalidQueryException(pg_errormessage()); } $resultPrototype = $this->driver->createResult(($resultResource === true) ? $this->resource : $resultResource); return $resultPrototype; } /** * @param null $name Ignored * @return string */ public function getLastGeneratedValue($name = null) { if ($name == null) { return null; } $result = pg_query($this->resource, 'SELECT CURRVAL(\'' . str_replace('\'', '\\\'', $name) . '\') as "currval"'); return pg_fetch_result($result, 0, 'currval'); } }