diff --git a/DataStorage/Database/Query/Builder.php b/DataStorage/Database/Query/Builder.php index dd3b731a5..b9b953093 100755 --- a/DataStorage/Database/Query/Builder.php +++ b/DataStorage/Database/Query/Builder.php @@ -1027,7 +1027,7 @@ class Builder extends BuilderAbstract /** * Update columns. * - * @param mixed ...$tables Column names to update + * @param mixed ...$columns Column names to update * * @return Builder * @@ -1036,7 +1036,7 @@ class Builder extends BuilderAbstract * * @since 1.0.0 */ - public function update(mixed ...$tables) : self + public function update(mixed ...$columns) : self { if ($this->isReadOnly) { throw new \Exception(); @@ -1044,11 +1044,11 @@ class Builder extends BuilderAbstract $this->type = QueryType::UPDATE; - /** @var mixed[] $tables */ + /** @var mixed[] $columns */ /** @var mixed $table */ - foreach ($tables as $table) { - if (\is_string($table) || $table instanceof self) { - $this->updates[] = $table; + foreach ($columns as $column) { + if (\is_string($column) || $column instanceof self) { + $this->updates[] = $column; } else { throw new \InvalidArgumentException(); } diff --git a/Utils/IO/Csv/CsvDatabaseMapper.php b/Utils/IO/Csv/CsvDatabaseMapper.php new file mode 100644 index 000000000..99680cf45 --- /dev/null +++ b/Utils/IO/Csv/CsvDatabaseMapper.php @@ -0,0 +1,176 @@ +con = $con; + $this->path = $path; + } + + /** + * {@inheritdoc} + */ + public function insert() : void + { + $fp = \fopen($this->path, 'r'); + if ($fp === false) { + return; + } + + $table = \basename($this->path, '.csv'); + $titles = []; + + // get column titles + $titles[] = \fgetcsv($fp, 4096); + + $columns = \count($titles); + if ($columns === 0) { + return; + } + + // insert data + $query = new Builder($this->con); + $query->insert(...$titles)->into($table); + + while (($cells = \fgetcsv($fp)) !== false) { + $query->values(...$cells); + } + + $query->execute(); + + \fclose($fp); + } + + /** + * {@inheritdoc} + */ + public function select(array $queries) : void + { + $fp = \fopen($this->path, 'r+'); + if ($fp === false) { + return; + } + + foreach ($queries as $key => $query) { + $results = $query->execute()?->fetchAll(\PDO::FETCH_ASSOC); + if (!\is_array($results)) { + continue; + } + + if ($key > 0) { + return; + } + + $rows = \count($results); + if ($rows < 1) { + break; + } + + $colCount = \count($results[0]); + $columns = \array_keys($results[0]); + + // set column titles + for ($i = 1; $i <= $colCount; ++$i) { + \fputcsv($fp, $columns); + } + + // set data + foreach ($results as $result) { + \fputcsv($fp, $result); + } + } + + \fclose($fp); + } + + /** + * {@inheritdoc} + */ + public function update() : void + { + $fp = \fopen($this->path, 'r+'); + if ($fp === false) { + return; + } + + $table = \basename($this->path, '.csv'); + $titles = []; + + // get column titles + $titles[] = \fgetcsv($fp, 4096); + + $columns = \count($titles); + if ($columns === 0) { + return; + } + + $idCol = (string) \array_shift($titles); + + // update data + while (($cells = \fgetcsv($fp)) !== false) { + $query = new Builder($this->con); + $query->update($titles)->into($table); + + for ($j = 2; $j <= $columns; ++$j) { + $query->sets((string) $titles[$j - 2], $cells[$j - 1]); + } + + $query->where($idCol, '=', $cells[0]); + $query->execute(); + } + + \fclose($fp); + } +} diff --git a/Utils/IO/Spreadsheet/SpreadsheetDatabaseMapper.php b/Utils/IO/Spreadsheet/SpreadsheetDatabaseMapper.php index 86633c137..2c33deaf5 100755 --- a/Utils/IO/Spreadsheet/SpreadsheetDatabaseMapper.php +++ b/Utils/IO/Spreadsheet/SpreadsheetDatabaseMapper.php @@ -133,7 +133,7 @@ class SpreadsheetDatabaseMapper implements IODatabaseMapper foreach ($queries as $key => $query) { $results = $query->execute()?->fetchAll(\PDO::FETCH_ASSOC); - if ($results === null) { + if (!\is_array($results)) { continue; } @@ -142,7 +142,7 @@ class SpreadsheetDatabaseMapper implements IODatabaseMapper } $workSheet = $sheet->setActiveSheetIndex($key); - $rows = $results === null ? 0 : \count($results); + $rows = \count($results); if ($rows < 1) { break; @@ -215,17 +215,19 @@ class SpreadsheetDatabaseMapper implements IODatabaseMapper continue; } + $idCol = (string) \array_shift($titles); + // update data $line = 2; while (!empty($workSheet->getCell('A' . $line)->getCalculatedValue())) { $query = new Builder($this->con); - $query->update($table)->into($table); + $query->update($titles)->into($table); for ($j = 2; $j <= $columns; ++$j) { - $query->sets($titles[$j - 1], $workSheet->getCell(StringUtils::intToAlphabet($j) . $line)->getCalculatedValue()); + $query->sets((string) $titles[$j - 2], $workSheet->getCell(StringUtils::intToAlphabet($j) . $line)->getCalculatedValue()); } - $query->where((string) $titles[0], '=', $workSheet->getCell('A' . $line)->getCalculatedValue()); + $query->where($idCol, '=', $workSheet->getCell('A' . $line)->getCalculatedValue()); $query->execute(); ++$line;