git.sr.ht/~pingoo/stdx@v0.0.0-20240218134121-094174641f6e/uuid/sql.go (about) 1 // Copyright 2016 Google Inc. All rights reserved. 2 // Use of this source code is governed by a BSD-style 3 // license that can be found in the LICENSE file. 4 5 package uuid 6 7 import ( 8 "database/sql/driver" 9 "fmt" 10 ) 11 12 // Scan implements sql.Scanner so UUIDs can be read from databases transparently. 13 // Currently, database types that map to string and []byte are supported. Please 14 // consult database-specific driver documentation for matching types. 15 func (uuid *UUID) Scan(src interface{}) error { 16 switch src := src.(type) { 17 case nil: 18 return nil 19 20 case string: 21 // if an empty UUID comes from a table, we return a null UUID 22 if src == "" { 23 return nil 24 } 25 26 // see Parse for required string format 27 u, err := Parse(src) 28 if err != nil { 29 return fmt.Errorf("Scan: %v", err) 30 } 31 32 *uuid = u 33 34 case []byte: 35 // if an empty UUID comes from a table, we return a null UUID 36 if len(src) == 0 { 37 return nil 38 } 39 40 // assumes a simple slice of bytes if 16 bytes 41 // otherwise attempts to parse 42 if len(src) != 16 { 43 return uuid.Scan(string(src)) 44 } 45 copy((*uuid)[:], src) 46 47 default: 48 return fmt.Errorf("Scan: unable to scan type %T into UUID", src) 49 } 50 51 return nil 52 } 53 54 // Value implements sql.Valuer so that UUIDs can be written to databases 55 // transparently. Currently, UUIDs map to strings. Please consult 56 // database-specific driver documentation for matching types. 57 func (uuid UUID) Value() (driver.Value, error) { 58 // return uuid.String(), nil 59 return uuid[:], nil 60 }