Completed
Pull Request — 2.0 (#75)
by Julien
02:32
created

SqlException   A

Complexity

Total Complexity 8

Size/Duplication

Total Lines 401
Duplicated Lines 0 %

Coupling/Cohesion

Components 1
Dependencies 1

Importance

Changes 6
Bugs 2 Features 2
Metric Value
wmc 8
lcom 1
cbo 1
dl 0
loc 401
c 6
b 2
f 2
rs 10

8 Methods

Rating   Name   Duplication   Size   Complexity  
A getQuery() 0 4 1
A getQueryParameters() 0 4 1
A __construct() 0 16 1
A setQueryParameters() 0 6 1
A getSQLErrorState() 0 4 1
A getSQLErrorSeverity() 0 4 1
A getSqlErrorMessage() 0 4 1
A getSQLDetailedErrorMessage() 0 4 1
1
<?php
2
/*
3
 * This file is part of the Pomm's Foundation package.
4
 *
5
 * (c) 2014 - 2015 Grégoire HUBERT <[email protected]>
6
 *
7
 * For the full copyright and license information, please view the LICENSE
8
 * file that was distributed with this source code.
9
 */
10
namespace PommProject\Foundation\Exception;
11
12
/**
13
 * SqlException
14
 *
15
 * Errors from the rdbms with the result resource.
16
 *
17
 * @link      http://www.postgresql.org/docs/9.0/static/errcodes-appendix.html
18
 * @package   Foundation
19
 * @uses      FoundationException
20
 * @copyright 2014 - 2015 Grégoire HUBERT
21
 * @author    Grégoire HUBERT <[email protected]>
22
 * @license   X11 {@link http://opensource.org/licenses/mit-license.php}
23
 */
24
class SqlException extends FoundationException
25
{
26
    /* 00 - Successful Completion */
27
    const SUCCESSFUL_COMPLETION = '00000';
28
    /* 01 - Warning */
29
    const WARNING = '01000';
30
    const DYNAMIC_RESULT_SETS_RETURNED = '0100C';
31
    const IMPLICIT_ZERO_BIT_PADDING = '01008';
32
    const NULL_VALUE_ELIMINATED_IN_SET_FUNCTION = '01003';
33
    const PRIVILEGE_NOT_GRANTED = '01007';
34
    const PRIVILEGE_NOT_REVOKED = '01006';
35
    const STRING_DATA_RIGHT_TRUNCATION = '01004';
36
    const DEPRECATED_FEATURE = '01P01';
37
    /* 02 - No Data (this is also a warning class per the SQL standard) */
38
    const NO_DATA = '02000';
39
    const NO_ADDITIONAL_DYNAMIC_RESULT_SETS_RETURNED = '02001';
40
    /* 03 - SQL Statement Not Yet Complete */
41
    const SQL_STATEMENT_NOT_YET_COMPLETE = '03000';
42
    /* 08 - Connection Exception */
43
    const CONNECTION_EXCEPTION = '08000';
44
    const CONNECTION_DOES_NOT_EXIST = '08003';
45
    const CONNECTION_FAILURE = '08006';
46
    const SQLCLIENT_UNABLE_TO_ESTABLISH_SQLCONNECTION = '08001';
47
    const SQLSERVER_REJECTED_ESTABLISHMENT_OF_SQLCONNECTION = '08004';
48
    const TRANSACTION_RESOLUTION_UNKNOWN = '08007';
49
    const PROTOCOL_VIOLATION = '08P01';
50
    /* 09 - Triggered Action Exception */
51
    const TRIGGERED_ACTION_EXCEPTION = '09000';
52
    /* 0A - Feature Not Supported */
53
    const FEATURE_NOT_SUPPORTED = '0A000';
54
    /* 0B - Invalid Transaction Initiation */
55
    const INVALID_TRANSACTION_INITIATION = '0B000';
56
    /* 0F - Locator Exception */
57
    const LOCATOR_EXCEPTION = '0F000';
58
    const INVALID_LOCATOR_SPECIFICATION = '0F001';
59
    /* 0L - Invalid Grantor */
60
    const INVALID_GRANTOR = '0L000';
61
    const INVALID_GRANT_OPERATION = '0LP01';
62
    /* 0P - Invalid Role Specification */
63
    const INVALID_ROLE_SPECIFICATION = '0P000';
64
    /* 0Z - Diagnostics Exception */
65
    const DIAGNOSTICS_EXCEPTION = '0Z000';
66
    const STACKED_DIAGNOSTICS_ACCESSED_WITHOUT_ACTIVE_HANDLER = '0Z002';
67
    /* 20 - Case Not Found */
68
    const CASE_NOT_FOUND = '20000';
69
    /* 21 - Cardinality Violation */
70
    const CARDINALITY_VIOLATION = '21000';
71
    /* 22 - Data Exception */
72
    const DATA_EXCEPTION = '22000';
73
    const ARRAY_SUBSCRIPT_ERROR = '2202E';
74
    const CHARACTER_NOT_IN_REPERTOIRE = '22021';
75
    const DATETIME_FIELD_OVERFLOW = '22008';
76
    const DIVISION_BY_ZERO = '22012';
77
    const ERROR_IN_ASSIGNMENT = '22005';
78
    const ESCAPE_CHARACTER_CONFLICT = '2200B';
79
    const INDICATOR_OVERFLOW = '22022';
80
    const INTERVAL_FIELD_OVERFLOW = '22015';
81
    const INVALID_ARGUMENT_FOR_LOGARITHM = '2201E';
82
    const INVALID_ARGUMENT_FOR_NTILE_FUNCTION = '22014';
83
    const INVALID_ARGUMENT_FOR_NTH_VALUE_FUNCTION = '22016';
84
    const INVALID_ARGUMENT_FOR_POWER_FUNCTION = '2201F';
85
    const INVALID_ARGUMENT_FOR_WIDTH_BUCKET_FUNCTION = '2201G';
86
    const INVALID_CHARACTER_VALUE_FOR_CAST = '22018';
87
    const INVALID_DATETIME_FORMAT = '22007';
88
    const INVALID_ESCAPE_CHARACTER = '22019';
89
    const INVALID_ESCAPE_OCTET = '2200D';
90
    const INVALID_ESCAPE_SEQUENCE = '22025';
91
    const NONSTANDARD_USE_OF_ESCAPE_CHARACTER = '22P06';
92
    const INVALID_INDICATOR_PARAMETER_VALUE = '22010';
93
    const INVALID_PARAMETER_VALUE = '22023';
94
    const INVALID_REGULAR_EXPRESSION = '2201B';
95
    const INVALID_ROW_COUNT_IN_LIMIT_CLAUSE = '2201W';
96
    const INVALID_ROW_COUNT_IN_RESULT_OFFSET_CLAUSE = '2201X';
97
    const INVALID_TIME_ZONE_DISPLACEMENT_VALUE = '22009';
98
    const INVALID_USE_OF_ESCAPE_CHARACTER = '2200C';
99
    const MOST_SPECIFIC_TYPE_MISMATCH = '2200G';
100
    const NULL_VALUE_NOT_ALLOWED = '22004';
101
    const NULL_VALUE_NO_INDICATOR_PARAMETER = '22002';
102
    const NUMERIC_VALUE_OUT_OF_RANGE = '22003';
103
    const STRING_DATA_LENGTH_MISMATCH = '22026';
104
    #const STRING_DATA_RIGHT_TRUNCATION = '22001';
105
    const SUBSTRING_ERROR = '22011';
106
    const TRIM_ERROR = '22027';
107
    const UNTERMINATED_C_STRING = '22024';
108
    const ZERO_LENGTH_CHARACTER_STRING = '2200F';
109
    const FLOATING_POINT_EXCEPTION = '22P01';
110
    const INVALID_TEXT_REPRESENTATION = '22P02';
111
    const INVALID_BINARY_REPRESENTATION = '22P03';
112
    const BAD_COPY_FILE_FORMAT = '22P04';
113
    const UNTRANSLATABLE_CHARACTER = '22P05';
114
    const NOT_AN_XML_DOCUMENT = '2200L';
115
    const INVALID_XML_DOCUMENT = '2200M';
116
    const INVALID_XML_CONTENT = '2200N';
117
    const INVALID_XML_COMMENT = '2200S';
118
    const INVALID_XML_PROCESSING_INSTRUCTION = '2200T';
119
    /* 23 - Integrity Constraint Violation */
120
    const INTEGRITY_CONSTRAINT_VIOLATION = '23000';
121
    const RESTRICT_VIOLATION = '23001';
122
    const NOT_NULL_VIOLATION = '23502';
123
    const FOREIGN_KEY_VIOLATION = '23503';
124
    const UNIQUE_VIOLATION = '23505';
125
    const CHECK_VIOLATION = '23514';
126
    const EXCLUSION_VIOLATION = '23P01';
127
    /* 24 - Invalid Cursor State */
128
    const INVALID_CURSOR_STATE = '24000';
129
    /* 25 - Invalid Transaction State */
130
    const INVALID_TRANSACTION_STATE = '25000';
131
    const ACTIVE_SQL_TRANSACTION = '25001';
132
    const BRANCH_TRANSACTION_ALREADY_ACTIVE = '25002';
133
    const HELD_CURSOR_REQUIRES_SAME_ISOLATION_LEVEL = '25008';
134
    const INAPPROPRIATE_ACCESS_MODE_FOR_BRANCH_TRANSACTION = '25003';
135
    const INAPPROPRIATE_ISOLATION_LEVEL_FOR_BRANCH_TRANSACTION = '25004';
136
    const NO_ACTIVE_SQL_TRANSACTION_FOR_BRANCH_TRANSACTION = '25005';
137
    const READ_ONLY_SQL_TRANSACTION = '25006';
138
    const SCHEMA_AND_DATA_STATEMENT_MIXING_NOT_SUPPORTED = '25007';
139
    const NO_ACTIVE_SQL_TRANSACTION = '25P01';
140
    const IN_FAILED_SQL_TRANSACTION = '25P02';
141
    /* 26 - Invalid SQL Statement Name */
142
    const INVALID_SQL_STATEMENT_NAME = '26000';
143
    /* 27 - Triggered Data Change Violation */
144
    const TRIGGERED_DATA_CHANGE_VIOLATION = '27000';
145
    /* 28 - Invalid Authorization Specification */
146
    const INVALID_AUTHORIZATION_SPECIFICATION = '28000';
147
    const INVALID_PASSWORD = '28P01';
148
    /* 2B - Dependent Privilege Descriptors Still Exist */
149
    const DEPENDENT_PRIVILEGE_DESCRIPTORS_STILL_EXIST = '2B000';
150
    const DEPENDENT_OBJECTS_STILL_EXIST = '2BP01';
151
    /* 2D - Invalid Transaction Termination */
152
    const INVALID_TRANSACTION_TERMINATION = '2D000';
153
    /* 2F - SQL Routine Exception */
154
    const SQL_ROUTINE_EXCEPTION = '2F000';
155
    const FUNCTION_EXECUTED_NO_RETURN_STATEMENT = '2F005';
156
    const MODIFYING_SQL_DATA_NOT_PERMITTED = '2F002';
157
    const PROHIBITED_SQL_STATEMENT_ATTEMPTED = '2F003';
158
    const READING_SQL_DATA_NOT_PERMITTED = '2F004';
159
    /* 34 - Invalid Cursor Name */
160
    const INVALID_CURSOR_NAME = '34000';
161
    /* 38 - External Routine Exception */
162
    const EXTERNAL_ROUTINE_EXCEPTION = '38000';
163
    const CONTAINING_SQL_NOT_PERMITTED = '38001';
164
    #const MODIFYING_SQL_DATA_NOT_PERMITTED = '38002';
165
    #const PROHIBITED_SQL_STATEMENT_ATTEMPTED = '38003';
166
    #const READING_SQL_DATA_NOT_PERMITTED = '38004';
167
    /* 39 - External Routine Invocation Exception */
168
    const EXTERNAL_ROUTINE_INVOCATION_EXCEPTION = '39000';
169
    const INVALID_SQLSTATE_RETURNED = '39001';
170
    #const NULL_VALUE_NOT_ALLOWED = '39004';
171
    const TRIGGER_PROTOCOL_VIOLATED = '39P01';
172
    const SRF_PROTOCOL_VIOLATED = '39P02';
173
    /* 3B - Savepoint Exception */
174
    const SAVEPOINT_EXCEPTION = '3B000';
175
    const INVALID_SAVEPOINT_SPECIFICATION = '3B001';
176
    /* 3D - Invalid Catalog Name */
177
    const INVALID_CATALOG_NAME = '3D000';
178
    /* 3F - Invalid Schema Name */
179
    const INVALID_SCHEMA_NAME = '3F000';
180
    /* 40 - Transaction Rollback */
181
    const TRANSACTION_ROLLBACK = '40000';
182
    const TRANSACTION_INTEGRITY_CONSTRAINT_VIOLATION = '40002';
183
    const SERIALIZATION_FAILURE = '40001';
184
    const STATEMENT_COMPLETION_UNKNOWN = '40003';
185
    const DEADLOCK_DETECTED = '40P01';
186
    /* 42 - Syntax Error or Access Rule Violation */
187
    const SYNTAX_ERROR_OR_ACCESS_RULE_VIOLATION = '42000';
188
    const SYNTAX_ERROR = '42601';
189
    const INSUFFICIENT_PRIVILEGE = '42501';
190
    const CANNOT_COERCE = '42846';
191
    const GROUPING_ERROR = '42803';
192
    const WINDOWING_ERROR = '42P20';
193
    const INVALID_RECURSION = '42P19';
194
    const INVALID_FOREIGN_KEY = '42830';
195
    const INVALID_NAME = '42602';
196
    const NAME_TOO_LONG = '42622';
197
    const RESERVED_NAME = '42939';
198
    const DATATYPE_MISMATCH = '42804';
199
    const INDETERMINATE_DATATYPE = '42P18';
200
    const COLLATION_MISMATCH = '42P21';
201
    const INDETERMINATE_COLLATION = '42P22';
202
    const WRONG_OBJECT_TYPE = '42809';
203
    const UNDEFINED_COLUMN = '42703';
204
    const UNDEFINED_FUNCTION = '42883';
205
    const UNDEFINED_TABLE = '42P01';
206
    const UNDEFINED_PARAMETER = '42P02';
207
    const UNDEFINED_OBJECT = '42704';
208
    const DUPLICATE_COLUMN = '42701';
209
    const DUPLICATE_CURSOR = '42P03';
210
    const DUPLICATE_DATABASE = '42P04';
211
    const DUPLICATE_FUNCTION = '42723';
212
    const DUPLICATE_PREPARED_STATEMENT = '42P05';
213
    const DUPLICATE_SCHEMA = '42P06';
214
    const DUPLICATE_TABLE = '42P07';
215
    const DUPLICATE_ALIAS = '42712';
216
    const DUPLICATE_OBJECT = '42710';
217
    const AMBIGUOUS_COLUMN = '42702';
218
    const AMBIGUOUS_FUNCTION = '42725';
219
    const AMBIGUOUS_PARAMETER = '42P08';
220
    const AMBIGUOUS_ALIAS = '42P09';
221
    const INVALID_COLUMN_REFERENCE = '42P10';
222
    const INVALID_COLUMN_DEFINITION = '42611';
223
    const INVALID_CURSOR_DEFINITION = '42P11';
224
    const INVALID_DATABASE_DEFINITION = '42P12';
225
    const INVALID_FUNCTION_DEFINITION = '42P13';
226
    const INVALID_PREPARED_STATEMENT_DEFINITION = '42P14';
227
    const INVALID_SCHEMA_DEFINITION = '42P15';
228
    const INVALID_TABLE_DEFINITION = '42P16';
229
    const INVALID_OBJECT_DEFINITION = '42P17';
230
    /* 44 - WITH CHECK OPTION Violation */
231
    const WITH_CHECK_OPTION_VIOLATION = '44000';
232
    /* 53 - Insufficient Resources */
233
    const INSUFFICIENT_RESOURCES = '53000';
234
    const DISK_FULL = '53100';
235
    const OUT_OF_MEMORY = '53200';
236
    const TOO_MANY_CONNECTIONS = '53300';
237
    const CONFIGURATION_LIMIT_EXCEEDED = '53400';
238
    /* 54 - Program Limit Exceeded */
239
    const PROGRAM_LIMIT_EXCEEDED = '54000';
240
    const STATEMENT_TOO_COMPLEX = '54001';
241
    const TOO_MANY_COLUMNS = '54011';
242
    const TOO_MANY_ARGUMENTS = '54023';
243
    /* 55 - Object Not In Prerequisite State */
244
    const OBJECT_NOT_IN_PREREQUISITE_STATE = '55000';
245
    const OBJECT_IN_USE = '55006';
246
    const CANT_CHANGE_RUNTIME_PARAM = '55P02';
247
    const LOCK_NOT_AVAILABLE = '55P03';
248
    /* 57 - Operator Intervention */
249
    const OPERATOR_INTERVENTION = '57000';
250
    const QUERY_CANCELED = '57014';
251
    const ADMIN_SHUTDOWN = '57P01';
252
    const CRASH_SHUTDOWN = '57P02';
253
    const CANNOT_CONNECT_NOW = '57P03';
254
    const DATABASE_DROPPED = '57P04';
255
    /* 58 - System Error (errors external to PostgreSQL itself) */
256
    const SYSTEM_ERROR = '58000';
257
    const IO_ERROR = '58030';
258
    const UNDEFINED_FILE = '58P01';
259
    const DUPLICATE_FILE = '58P02';
260
    /* F0 - Configuration File Error */
261
    const CONFIG_FILE_ERROR = 'F0000';
262
    const LOCK_FILE_EXISTS = 'F0001';
263
    /* HV - Foreign Data Wrapper Error (SQL/MED) */
264
    const FDW_ERROR = 'HV000';
265
    const FDW_COLUMN_NAME_NOT_FOUND = 'HV005';
266
    const FDW_DYNAMIC_PARAMETER_VALUE_NEEDED = 'HV002';
267
    const FDW_FUNCTION_SEQUENCE_ERROR = 'HV010';
268
    const FDW_INCONSISTENT_DESCRIPTOR_INFORMATION = 'HV021';
269
    const FDW_INVALID_ATTRIBUTE_VALUE = 'HV024';
270
    const FDW_INVALID_COLUMN_NAME = 'HV007';
271
    const FDW_INVALID_COLUMN_NUMBER = 'HV008';
272
    const FDW_INVALID_DATA_TYPE = 'HV004';
273
    const FDW_INVALID_DATA_TYPE_DESCRIPTORS = 'HV006';
274
    const FDW_INVALID_DESCRIPTOR_FIELD_IDENTIFIER = 'HV091';
275
    const FDW_INVALID_HANDLE = 'HV00B';
276
    const FDW_INVALID_OPTION_INDEX = 'HV00C';
277
    const FDW_INVALID_OPTION_NAME = 'HV00D';
278
    const FDW_INVALID_STRING_LENGTH_OR_BUFFER_LENGTH = 'HV090';
279
    const FDW_INVALID_STRING_FORMAT = 'HV00A';
280
    const FDW_INVALID_USE_OF_NULL_POINTER = 'HV009';
281
    const FDW_TOO_MANY_HANDLES = 'HV014';
282
    const FDW_OUT_OF_MEMORY = 'HV001';
283
    const FDW_NO_SCHEMAS = 'HV00P';
284
    const FDW_OPTION_NAME_NOT_FOUND = 'HV00J';
285
    const FDW_REPLY_HANDLE = 'HV00K';
286
    const FDW_SCHEMA_NOT_FOUND = 'HV00Q';
287
    const FDW_TABLE_NOT_FOUND = 'HV00R';
288
    const FDW_UNABLE_TO_CREATE_EXECUTION = 'HV00L';
289
    const FDW_UNABLE_TO_CREATE_REPLY = 'HV00M';
290
    const FDW_UNABLE_TO_ESTABLISH_CONNECTION = 'HV00N';
291
    /* P0 - PL/pgSQL Error */
292
    const PLPGSQL_ERROR = 'P0000';
293
    const RAISE_EXCEPTION = 'P0001';
294
    const NO_DATA_FOUND = 'P0002';
295
    const TOO_MANY_ROWS = 'P0003';
296
    /* XX - Internal Error */
297
    const INTERNAL_ERROR = 'XX000';
298
    const DATA_CORRUPTED = 'XX001';
299
    const INDEX_CORRUPTED = 'XX002';
300
301
    protected $result_resource;
302
    protected $sql;
303
    protected $query_parameters = [];
304
305
    /**
306
     * __construct
307
     *
308
     * @access public
309
     * @param  resource   $result_resource
310
     * @param  string     $sql
311
     * @param  string     $code
312
     * @param  \Exception $e
313
     */
314
    public function __construct($result_resource, $sql, $code = null, \Exception $e = null)
315
    {
316
        $this->result_resource = $result_resource;
317
        $this->sql = $sql;
318
        parent::__construct(
319
            sprintf(
320
                "\nSQL error state '%s' [%s]\n====\n%s\n====\n«%s».",
321
                $this->getSQLErrorState(),
322
                $this->getSQLErrorSeverity(),
323
                $this->getSqlErrorMessage(),
324
                $sql
325
            ),
326
            $code,
327
            $e
328
        );
329
    }
330
331
    /**
332
     * getSQLErrorState
333
     *
334
     * Returns the SQLSTATE of the last SQL error.
335
     *
336
     * @link http://www.postgresql.org/docs/9.0/interactive/errcodes-appendix.html
337
     * @access public
338
     * @return string
339
     */
340
    public function getSQLErrorState()
341
    {
342
        return pg_result_error_field($this->result_resource, \PGSQL_DIAG_SQLSTATE);
343
    }
344
345
    /**
346
     * getSQLErrorSeverity
347
     *
348
     * Returns the severity level of the error.
349
     *
350
     * @access public
351
     * @return string
352
     */
353
    public function getSQLErrorSeverity()
354
    {
355
        return pg_result_error_field($this->result_resource, \PGSQL_DIAG_SEVERITY);
356
    }
357
358
    /**
359
     * getSqlErrorMessage
360
     *
361
     * Returns the error message sent by the server.
362
     *
363
     * @access public
364
     * @return string
365
     */
366
367
    public function getSqlErrorMessage()
368
    {
369
        return pg_result_error($this->result_resource);
370
    }
371
372
    /**
373
     * getSQLDetailedErrorMessage
374
     *
375
     * @access public
376
     * @return string
377
     */
378
    public function getSQLDetailedErrorMessage()
379
    {
380
        return sprintf("«%s»\n%s\n(%s)", pg_result_error_field($this->result_resource, \PGSQL_DIAG_MESSAGE_PRIMARY), pg_result_error_field($this->result_resource, \PGSQL_DIAG_MESSAGE_DETAIL), pg_result_error_field($this->result_resource, \PGSQL_DIAG_MESSAGE_HINT));
381
    }
382
383
    /**
384
     * getQuery
385
     *
386
     * Return the associated query.
387
     *
388
     * @access public
389
     * @return string
390
     */
391
    public function getQuery()
392
    {
393
        return $this->sql;
394
    }
395
396
    /**
397
     * setQueryParameters
398
     *
399
     * Set the query parameters sent with the query.
400
     *
401
     * @access public
402
     * @param  array    $parameters
403
     * @return SqlException $this
404
     */
405
    public function setQueryParameters(array $parameters)
406
    {
407
        $this->query_parameters = $parameters;
408
409
        return $this;
410
    }
411
412
    /**
413
     * getQueryParameters
414
     *
415
     * Return the query parameters sent with the query.
416
     *
417
     * @access public
418
     * @return array
419
     */
420
    public function getQueryParameters()
421
    {
422
        return $this->query_parameters;
423
    }
424
}
425