summaryrefslogtreecommitdiff
path: root/vendor/doctrine/dbal/src/Driver/OCI8/Statement.php
diff options
context:
space:
mode:
Diffstat (limited to 'vendor/doctrine/dbal/src/Driver/OCI8/Statement.php')
-rw-r--r--vendor/doctrine/dbal/src/Driver/OCI8/Statement.php103
1 files changed, 103 insertions, 0 deletions
diff --git a/vendor/doctrine/dbal/src/Driver/OCI8/Statement.php b/vendor/doctrine/dbal/src/Driver/OCI8/Statement.php
new file mode 100644
index 0000000..408f0dd
--- /dev/null
+++ b/vendor/doctrine/dbal/src/Driver/OCI8/Statement.php
@@ -0,0 +1,103 @@
1<?php
2
3declare(strict_types=1);
4
5namespace Doctrine\DBAL\Driver\OCI8;
6
7use Doctrine\DBAL\Driver\OCI8\Exception\Error;
8use Doctrine\DBAL\Driver\OCI8\Exception\UnknownParameterIndex;
9use Doctrine\DBAL\Driver\Statement as StatementInterface;
10use Doctrine\DBAL\ParameterType;
11
12use function is_int;
13use function oci_bind_by_name;
14use function oci_execute;
15use function oci_new_descriptor;
16
17use const OCI_B_BIN;
18use const OCI_B_BLOB;
19use const OCI_COMMIT_ON_SUCCESS;
20use const OCI_D_LOB;
21use const OCI_NO_AUTO_COMMIT;
22use const OCI_TEMP_BLOB;
23use const SQLT_CHR;
24
25final class Statement implements StatementInterface
26{
27 /**
28 * @internal The statement can be only instantiated by its driver connection.
29 *
30 * @param resource $connection
31 * @param resource $statement
32 * @param array<int,string> $parameterMap
33 */
34 public function __construct(
35 private readonly mixed $connection,
36 private readonly mixed $statement,
37 private readonly array $parameterMap,
38 private readonly ExecutionMode $executionMode,
39 ) {
40 }
41
42 public function bindValue(int|string $param, mixed $value, ParameterType $type): void
43 {
44 if (is_int($param)) {
45 if (! isset($this->parameterMap[$param])) {
46 throw UnknownParameterIndex::new($param);
47 }
48
49 $param = $this->parameterMap[$param];
50 }
51
52 if ($type === ParameterType::LARGE_OBJECT) {
53 if ($value !== null) {
54 $lob = oci_new_descriptor($this->connection, OCI_D_LOB);
55 $lob->writeTemporary($value, OCI_TEMP_BLOB);
56
57 $value =& $lob;
58 } else {
59 $type = ParameterType::STRING;
60 }
61 }
62
63 if (
64 ! @oci_bind_by_name(
65 $this->statement,
66 $param,
67 $value,
68 -1,
69 $this->convertParameterType($type),
70 )
71 ) {
72 throw Error::new($this->statement);
73 }
74 }
75
76 /**
77 * Converts DBAL parameter type to oci8 parameter type
78 */
79 private function convertParameterType(ParameterType $type): int
80 {
81 return match ($type) {
82 ParameterType::BINARY => OCI_B_BIN,
83 ParameterType::LARGE_OBJECT => OCI_B_BLOB,
84 default => SQLT_CHR,
85 };
86 }
87
88 public function execute(): Result
89 {
90 if ($this->executionMode->isAutoCommitEnabled()) {
91 $mode = OCI_COMMIT_ON_SUCCESS;
92 } else {
93 $mode = OCI_NO_AUTO_COMMIT;
94 }
95
96 $ret = @oci_execute($this->statement, $mode);
97 if (! $ret) {
98 throw Error::new($this->statement);
99 }
100
101 return new Result($this->statement);
102 }
103}