@@ -3,6 +3,7 @@ package postgres
33import (
44 "errors"
55 "net"
6+ "strings"
67)
78
89// -----------------------------------------------------------------------------
@@ -40,6 +41,9 @@ type NoRowsError struct {
4041
4142// Unwrap returns the underlying error.
4243func (e * Error ) Unwrap () error {
44+ if e == nil {
45+ return nil
46+ }
4347 return e .err
4448}
4549
@@ -48,11 +52,43 @@ func (e *Error) Error() string {
4852 if e == nil {
4953 return ""
5054 }
51- s := e .message
55+
56+ sb := strings.Builder {}
57+ _ , _ = sb .WriteString (e .message )
5258 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+ }
5490 }
55- return s
91+ return false
5692}
5793
5894func (e * NoRowsError ) Error () string {
@@ -68,6 +104,24 @@ func IsDatabaseError(err error) bool {
68104 return errors .As (err , & e )
69105}
70106
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+
71125// IsNoRowsError returns true if the given error is the result of returning an empty result set.
72126func IsNoRowsError (err error ) bool {
73127 var e * NoRowsError
0 commit comments