You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
59 lines
1.4 KiB
59 lines
1.4 KiB
// Copyright 2016 Google Inc. All rights reserved. |
|
// Use of this source code is governed by a BSD-style |
|
// license that can be found in the LICENSE file. |
|
|
|
package uuid |
|
|
|
import ( |
|
"database/sql/driver" |
|
"fmt" |
|
) |
|
|
|
// Scan implements sql.Scanner so UUIDs can be read from databases transparently. |
|
// Currently, database types that map to string and []byte are supported. Please |
|
// consult database-specific driver documentation for matching types. |
|
func (uuid *UUID) Scan(src interface{}) error { |
|
switch src := src.(type) { |
|
case nil: |
|
return nil |
|
|
|
case string: |
|
// if an empty UUID comes from a table, we return a null UUID |
|
if src == "" { |
|
return nil |
|
} |
|
|
|
// see Parse for required string format |
|
u, err := Parse(src) |
|
if err != nil { |
|
return fmt.Errorf("Scan: %v", err) |
|
} |
|
|
|
*uuid = u |
|
|
|
case []byte: |
|
// if an empty UUID comes from a table, we return a null UUID |
|
if len(src) == 0 { |
|
return nil |
|
} |
|
|
|
// assumes a simple slice of bytes if 16 bytes |
|
// otherwise attempts to parse |
|
if len(src) != 16 { |
|
return uuid.Scan(string(src)) |
|
} |
|
copy((*uuid)[:], src) |
|
|
|
default: |
|
return fmt.Errorf("Scan: unable to scan type %T into UUID", src) |
|
} |
|
|
|
return nil |
|
} |
|
|
|
// Value implements sql.Valuer so that UUIDs can be written to databases |
|
// transparently. Currently, UUIDs map to strings. Please consult |
|
// database-specific driver documentation for matching types. |
|
func (uuid UUID) Value() (driver.Value, error) { |
|
return uuid.String(), nil |
|
}
|
|
|