4
"github.com/ziutek/mymysql/mysql"
10
type paramValue struct {
14
length int // >=0 - length of value, <0 - unknown length
17
func (val *paramValue) Len() int {
18
if !val.addr.IsValid() {
19
// Invalid Value was binded
22
// val.addr always points to the pointer - lets dereference it
25
// Binded Ptr Value is nil
35
case MYSQL_TYPE_STRING:
36
return lenStr(v.String())
39
return lenDate(v.Interface().(mysql.Date))
41
case MYSQL_TYPE_TIMESTAMP:
42
return lenTime(v.Interface().(mysql.Timestamp).Time)
43
case MYSQL_TYPE_DATETIME:
44
return lenTime(v.Interface().(time.Time))
47
return lenDuration(v.Interface().(time.Duration))
49
case MYSQL_TYPE_TINY: // val.length < 0 so this is bool
52
// MYSQL_TYPE_VAR_STRING, MYSQL_TYPE_BLOB and type of Raw value
53
return lenBin(v.Bytes())
56
func (pw *pktWriter) writeValue(val *paramValue) {
57
if !val.addr.IsValid() {
58
// Invalid Value was binded
61
// val.addr always points to the pointer - lets dereference it
64
// Binded Ptr Value is nil
69
if val.raw || val.typ == MYSQL_TYPE_VAR_STRING ||
70
val.typ == MYSQL_TYPE_BLOB {
71
pw.writeBin(v.Bytes())
74
// We don't need unsigned bit to check type
75
unsign := (val.typ & MYSQL_UNSIGNED_MASK) != 0
76
switch val.typ & ^MYSQL_UNSIGNED_MASK {
78
// Don't write null values
80
case MYSQL_TYPE_STRING:
81
pw.writeBin([]byte(v.String()))
96
pw.writeU32(uint32(l))
99
case MYSQL_TYPE_FLOAT:
100
pw.writeU32(math.Float32bits(v.Interface().(float32)))
102
case MYSQL_TYPE_SHORT:
104
pw.writeU16(v.Interface().(uint16))
106
pw.writeU16(uint16(v.Interface().(int16)))
110
case MYSQL_TYPE_TINY:
111
if val.length == -1 {
112
// Translate bool value to MySQL tiny
120
pw.writeByte(v.Interface().(uint8))
122
pw.writeByte(uint8(v.Interface().(int8)))
126
case MYSQL_TYPE_LONGLONG:
139
pw.writeU64(uint64(l))
142
case MYSQL_TYPE_DOUBLE:
143
pw.writeU64(math.Float64bits(v.Interface().(float64)))
145
case MYSQL_TYPE_DATE:
146
pw.writeDate(v.Interface().(mysql.Date))
148
case MYSQL_TYPE_TIMESTAMP:
149
pw.writeTime(v.Interface().(mysql.Timestamp).Time)
151
case MYSQL_TYPE_DATETIME:
152
pw.writeTime(v.Interface().(time.Time))
154
case MYSQL_TYPE_TIME:
155
pw.writeDuration(v.Interface().(time.Duration))
158
panic(mysql.ErrBindUnkType)