ImgURL Pro容器部署
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

295 lines
5.9 KiB

2 years ago
<?php
declare(strict_types=1);
namespace PhpMyAdmin\Plugins\Export\Helpers;
use PhpMyAdmin\Plugins\Export\ExportCodegen;
use function htmlspecialchars;
use function mb_strpos;
use function mb_substr;
use function str_replace;
use function strlen;
use function trim;
use const ENT_COMPAT;
/**
* PhpMyAdmin\Plugins\Export\Helpers\TableProperty class
*/
class TableProperty
{
/**
* Name
*
* @var string
*/
public $name;
/**
* Type
*
* @var string
*/
public $type;
/**
* Whether the key is nullable or not
*
* @var string
*/
public $nullable;
/**
* The key
*
* @var string
*/
public $key;
/**
* Default value
*
* @var mixed
*/
public $defaultValue;
/**
* Extension
*
* @var string
*/
public $ext;
/**
* @param array $row table row
*/
public function __construct(array $row)
{
$this->name = trim((string) $row[0]);
$this->type = trim((string) $row[1]);
$this->nullable = trim((string) $row[2]);
$this->key = trim((string) $row[3]);
$this->defaultValue = trim((string) $row[4]);
$this->ext = trim((string) $row[5]);
}
/**
* Gets the pure type
*
* @return string type
*/
public function getPureType()
{
$pos = (int) mb_strpos($this->type, '(');
if ($pos > 0) {
return mb_substr($this->type, 0, $pos);
}
return $this->type;
}
/**
* Tells whether the key is null or not
*
* @return string true if the key is not null, false otherwise
*/
public function isNotNull()
{
return $this->nullable === 'NO' ? 'true' : 'false';
}
/**
* Tells whether the key is unique or not
*
* @return string "true" if the key is unique, "false" otherwise
*/
public function isUnique(): string
{
return $this->key === 'PRI' || $this->key === 'UNI' ? 'true' : 'false';
}
/**
* Gets the .NET primitive type
*
* @return string type
*/
public function getDotNetPrimitiveType()
{
if (mb_strpos($this->type, 'int') === 0) {
return 'int';
}
if (mb_strpos($this->type, 'longtext') === 0) {
return 'string';
}
if (mb_strpos($this->type, 'long') === 0) {
return 'long';
}
if (mb_strpos($this->type, 'char') === 0) {
return 'string';
}
if (mb_strpos($this->type, 'varchar') === 0) {
return 'string';
}
if (mb_strpos($this->type, 'text') === 0) {
return 'string';
}
if (mb_strpos($this->type, 'tinyint') === 0) {
return 'bool';
}
if (mb_strpos($this->type, 'datetime') === 0) {
return 'DateTime';
}
return 'unknown';
}
/**
* Gets the .NET object type
*
* @return string type
*/
public function getDotNetObjectType()
{
if (mb_strpos($this->type, 'int') === 0) {
return 'Int32';
}
if (mb_strpos($this->type, 'longtext') === 0) {
return 'String';
}
if (mb_strpos($this->type, 'long') === 0) {
return 'Long';
}
if (mb_strpos($this->type, 'char') === 0) {
return 'String';
}
if (mb_strpos($this->type, 'varchar') === 0) {
return 'String';
}
if (mb_strpos($this->type, 'text') === 0) {
return 'String';
}
if (mb_strpos($this->type, 'tinyint') === 0) {
return 'Boolean';
}
if (mb_strpos($this->type, 'datetime') === 0) {
return 'DateTime';
}
return 'Unknown';
}
/**
* Gets the index name
*
* @return string containing the name of the index
*/
public function getIndexName()
{
if (strlen($this->key) > 0) {
return 'index="'
. htmlspecialchars($this->name, ENT_COMPAT, 'UTF-8')
. '"';
}
return '';
}
/**
* Tells whether the key is primary or not
*/
public function isPK(): bool
{
return $this->key === 'PRI';
}
/**
* Formats a string for C#
*
* @param string $text string to be formatted
*
* @return string formatted text
*/
public function formatCs($text)
{
$text = str_replace(
'#name#',
ExportCodegen::cgMakeIdentifier($this->name, false),
$text
);
return $this->format($text);
}
/**
* Formats a string for XML
*
* @param string $text string to be formatted
*
* @return string formatted text
*/
public function formatXml($text)
{
$text = str_replace(
[
'#name#',
'#indexName#',
],
[
htmlspecialchars($this->name, ENT_COMPAT, 'UTF-8'),
$this->getIndexName(),
],
$text
);
return $this->format($text);
}
/**
* Formats a string
*
* @param string $text string to be formatted
*
* @return string formatted text
*/
public function format($text)
{
$text = str_replace(
[
'#ucfirstName#',
'#dotNetPrimitiveType#',
'#dotNetObjectType#',
'#type#',
'#notNull#',
'#unique#',
],
[
ExportCodegen::cgMakeIdentifier($this->name),
$this->getDotNetPrimitiveType(),
$this->getDotNetObjectType(),
$this->getPureType(),
$this->isNotNull(),
$this->isUnique(),
],
$text
);
return $text;
}
}