diff --git a/src/Command.php b/src/Command.php index 7ac6aaf..e581903 100644 --- a/src/Command.php +++ b/src/Command.php @@ -120,7 +120,6 @@ class Command extends Component $time = microtime(true); if ($type === static::EXECUTE) { $result = $this->db->getConnect($this->sql)->execute($this->sql,$this->params); - var_dump($result); } else { $result = $this->search($type); } diff --git a/src/Mysql/PDO.php b/src/Mysql/PDO.php index 9332274..f80e59b 100644 --- a/src/Mysql/PDO.php +++ b/src/Mysql/PDO.php @@ -3,8 +3,8 @@ namespace Database\Mysql; use Exception; -use Kiri\Context; use Kiri\Abstracts\Logger; +use Kiri\Context; use Kiri\Kiri; use Kiri\Pool\StopHeartbeatCheck; use PDOStatement; @@ -16,122 +16,122 @@ use Swoole\Timer; class PDO implements StopHeartbeatCheck { - const DB_ERROR_MESSAGE = 'The system is busy, please try again later.'; + const DB_ERROR_MESSAGE = 'The system is busy, please try again later.'; - private ?\PDO $pdo = null; + private ?\PDO $pdo = null; - private int $_transaction = 0; + private int $_transaction = 0; - private int $_timer = -1; + private int $_timer = -1; - private int $_last = 0; + private int $_last = 0; - /** - * @param string $dbname - * @param string $cds - * @param string $username - * @param string $password - * @param string $chatset - * @throws - */ - public function __construct(public string $dbname, public string $cds, - public string $username, public string $password, public string $chatset = 'utf8mb4') - { - } + /** + * @param string $dbname + * @param string $cds + * @param string $username + * @param string $password + * @param string $chatset + * @throws + */ + public function __construct(public string $dbname, public string $cds, + public string $username, public string $password, public string $chatset = 'utf8mb4') + { + } - public function init() - { - $this->heartbeat_check(); - } + public function init() + { + $this->heartbeat_check(); + } - /** - * @return bool - */ - public function inTransaction(): bool - { - return $this->_transaction > 0; - } + /** + * @return bool + */ + public function inTransaction(): bool + { + return $this->_transaction > 0; + } - /** - * - */ - public function heartbeat_check(): void - { - if (env('state', 'start') == 'exit') { - return; - } - if ($this->_timer === -1 && Context::inCoroutine()) { - $this->_timer = Timer::tick(1000, function () { - try { - if (env('state', 'start') == 'exit') { - Kiri::getDi()->get(Logger::class)->critical('timer end'); - $this->stopHeartbeatCheck(); - } - if (time() - $this->_last > 10 * 60) { - $this->stopHeartbeatCheck(); - $this->pdo = null; - } - } catch (\Throwable $throwable) { - error($throwable); - } - }); - } - } + /** + * + */ + public function heartbeat_check(): void + { + if (env('state', 'start') == 'exit') { + return; + } + if ($this->_timer === -1 && Context::inCoroutine()) { + $this->_timer = Timer::tick(1000, function () { + try { + if (env('state', 'start') == 'exit') { + Kiri::getDi()->get(Logger::class)->critical('timer end'); + $this->stopHeartbeatCheck(); + } + if (time() - $this->_last > 10 * 60) { + $this->stopHeartbeatCheck(); + $this->pdo = null; + } + } catch (\Throwable $throwable) { + error($throwable); + } + }); + } + } - /** - * - */ - public function stopHeartbeatCheck(): void - { - if ($this->_timer > -1) { - Timer::clear($this->_timer); - } - $this->_timer = -1; - } + /** + * + */ + public function stopHeartbeatCheck(): void + { + if ($this->_timer > -1) { + Timer::clear($this->_timer); + } + $this->_timer = -1; + } - /** - * - */ - public function beginTransaction() - { - if ($this->_transaction == 0) { - $this->_pdo()->beginTransaction(); - } - $this->_transaction++; - } + /** + * + */ + public function beginTransaction() + { + if ($this->_transaction == 0) { + $this->_pdo()->beginTransaction(); + } + $this->_transaction++; + } - /** - * - */ - public function commit() - { - if ($this->_transaction == 0) { - $this->_pdo()->commit(); - } - $this->_transaction--; - } + /** + * + */ + public function commit() + { + if ($this->_transaction == 0) { + $this->_pdo()->commit(); + } + $this->_transaction--; + } - /** - * - */ - public function rollback() - { - if ($this->_transaction == 0) { - $this->_pdo()->rollBack(); - } - $this->_transaction--; - } + /** + * + */ + public function rollback() + { + if ($this->_transaction == 0) { + $this->_pdo()->rollBack(); + } + $this->_transaction--; + } /** @@ -140,14 +140,14 @@ class PDO implements StopHeartbeatCheck * @return bool|array|null * @throws Exception */ - public function fetchAll(string $sql, array $params = []): bool|null|array - { - $pdo = $this->queryPrev($sql, $params); + public function fetchAll(string $sql, array $params = []): bool|null|array + { + $pdo = $this->queryPrev($sql, $params); - $result = $pdo->fetchAll(\PDO::FETCH_ASSOC); - $pdo->closeCursor(); - return $result; - } + $result = $pdo->fetchAll(\PDO::FETCH_ASSOC); + $pdo->closeCursor(); + return $result; + } /** @@ -156,143 +156,146 @@ class PDO implements StopHeartbeatCheck * @return bool|array|null * @throws Exception */ - public function fetch(string $sql, array $params = []): bool|null|array - { - $pdo = $this->queryPrev($sql, $params); + public function fetch(string $sql, array $params = []): bool|null|array + { + $pdo = $this->queryPrev($sql, $params); - $result = $pdo->fetch(\PDO::FETCH_ASSOC); - $pdo->closeCursor(); - return $result; - } + $result = $pdo->fetch(\PDO::FETCH_ASSOC); + $pdo->closeCursor(); + return $result; + } - /** - * @param string $sql - * @param array $params - * @return bool|array|null - * @throws \Exception - */ - public function fetchColumn(string $sql, array $params = []): bool|null|array - { - $pdo = $this->queryPrev($sql, $params); + /** + * @param string $sql + * @param array $params + * @return bool|array|null + * @throws \Exception + */ + public function fetchColumn(string $sql, array $params = []): bool|null|array + { + $pdo = $this->queryPrev($sql, $params); - $result = $pdo->fetchColumn(\PDO::FETCH_ASSOC); - $pdo->closeCursor(); - return $result; - } + $result = $pdo->fetchColumn(\PDO::FETCH_ASSOC); + $pdo->closeCursor(); + return $result; + } - /** - * @param string $sql - * @param array $params - * @return int - * @throws Exception - */ - public function count(string $sql, array $params = []): int - { - $pdo = $this->queryPrev($sql, $params); + /** + * @param string $sql + * @param array $params + * @return int + * @throws Exception + */ + public function count(string $sql, array $params = []): int + { + $pdo = $this->queryPrev($sql, $params); - $result = $pdo->rowCount(); - $pdo->closeCursor(); - return $result; - } + $result = $pdo->rowCount(); + $pdo->closeCursor(); + return $result; + } - /** - * @param string $sql - * @param array $params - * @return PDOStatement - * @throws Exception - */ - private function queryPrev(string $sql, array $params = []): PDOStatement - { - $this->_last = time(); - try { - if (($statement = $this->_pdo()->query($sql)) === false) { - throw new Exception($this->_pdo()->errorInfo()[1]); - } - return $this->bindValue($statement, $params); - } catch (\Throwable $throwable) { + /** + * @param string $sql + * @param array $params + * @return PDOStatement + * @throws Exception + */ + private function queryPrev(string $sql, array $params = []): PDOStatement + { + $this->_last = time(); + try { + if (($statement = $this->_pdo()->query($sql)) === false) { + throw new Exception($this->_pdo()->errorInfo()[1]); + } + return $this->bindValue($statement, $params); + } catch (\Throwable $throwable) { - if (str_contains($throwable->getMessage(), 'MySQL server has gone away')) { - $this->pdo = null; + if (str_contains($throwable->getMessage(), 'MySQL server has gone away')) { + $this->pdo = null; - return $this->queryPrev($sql, $params); - } + return $this->queryPrev($sql, $params); + } - throw new Exception($throwable->getMessage()); - } - } + throw new Exception($throwable->getMessage()); + } + } - /** - * @param PDOStatement $statement - * @param array $params - * @return PDOStatement - */ - private function bindValue(PDOStatement $statement, array $params = []): PDOStatement - { - if (empty($params)) return $statement; - foreach ($params as $key => $param) { - $statement->bindValue($key, $param); - } - return $statement; - } + /** + * @param PDOStatement $statement + * @param array $params + * @return PDOStatement + */ + private function bindValue(PDOStatement $statement, array $params = []): PDOStatement + { + if (empty($params)) return $statement; + foreach ($params as $key => $param) { + $statement->bindValue($key, $param); + } + return $statement; + } - /** - * @param string $sql - * @param array $params - * @return int - * @throws Exception - */ - public function execute(string $sql, array $params = []): int - { - $this->_last = time(); - $pdo = $this->_pdo(); - if (!(($prepare = $pdo->prepare($sql)) instanceof PDOStatement)) { - throw new Exception($prepare->errorInfo()[2] ?? static::DB_ERROR_MESSAGE); - } - if ($prepare->execute($params) === false) { - throw new Exception($prepare->errorInfo()[2] ?? static::DB_ERROR_MESSAGE); - } - $result = (int)$pdo->lastInsertId(); - $prepare->closeCursor(); - return $result; - } + /** + * @param string $sql + * @param array $params + * @return int + * @throws Exception + */ + public function execute(string $sql, array $params = []): int + { + $this->_last = time(); + $pdo = $this->_pdo(); + if (!(($prepare = $pdo->prepare($sql)) instanceof PDOStatement)) { + throw new Exception($prepare->errorInfo()[2] ?? static::DB_ERROR_MESSAGE); + } + if ($prepare->execute($params) === false) { + throw new Exception($prepare->errorInfo()[2] ?? static::DB_ERROR_MESSAGE); + } + $result = (int)$pdo->lastInsertId(); + $prepare->closeCursor(); + if ($result == 0) { + return true; + } + return $result; + } - /** - * @return \PDO - */ - public function _pdo(): \PDO - { - if ($this->_timer === -1) { - $this->heartbeat_check(); - } - if (!($this->pdo instanceof \PDO)) { - $this->pdo = $this->newClient(); - } - return $this->pdo; - } + /** + * @return \PDO + */ + public function _pdo(): \PDO + { + if ($this->_timer === -1) { + $this->heartbeat_check(); + } + if (!($this->pdo instanceof \PDO)) { + $this->pdo = $this->newClient(); + } + return $this->pdo; + } - /** - * @return \PDO - */ - private function newClient(): \PDO - { - $link = new \PDO('mysql:dbname=' . $this->dbname . ';host=' . $this->cds, $this->username, $this->password, [ - \PDO::ATTR_EMULATE_PREPARES => false, - \PDO::ATTR_CASE => \PDO::CASE_NATURAL, - \PDO::ATTR_TIMEOUT => 60, - \PDO::MYSQL_ATTR_USE_BUFFERED_QUERY => true, - \PDO::MYSQL_ATTR_INIT_COMMAND => 'SET NAMES ' . $this->chatset - ]); - $link->setAttribute(\PDO::ATTR_ERRMODE, \PDO::ERRMODE_EXCEPTION); - $link->setAttribute(\PDO::ATTR_STRINGIFY_FETCHES, false); - $link->setAttribute(\PDO::ATTR_ORACLE_NULLS, \PDO::NULL_EMPTY_STRING); - return $link; - } + /** + * @return \PDO + */ + private function newClient(): \PDO + { + $link = new \PDO('mysql:dbname=' . $this->dbname . ';host=' . $this->cds, $this->username, $this->password, [ + \PDO::ATTR_EMULATE_PREPARES => false, + \PDO::ATTR_CASE => \PDO::CASE_NATURAL, + \PDO::ATTR_TIMEOUT => 60, + \PDO::MYSQL_ATTR_USE_BUFFERED_QUERY => true, + \PDO::MYSQL_ATTR_INIT_COMMAND => 'SET NAMES ' . $this->chatset + ]); + $link->setAttribute(\PDO::ATTR_ERRMODE, \PDO::ERRMODE_EXCEPTION); + $link->setAttribute(\PDO::ATTR_STRINGIFY_FETCHES, false); + $link->setAttribute(\PDO::ATTR_ORACLE_NULLS, \PDO::NULL_EMPTY_STRING); + return $link; + } }