Skip to content

Commit f38e41d

Browse files
committed
changed binary date / datetime to string
1 parent 9724877 commit f38e41d

File tree

2 files changed

+56
-48
lines changed

2 files changed

+56
-48
lines changed

packets.go

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1048,7 +1048,7 @@ func (rows *binaryRows) readRow(dest []driver.Value) error {
10481048
if rows.mc.parseTime {
10491049
dest[i], err = parseBinaryDateTime(num, data[pos:], rows.mc.cfg.loc)
10501050
} else {
1051-
dest[i], err = formatBinaryDate(num, data[pos:])
1051+
dest[i], err = formatBinaryDateTime(data[pos:pos+int(num)], false)
10521052
}
10531053

10541054
if err == nil {
@@ -1116,7 +1116,7 @@ func (rows *binaryRows) readRow(dest []driver.Value) error {
11161116
if rows.mc.parseTime {
11171117
dest[i], err = parseBinaryDateTime(num, data[pos:], rows.mc.cfg.loc)
11181118
} else {
1119-
dest[i], err = formatBinaryDateTime(num, data[pos:])
1119+
dest[i], err = formatBinaryDateTime(data[pos:pos+int(num)], true)
11201120
}
11211121

11221122
if err == nil {

utils.go

Lines changed: 54 additions & 46 deletions
Original file line numberDiff line numberDiff line change
@@ -503,55 +503,63 @@ func parseBinaryDateTime(num uint64, data []byte, loc *time.Location) (driver.Va
503503
return nil, fmt.Errorf("Invalid DATETIME-packet length %d", num)
504504
}
505505

506-
func formatBinaryDate(num uint64, data []byte) (driver.Value, error) {
507-
switch num {
508-
case 0:
509-
return []byte("0000-00-00"), nil
506+
func formatBinaryDateTime(src []byte, withTime bool) (driver.Value, error) {
507+
const zeroDateTimeMicros = "0000-00-00 00:00:00.000000"
508+
srclen := len(src)
509+
var dst []byte
510+
if withTime {
511+
if srclen == 11 {
512+
dst = []byte(zeroDateTimeMicros)
513+
} else {
514+
dst = []byte(zeroDateTimeMicros[:19])
515+
}
516+
} else {
517+
dst = []byte(zeroDateTimeMicros[:10])
518+
}
519+
switch srclen {
520+
case 11:
521+
microsecs := binary.LittleEndian.Uint32(src[7:11])
522+
dst[20] += byte((microsecs / 100000) % 10)
523+
dst[21] += byte((microsecs / 10000) % 10)
524+
dst[22] += byte((microsecs / 1000) % 10)
525+
dst[23] += byte((microsecs / 100) % 10)
526+
dst[24] += byte((microsecs / 10) % 10)
527+
dst[25] += byte(microsecs % 10)
528+
fallthrough
529+
case 7:
530+
hour := src[4]
531+
minute := src[5]
532+
second := src[6]
533+
dst[11] += (hour / 10) % 10
534+
dst[12] += hour % 10
535+
dst[14] += (minute / 10) % 10
536+
dst[15] += minute % 10
537+
dst[17] += (second / 10) % 10
538+
dst[18] += second % 10
539+
fallthrough
510540
case 4:
511-
return []byte(fmt.Sprintf(
512-
"%04d-%02d-%02d",
513-
binary.LittleEndian.Uint16(data[:2]),
514-
data[2],
515-
data[3],
516-
)), nil
517-
}
518-
return nil, fmt.Errorf("Invalid DATE-packet length %d", num)
519-
}
520-
521-
func formatBinaryDateTime(num uint64, data []byte) (driver.Value, error) {
522-
switch num {
541+
year := binary.LittleEndian.Uint16(src[:2])
542+
month := src[2]
543+
day := src[3]
544+
dst[0] += byte((year / 1000) % 10)
545+
dst[1] += byte((year / 100) % 10)
546+
dst[2] += byte((year / 10) % 10)
547+
dst[3] += byte(year % 10)
548+
dst[5] += (month / 10) % 10
549+
dst[6] += month % 10
550+
dst[8] += (day / 10) % 10
551+
dst[9] += day % 10
552+
return dst, nil
523553
case 0:
524-
return []byte("0000-00-00 00:00:00"), nil
525-
case 4:
526-
return []byte(fmt.Sprintf(
527-
"%04d-%02d-%02d 00:00:00",
528-
binary.LittleEndian.Uint16(data[:2]),
529-
data[2],
530-
data[3],
531-
)), nil
532-
case 7:
533-
return []byte(fmt.Sprintf(
534-
"%04d-%02d-%02d %02d:%02d:%02d",
535-
binary.LittleEndian.Uint16(data[:2]),
536-
data[2],
537-
data[3],
538-
data[4],
539-
data[5],
540-
data[6],
541-
)), nil
542-
case 11:
543-
return []byte(fmt.Sprintf(
544-
"%04d-%02d-%02d %02d:%02d:%02d.%06d",
545-
binary.LittleEndian.Uint16(data[:2]),
546-
data[2],
547-
data[3],
548-
data[4],
549-
data[5],
550-
data[6],
551-
binary.LittleEndian.Uint32(data[7:11]),
552-
)), nil
554+
return dst, nil
553555
}
554-
return nil, fmt.Errorf("Invalid DATETIME-packet length %d", num)
556+
var mode string
557+
if withTime {
558+
mode = "DATETIME"
559+
} else {
560+
mode = "DATE"
561+
}
562+
return nil, fmt.Errorf("invalid %s-packet length %d", mode, srclen)
555563
}
556564

557565
/******************************************************************************

0 commit comments

Comments
 (0)