aboutsummaryrefslogtreecommitdiff
path: root/srcs/phpmyadmin/libraries/classes/Charsets/Collation.php
diff options
context:
space:
mode:
Diffstat (limited to 'srcs/phpmyadmin/libraries/classes/Charsets/Collation.php')
-rw-r--r--srcs/phpmyadmin/libraries/classes/Charsets/Collation.php549
1 files changed, 549 insertions, 0 deletions
diff --git a/srcs/phpmyadmin/libraries/classes/Charsets/Collation.php b/srcs/phpmyadmin/libraries/classes/Charsets/Collation.php
new file mode 100644
index 0000000..fa2b85f
--- /dev/null
+++ b/srcs/phpmyadmin/libraries/classes/Charsets/Collation.php
@@ -0,0 +1,549 @@
+<?php
+/**
+ * Value object class for a collation
+ * @package PhpMyAdmin\Charsets
+ */
+declare(strict_types=1);
+
+namespace PhpMyAdmin\Charsets;
+
+use PhpMyAdmin\Charsets;
+
+/**
+ * Value object class for a collation
+ * @package PhpMyAdmin\Charsets
+ */
+final class Collation
+{
+ /**
+ * The collation name
+ * @var string
+ */
+ private $name;
+
+ /**
+ * A description of the collation
+ * @var string
+ */
+ private $description;
+
+ /**
+ * The name of the character set with which the collation is associated
+ * @var string
+ */
+ private $charset;
+
+ /**
+ * The collation ID
+ * @var int
+ */
+ private $id;
+
+ /**
+ * Whether the collation is the default for its character set
+ * @var bool
+ */
+ private $isDefault;
+
+ /**
+ * Whether the character set is compiled into the server
+ * @var bool
+ */
+ private $isCompiled;
+
+ /**
+ * Used for determining the memory used to sort strings in this collation
+ * @var int
+ */
+ private $sortLength;
+
+ /**
+ * The collation pad attribute
+ * @var string
+ */
+ private $padAttribute;
+
+ /**
+ * @param string $name Collation name
+ * @param string $charset Related charset
+ * @param int $id Collation ID
+ * @param bool $isDefault Whether is the default
+ * @param bool $isCompiled Whether the charset is compiled
+ * @param int $sortLength Sort length
+ * @param string $padAttribute Pad attribute
+ */
+ private function __construct(
+ string $name,
+ string $charset,
+ int $id,
+ bool $isDefault,
+ bool $isCompiled,
+ int $sortLength,
+ string $padAttribute
+ ) {
+ $this->name = $name;
+ $this->charset = $charset;
+ $this->id = $id;
+ $this->isDefault = $isDefault;
+ $this->isCompiled = $isCompiled;
+ $this->sortLength = $sortLength;
+ $this->padAttribute = $padAttribute;
+ $this->description = $this->buildDescription();
+ }
+
+ /**
+ * @param array $state State obtained from the database server
+ * @return self
+ */
+ public static function fromServer(array $state): self
+ {
+ return new self(
+ $state['Collation'] ?? '',
+ $state['Charset'] ?? '',
+ (int) ($state['Id'] ?? 0),
+ isset($state['Default']) && ($state['Default'] === 'Yes' || $state['Default'] === '1'),
+ isset($state['Compiled']) && ($state['Compiled'] === 'Yes' || $state['Compiled'] === '1'),
+ (int) ($state['Sortlen'] ?? 0),
+ $state['Pad_attribute'] ?? ''
+ );
+ }
+
+ /**
+ * @return string
+ */
+ public function getName(): string
+ {
+ return $this->name;
+ }
+
+ /**
+ * @return string
+ */
+ public function getDescription(): string
+ {
+ return $this->description;
+ }
+
+ /**
+ * @return string
+ */
+ public function getCharset(): string
+ {
+ return $this->charset;
+ }
+
+ /**
+ * @return int
+ */
+ public function getId(): int
+ {
+ return $this->id;
+ }
+
+ /**
+ * @return bool
+ */
+ public function isDefault(): bool
+ {
+ return $this->isDefault;
+ }
+
+ /**
+ * @return bool
+ */
+ public function isCompiled(): bool
+ {
+ return $this->isCompiled;
+ }
+
+ /**
+ * @return int
+ */
+ public function getSortLength(): int
+ {
+ return $this->sortLength;
+ }
+
+ /**
+ * @return string
+ */
+ public function getPadAttribute(): string
+ {
+ return $this->padAttribute;
+ }
+
+ /**
+ * Returns description for given collation
+ *
+ * @return string collation description
+ */
+ private function buildDescription(): string
+ {
+ $parts = explode('_', $this->getName());
+
+ $name = __('Unknown');
+ $variant = null;
+ $suffixes = [];
+ $unicode = false;
+ $unknown = false;
+
+ $level = 0;
+ foreach ($parts as $part) {
+ if ($level == 0) {
+ /* Next will be language */
+ $level = 1;
+ /* First should be charset */
+ switch ($part) {
+ case 'binary':
+ $name = _pgettext('Collation', 'Binary');
+ break;
+ // Unicode charsets
+ case 'utf8mb4':
+ $variant = 'UCA 4.0.0';
+ // Fall through to other unicode
+ case 'ucs2':
+ case 'utf8':
+ case 'utf16':
+ case 'utf16le':
+ case 'utf16be':
+ case 'utf32':
+ $name = _pgettext('Collation', 'Unicode');
+ $unicode = true;
+ break;
+ // West European charsets
+ case 'ascii':
+ case 'cp850':
+ case 'dec8':
+ case 'hp8':
+ case 'latin1':
+ case 'macroman':
+ $name = _pgettext('Collation', 'West European');
+ break;
+ // Central European charsets
+ case 'cp1250':
+ case 'cp852':
+ case 'latin2':
+ case 'macce':
+ $name = _pgettext('Collation', 'Central European');
+ break;
+ // Russian charsets
+ case 'cp866':
+ case 'koi8r':
+ $name = _pgettext('Collation', 'Russian');
+ break;
+ // Chinese charsets
+ case 'gb2312':
+ case 'gbk':
+ $name = _pgettext('Collation', 'Simplified Chinese');
+ break;
+ case 'big5':
+ $name = _pgettext('Collation', 'Traditional Chinese');
+ break;
+ case 'gb18030':
+ $name = _pgettext('Collation', 'Chinese');
+ $unicode = true;
+ break;
+ // Japanese charsets
+ case 'sjis':
+ case 'ujis':
+ case 'cp932':
+ case 'eucjpms':
+ $name = _pgettext('Collation', 'Japanese');
+ break;
+ // Baltic charsets
+ case 'cp1257':
+ case 'latin7':
+ $name = _pgettext('Collation', 'Baltic');
+ break;
+ // Other
+ case 'armscii8':
+ case 'armscii':
+ $name = _pgettext('Collation', 'Armenian');
+ break;
+ case 'cp1251':
+ $name = _pgettext('Collation', 'Cyrillic');
+ break;
+ case 'cp1256':
+ $name = _pgettext('Collation', 'Arabic');
+ break;
+ case 'euckr':
+ $name = _pgettext('Collation', 'Korean');
+ break;
+ case 'hebrew':
+ $name = _pgettext('Collation', 'Hebrew');
+ break;
+ case 'geostd8':
+ $name = _pgettext('Collation', 'Georgian');
+ break;
+ case 'greek':
+ $name = _pgettext('Collation', 'Greek');
+ break;
+ case 'keybcs2':
+ $name = _pgettext('Collation', 'Czech-Slovak');
+ break;
+ case 'koi8u':
+ $name = _pgettext('Collation', 'Ukrainian');
+ break;
+ case 'latin5':
+ $name = _pgettext('Collation', 'Turkish');
+ break;
+ case 'swe7':
+ $name = _pgettext('Collation', 'Swedish');
+ break;
+ case 'tis620':
+ $name = _pgettext('Collation', 'Thai');
+ break;
+ default:
+ $name = _pgettext('Collation', 'Unknown');
+ $unknown = true;
+ break;
+ }
+ continue;
+ }
+ if ($level == 1) {
+ /* Next will be variant unless changed later */
+ $level = 4;
+ /* Locale name or code */
+ $found = true;
+ switch ($part) {
+ case 'general':
+ break;
+ case 'bulgarian':
+ case 'bg':
+ $name = _pgettext('Collation', 'Bulgarian');
+ break;
+ case 'chinese':
+ case 'cn':
+ case 'zh':
+ if ($unicode) {
+ $name = _pgettext('Collation', 'Chinese');
+ }
+ break;
+ case 'croatian':
+ case 'hr':
+ $name = _pgettext('Collation', 'Croatian');
+ break;
+ case 'czech':
+ case 'cs':
+ $name = _pgettext('Collation', 'Czech');
+ break;
+ case 'danish':
+ case 'da':
+ $name = _pgettext('Collation', 'Danish');
+ break;
+ case 'english':
+ case 'en':
+ $name = _pgettext('Collation', 'English');
+ break;
+ case 'esperanto':
+ case 'eo':
+ $name = _pgettext('Collation', 'Esperanto');
+ break;
+ case 'estonian':
+ case 'et':
+ $name = _pgettext('Collation', 'Estonian');
+ break;
+ case 'german1':
+ $name = _pgettext('Collation', 'German (dictionary order)');
+ break;
+ case 'german2':
+ $name = _pgettext('Collation', 'German (phone book order)');
+ break;
+ case 'german':
+ case 'de':
+ /* Name is set later */
+ $level = 2;
+ break;
+ case 'hungarian':
+ case 'hu':
+ $name = _pgettext('Collation', 'Hungarian');
+ break;
+ case 'icelandic':
+ case 'is':
+ $name = _pgettext('Collation', 'Icelandic');
+ break;
+ case 'japanese':
+ case 'ja':
+ $name = _pgettext('Collation', 'Japanese');
+ break;
+ case 'la':
+ $name = _pgettext('Collation', 'Classical Latin');
+ break;
+ case 'latvian':
+ case 'lv':
+ $name = _pgettext('Collation', 'Latvian');
+ break;
+ case 'lithuanian':
+ case 'lt':
+ $name = _pgettext('Collation', 'Lithuanian');
+ break;
+ case 'korean':
+ case 'ko':
+ $name = _pgettext('Collation', 'Korean');
+ break;
+ case 'myanmar':
+ case 'my':
+ $name = _pgettext('Collation', 'Burmese');
+ break;
+ case 'persian':
+ $name = _pgettext('Collation', 'Persian');
+ break;
+ case 'polish':
+ case 'pl':
+ $name = _pgettext('Collation', 'Polish');
+ break;
+ case 'roman':
+ $name = _pgettext('Collation', 'West European');
+ break;
+ case 'romanian':
+ case 'ro':
+ $name = _pgettext('Collation', 'Romanian');
+ break;
+ case 'ru':
+ $name = _pgettext('Collation', 'Russian');
+ break;
+ case 'si':
+ case 'sinhala':
+ $name = _pgettext('Collation', 'Sinhalese');
+ break;
+ case 'slovak':
+ case 'sk':
+ $name = _pgettext('Collation', 'Slovak');
+ break;
+ case 'slovenian':
+ case 'sl':
+ $name = _pgettext('Collation', 'Slovenian');
+ break;
+ case 'spanish':
+ $name = _pgettext('Collation', 'Spanish (modern)');
+ break;
+ case 'es':
+ /* Name is set later */
+ $level = 3;
+ break;
+ case 'spanish2':
+ $name = _pgettext('Collation', 'Spanish (traditional)');
+ break;
+ case 'swedish':
+ case 'sv':
+ $name = _pgettext('Collation', 'Swedish');
+ break;
+ case 'thai':
+ case 'th':
+ $name = _pgettext('Collation', 'Thai');
+ break;
+ case 'turkish':
+ case 'tr':
+ $name = _pgettext('Collation', 'Turkish');
+ break;
+ case 'ukrainian':
+ case 'uk':
+ $name = _pgettext('Collation', 'Ukrainian');
+ break;
+ case 'vietnamese':
+ case 'vi':
+ $name = _pgettext('Collation', 'Vietnamese');
+ break;
+ case 'unicode':
+ if ($unknown) {
+ $name = _pgettext('Collation', 'Unicode');
+ }
+ break;
+ default:
+ $found = false;
+ }
+ if ($found) {
+ continue;
+ }
+ // Not parsed token, fall to next level
+ }
+ if ($level == 2) {
+ /* Next will be variant */
+ $level = 4;
+ /* Germal variant */
+ if ($part == 'pb') {
+ $name = _pgettext('Collation', 'German (phone book order)');
+ continue;
+ }
+ $name = _pgettext('Collation', 'German (dictionary order)');
+ // Not parsed token, fall to next level
+ }
+ if ($level == 3) {
+ /* Next will be variant */
+ $level = 4;
+ /* Spanish variant */
+ if ($part == 'trad') {
+ $name = _pgettext('Collation', 'Spanish (traditional)');
+ continue;
+ }
+ $name = _pgettext('Collation', 'Spanish (modern)');
+ // Not parsed token, fall to next level
+ }
+ if ($level == 4) {
+ /* Next will be suffix */
+ $level = 5;
+ /* Variant */
+ $found = true;
+ switch ($part) {
+ case '0900':
+ $variant = 'UCA 9.0.0';
+ break;
+ case '520':
+ $variant = 'UCA 5.2.0';
+ break;
+ case 'mysql561':
+ $variant = 'MySQL 5.6.1';
+ break;
+ case 'mysql500':
+ $variant = 'MySQL 5.0.0';
+ break;
+ default:
+ $found = false;
+ }
+ if ($found) {
+ continue;
+ }
+ // Not parsed token, fall to next level
+ }
+ if ($level == 5) {
+ /* Suffixes */
+ switch ($part) {
+ case 'ci':
+ $suffixes[] = _pgettext('Collation variant', 'case-insensitive');
+ break;
+ case 'cs':
+ $suffixes[] = _pgettext('Collation variant', 'case-sensitive');
+ break;
+ case 'ai':
+ $suffixes[] = _pgettext('Collation variant', 'accent-insensitive');
+ break;
+ case 'as':
+ $suffixes[] = _pgettext('Collation variant', 'accent-sensitive');
+ break;
+ case 'ks':
+ $suffixes[] = _pgettext('Collation variant', 'kana-sensitive');
+ break;
+ case 'w2':
+ case 'l2':
+ $suffixes[] = _pgettext('Collation variant', 'multi-level');
+ break;
+ case 'bin':
+ $suffixes[] = _pgettext('Collation variant', 'binary');
+ break;
+ case 'nopad':
+ $suffixes[] = _pgettext('Collation variant', 'no-pad');
+ break;
+ }
+ }
+ }
+
+ $result = $name;
+ if ($variant !== null) {
+ $result .= ' (' . $variant . ')';
+ }
+ if (count($suffixes) > 0) {
+ $result .= ', ' . implode(', ', $suffixes);
+ }
+ return $result;
+ }
+}