Browse Source

Update DB\Mysql

Visman 3 years ago
parent
commit
47a6627593
1 changed files with 45 additions and 29 deletions
  1. 45 29
      app/Core/DB/Mysql.php

+ 45 - 29
app/Core/DB/Mysql.php

@@ -201,8 +201,8 @@ class Mysql
         $this->testStr($table);
 
         $table = ($noPrefix ? '' : $this->dbPrefix) . $table;
-
         $query = "CREATE TABLE IF NOT EXISTS `{$table}` (";
+
         foreach ($schema['FIELDS'] as $field => $data) {
             $this->testStr($field);
             // имя и тип
@@ -210,11 +210,13 @@ class Mysql
             // сравнение
             if (\preg_match('%^(?:CHAR|VARCHAR|TINYTEXT|TEXT|MEDIUMTEXT|LONGTEXT|ENUM|SET)%i', $data[0])) {
                 $query .= ' CHARACTER SET utf8mb4 COLLATE utf8mb4_';
+
                 if (
                     isset($data[3])
                     && \is_string($data[3])
                 ) {
                     $this->testStr($data[3]);
+
                     $query .= $data[3];
                 } else {
                     $query .= 'unicode_ci';
@@ -228,11 +230,14 @@ class Mysql
             if (isset($data[2])) {
                 $query .= ' DEFAULT ' . $this->convToStr($data[2]);
             }
+
             $query .= ', ';
         }
+
         if (isset($schema['PRIMARY KEY'])) {
             $query .= 'PRIMARY KEY (' . $this->replIdxs($schema['PRIMARY KEY']) . '), ';
         }
+
         if (isset($schema['UNIQUE KEYS'])) {
             foreach ($schema['UNIQUE KEYS'] as $key => $fields) {
                 $this->testStr($key);
@@ -240,6 +245,7 @@ class Mysql
                 $query .= "UNIQUE `{$table}_{$key}` (" . $this->replIdxs($fields) . '), ';
             }
         }
+
         if (isset($schema['INDEXES'])) {
             foreach ($schema['INDEXES'] as $index => $fields) {
                 $this->testStr($index);
@@ -247,13 +253,15 @@ class Mysql
                 $query .= "INDEX `{$table}_{$index}` (" . $this->replIdxs($fields) . '), ';
             }
         }
+
         if (isset($schema['ENGINE'])) {
             $engine = $schema['ENGINE'];
         } else {
             // при отсутствии типа таблицы он определяется на основании типов других таблиц в базе
             $prefix = \str_replace('_', '\\_', $this->dbPrefix);
-            $stmt = $this->db->query("SHOW TABLE STATUS LIKE '{$prefix}%'");
+            $stmt   = $this->db->query("SHOW TABLE STATUS LIKE '{$prefix}%'");
             $engine = [];
+
             while ($row = $stmt->fetch()) {
                 if (isset($engine[$row['Engine']])) {
                     ++$engine[$row['Engine']];
@@ -271,7 +279,9 @@ class Mysql
                 $engine = \array_shift($engine);
             }
         }
+
         $this->testStr($engine);
+
         $query = \rtrim($query, ', ') . ") ENGINE={$engine} CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci";
 
         return false !== $this->db->exec($query);
@@ -323,14 +333,16 @@ class Mysql
         }
 
         $table = ($noPrefix ? '' : $this->dbPrefix) . $table;
-
         $query = "ALTER TABLE `{$table}` ADD `{$field}` " . $this->replType($type);
+
         if (! $allowNull) {
             $query .= ' NOT NULL';
         }
+
         if (null !== $default) {
             $query .= ' DEFAULT ' . $this->convToStr($default);
         }
+
         if (null !== $after) {
             $this->testStr($after);
 
@@ -349,14 +361,16 @@ class Mysql
         $this->testStr($field);
 
         $table = ($noPrefix ? '' : $this->dbPrefix) . $table;
-
         $query = "ALTER TABLE `{$table}` MODIFY `{$field}` " . $this->replType($type);
+
         if (! $allowNull) {
             $query .= ' NOT NULL';
         }
+
         if (null !== $default) {
             $query .= ' DEFAULT ' . $this->convToStr($default);
         }
+
         if (null !== $after) {
             $this->testStr($after);
 
@@ -401,30 +415,29 @@ class Mysql
 
         $table = ($noPrefix ? '' : $this->dbPrefix) . $table;
 
-        try {
-            $vars = [
-                ':tname' => $table,
-                ':fname' => $old,
-            ];
-            $query = 'SELECT COLUMN_DEFAULT, IS_NULLABLE, COLUMN_TYPE
-                FROM INFORMATION_SCHEMA.COLUMNS
-                WHERE TABLE_SCHEMA = DATABASE() AND TABLE_NAME = ?s:tname AND COLUMN_NAME = ?s:fname';
-
-            $stmt   = $this->db->query($query, $vars);
-            $result = $stmt->fetch();
-            $stmt->closeCursor();
-
-            $type      = $result['COLUMN_TYPE'];
-            $allowNull = 'YES' == $result['IS_NULLABLE'];
-            $default   = $result['COLUMN_DEFAULT'];
-        } catch (PDOException $e) {
-            return false;
-        }
+        $vars = [
+            ':tname' => $table,
+            ':fname' => $old,
+        ];
+        $query = 'SELECT COLUMN_DEFAULT, IS_NULLABLE, COLUMN_TYPE
+            FROM INFORMATION_SCHEMA.COLUMNS
+            WHERE TABLE_SCHEMA = DATABASE() AND TABLE_NAME = ?s:tname AND COLUMN_NAME = ?s:fname';
+
+        $stmt   = $this->db->query($query, $vars);
+        $result = $stmt->fetch();
+
+        $stmt->closeCursor();
+
+        $type      = $result['COLUMN_TYPE'];
+        $allowNull = 'YES' == $result['IS_NULLABLE'];
+        $default   = $result['COLUMN_DEFAULT'];
 
         $query = "ALTER TABLE `{$table}` CHANGE COLUMN `{$old}` `{$new}` " . $this->replType($type);
+
         if (! $allowNull) {
             $query .= ' NOT NULL';
         }
+
         if (null !== $default) {
             $query .= ' DEFAULT ' . $this->convToStr($default);
         }
@@ -444,8 +457,8 @@ class Mysql
         }
 
         $table = ($noPrefix ? '' : $this->dbPrefix) . $table;
-
         $query = "ALTER TABLE `{$table}` ADD ";
+
         if ('PRIMARY' == $index) {
             $query .= 'PRIMARY KEY';
         } else {
@@ -459,6 +472,7 @@ class Mysql
                 $query .= "INDEX `{$index}`";
             }
         }
+
         $query .= ' (' . $this->replIdxs($fields) . ')';
 
         return false !== $this->db->exec($query);
@@ -476,8 +490,8 @@ class Mysql
         }
 
         $table = ($noPrefix ? '' : $this->dbPrefix) . $table;
-
         $query = "ALTER TABLE `{$table}` ";
+
         if ('PRIMARY' == $index) {
             $query .= "DROP PRIMARY KEY";
         } else {
@@ -539,7 +553,7 @@ class Mysql
         }
 
         return [
-            'db'      => 'MySQL (PDO) ' . $this->db->getAttribute(PDO::ATTR_SERVER_VERSION) . ' : ' . implode(', ', $tmp),
+            'db'      => 'MySQL (PDO) v.' . $this->db->getAttribute(PDO::ATTR_SERVER_VERSION) . ' : ' . implode(', ', $tmp),
             'records' => $records,
             'size'    => $size,
             'server info' => $this->db->getAttribute(PDO::ATTR_SERVER_INFO),
@@ -552,7 +566,7 @@ class Mysql
     public function getMap(): array
     {
         $vars = [
-            "{$this->dbPrefix}%",
+            str_replace('_', '\\_', $this->dbPrefix) . '%',
         ];
         $query = 'SELECT TABLE_NAME, COLUMN_NAME, DATA_TYPE
             FROM INFORMATION_SCHEMA.COLUMNS
@@ -561,12 +575,14 @@ class Mysql
         $stmt   = $this->db->query($query, $vars);
         $result = [];
         $table  = null;
+
         while ($row = $stmt->fetch()) {
             if ($table !== $row['TABLE_NAME']) {
-                $table = $row['TABLE_NAME'];
-                $tableNoPref = \substr($table, \strlen($this->dbPrefix));
+                $table                = $row['TABLE_NAME'];
+                $tableNoPref          = \substr($table, \strlen($this->dbPrefix));
                 $result[$tableNoPref] = [];
             }
+
             $type = \strtolower($row['DATA_TYPE']);
             $result[$tableNoPref][$row['COLUMN_NAME']] = $this->types[$type] ?? 's';
         }