@@ -3,6 +3,7 @@ package postgres
3
3
import (
4
4
"errors"
5
5
"net"
6
+ "strings"
6
7
)
7
8
8
9
// -----------------------------------------------------------------------------
@@ -40,6 +41,9 @@ type NoRowsError struct {
40
41
41
42
// Unwrap returns the underlying error.
42
43
func (e * Error ) Unwrap () error {
44
+ if e == nil {
45
+ return nil
46
+ }
43
47
return e .err
44
48
}
45
49
@@ -48,11 +52,43 @@ func (e *Error) Error() string {
48
52
if e == nil {
49
53
return ""
50
54
}
51
- s := e .message
55
+
56
+ sb := strings.Builder {}
57
+ _ , _ = sb .WriteString (e .message )
52
58
if e .err != nil {
53
- s += " [err=" + e .err .Error () + "]"
59
+ _ , _ = sb .WriteString (" [err=" + e .err .Error () + "]" )
60
+ }
61
+ if e .Details != nil {
62
+ _ , _ = sb .WriteString (" [code=" + e .Details .Code + "]" )
63
+ }
64
+ return sb .String ()
65
+ }
66
+
67
+ func (e * Error ) IsDuplicateKeyError () bool {
68
+ if e != nil && e .Details != nil {
69
+ if e .Details .Code == "23505" {
70
+ return true
71
+ }
72
+ }
73
+ return false
74
+ }
75
+
76
+ func (e * Error ) IsConstraintViolationError () bool {
77
+ if e != nil && e .Details != nil {
78
+ switch e .Details .Code {
79
+ case "23000" :
80
+ return true
81
+ case "23502" :
82
+ return true
83
+ case "23503" :
84
+ return true
85
+ case "23514" :
86
+ return true
87
+ case "23P01" :
88
+ return true
89
+ }
54
90
}
55
- return s
91
+ return false
56
92
}
57
93
58
94
func (e * NoRowsError ) Error () string {
@@ -68,6 +104,24 @@ func IsDatabaseError(err error) bool {
68
104
return errors .As (err , & e )
69
105
}
70
106
107
+ func IsDuplicateKeyError (err error ) bool {
108
+ var e * Error
109
+
110
+ if errors .As (err , & e ) {
111
+ return e .IsDuplicateKeyError ()
112
+ }
113
+ return false
114
+ }
115
+
116
+ func IsConstraintViolationError (err error ) bool {
117
+ var e * Error
118
+
119
+ if errors .As (err , & e ) {
120
+ return e .IsConstraintViolationError ()
121
+ }
122
+ return false
123
+ }
124
+
71
125
// IsNoRowsError returns true if the given error is the result of returning an empty result set.
72
126
func IsNoRowsError (err error ) bool {
73
127
var e * NoRowsError
0 commit comments