mirror of
				https://codeberg.org/forgejo/forgejo.git
				synced 2025-10-30 22:11:07 +00:00 
			
		
		
		
	
		
			
				
	
	
		
			80 lines
		
	
	
	
		
			1.7 KiB
		
	
	
	
		
			Go
		
	
	
	
		
			Vendored
		
	
	
	
			
		
		
	
	
			80 lines
		
	
	
	
		
			1.7 KiB
		
	
	
	
		
			Go
		
	
	
	
		
			Vendored
		
	
	
	
| 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:])
 | |
| }
 | |
| 
 | |
| // MarshalText converts Uniqueidentifier to bytes corresponding to the stringified hexadecimal representation of the Uniqueidentifier
 | |
| // e.g., "AAAAAAAA-AAAA-AAAA-AAAA-AAAAAAAAAAAA" -> [65 65 65 65 65 65 65 65 45 65 65 65 65 45 65 65 65 65 45 65 65 65 65 65 65 65 65 65 65 65 65]
 | |
| func (u UniqueIdentifier) MarshalText() []byte {
 | |
| 	return []byte(u.String())
 | |
| }
 |