-
-
Notifications
You must be signed in to change notification settings - Fork 54
/
Copy pathPostgresError+Database.swift
116 lines (109 loc) · 3.32 KB
/
PostgresError+Database.swift
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
import FluentKit
import FluentSQL
import PostgresKit
import PostgresNIO
fileprivate extension PostgresError.Code {
var isSyntaxError: Bool {
switch self {
case .syntaxErrorOrAccessRuleViolation,
.syntaxError,
.insufficientPrivilege,
.cannotCoerce,
.groupingError,
.windowingError,
.invalidRecursion,
.invalidForeignKey,
.invalidName,
.nameTooLong,
.reservedName,
.datatypeMismatch,
.indeterminateDatatype,
.collationMismatch,
.indeterminateCollation,
.wrongObjectType,
.undefinedColumn,
.undefinedFunction,
.undefinedTable,
.undefinedParameter,
.undefinedObject,
.duplicateColumn,
.duplicateCursor,
.duplicateDatabase,
.duplicateFunction,
.duplicatePreparedStatement,
.duplicateSchema,
.duplicateTable,
.duplicateAlias,
.duplicateObject,
.ambiguousColumn,
.ambiguousFunction,
.ambiguousParameter,
.ambiguousAlias,
.invalidColumnReference,
.invalidColumnDefinition,
.invalidCursorDefinition,
.invalidDatabaseDefinition,
.invalidFunctionDefinition,
.invalidPreparedStatementDefinition,
.invalidSchemaDefinition,
.invalidTableDefinition,
.invalidObjectDefinition:
return true
default:
return false
}
}
var isConstraintFailure: Bool {
switch self {
case .integrityConstraintViolation,
.restrictViolation,
.notNullViolation,
.foreignKeyViolation,
.uniqueViolation,
.checkViolation,
.exclusionViolation:
return true
default:
return false
}
}
}
// Used for DatabaseError conformance
extension PostgresError {
public var isSyntaxError: Bool { self.code.isSyntaxError }
public var isConnectionClosed: Bool {
switch self {
case .connectionClosed: return true
default: return false
}
}
public var isConstraintFailure: Bool { self.code.isConstraintFailure }
}
// Used for DatabaseError conformance
extension PSQLError {
public var isSyntaxError: Bool {
switch self.code {
case .server: return self.serverInfo?[.sqlState].map { PostgresError.Code(raw: $0).isSyntaxError } ?? false
default: return false
}
}
public var isConnectionClosed: Bool {
switch self.code {
case .serverClosedConnection, .clientClosedConnection: return true
default: return false
}
}
public var isConstraintFailure: Bool {
switch self.code {
case .server: return self.serverInfo?[.sqlState].map { PostgresError.Code(raw: $0).isConstraintFailure } ?? false
default: return false
}
}
}
#if compiler(<6)
extension PostgresError: DatabaseError { }
extension PSQLError: DatabaseError { }
#else
extension PostgresError: @retroactive DatabaseError { }
extension PSQLError: @retroactive DatabaseError { }
#endif