public function describe($entity, $fields = array(), array $meta = array())
{
$schema = $this->_config['schema'];
$params = compact('entity', 'meta', 'fields', 'schema');
return $this->_filter(__METHOD__, $params, function ($self, $params) {
extract($params);
if ($fields) {
return $self->invokeMethod('_instance', array('schema', compact('fields')));
}
$name = $self->connection->quote($self->invokeMethod('_entityName', array($entity)));
$schema = $self->connection->quote($schema);
$sql = 'SELECT "column_name" AS "field", "data_type" AS "type", ';
$sql .= '"is_nullable" AS "null", "column_default" AS "default", ';
$sql .= '"character_maximum_length" AS "char_length" ';
$sql .= 'FROM "information_schema"."columns" WHERE "table_name" = ' . $name;
$sql .= ' AND table_schema = ' . $schema . ' ORDER BY "ordinal_position"';
$columns = $self->connection->query($sql)->fetchAll(PDO::FETCH_ASSOC);
$fields = array();
foreach ($columns as $column) {
$schema = $self->invokeMethod('_column', array($column['type']));
$default = $column['default'];
if (preg_match("/^'(.*)'::/", $default, $match)) {
$default = $match[1];
} elseif ($default === 'true') {
$default = true;
} elseif ($default === 'false') {
$default = false;
} else {
$default = null;
}
$fields[$column['field']] = $schema + array('null' => $column['null'] === 'YES' ? true : false, 'default' => $default);
if ($fields[$column['field']]['type'] === 'string') {
$fields[$column['field']]['length'] = $column['char_length'];
}
}
return $self->invokeMethod('_instance', array('schema', compact('fields')));
});
}