1C-Bitrix 25.700.0
Загрузка...
Поиск...
Не найдено
table.php
См. документацию.
1<?php
2namespace Bitrix\Perfmon\Sql;
3
4use Bitrix\Main\NotSupportedException;
5
6class Table extends BaseObject
7{
8 public $checkExists = false;
10 public $columns = null;
12 public $indexes = null;
14 public $constraints = null;
16 public $triggers = null;
17
21 public function __construct($name = '')
22 {
23 parent::__construct($name);
24 $this->columns = new Collection;
25 $this->indexes = new Collection;
26 $this->constraints = new Collection;
27 $this->triggers = new Collection;
28 }
29
40 public function createTrigger(Tokenizer $tokenizer)
41 {
42 $trigger = Trigger::create($tokenizer);
43 $trigger->setParent($this);
44 $this->triggers->add($trigger);
45 return $this;
46 }
47
59 public function createConstraint(Tokenizer $tokenizer, $constraintName = '')
60 {
61 $constraint = Constraint::create($tokenizer, $constraintName);
62 $constraint->setParent($this);
63 $this->constraints->add($constraint);
64 return $this;
65 }
66
80 public function createIndex(Tokenizer $tokenizer, $unique = false, $fulltext = false, $indexName = '')
81 {
82 $index = Index::create($tokenizer, $unique, $fulltext, $indexName);
83 $index->setParent($this);
84 $this->indexes->add($index);
85 return $this;
86 }
87
98 public function createColumn(Tokenizer $tokenizer)
99 {
100 $column = Column::create($tokenizer, $this);
101 $this->columns->add($column);
102 return $this;
103 }
104
113 public function modifyColumn(Tokenizer $tokenizer)
114 {
115 $column = Column::create($tokenizer);
116 if ($column !== null)
117 {
118 $column->setParent($this);
119 $columnIndex = $this->columns->searchIndex($column->name);
120 if ($columnIndex === null)
121 {
122 throw new NotSupportedException('Column ' . $this->name . '.' . $column->name . ' not found line:' . $tokenizer->getCurrentToken()->line);
123 }
124 $this->columns->set($columnIndex, $column);
125 }
126 return $this;
127 }
128
139 public static function create(Tokenizer $tokenizer)
140 {
141 $checkExists = false;
142 $tokenizer->skipWhiteSpace();
143
144 if ($tokenizer->testUpperText('IF'))
145 {
146 $tokenizer->skipWhiteSpace();
147
148 if ($tokenizer->testUpperText('NOT'))
149 {
150 $tokenizer->skipWhiteSpace();
151 }
152
153 if ($tokenizer->testUpperText('EXISTS'))
154 {
155 $tokenizer->skipWhiteSpace();
156 $checkExists = true;
157 }
158 }
159
160 $table = new Table($tokenizer->getCurrentToken()->text);
161 $table->checkExists = $checkExists;
162
163 $tokenizer->nextToken();
164 $tokenizer->skipWhiteSpace();
165
166 if ($tokenizer->testText('('))
167 {
168 $tokenizer->skipWhiteSpace();
169
170 $token = $tokenizer->getCurrentToken();
171 $level = $token->level;
172 do
173 {
174 if (
175 $tokenizer->testUpperText('INDEX')
176 || $tokenizer->testUpperText('KEY')
177 )
178 {
179 $tokenizer->skipWhiteSpace();
180 $table->createIndex($tokenizer, false);
181 }
182 elseif ($tokenizer->testUpperText('UNIQUE'))
183 {
184 $tokenizer->skipWhiteSpace();
185 if ($tokenizer->testUpperText('KEY'))
186 {
187 $tokenizer->skipWhiteSpace();
188 }
189 elseif ($tokenizer->testUpperText('INDEX'))
190 {
191 $tokenizer->skipWhiteSpace();
192 }
193 $table->createIndex($tokenizer, true);
194 }
195 elseif ($tokenizer->testUpperText('FULLTEXT'))
196 {
197 $tokenizer->skipWhiteSpace();
198 if ($tokenizer->testUpperText('KEY'))
199 {
200 $tokenizer->skipWhiteSpace();
201 }
202 elseif ($tokenizer->testUpperText('INDEX'))
203 {
204 $tokenizer->skipWhiteSpace();
205 }
206 $table->createIndex($tokenizer, false, true);
207 }
208 elseif ($tokenizer->testUpperText('PRIMARY'))
209 {
210 $tokenizer->skipWhiteSpace();
211 if (!$tokenizer->testUpperText('KEY'))
212 {
213 throw new NotSupportedException("'KEY' expected. line:" . $tokenizer->getCurrentToken()->line);
214 }
215
216 $tokenizer->putBack(); //KEY
217 $tokenizer->putBack(); //WS
218 $tokenizer->putBack(); //PRIMARY
219 $table->createConstraint($tokenizer, false);
220 }
221 elseif ($tokenizer->testUpperText('CONSTRAINT'))
222 {
223 $tokenizer->skipWhiteSpace();
224 $constraintName = $tokenizer->getCurrentToken()->text;
225
226 $tokenizer->nextToken();
227 $tokenizer->skipWhiteSpace();
228
229 if ($tokenizer->testUpperText('PRIMARY') || $tokenizer->testUpperText('UNIQUE'))
230 {
231 $tokenizer->putBack();
232 $table->createConstraint($tokenizer, $constraintName);
233 }
234 elseif ($tokenizer->testUpperText('FOREIGN'))
235 {
236 $tokenizer->putBack();
237 $table->createConstraint($tokenizer, $constraintName);
238 }
239 else
240 {
241 throw new NotSupportedException("'PRIMARY KEY' expected. line:" . $tokenizer->getCurrentToken()->line);
242 }
243 }
244 elseif ($tokenizer->testUpperText(')'))
245 {
246 break;
247 }
248 else
249 {
250 $table->createColumn($tokenizer);
251 }
252
253 $tokenizer->skipWhiteSpace();
254
255 $token = $tokenizer->getCurrentToken();
256
257 if ($token->level == $level && $token->text === ',')
258 {
259 $token = $tokenizer->nextToken();
260 }
261 elseif ($token->level < $level && $token->text === ')')
262 {
263 $tokenizer->nextToken();
264 break;
265 }
266 else
267 {
268 if ($token === null)
269 {
270 $token = $tokenizer->getPrevToken();
271 $token->text = ';';
272 }
273 throw new NotSupportedException("',' or ')' expected got (" . $token->text . '). line:' . $token->line);
274 }
275
276 $tokenizer->skipWhiteSpace();
277 }
278 while (!$tokenizer->endOfInput() && $token->level >= $level);
279
280 $suffix = '';
281 while (!$tokenizer->endOfInput())
282 {
283 $suffix .= $tokenizer->getCurrentToken()->text;
284 $tokenizer->nextToken();
285 }
286 if ($suffix)
287 {
288 $table->setBody($suffix);
289 }
290 }
291 else
292 {
293 throw new NotSupportedException("'(' expected. line:" . $tokenizer->getCurrentToken()->line);
294 }
295
296 return $table;
297 }
298
306 public function getCreateDdl($dbType = '')
307 {
308 $result = [];
309
310 $items = [];
312 foreach ($this->columns->getList() as $column)
313 {
314 $items[] = $column->name . ' ' . $column->body;
315 }
316
317 if ($dbType === 'MYSQL')
318 {
320 foreach ($this->indexes->getList() as $index)
321 {
322 $items[] = ($index->fulltext ? 'FULLTEXT ' : '') . ($index->unique ? 'UNIQUE ' : '') . 'KEY ' . $index->name . ' (' . $index->body . ')';
323 }
324 }
325
327 foreach ($this->constraints->getList() as $constraint)
328 {
329 if ($constraint->name === '')
330 {
331 $items[] = $constraint->body;
332 }
333 else
334 {
335 $items[] = 'CONSTRAINT ' . $constraint->name . ' ' . $constraint->body;
336 }
337 }
338
339 $result[] = 'CREATE TABLE ' . ($this->checkExists ? 'IF NOT EXISTS ' : '') . $this->name . "(\n\t" . implode(",\n\t", $items) . "\n)" . $this->body;
340
341 if ($dbType !== 'MYSQL')
342 {
343 foreach ($this->indexes->getList() as $index)
344 {
345 $result[] = $index->getCreateDdl($dbType);
346 }
347 }
348
349 return $result;
350 }
351
359 public function getDropDdl($dbType = '')
360 {
361 return 'DROP TABLE ' . $this->name;
362 }
363}
getCreateDdl($dbType='')
Определения base_object.php:172
static create(Tokenizer $tokenizer, $parent=null)
Определения column.php:180
static create(Tokenizer $tokenizer, $constraintName='')
Определения constraint.php:18
static create(Tokenizer $tokenizer, $unique=false, $fulltext=false, $indexName='')
Определения index.php:52
$triggers
Определения table.php:16
createTrigger(Tokenizer $tokenizer)
Определения table.php:40
$columns
Определения table.php:10
createConstraint(Tokenizer $tokenizer, $constraintName='')
Определения table.php:59
static create(Tokenizer $tokenizer)
Определения table.php:139
__construct($name='')
Определения table.php:21
$indexes
Определения table.php:12
$constraints
Определения table.php:14
getDropDdl($dbType='')
Определения table.php:359
createIndex(Tokenizer $tokenizer, $unique=false, $fulltext=false, $indexName='')
Определения table.php:80
createColumn(Tokenizer $tokenizer)
Определения table.php:98
$checkExists
Определения table.php:8
modifyColumn(Tokenizer $tokenizer)
Определения table.php:113
static create(Tokenizer $tokenizer)
Определения trigger.php:17
$result
Определения get_property_values.php:14
$dbType
Определения autoload.php:6
if( $daysToExpire >=0 &&$daysToExpire< 60 elseif)( $daysToExpire< 0)
Определения prolog_main_admin.php:393
$items
Определения template.php:224