%PDF- %PDF-
| Direktori : /home/vacivi36/dossteste.vacivitta.com.br/system/Database/OCI8/ |
| Current File : /home/vacivi36/dossteste.vacivitta.com.br/system/Database/OCI8/PreparedQuery.php |
<?php
/**
* This file is part of CodeIgniter 4 framework.
*
* (c) CodeIgniter Foundation <admin@codeigniter.com>
*
* For the full copyright and license information, please view
* the LICENSE file that was distributed with this source code.
*/
namespace CodeIgniter\Database\OCI8;
use BadMethodCallException;
use CodeIgniter\Database\BasePreparedQuery;
use CodeIgniter\Database\PreparedQueryInterface;
/**
* Prepared query for OCI8
*/
class PreparedQuery extends BasePreparedQuery implements PreparedQueryInterface
{
/**
* A reference to the db connection to use.
*
* @var Connection
*/
protected $db;
/**
* Latest inserted table name.
*/
private ?string $lastInsertTableName = null;
/**
* Prepares the query against the database, and saves the connection
* info necessary to execute the query later.
*
* NOTE: This version is based on SQL code. Child classes should
* override this method.
*
* @param array $options Passed to the connection's prepare statement.
* Unused in the OCI8 driver.
*
* @return mixed
*/
public function _prepare(string $sql, array $options = [])
{
if (! $this->statement = oci_parse($this->db->connID, $this->parameterize($sql))) {
$error = oci_error($this->db->connID);
$this->errorCode = $error['code'] ?? 0;
$this->errorString = $error['message'] ?? '';
}
$this->lastInsertTableName = $this->db->parseInsertTableName($sql);
return $this;
}
/**
* Takes a new set of data and runs it against the currently
* prepared query. Upon success, will return a Results object.
*/
public function _execute(array $data): bool
{
if (null === $this->statement) {
throw new BadMethodCallException('You must call prepare before trying to execute a prepared statement.');
}
$lastKey = 0;
foreach (array_keys($data) as $key) {
oci_bind_by_name($this->statement, ':' . $key, $data[$key]);
$lastKey = $key;
}
$result = oci_execute($this->statement, $this->db->commitMode);
if ($result && $this->lastInsertTableName !== '') {
$this->db->lastInsertedTableName = $this->lastInsertTableName;
}
return $result;
}
/**
* Returns the result object for the prepared query.
*
* @return mixed
*/
public function _getResult()
{
return $this->statement;
}
/**
* Replaces the ? placeholders with :0, :1, etc parameters for use
* within the prepared query.
*/
public function parameterize(string $sql): string
{
// Track our current value
$count = 0;
return preg_replace_callback('/\?/', static function ($matches) use (&$count) {
return ':' . ($count++);
}, $sql);
}
}