@@ -21,11 +21,27 @@ public enum Result: Error {
2121 /// - statement: the statement which produced the error
2222 case error( message: String , code: Int32 , statement: Statement ? )
2323
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+
2433 init ? ( errorCode: Int32 , connection: Connection , statement: Statement ? = nil ) {
2534 guard !Result. successCodes. contains ( errorCode) else { return nil }
2635
2736 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)
2945 }
3046
3147}
@@ -40,6 +56,12 @@ extension Result: CustomStringConvertible {
4056 } else {
4157 return " \( message) (code: \( errorCode) ) "
4258 }
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+ }
4365 }
4466 }
4567}
0 commit comments