diff --git a/src/Database/Drivers/MySqlDriver.php b/src/Database/Drivers/MySqlDriver.php index cfe1018df..686e1734b 100644 --- a/src/Database/Drivers/MySqlDriver.php +++ b/src/Database/Drivers/MySqlDriver.php @@ -204,6 +204,40 @@ public function getColumnTypes(\PDOStatement $statement): array } + /** @return Reflection\Column */ + public function getResultColumns(\PDOStatement $statement): array + { + $columns = []; + $count = $statement->columnCount(); + for ($col = 0; $col < $count; $col++) { + $meta = $statement->getColumnMeta($col); + $type = Nette\Database\IStructure::FIELD_TEXT; // nebo null? + if (isset($meta['native_type'])) { + $type = Nette\Database\Helpers::detectType($meta['native_type']); + if ($type === Nette\Database\IStructure::FIELD_TIME) { + $type = Nette\Database\IStructure::FIELD_TIME_INTERVAL; + } elseif ($type === Nette\Database\IStructure::FIELD_FLOAT && $meta['precision'] === 0) { + $type = Nette\Database\IStructure::FIELD_INTEGER; + } + } + $columns[] = new Reflection\Column( + name: $meta['name'], + table: null, + nativeType: $meta['native_type'], + type: $type, + size: null, + nullable: null, + default: null, + autoIncrement: null, + primary: null, + vendor: $meta, + ); + } + + return $columns; + } + + public function isSupported(string $item): bool { // MULTI_COLUMN_AS_OR_COND due to mysql bugs: diff --git a/src/Database/Drivers/PdoDriver.php b/src/Database/Drivers/PdoDriver.php index 986c71645..dabf50164 100644 --- a/src/Database/Drivers/PdoDriver.php +++ b/src/Database/Drivers/PdoDriver.php @@ -11,6 +11,7 @@ use Nette; use Nette\Database\DriverException; +use Nette\Database\Reflection; use PDO; use PDOException; @@ -142,4 +143,8 @@ public function detectExceptionClass(\PDOException $e): ?string { return null; } + + + /** @return Reflection\Column[] */ + abstract public function getResultColumns(\PDOStatement $statement): array; } diff --git a/src/Database/Drivers/PdoResultDriver.php b/src/Database/Drivers/PdoResultDriver.php index 28386a4c9..cae681a34 100644 --- a/src/Database/Drivers/PdoResultDriver.php +++ b/src/Database/Drivers/PdoResultDriver.php @@ -10,6 +10,7 @@ namespace Nette\Database\Drivers; use Nette; +use Nette\Database\Reflection; /** @@ -53,14 +54,23 @@ public function getRowCount(): int } + /** @return Reflection\Column[] */ + public function getColumns(): array + { + return $this->driver->getResultColumns($this->result); + } + + public function getColumnTypes(): array { + // zrusit return $this->driver->getColumnTypes($this->result); } public function getColumnMeta(int $col): array { + // zrusit return $this->result->getColumnMeta($col); } diff --git a/src/Database/ResultSet.php b/src/Database/ResultSet.php index 9e8eb7e7d..0ef5102aa 100644 --- a/src/Database/ResultSet.php +++ b/src/Database/ResultSet.php @@ -93,8 +93,17 @@ public function getRowCount(): ?int } + /** @return Reflection\Column[] */ + public function getColumns(): array + { + // add cache per connection & query, kontrolovat limit, dat moznost vypnout + return $this->result->getColumns(); + } + + public function getColumnTypes(): array { + // zrusit $this->types ??= $this->result->getColumnTypes(); return $this->types; }