Completed
Push — master ( ca99e9...18d42b )
by Rasmus
02:33
created

PreparedPDOStatement::getRowsAffected()   A

Complexity

Conditions 1
Paths 1

Size

Total Lines 4
Code Lines 2

Duplication

Lines 0
Ratio 0 %

Code Coverage

Tests 0
CRAP Score 2

Importance

Changes 1
Bugs 0 Features 0
Metric Value
c 1
b 0
f 0
dl 0
loc 4
ccs 0
cts 2
cp 0
rs 10
cc 1
eloc 2
nc 1
nop 0
crap 2
1
<?php
2
3
namespace mindplay\sql\pdo;
4
5
use InvalidArgumentException;
6
use mindplay\sql\framework\PreparedStatement;
7
use mindplay\sql\framework\SQLException;
8
use PDO;
9
use PDOStatement;
10
11
/**
12
 * This class implements a Prepared Statement adapter for PDO Statements.
13
 */
14
class PreparedPDOStatement implements PreparedStatement
15
{
16
    /**
17
     * @var PDOStatement
18
     */
19
    private $handle;
20
21
    /**
22
     * @var array
23
     */
24
    private $params;
25
26
    /**
27
     * @var bool
28
     */
29
    private $executed = false;
30
31
    /**
32
     * @param PDOStatement $handle
33
     */
34 1
    public function __construct(PDOStatement $handle)
35
    {
36 1
        $this->handle = $handle;
37 1
    }
38
39
    /**
40
     * @inheritdoc
41
     */
42 1
    public function bind($name, $value)
43
    {
44 1
        static $PDO_TYPE = [
45
            'integer' => PDO::PARAM_INT,
46
            'double'  => PDO::PARAM_STR, // bind as string, since there's no float type in PDO
47
            'string'  => PDO::PARAM_STR,
48
            'boolean' => PDO::PARAM_BOOL,
49
            'NULL'    => PDO::PARAM_NULL,
50
        ];
51
52 1
        $value_type = gettype($value);
53
54 1
        if (isset($PDO_TYPE[$value_type])) {
55 1
            $this->handle->bindValue($name, $value, $PDO_TYPE[$value_type]);
56
57 1
            $this->params[$name] = $value;
58
        } else {
59 1
            throw new InvalidArgumentException("unexpected value type: {$value_type}");
60
        }
61 1
    }
62
63
    /**
64
     * @inheritdoc
65
     */
66 1
    public function execute()
67
    {
68 1
        if ($this->handle->execute() === false) {
69
            $error = $this->handle->errorInfo();
70
            
71
            throw new SQLException($this->handle->queryString, $this->params, "{$error[0]}: {$error[2]}", $error[1]);
72
        }
73
        
74 1
        $this->executed = true;
75 1
    }
76
77
    /**
78
     * @inheritdoc
79
     */
80 1
    public function fetch()
81
    {
82 1
        if (! $this->executed) {
83 1
            $this->execute();
84
        }
85
86 1
        $result = $this->handle->fetch(PDO::FETCH_ASSOC);
87
        
88 1
        if ($result === false) {
89 1
            return null;
90
        }
91
        
92 1
        return $result;
93
    }
94
95
    /**
96
     * @inheritdoc
97
     */
98
    public function getRowsAffected()
99
    {
100
        return $this->handle->rowCount();
101
    }
102
}
103