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);
}