KumbiaPHP/ActiveRecord

View on GitHub
Metadata/SqlsrvMetadata.php

Summary

Maintainability
A
0 mins
Test Coverage
<?php
/**
* KumbiaPHP web & app Framework
*
* LICENSE
*
* This source file is subject to the new BSD license that is bundled
* with this package in the file LICENSE.txt.
* It is also available through the world-wide-web at this URL:
* http://wiki.kumbiaphp.com/Licencia
* If you did not receive a copy of the license and are unable to
* obtain it through the world-wide-web, please send an email
* to license@kumbiaphp.com so we can send you a copy immediately.
*
* @category Kumbia
* @package ActiveRecord
* @subpackage Metadata
*
* @copyright 2005 - 2020 Kumbia Team (http://www.kumbiaphp.com)
* @license http://wiki.kumbiaphp.com/Licencia New BSD License
*/
namespace Kumbia\ActiveRecord\Metadata;
 
use \PDO;
 
/**
* Adaptador de Metadata para Sqlsrv
*
*/
class SqlsrvMetadata extends Metadata
{
/**
* Consultar los campos de la tabla en la base de datos
*
* @param \PDO $pdo base de datos
* @param string $table tabla
* @param string $schema squema
* @return array
*/
protected function queryFields(\PDO $pdo, string $table, string $schema = 'dbo'): array
{
$describe = $pdo->query(
"SELECT
c.name AS field_name,
c.is_identity AS is_auto_increment,
c.is_nullable,
object_definition(c.default_object_id) AS default_value,
t.name AS type_field
FROM sys.columns c join sys.types t
ON c.system_type_id = t.user_type_id
WHERE object_id = object_id('$schema.$table')"
);
 
$pk = self::pk($pdo, $table);
 
return self::describe($describe, $pk);
}
 
/**
* Optiene el PK
*
* @param \PDO $pdo base de datos
* @param string $table tabla
* @return string
*/
private static function pk(\PDO $pdo, string $table): string
{
$pk = $pdo->query("exec sp_pkeys @table_name='$table'");
$pk = $pk->fetch(\PDO::FETCH_OBJ);
 
return $pk->COLUMN_NAME;
}
 
/**
* Genera la metadata
*
* @param \PDOStatement $describe SQL result
* @param string $pk Primary key
* @return array
*/
protected function describe(\PDOStatement $describe, string $pk): array
{
// TODO Mejorar
$fields = [];
while ($value = $describe->fetch()) {
$fields[$value->field_name] = [
'Type' => $value->type_field,
'Null' => ($value->is_nullable),
'Key' => ($value->field_name === $pk) ? 'PRI' : '',
'Default' => \str_replace("''", "'", \trim($value->default_value, "(')")),
'Auto' => ($value->is_auto_increment)
];
$this->filterColumn($fields[$value->field_name], $value->field_name);
}
 
return $fields;
}
}