forked from srusakov/yii2-firebirddb
/
FirebirdMigration.php
88 lines (75 loc) · 2.47 KB
/
FirebirdMigration.php
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
<?php
/*
* @author <srusakov@gmail.com>
* To change this template file, choose Tools | Templates
* and open the template in the editor.
*/
namespace srusakov\firebirddb;
/**
* Description of FirebirdMigration
*
* @author rusakov
*/
class FirebirdMigration extends \yii\db\Migration
{
/**
* @inheritdoc
*/
public function createTable($name, $columns, $options=null)
{
$baseTableName = $this->db->getSchema()->getRawTableName($name);
if ($this->db->getSchema()->getTableSchema($baseTableName, true) !== null) {
echo " > table $name already exists ...\n";
return;
}
parent::createTable($name, $columns, $options);
}
/**
* Create trigger for auto-sequence primary key field
* @param string $baseName name of trigger, table and sequence (all the same)
* @param string $pk name of primary key field (usually 'ID')
*/
public function createPKTrigger($triggerName, $tableName=null, $pkFieldName='id', $seqName=null)
{
echo " > create trigger $triggerName ...";
$time = microtime(true);
if (empty($tableName)) {
$tableName = $triggerName;
}
if (empty($seqName)) {
$seqName = $tableName;
}
$rawTableName = $this->db->getSchema()->getRawTableName($tableName);
$this->db->createCommand("create trigger {$triggerName} for {$rawTableName}
active before insert position 0 as
begin
new.{$pkFieldName} = gen_id({$seqName}, 1);
end
")->execute();
echo " done (time: " . sprintf('%.3f', microtime(true) - $time) . "s)\n";
}
/**
* Create sequence for PK autoincrement fields
* @param string $name SEQ name
* @param integer $value Initial value
*/
public function createSequence($name, $value=null)
{
echo " > create sequence $name ...";
$time = microtime(true);
$rawName = $this->db->getSchema()->getRawTableName($name);
$this->db->createCommand("CREATE SEQUENCE {$rawName}")->execute();
if ($value > 0) {
$this->db->createCommand("ALTER SEQUENCE {$rawName} RESTART WITH {$value}")->execute();
}
echo " done (time: " . sprintf('%.3f', microtime(true) - $time) . "s)\n";
}
public function dropSequence($name)
{
echo " > drop sequence $name ...";
$time = microtime(true);
$rawName = $this->db->getSchema()->getRawTableName($name);
$this->db->createCommand("DROP SEQUENCE {$rawName}")->execute();
echo " done (time: " . sprintf('%.3f', microtime(true) - $time) . "s)\n";
}
}