@@ -21,11 +21,27 @@ public enum Result: Error {
21
21
/// - statement: the statement which produced the error
22
22
case error( message: String , code: Int32 , statement: Statement ? )
23
23
24
+ /// Represents a SQLite specific [extended error code] (https://sqlite.org/rescode.html#primary_result_codes_versus_extended_result_codes)
25
+ ///
26
+ /// - message: English-language text that describes the error
27
+ ///
28
+ /// - extendedCode: SQLite [extended error code](https://sqlite.org/rescode.html#extended_result_code_list)
29
+ ///
30
+ /// - statement: the statement which produced the error
31
+ case extendedError( message: String , extendedCode: Int32 , statement: Statement ? )
32
+
24
33
init ? ( errorCode: Int32 , connection: Connection , statement: Statement ? = nil ) {
25
34
guard !Result. successCodes. contains ( errorCode) else { return nil }
26
35
27
36
let message = String ( cString: sqlite3_errmsg ( connection. handle) )
28
- self = . error( message: message, code: errorCode, statement: statement)
37
+
38
+ guard connection. usesExtendedErrorCodes else {
39
+ self = . error( message: message, code: errorCode, statement: statement)
40
+ return
41
+ }
42
+
43
+ let extendedErrorCode = sqlite3_extended_errcode ( connection. handle)
44
+ self = . extendedError( message: message, extendedCode: extendedErrorCode, statement: statement)
29
45
}
30
46
31
47
}
@@ -40,6 +56,12 @@ extension Result: CustomStringConvertible {
40
56
} else {
41
57
return " \( message) (code: \( errorCode) ) "
42
58
}
59
+ case let . extendedError( message, extendedCode, statement) :
60
+ if let statement = statement {
61
+ return " \( message) ( \( statement) ) (extended code: \( extendedCode) ) "
62
+ } else {
63
+ return " \( message) (extended code: \( extendedCode) ) "
64
+ }
43
65
}
44
66
}
45
67
}
0 commit comments