1: <?php
2:
3: 4: 5: 6:
7:
8: namespace Nette\Database\Drivers;
9:
10: use Nette;
11:
12:
13: 14: 15:
16: class MsSqlDriver implements Nette\Database\ISupplementalDriver
17: {
18: use Nette\SmartObject;
19:
20: public function convertException(\PDOException $e)
21: {
22: return Nette\Database\DriverException::from($e);
23: }
24:
25:
26:
27:
28:
29: 30: 31:
32: public function delimite($name)
33: {
34:
35: return '[' . str_replace(['[', ']'], ['[[', ']]'], $name) . ']';
36: }
37:
38:
39: 40: 41:
42: public function formatBool($value)
43: {
44: return $value ? '1' : '0';
45: }
46:
47:
48: 49: 50:
51: public function formatDateTime( $value)
52: {
53: return $value->format("'Y-m-d H:i:s'");
54: }
55:
56:
57: 58: 59:
60: public function formatDateInterval(\DateInterval $value)
61: {
62: throw new Nette\NotSupportedException;
63: }
64:
65:
66: 67: 68:
69: public function formatLike($value, $pos)
70: {
71: $value = strtr($value, ["'" => "''", '%' => '[%]', '_' => '[_]', '[' => '[[]']);
72: return ($pos <= 0 ? "'%" : "'") . $value . ($pos >= 0 ? "%'" : "'");
73: }
74:
75:
76: 77: 78:
79: public function applyLimit(&$sql, $limit, $offset)
80: {
81: if ($offset) {
82: throw new Nette\NotSupportedException('Offset is not supported by this database.');
83:
84: } elseif ($limit < 0) {
85: throw new Nette\InvalidArgumentException('Negative offset or limit.');
86:
87: } elseif ($limit !== null) {
88: $sql = preg_replace('#^\s*(SELECT(\s+DISTINCT|\s+ALL)?|UPDATE|DELETE)#i', '$0 TOP ' . (int) $limit, $sql, 1, $count);
89: if (!$count) {
90: throw new Nette\InvalidArgumentException('SQL query must begin with SELECT, UPDATE or DELETE command.');
91: }
92: }
93: }
94:
95:
96: 97: 98:
99: public function normalizeRow($row)
100: {
101: return $row;
102: }
103:
104:
105:
106:
107:
108: 109: 110:
111: public function getTables()
112: {
113: throw new Nette\NotImplementedException;
114: }
115:
116:
117: 118: 119:
120: public function getColumns($table)
121: {
122: throw new Nette\NotImplementedException;
123: }
124:
125:
126: 127: 128:
129: public function getIndexes($table)
130: {
131: throw new Nette\NotImplementedException;
132: }
133:
134:
135: 136: 137:
138: public function getForeignKeys($table)
139: {
140: throw new Nette\NotImplementedException;
141: }
142:
143:
144: 145: 146:
147: public function getColumnTypes(\PDOStatement $statement)
148: {
149: return Nette\Database\Helpers::detectTypes($statement);
150: }
151:
152:
153: 154: 155: 156:
157: public function isSupported($item)
158: {
159: return $item === self::SUPPORT_SUBSELECT;
160: }
161: }
162: