|
| 1 | +<?php |
| 2 | + |
| 3 | +declare(strict_types=1); |
| 4 | + |
| 5 | +namespace Flow\PostgreSql\Client\Exception; |
| 6 | + |
| 7 | +enum PostgreSqlErrorCategory : string |
| 8 | +{ |
| 9 | + case CARDINALITY_VIOLATION = '21'; |
| 10 | + case CASE_NOT_FOUND = '20'; |
| 11 | + case CONFIGURATION_FILE_ERROR = 'F0'; |
| 12 | + case CONNECTION_EXCEPTION = '08'; |
| 13 | + case DATA_EXCEPTION = '22'; |
| 14 | + case DEPENDENT_PRIVILEGE_DESCRIPTORS = '2B'; |
| 15 | + case DIAGNOSTICS_EXCEPTION = '0Z'; |
| 16 | + case EXTERNAL_ROUTINE_EXCEPTION = '38'; |
| 17 | + case EXTERNAL_ROUTINE_INVOCATION_EXCEPTION = '39'; |
| 18 | + case FDW_ERROR = 'HV'; |
| 19 | + case FEATURE_NOT_SUPPORTED = '0A'; |
| 20 | + case INSUFFICIENT_RESOURCES = '53'; |
| 21 | + case INTEGRITY_CONSTRAINT_VIOLATION = '23'; |
| 22 | + case INTERNAL_ERROR = 'XX'; |
| 23 | + case INVALID_AUTHORIZATION_SPECIFICATION = '28'; |
| 24 | + case INVALID_CATALOG_NAME = '3D'; |
| 25 | + case INVALID_CURSOR_NAME = '34'; |
| 26 | + case INVALID_CURSOR_STATE = '24'; |
| 27 | + case INVALID_GRANTOR = '0L'; |
| 28 | + case INVALID_ROLE_SPECIFICATION = '0P'; |
| 29 | + case INVALID_SCHEMA_NAME = '3F'; |
| 30 | + case INVALID_SQL_STATEMENT_NAME = '26'; |
| 31 | + case INVALID_TRANSACTION_INITIATION = '0B'; |
| 32 | + case INVALID_TRANSACTION_STATE = '25'; |
| 33 | + case INVALID_TRANSACTION_TERMINATION = '2D'; |
| 34 | + case LOCATOR_EXCEPTION = '0F'; |
| 35 | + case NO_DATA = '02'; |
| 36 | + case OBJECT_NOT_IN_PREREQUISITE_STATE = '55'; |
| 37 | + case OPERATOR_INTERVENTION = '57'; |
| 38 | + case PL_PGSQL_ERROR = 'P0'; |
| 39 | + case PROGRAM_LIMIT_EXCEEDED = '54'; |
| 40 | + case SAVEPOINT_EXCEPTION = '3B'; |
| 41 | + case SNAPSHOT_FAILURE = '72'; |
| 42 | + case SQL_ROUTINE_EXCEPTION = '2F'; |
| 43 | + case SQL_STATEMENT_NOT_YET_COMPLETE = '03'; |
| 44 | + case SUCCESSFUL_COMPLETION = '00'; |
| 45 | + case SYNTAX_ERROR_OR_ACCESS_RULE_VIOLATION = '42'; |
| 46 | + case SYSTEM_ERROR = '58'; |
| 47 | + case TRANSACTION_ROLLBACK = '40'; |
| 48 | + case TRIGGERED_ACTION_EXCEPTION = '09'; |
| 49 | + case TRIGGERED_DATA_CHANGE_VIOLATION = '27'; |
| 50 | + case UNKNOWN = '??'; |
| 51 | + case WARNING = '01'; |
| 52 | + case WITH_CHECK_OPTION_VIOLATION = '44'; |
| 53 | + |
| 54 | + public static function fromSqlState(string $sqlState) : self |
| 55 | + { |
| 56 | + if (\strlen($sqlState) < 2) { |
| 57 | + return self::UNKNOWN; |
| 58 | + } |
| 59 | + |
| 60 | + $class = \substr($sqlState, 0, 2); |
| 61 | + |
| 62 | + return self::tryFrom($class) ?? self::UNKNOWN; |
| 63 | + } |
| 64 | + |
| 65 | + public function isRecoverable() : bool |
| 66 | + { |
| 67 | + return match ($this) { |
| 68 | + self::TRANSACTION_ROLLBACK => true, |
| 69 | + default => false, |
| 70 | + }; |
| 71 | + } |
| 72 | + |
| 73 | + public function safeMessage() : string |
| 74 | + { |
| 75 | + return match ($this) { |
| 76 | + self::SUCCESSFUL_COMPLETION => 'Operation completed successfully', |
| 77 | + self::WARNING => 'Operation completed with warnings', |
| 78 | + self::NO_DATA => 'No data found', |
| 79 | + self::SQL_STATEMENT_NOT_YET_COMPLETE => 'SQL statement not yet complete', |
| 80 | + self::CONNECTION_EXCEPTION => 'Database connection error occurred', |
| 81 | + self::TRIGGERED_ACTION_EXCEPTION => 'Triggered action error', |
| 82 | + self::FEATURE_NOT_SUPPORTED => 'Feature not supported', |
| 83 | + self::INVALID_TRANSACTION_INITIATION => 'Invalid transaction initiation', |
| 84 | + self::LOCATOR_EXCEPTION => 'Locator error', |
| 85 | + self::INVALID_GRANTOR => 'Invalid grantor', |
| 86 | + self::INVALID_ROLE_SPECIFICATION => 'Invalid role specification', |
| 87 | + self::DIAGNOSTICS_EXCEPTION => 'Diagnostics error', |
| 88 | + self::CASE_NOT_FOUND => 'Case not found', |
| 89 | + self::CARDINALITY_VIOLATION => 'Cardinality violation', |
| 90 | + self::DATA_EXCEPTION => 'Invalid data format or value', |
| 91 | + self::INTEGRITY_CONSTRAINT_VIOLATION => 'Data constraint violation', |
| 92 | + self::INVALID_CURSOR_STATE => 'Invalid cursor state', |
| 93 | + self::INVALID_TRANSACTION_STATE => 'Invalid transaction state', |
| 94 | + self::INVALID_SQL_STATEMENT_NAME => 'Invalid SQL statement name', |
| 95 | + self::TRIGGERED_DATA_CHANGE_VIOLATION => 'Triggered data change violation', |
| 96 | + self::INVALID_AUTHORIZATION_SPECIFICATION => 'Authorization error', |
| 97 | + self::DEPENDENT_PRIVILEGE_DESCRIPTORS => 'Dependent privilege descriptors still exist', |
| 98 | + self::INVALID_TRANSACTION_TERMINATION => 'Invalid transaction termination', |
| 99 | + self::SQL_ROUTINE_EXCEPTION => 'SQL routine error', |
| 100 | + self::INVALID_CURSOR_NAME => 'Invalid cursor name', |
| 101 | + self::EXTERNAL_ROUTINE_EXCEPTION => 'External routine error', |
| 102 | + self::EXTERNAL_ROUTINE_INVOCATION_EXCEPTION => 'External routine invocation error', |
| 103 | + self::SAVEPOINT_EXCEPTION => 'Savepoint error', |
| 104 | + self::INVALID_CATALOG_NAME => 'Invalid catalog name', |
| 105 | + self::INVALID_SCHEMA_NAME => 'Invalid schema name', |
| 106 | + self::TRANSACTION_ROLLBACK => 'Transaction was rolled back', |
| 107 | + self::SYNTAX_ERROR_OR_ACCESS_RULE_VIOLATION => 'Query syntax or permission error', |
| 108 | + self::WITH_CHECK_OPTION_VIOLATION => 'Check option violation', |
| 109 | + self::INSUFFICIENT_RESOURCES => 'Server resource limit reached', |
| 110 | + self::PROGRAM_LIMIT_EXCEEDED => 'Program limit exceeded', |
| 111 | + self::OBJECT_NOT_IN_PREREQUISITE_STATE => 'Object not in prerequisite state', |
| 112 | + self::OPERATOR_INTERVENTION => 'Operator intervention', |
| 113 | + self::SYSTEM_ERROR => 'Database system error', |
| 114 | + self::SNAPSHOT_FAILURE => 'Snapshot failure', |
| 115 | + self::CONFIGURATION_FILE_ERROR => 'Configuration file error', |
| 116 | + self::FDW_ERROR => 'Foreign data wrapper error', |
| 117 | + self::PL_PGSQL_ERROR => 'PL/pgSQL error', |
| 118 | + self::INTERNAL_ERROR => 'Internal database error', |
| 119 | + self::UNKNOWN => 'Database operation failed', |
| 120 | + }; |
| 121 | + } |
| 122 | +} |
0 commit comments