diff --git a/Command.php b/Command.php index 1df3274..9fa588b 100644 --- a/Command.php +++ b/Command.php @@ -25,235 +25,234 @@ use Throwable; class Command extends Component { - /** - * - */ - const DB_ERROR_MESSAGE = 'The system is busy, please try again later.'; - - /** @var Connection */ - public Connection $connection; - - /** @var ?string */ - public ?string $sql = ''; - - /** @var array */ - public array $params = []; - - - /** - * @param array $params - * @throws Exception - */ - public function __construct(array $params = []) - { - parent::__construct(); - Container::configure($this, $params); - } - - - /** - * @return int|bool - * @throws Exception - */ - public function incrOrDecr(): int|bool - { - return $this->_execute(); - } - - /** - * @return int|bool - * @throws Exception - */ - public function save(): int|bool - { - return $this->_execute(); - } - - - /** - * @return bool|array - * @throws Exception - */ - public function all(): bool|array - { - try { - $client = $this->connection->getConnection(); - if (($prepare = $client->prepare($this->sql)) === false) { - throw new Exception($client->errorInfo()[1]); - } - $prepare->execute($this->params); - return $prepare->fetchAll(PDO::FETCH_ASSOC); - } catch (Throwable $throwable) { - if (str_contains($throwable->getMessage(), 'MySQL server has gone away')) { - return $this->all(); - } - return $this->error($throwable); - } finally { - $this->connection->release($client ?? null); - } - } - - /** - * @return bool|array|null - * @throws Exception - */ - public function one(): null|bool|array - { - try { - $client = $this->connection->getConnection(); - if (($prepare = $client->prepare($this->sql)) === false) { - throw new Exception($client->errorInfo()[1]); - } - $prepare->execute($this->params); - return $prepare->fetch(PDO::FETCH_ASSOC); - } catch (Throwable $throwable) { - if (str_contains($throwable->getMessage(), 'MySQL server has gone away')) { - return $this->one(); - } - return $this->error($throwable); - } finally { - $this->connection->release($client ?? null); - } - } - - /** - * @return bool|array|null - * @throws Exception - */ - public function fetchColumn(): null|bool|array - { - try { - $client = $this->connection->getConnection(); - if (($prepare = $client->prepare($this->sql)) === false) { - throw new Exception($client->errorInfo()[1]); - } - $prepare->execute($this->params); - return $prepare->fetchColumn(PDO::FETCH_ASSOC); - } catch (Throwable $throwable) { - if (str_contains($throwable->getMessage(), 'MySQL server has gone away')) { - return $this->fetchColumn(); - } - return $this->error($throwable); - } finally { - $this->connection->release($client ?? null); - } - } - - /** - * @return int|bool - * @throws Exception - */ - public function rowCount(): int|bool - { - try { - $client = $this->connection->getConnection(); - if (($prepare = $client->prepare($this->sql)) === false) { - throw new Exception($client->errorInfo()[1]); - } - $prepare->execute($this->params); - return $prepare->rowCount(); - } catch (Throwable $throwable) { - if (str_contains($throwable->getMessage(), 'MySQL server has gone away')) { - return $this->rowCount(); - } - return $this->error($throwable); - } finally { - $this->connection->release($client ?? null); - } - } - - - /** - * @return int|bool - * @throws Exception - */ - public function flush(): int|bool - { - return $this->_execute(); - } - - /** - * @return bool|int - * @throws ConfigException - * @throws Exception - */ - private function _execute(): bool|int - { - try { - $client = $this->connection->getTransactionClient(); - if (($prepare = $client->prepare($this->sql)) === false) { - throw new Exception($client->errorInfo()[1]); - } - if ($prepare->execute($this->params) === false) { - throw new Exception($prepare->errorInfo()[1]); - } - $result = $client->lastInsertId(); - $prepare->closeCursor(); - - if (!$client->inTransaction()) { - $this->connection->release($client); - } - return $result == 0 ? true : (int)$result; - } catch (Throwable $throwable) { - if (str_contains($throwable->getMessage(), 'MySQL server has gone away')) { - return $this->_execute(); - } - return $this->error($throwable); - } - } - - - /** - * @param Throwable $throwable - * @return bool + /** + * */ - private function error(Throwable $throwable): bool - { - error($this->sql . '.' . json_encode($this->params, JSON_UNESCAPED_UNICODE)); - error(throwable($throwable), []); - return addError($throwable->getMessage(), 'mysql'); - } + const DB_ERROR_MESSAGE = 'The system is busy, please try again later.'; + + /** @var Connection */ + public Connection $connection; + + /** @var ?string */ + public ?string $sql = ''; + + /** @var array */ + public array $params = []; - /** - * @return int|bool - * @throws Exception - */ - public function delete(): int|bool - { - return $this->_execute(); - } + /** + * @param array $params + * @throws Exception + */ + public function __construct(array $params = []) + { + parent::__construct(); + Container::configure($this, $params); + } - /** - * @return int|bool - * @throws Exception - */ - public function exec(): int|bool - { - return $this->_execute(); - } - /** - * @param array $data - * @return $this - */ - public function bindValues(array $data = []): static - { - if (count($data) > 0) { - $this->params = array_merge($this->params, $data); - } - return $this; - } + /** + * @return int|bool + * @throws Exception + */ + public function incrOrDecr(): int|bool + { + return $this->_execute(); + } - /** - * @param $sql - * @return $this - * @throws Exception - */ - public function setSql($sql): static - { - $this->sql = $sql; - return $this; - } + /** + * @return int|bool + * @throws Exception + */ + public function save(): int|bool + { + return $this->_execute(); + } + + + /** + * @return bool|array + * @throws Exception + */ + public function all(): bool|array + { + try { + $client = $this->connection->getConnection(); + if (($prepare = $client->prepare($this->sql)) === false) { + throw new Exception($client->errorInfo()[1]); + } + $prepare->execute($this->params); + return $prepare->fetchAll(PDO::FETCH_ASSOC); + } catch (Throwable $throwable) { + if (str_contains($throwable->getMessage(), 'MySQL server has gone away')) { + return $this->all(); + } + return $this->error($throwable); + } finally { + $this->connection->release($client ?? null); + } + } + + /** + * @return bool|array|null + * @throws Exception + */ + public function one(): null|bool|array + { + try { + $client = $this->connection->getConnection(); + if (($prepare = $client->prepare($this->sql)) === false) { + throw new Exception($client->errorInfo()[1]); + } + $prepare->execute($this->params); + return $prepare->fetch(PDO::FETCH_ASSOC); + } catch (Throwable $throwable) { + if (str_contains($throwable->getMessage(), 'MySQL server has gone away')) { + return $this->one(); + } + return $this->error($throwable); + } finally { + $this->connection->release($client ?? null); + } + } + + /** + * @return bool|array|null + * @throws Exception + */ + public function fetchColumn(): null|bool|array + { + try { + $client = $this->connection->getConnection(); + if (($prepare = $client->prepare($this->sql)) === false) { + throw new Exception($client->errorInfo()[1]); + } + $prepare->execute($this->params); + return $prepare->fetchColumn(PDO::FETCH_ASSOC); + } catch (Throwable $throwable) { + if (str_contains($throwable->getMessage(), 'MySQL server has gone away')) { + return $this->fetchColumn(); + } + return $this->error($throwable); + } finally { + $this->connection->release($client ?? null); + } + } + + /** + * @return int|bool + * @throws Exception + */ + public function rowCount(): int|bool + { + try { + $client = $this->connection->getConnection(); + if (($prepare = $client->prepare($this->sql)) === false) { + throw new Exception($client->errorInfo()[1]); + } + $prepare->execute($this->params); + return $prepare->rowCount(); + } catch (Throwable $throwable) { + if (str_contains($throwable->getMessage(), 'MySQL server has gone away')) { + return $this->rowCount(); + } + return $this->error($throwable); + } finally { + $this->connection->release($client ?? null); + } + } + + + /** + * @return int|bool + * @throws Exception + */ + public function flush(): int|bool + { + return $this->_execute(); + } + + /** + * @return bool|int + * @throws ConfigException + * @throws Exception + */ + private function _execute(): bool|int + { + try { + $client = $this->connection->getTransactionClient(); + if (($prepare = $client->prepare($this->sql)) === false) { + throw new Exception($client->errorInfo()[1]); + } + if ($prepare->execute($this->params) === false) { + throw new Exception($prepare->errorInfo()[1]); + } + $result = $client->lastInsertId(); + $prepare->closeCursor(); + + if (!$client->inTransaction()) { + $this->connection->release($client); + } + return $result == 0 ? true : (int)$result; + } catch (Throwable $throwable) { + if (str_contains($throwable->getMessage(), 'MySQL server has gone away')) { + return $this->_execute(); + } + return $this->error($throwable); + } + } + + + /** + * @param Throwable $throwable + * @return bool + */ + private function error(Throwable $throwable): bool + { + $message = $this->sql . '.' . json_encode($this->params, JSON_UNESCAPED_UNICODE) . PHP_EOL . jTraceEx($throwable); + return addError($message, 'mysql'); + } + + + /** + * @return int|bool + * @throws Exception + */ + public function delete(): int|bool + { + return $this->_execute(); + } + + /** + * @return int|bool + * @throws Exception + */ + public function exec(): int|bool + { + return $this->_execute(); + } + + /** + * @param array $data + * @return $this + */ + public function bindValues(array $data = []): static + { + if (count($data) > 0) { + $this->params = array_merge($this->params, $data); + } + return $this; + } + + /** + * @param $sql + * @return $this + * @throws Exception + */ + public function setSql($sql): static + { + $this->sql = $sql; + return $this; + } } diff --git a/Db.php b/Db.php index e97a879..de6c70b 100644 --- a/Db.php +++ b/Db.php @@ -227,13 +227,30 @@ class Db implements ISqlBuilder } + /** + * @param string $table + * @param Connection|null $connection + * @param string $database + * @return array|null + * @throws Exception + */ + public static function desc(string $table, ?Connection $connection = null, string $database = 'db'): ?array + { + $sql = SqlBuilder::builder(new Query())->columns($table); + + $connection = self::getDefaultConnection($connection, $database); + + return $connection->createCommand($sql)->all(); + } + + /** * @param null|Connection $connection - * @param string $name + * @param string $database * @return mixed * @throws Exception */ - public static function getDefaultConnection(?Connection $connection = null, string $name = 'db'): Connection + public static function getDefaultConnection(?Connection $connection = null, string $database = 'db'): Connection { if ($connection instanceof Connection) { return $connection; @@ -242,7 +259,7 @@ class Db implements ISqlBuilder if (empty($databases) || !is_array($databases)) { throw new Exception('Please configure the database link.'); } - return Kiri::service()->get($databases[$name]); + return Kiri::service()->get($databases[$database]); }