mirror of
				https://gitee.com/gitea/gitea
				synced 2025-11-04 00:20:25 +08:00 
			
		
		
		
	
		
			
				
	
	
		
			75 lines
		
	
	
		
			1.3 KiB
		
	
	
	
		
			Go
		
	
	
	
	
	
			
		
		
	
	
			75 lines
		
	
	
		
			1.3 KiB
		
	
	
	
		
			Go
		
	
	
	
	
	
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:])
 | 
						|
}
 |