public static createException ( $message, $code, $sql ) : Dibi\DriverException | ||
return | Dibi\DriverException |
public static function createException($message, $code, $sql)
{
if (in_array($code, [1, 2299, 38911], TRUE)) {
return new Dibi\UniqueConstraintViolationException($message, $code, $sql);
} elseif (in_array($code, [1400], TRUE)) {
return new Dibi\NotNullConstraintViolationException($message, $code, $sql);
} elseif (in_array($code, [2266, 2291, 2292], TRUE)) {
return new Dibi\ForeignKeyConstraintViolationException($message, $code, $sql);
} else {
return new Dibi\DriverException($message, $code, $sql);
}
}
/** * Executes the SQL query. * @param string SQL statement. * @return Dibi\ResultDriver|NULL * @throws Dibi\DriverException */ public function query($sql) { // must detect if SQL returns result set or num of affected rows $cmd = strtoupper(substr(ltrim($sql), 0, 6)); static $list = ['UPDATE' => 1, 'DELETE' => 1, 'INSERT' => 1, 'REPLAC' => 1]; $this->affectedRows = FALSE; if (isset($list[$cmd])) { $this->affectedRows = $this->connection->exec($sql); if ($this->affectedRows !== FALSE) { return; } } else { $res = $this->connection->query($sql); if ($res) { return $this->createResultDriver($res); } } list($sqlState, $code, $message) = $this->connection->errorInfo(); $message = "SQLSTATE[{$sqlState}]: {$message}"; switch ($this->driverName) { case 'mysql': throw MySqliDriver::createException($message, $code, $sql); case 'oci': throw OracleDriver::createException($message, $code, $sql); case 'pgsql': throw PostgreDriver::createException($message, $sqlState, $sql); case 'sqlite': throw Sqlite3Driver::createException($message, $code, $sql); default: throw new Dibi\DriverException($message, $code, $sql); } }