Пример #1
0
 public function buildCreateTableQuery(Table $table)
 {
     $columnQuery = array();
     foreach ($table->columnNames() as $columnName) {
         $column = $table->column($columnName);
         $query = $this->buildColumnQuery($column);
         $columnQuery[] = $query;
     }
     $res = "create table " . $table->getName();
     $res .= "(\n";
     $res .= "\t" . implode(",\n\t", $columnQuery);
     $res .= "\n)";
     return $res;
 }
Пример #2
0
 private function prepareTable(Table $table)
 {
     $ds = $this->getDataSource();
     $res = $ds->executeQuery("show table status where name = :table", [":table" => $table->getName()]);
     $res = $res[0];
     $table->engine($res["Engine"]);
     $table->comment($res["Comment"]);
     $res = $ds->executeQuery("show create table " . $table->getName());
     $res = $res[0];
     $createSql = $res["Create Table"];
     $tmp = array();
     if (preg_match("/DEFAULT CHARSET=(.+)/", $createSql, $tmp)) {
         $table->charset($tmp[1]);
     }
     $res = $ds->executeQuery("show columns from " . $table->getName());
     foreach ($res as $row) {
         $columnName = $row["Field"];
         $type = $row["Type"];
         $nullable = $row["Null"] == "YES";
         $default = $row["Default"];
         $key = $row["Key"];
         $length = null;
         $primary = $key == "PRI";
         $unique = $key == "UNI";
         if ($columnName == "id") {
             $table->id();
             continue;
         }
         if (preg_match("/(.+)\\((\\d+)\\)/", $type, $tmp)) {
             $type = $tmp[1];
             $length = $tmp[2];
         }
         $column = null;
         switch ($type) {
             case "int":
                 $column = $table->integer($columnName);
                 $length = null;
                 break;
             case "varchar":
                 $column = $table->varchar($columnName);
                 break;
             case "text":
                 $column = $table->text($columnName);
                 break;
             case "longtext":
                 $column = $table->text($columnName, "long");
                 break;
         }
         if (!$column) {
             die("unknown type:" . $type);
         }
         $column->length = $length;
         $column->primary = $primary;
         $column->nullable = $nullable;
         $column->default = $default;
         $column->unique = $unique;
     }
     $res = $ds->executeQuery("select column_name, " . "referenced_table_name,referenced_column_name " . "from information_schema.key_column_usage " . "where referenced_table_name is not null " . "and table_schema = :dbname and table_name = :table", [":dbname" => $ds->getDataBaseName(), ":table" => $table->getName()]);
     foreach ($res as $row) {
         $column = $row["column_name"];
         $targetTable = $row["referenced_table_name"];
         $targetColumn = $row["referenced_column_name"];
         $table->column($column)->reference($targetTable, $targetColumn);
     }
 }
Пример #3
0
 private function prepareTable(Table $table)
 {
     $ds = $this->getDataSource();
     $res = $ds->executeQuery("PRAGMA table_info(" . $table->getName() . ")");
     foreach ($res as $row) {
         $columnName = $row["name"];
         $type = $row["type"];
         $length = null;
         if (preg_match("#(.+)\\(([0-9]+)\\)#", $type, $tmp)) {
             $type = $tmp[1];
             $length = $tmp[2];
         }
         //SQLiteのバージョンによってはpkに上手く入らないパターンが有る
         if (strpos($type, " ") !== false) {
             list($type, $suffix) = explode(" ", $type);
             if ($suffix == "primary_id") {
                 $row["pk"] = 1;
             }
         }
         switch ($type) {
             case "integer":
                 $column = $table->integer($columnName);
                 $length = null;
                 break;
             case "varchar":
                 $column = $table->varchar($columnName);
                 break;
             case "text":
                 $column = $table->text($columnName);
                 break;
             case "longtext":
                 $column = $table->text($columnName, "long");
                 break;
             default:
                 $column = $table->text($columnName);
                 break;
         }
         $primary = $row["pk"] == "1";
         $nullable = $row["notnull"] == "0";
         $default = $row["dflt_value"];
         $unique = false;
         $column->length = $length;
         $column->primary = $primary;
         $column->nullable = $nullable;
         $column->default = $default;
         $column->unique = $unique;
     }
     $res = $ds->executeQuery("select * from sqlite_master where tbl_name = :table", [":table" => $table->getName()]);
     foreach ($res as $row) {
         $type = $row["type"];
         if ($type == "table") {
             $tableName = $row["name"];
             $sql = str_replace(["\r", "\n"], "", $row["sql"]);
             preg_match("#(" . $tableName . ")\\((.*)\\)#im", $sql, $tmp);
             $lines = explode(",", $tmp[2]);
             foreach ($lines as $line) {
                 $line = strtolower(trim($line));
                 $each = explode(" ", $line);
                 $columnName = $each[0];
                 $column = $table->column($columnName);
                 if (!$column) {
                     continue;
                 }
                 if (in_array("unique", $each)) {
                     $column->unique = true;
                 }
             }
         }
     }
 }