| 1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374 | 
							- package mssql
 
- import (
 
- 	"database/sql/driver"
 
- 	"encoding/hex"
 
- 	"errors"
 
- 	"fmt"
 
- )
 
- type UniqueIdentifier [16]byte
 
- func (u *UniqueIdentifier) Scan(v interface{}) error {
 
- 	reverse := func(b []byte) {
 
- 		for i, j := 0, len(b)-1; i < j; i, j = i+1, j-1 {
 
- 			b[i], b[j] = b[j], b[i]
 
- 		}
 
- 	}
 
- 	switch vt := v.(type) {
 
- 	case []byte:
 
- 		if len(vt) != 16 {
 
- 			return errors.New("mssql: invalid UniqueIdentifier length")
 
- 		}
 
- 		var raw UniqueIdentifier
 
- 		copy(raw[:], vt)
 
- 		reverse(raw[0:4])
 
- 		reverse(raw[4:6])
 
- 		reverse(raw[6:8])
 
- 		*u = raw
 
- 		return nil
 
- 	case string:
 
- 		if len(vt) != 36 {
 
- 			return errors.New("mssql: invalid UniqueIdentifier string length")
 
- 		}
 
- 		b := []byte(vt)
 
- 		for i, c := range b {
 
- 			switch c {
 
- 			case '-':
 
- 				b = append(b[:i], b[i+1:]...)
 
- 			}
 
- 		}
 
- 		_, err := hex.Decode(u[:], []byte(b))
 
- 		return err
 
- 	default:
 
- 		return fmt.Errorf("mssql: cannot convert %T to UniqueIdentifier", v)
 
- 	}
 
- }
 
- func (u UniqueIdentifier) Value() (driver.Value, error) {
 
- 	reverse := func(b []byte) {
 
- 		for i, j := 0, len(b)-1; i < j; i, j = i+1, j-1 {
 
- 			b[i], b[j] = b[j], b[i]
 
- 		}
 
- 	}
 
- 	raw := make([]byte, len(u))
 
- 	copy(raw, u[:])
 
- 	reverse(raw[0:4])
 
- 	reverse(raw[4:6])
 
- 	reverse(raw[6:8])
 
- 	return raw, nil
 
- }
 
- func (u UniqueIdentifier) String() string {
 
- 	return fmt.Sprintf("%X-%X-%X-%X-%X", u[0:4], u[4:6], u[6:8], u[8:10], u[10:])
 
- }
 
 
  |