Procházet zdrojové kódy

Update DB\Sqlite #10

A crutch in the dropField() method for SQLite prior to version 3.36.0.
Visman před 3 roky
rodič
revize
49c00d420b
1 změnil soubory, kde provedl 77 přidání a 0 odebrání
  1. 77 0
      app/Core/DB/Sqlite.php

+ 77 - 0
app/Core/DB/Sqlite.php

@@ -348,6 +348,83 @@ class Sqlite
         if (\version_compare($this->db->getAttribute(PDO::ATTR_SERVER_VERSION), '3.36.0', '>=')) { // 3.35.1 and 3.35.5 have fixes
         if (\version_compare($this->db->getAttribute(PDO::ATTR_SERVER_VERSION), '3.36.0', '>=')) { // 3.35.1 and 3.35.5 have fixes
             return false !== $this->db->exec("ALTER TABLE \"{$table}\" DROP COLUMN \"{$field}\""); // add 2021-03-12 (3.35.0)
             return false !== $this->db->exec("ALTER TABLE \"{$table}\" DROP COLUMN \"{$field}\""); // add 2021-03-12 (3.35.0)
         }
         }
+
+        $stmt = $this->db->query("PRAGMA table_info({$table})");
+
+        $fields = [];
+
+        while ($row = $stmt->fetch()) {
+            $fields[$row['name']] = $row['name'];
+        }
+
+        unset($fields[$field]);
+
+        $vars = [
+            ':tname' => $table,
+        ];
+        $query = 'SELECT * FROM sqlite_master WHERE tbl_name=?s:tname';
+
+        $stmt = $this->db->query($query, $vars);
+
+        $createQuery = null;
+        $otherQuery  = [];
+
+        while ($row = $stmt->fetch()) {
+            switch ($row['type']) {
+                case 'table':
+                    $createQuery = $row['sql'];
+
+                    break;
+                default:
+                    if (! empty($row['sql'])) {
+                        $otherQuery[$row['name']] = $row['sql'];
+                    }
+
+                    break;
+            }
+        }
+
+        $tableTmp    = $table . '_tmp' . \time();
+        $createQuery = \preg_replace("%(CREATE\s+TABLE\s+\"?){$table}\b%", '${1}' . $tableTmp, $createQuery, -1, $count);
+
+        $result = 1 === $count;
+
+        $tmp         = \implode('|', $fields);
+        $createQuery = \preg_replace_callback(
+            "%[(,]\s*(?:\"{$field}\"|\b{$field}\b).*?(?:,(?=\s*(?:\"?\b(?:{$tmp})|CONSTRAINT|PRIMARY|CHECK|FOREIGN))|\)(?=\s*(?:$|WITHOUT|STRICT)))%si",
+            function ($matches) {
+                if ('(' === $matches[0][0]) {
+                    return '(';
+                } elseif (')' === $matches[0][-1]) {
+                    return ')';
+                } else {
+                    return ',';
+                }
+            },
+            $createQuery,
+            -1,
+            $count
+        );
+
+        $result = $result && 1 === $count;
+        $result = $result && false !== $this->db->exec($createQuery);
+
+        $tmp   = '"' . \implode('", "', $fields) . '"';
+        $query = "INSERT INTO \"{$tableTmp}\" ({$tmp})
+            SELECT {$tmp}
+            FROM \"{$table}\"";
+
+        $result = $result && false !== $this->db->exec($query);
+        $result = $result && $this->dropTable($table, true);
+        $result = $result && $this->renameTable($tableTmp, $table, true);
+
+        foreach ($otherQuery as $query) {
+            if (! \preg_match("%\([^)]*?\b{$field}\b%", $query)) {
+                $result = $result && false !== $this->db->exec($query);
+            }
+        }
+
+        return $result;
     }
     }
 
 
     /**
     /**