public function describeColumns($table, $schema = null)
{
$columns = [];
$oldColumn = null;
/**
* 0:column_name,
* 1:data_type,
* 2:data_length,
* 3:data_precision,
* 4:data_scale,
* 5:nullable,
* 6:constraint_type,
* 7:default,
* 8:position;
*/
$sql = $this->_dialect->describeColumns($table, $schema);
foreach ($this->fetchAll($sql, Db::FETCH_NUM) as $field) {
$definition = ['bindType' => 2];
$columnSize = $field[2];
$columnPrecision = $field[3];
$columnScale = $field[4];
$columnType = $field[1];
/**
* Check the column type to get the correct Phalcon type
*/
while (true) {
if (false !== strpos($columnType, 'NUMBER')) {
$definition['type'] = Column::TYPE_DECIMAL;
$definition['isNumeric'] = true;
$definition['size'] = $columnPrecision;
$definition['scale'] = $columnScale;
$definition['bindType'] = 32;
break;
}
if (false !== strpos($columnType, 'INTEGER')) {
$definition['type'] = Column::TYPE_INTEGER;
$definition['isNumeric'] = true;
$definition['size'] = $columnPrecision;
$definition['bindType'] = 1;
break;
}
if (false !== strpos($columnType, 'VARCHAR2')) {
$definition['type'] = Column::TYPE_VARCHAR;
$definition['size'] = $columnSize;
break;
}
if (false !== strpos($columnType, 'FLOAT')) {
$definition['type'] = Column::TYPE_FLOAT;
$definition['isNumeric'] = true;
$definition['size'] = $columnSize;
$definition['scale'] = $columnScale;
$definition['bindType'] = 32;
break;
}
if (false !== strpos($columnType, 'TIMESTAMP')) {
$definition['type'] = Column::TYPE_TIMESTAMP;
break;
}
if (false !== strpos($columnType, 'DATE')) {
$definition['type'] = Column::TYPE_DATE;
break;
}
if (false !== strpos($columnType, 'RAW')) {
$definition['type'] = Column::TYPE_TEXT;
break;
}
if (false !== strpos($columnType, 'BLOB')) {
$definition['type'] = Column::TYPE_TEXT;
break;
}
if (false !== strpos($columnType, 'CLOB')) {
$definition['type'] = Column::TYPE_TEXT;
break;
}
if (false !== strpos($columnType, 'CHAR')) {
$definition['type'] = Column::TYPE_CHAR;
$definition['size'] = $columnSize;
break;
}
$definition['type'] = Column::TYPE_TEXT;
break;
}
if (null === $oldColumn) {
$definition['first'] = true;
} else {
$definition['after'] = $oldColumn;
}
/**
* Check if the field is primary key
*/
if ('P' == $field[6]) {
$definition['primary'] = true;
}
/**
* Check if the column allows null values
*/
if ('N' == $field[5]) {
$definition['notNull'] = true;
}
$columns[] = new Column($field[0], $definition);
$oldColumn = $field[0];
}
return $columns;
}