Completed
Branch feature/pre-split (1fb805)
by Anton
03:35
created

SQLServerDriver::getHandler()   A

Complexity

Conditions 1
Paths 1

Size

Total Lines 4
Code Lines 2

Duplication

Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
cc 1
eloc 2
nc 1
nop 1
dl 0
loc 4
rs 10
c 0
b 0
f 0
1
<?php
2
/**
3
 * components
4
 *
5
 * @author    Wolfy-J
6
 */
7
namespace Spiral\Database\Drivers\SQLServer;
8
9
use PDO;
10
use Psr\Log\LoggerInterface;
11
use Spiral\Cache\StoreInterface;
12
use Spiral\Core\FactoryInterface;
13
use Spiral\Database\DatabaseInterface;
14
use Spiral\Database\Drivers\SQLServer\Schemas\SQLServerTable;
15
use Spiral\Database\Entities\AbstractHandler;
16
use Spiral\Database\Entities\Driver;
17
use Spiral\Database\Exceptions\DriverException;
18
19
class SQLServerDriver extends Driver
20
{
21
    /**
22
     * Driver type.
23
     */
24
    const TYPE = DatabaseInterface::SQL_SERVER;
25
26
    /**
27
     * Driver schemas.
28
     */
29
    const TABLE_SCHEMA_CLASS = SQLServerTable::class;
30
31
    /**
32
     * Query compiler class.
33
     */
34
    const QUERY_COMPILER = SQLServerCompiler::class;
35
36
    /**
37
     * DateTime format to be used to perform automatic conversion of DateTime objects.
38
     *
39
     * @var string
40
     */
41
    const DATETIME = 'Y-m-d\TH:i:s.000';
42
43
    /**
44
     * @var array
45
     */
46
    protected $options = [
47
        PDO::ATTR_CASE              => PDO::CASE_NATURAL,
48
        PDO::ATTR_ERRMODE           => PDO::ERRMODE_EXCEPTION,
49
        PDO::ATTR_STRINGIFY_FETCHES => false,
50
    ];
51
52
    /**
53
     * {@inheritdoc}
54
     *
55
     * @throws DriverException
56
     */
57
    public function __construct(
58
        $name,
59
        array $options,
60
        FactoryInterface $factory,
61
        StoreInterface $store
62
    ) {
63
        parent::__construct($name, $options, $factory, $store);
64
65
        if ((int)$this->getPDO()->getAttribute(\PDO::ATTR_SERVER_VERSION) < 12) {
66
            throw new DriverException("SQLServer driver supports only 12+ version of SQLServer");
67
        }
68
    }
69
70
    /**
71
     * {@inheritdoc}
72
     */
73
    public function identifier(string $identifier): string
74
    {
75
        return $identifier == '*' ? '*' : '[' . str_replace('[', '[[', $identifier) . ']';
76
    }
77
78
    /**
79
     * {@inheritdoc}
80
     */
81
    public function hasTable(string $name): bool
82
    {
83
        $query = "SELECT COUNT(*) FROM [information_schema].[tables] WHERE [table_type] = 'BASE TABLE' AND [table_name] = ?";
84
85
        return (bool)$this->query($query, [$name])->fetchColumn();
86
    }
87
88
    /**
89
     * {@inheritdoc}
90
     */
91
    public function truncateData(string $table)
92
    {
93
        $this->statement("TRUNCATE TABLE {$this->identifier($table)}");
94
    }
95
96
    /**
97
     * {@inheritdoc}
98
     */
99
    public function tableNames(): array
100
    {
101
        $query = "SELECT [table_name] FROM [information_schema].[tables] WHERE [table_type] = 'BASE TABLE'";
102
103
        $tables = [];
104
        foreach ($this->query($query)->fetch(PDO::FETCH_NUM) as $name) {
105
            $tables[] = $name;
106
        }
107
108
        return $tables;
109
    }
110
111
    /**
112
     * {@inheritdoc}
113
     */
114
    public function getHandler(LoggerInterface $logger = null): AbstractHandler
115
    {
116
        return new SQLServerHandler($this, $logger);
117
    }
118
}