1 package pgx 2 3 import ( 4 "database/sql/driver" 5 "reflect" 6 ) 7 8 // This file contains code copied from the Go standard library due to the 9 // required function not being public. 10 11 // Copyright (c) 2009 The Go Authors. All rights reserved. 12 13 // Redistribution and use in source and binary forms, with or without 14 // modification, are permitted provided that the following conditions are 15 // met: 16 17 // * Redistributions of source code must retain the above copyright 18 // notice, this list of conditions and the following disclaimer. 19 // * Redistributions in binary form must reproduce the above 20 // copyright notice, this list of conditions and the following disclaimer 21 // in the documentation and/or other materials provided with the 22 // distribution. 23 // * Neither the name of Google Inc. nor the names of its 24 // contributors may be used to endorse or promote products derived from 25 // this software without specific prior written permission. 26 27 // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 28 // "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 29 // LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR 30 // A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 31 // OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 32 // SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 33 // LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 34 // DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 35 // THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 36 // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 37 // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 38 39 // From database/sql/convert.go 40 41 var valuerReflectType = reflect.TypeOf((*driver.Valuer)(nil)).Elem() 42 43 // callValuerValue returns vr.Value(), with one exception: 44 // If vr.Value is an auto-generated method on a pointer type and the 45 // pointer is nil, it would panic at runtime in the panicwrap 46 // method. Treat it like nil instead. 47 // Issue 8415. 48 // 49 // This is so people can implement driver.Value on value types and 50 // still use nil pointers to those types to mean nil/NULL, just like 51 // string/*string. 52 // 53 // This function is mirrored in the database/sql/driver package. 54 func callValuerValue(vr driver.Valuer) (v driver.Value, err error) { 55 if rv := reflect.ValueOf(vr); rv.Kind() == reflect.Ptr && 56 rv.IsNil() && 57 rv.Type().Elem().Implements(valuerReflectType) { 58 return nil, nil 59 } 60 return vr.Value() 61 } 62