phpbb\db\extractor\mssql_extractor::write_table PHP Метод

write_table() публичный Метод

public write_table ( $table_name )
    public function write_table($table_name)
    {
        if (!$this->is_initialized) {
            throw new extractor_not_initialized_exception();
        }
        $sql_data = '-- Table: ' . $table_name . "\n";
        $sql_data .= "IF OBJECT_ID(N'{$table_name}', N'U') IS NOT NULL\n";
        $sql_data .= "DROP TABLE {$table_name};\n";
        $sql_data .= "GO\n";
        $sql_data .= "\nCREATE TABLE [{$table_name}] (\n";
        $rows = array();
        $text_flag = false;
        $sql = "SELECT COLUMN_NAME, COLUMN_DEFAULT, IS_NULLABLE, DATA_TYPE, CHARACTER_MAXIMUM_LENGTH, COLUMNPROPERTY(object_id(TABLE_NAME), COLUMN_NAME, 'IsIdentity') as IS_IDENTITY\n\t\t\tFROM INFORMATION_SCHEMA.COLUMNS\n\t\t\tWHERE TABLE_NAME = '{$table_name}'";
        $result = $this->db->sql_query($sql);
        while ($row = $this->db->sql_fetchrow($result)) {
            $line = "\t[{$row['COLUMN_NAME']}] [{$row['DATA_TYPE']}]";
            if ($row['DATA_TYPE'] == 'text') {
                $text_flag = true;
            }
            if ($row['IS_IDENTITY']) {
                $line .= ' IDENTITY (1 , 1)';
            }
            if ($row['CHARACTER_MAXIMUM_LENGTH'] && $row['DATA_TYPE'] !== 'text') {
                $line .= ' (' . $row['CHARACTER_MAXIMUM_LENGTH'] . ')';
            }
            if ($row['IS_NULLABLE'] == 'YES') {
                $line .= ' NULL';
            } else {
                $line .= ' NOT NULL';
            }
            if ($row['COLUMN_DEFAULT']) {
                $line .= ' DEFAULT ' . $row['COLUMN_DEFAULT'];
            }
            $rows[] = $line;
        }
        $this->db->sql_freeresult($result);
        $sql_data .= implode(",\n", $rows);
        $sql_data .= "\n) ON [PRIMARY]";
        if ($text_flag) {
            $sql_data .= " TEXTIMAGE_ON [PRIMARY]";
        }
        $sql_data .= "\nGO\n\n";
        $rows = array();
        $sql = "SELECT CONSTRAINT_NAME, COLUMN_NAME\n\t\t\tFROM INFORMATION_SCHEMA.KEY_COLUMN_USAGE\n\t\t\tWHERE TABLE_NAME = '{$table_name}'";
        $result = $this->db->sql_query($sql);
        while ($row = $this->db->sql_fetchrow($result)) {
            if (!sizeof($rows)) {
                $sql_data .= "ALTER TABLE [{$table_name}] WITH NOCHECK ADD\n";
                $sql_data .= "\tCONSTRAINT [{$row['CONSTRAINT_NAME']}] PRIMARY KEY  CLUSTERED \n\t(\n";
            }
            $rows[] = "\t\t[{$row['COLUMN_NAME']}]";
        }
        if (sizeof($rows)) {
            $sql_data .= implode(",\n", $rows);
            $sql_data .= "\n\t)  ON [PRIMARY] \nGO\n";
        }
        $this->db->sql_freeresult($result);
        $index = array();
        $sql = "EXEC sp_statistics '{$table_name}'";
        $result = $this->db->sql_query($sql);
        while ($row = $this->db->sql_fetchrow($result)) {
            if ($row['TYPE'] == 3) {
                $index[$row['INDEX_NAME']][] = '[' . $row['COLUMN_NAME'] . ']';
            }
        }
        $this->db->sql_freeresult($result);
        foreach ($index as $index_name => $column_name) {
            $index[$index_name] = implode(', ', $column_name);
        }
        foreach ($index as $index_name => $columns) {
            $sql_data .= "\nCREATE  INDEX [{$index_name}] ON [{$table_name}]({$columns}) ON [PRIMARY]\nGO\n";
        }
        $this->flush($sql_data);
    }