public static function getColumns(DB\Table $table) { //using namespace for the table identifier as there might be same name DBs on different servers $namespace = $table->getDatabase()->getNamespace(); if (!isset(self::$_column_cache[$namespace])) { self::$_column_cache[$namespace] = array(); $column_sql = 'SELECT "table_name", "column_name", "column_default", "is_nullable", "data_type" ' . 'FROM "information_schema"."columns" WHERE "table_schema" = ? ORDER BY ordinal_position'; $column_stmt = $table->getDatabase()->getConnection()->prepare($column_sql); $column_stmt->execute(array($table->getDatabase()->getSchema())); while ($column_row = $column_stmt->fetch()) { self::$_column_cache[$namespace][$column_row['table_name']][] = $column_row; } } $columns = array(); //may not be any columns if (isset(self::$_column_cache[$namespace][$table->getName()])) { foreach (self::$_column_cache[$namespace][$table->getName()] as $cached_row) { list($default_value, $is_serial, $sequence) = self::translateSQLDefault($cached_row['column_default']); $column = new DB\Column($table, $cached_row['column_name'], self::translateSQLNullable($cached_row['is_nullable']), self::translateSQLDataType($cached_row['data_type']), $default_value, $is_serial); if ($sequence !== null) { $column->setSequenceName($sequence); } $columns[$cached_row['column_name']] = $column; } } return $columns; }
public static function create(Column $local_column, Column $referenced_column, $constraint_name, $is_reverse_relation) { //This is to support multiple column foreign keys, any constraints with the same name will be treated as an additional column. //An assumption is made in the driver that the constraint names will be unique across the table $instance_name = sprintf('%s.%s.%s__%s', $local_column->getTable()->getDatabase()->getName(), $local_column->getTable()->getName(), $constraint_name, $is_reverse_relation ? 'reverse' : 'forward'); if (isset(self::$instances[$instance_name])) { self::$instances[$instance_name]->addColumns($local_column, $referenced_column, $is_reverse_relation); } else { self::$instances[$instance_name] = new self($local_column, $referenced_column, $is_reverse_relation, $instance_name); } return self::$instances[$instance_name]; }