mirror of https://github.com/gogits/gogs.git
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.
74 lines
1.3 KiB
74 lines
1.3 KiB
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:]) |
|
}
|
|
|