@@ -564,38 +564,41 @@ func (mc *mysqlConn) readColumns(n int) (columns []mysqlField, err error) {
564564}
565565
566566// Read Packets as Field Packets until EOF-Packet or an Error appears
567- func (mc * mysqlConn ) readRow (columnsCount int ) ( * []* [] byte , error ) {
568- data , err := mc .readPacket ()
567+ func (rows * mysqlRows ) readRow (dest * []driver. Value ) ( err error ) {
568+ data , err := rows . mc .readPacket ()
569569 if err != nil {
570- return nil , err
570+ return
571571 }
572572
573573 // EOF Packet
574574 if data [0 ] == 254 && len (data ) == 5 {
575- return nil , io .EOF
575+ return io .EOF
576576 }
577577
578578 // RowSet Packet
579- row := make ([]* []byte , columnsCount )
580579 var n int
581580 var isNull bool
581+ var val * []byte
582+ columnsCount := len (* dest )
582583 pos := 0
583584
584585 for i := 0 ; i < columnsCount ; i ++ {
585586 // Read bytes and convert to string
586- row [ i ] , n , isNull , err = readLengthCodedBinary (data [pos :])
587+ val , n , isNull , err = readLengthCodedBinary (data [pos :])
587588 if err != nil {
588- return nil , err
589+ return
589590 }
590591
591592 // nil if field is NULL
592593 if isNull {
593- row [i ] = nil
594+ (* dest )[i ] = nil
595+ } else {
596+ (* dest )[i ] = * val
594597 }
595598 pos += n
596599 }
597600
598- return & row , nil
601+ return
599602}
600603
601604// Reads Packets until EOF-Packet or an Error appears. Returns count of Packets read
@@ -830,23 +833,22 @@ func (stmt *mysqlStmt) buildExecutePacket(args *[]driver.Value) error {
830833}
831834
832835// http://dev.mysql.com/doc/internals/en/prepared-statements.html#packet-ProtocolBinary::ResultsetRow
833- func (mc * mysqlConn ) readBinaryRow (rc * mysqlRows ) (* [] * [] byte , error ) {
834- data , err := mc .readPacket ()
836+ func (rc * mysqlRows ) readBinaryRow (dest * []driver. Value ) (err error ) {
837+ data , err := rc . mc .readPacket ()
835838 if err != nil {
836- return nil , err
839+ return
837840 }
838841
839842 pos := 0
840843
841844 // EOF Packet
842845 if data [pos ] == 254 && len (data ) == 5 {
843- return nil , io .EOF
846+ return io .EOF
844847 }
845848 pos ++
846849
847850 // BinaryRowSet Packet
848851 columnsCount := len (rc .columns )
849- row := make ([]* []byte , columnsCount )
850852
851853 nullBitMap := data [pos : pos + (columnsCount + 7 + 2 )>> 3 ]
852854 pos += (columnsCount + 7 + 2 ) >> 3
@@ -856,7 +858,7 @@ func (mc *mysqlConn) readBinaryRow(rc *mysqlRows) (*[]*[]byte, error) {
856858 for i := 0 ; i < columnsCount ; i ++ {
857859 // Field is NULL
858860 if (nullBitMap [(i + 2 )>> 3 ] >> uint ((i + 2 )& 7 ) & 1 ) == 1 {
859- row [i ] = nil
861+ ( * dest ) [i ] = nil
860862 continue
861863 }
862864
@@ -865,167 +867,142 @@ func (mc *mysqlConn) readBinaryRow(rc *mysqlRows) (*[]*[]byte, error) {
865867 // Convert to byte-coded string
866868 switch rc .columns [i ].fieldType {
867869 case FIELD_TYPE_NULL :
868- row [i ] = nil
870+ ( * dest ) [i ] = nil
869871
870872 // Numeric Typs
871873 case FIELD_TYPE_TINY :
872- var val []byte
873874 if unsigned {
874- val = uintToByteStr (uint64 (byteToUint8 (data [pos ])))
875+ ( * dest )[ i ] = uintToByteStr (uint64 (byteToUint8 (data [pos ])))
875876 } else {
876- val = intToByteStr (int64 (int8 (byteToUint8 (data [pos ]))))
877+ ( * dest )[ i ] = intToByteStr (int64 (int8 (byteToUint8 (data [pos ]))))
877878 }
878- row [i ] = & val
879879 pos ++
880880
881881 case FIELD_TYPE_SHORT , FIELD_TYPE_YEAR :
882- var val []byte
883882 if unsigned {
884- val = uintToByteStr (uint64 (bytesToUint16 (data [pos : pos + 2 ])))
883+ ( * dest )[ i ] = uintToByteStr (uint64 (bytesToUint16 (data [pos : pos + 2 ])))
885884 } else {
886- val = intToByteStr (int64 (int16 (bytesToUint16 (data [pos : pos + 2 ]))))
885+ ( * dest )[ i ] = intToByteStr (int64 (int16 (bytesToUint16 (data [pos : pos + 2 ]))))
887886 }
888- row [i ] = & val
889887 pos += 2
890888
891889 case FIELD_TYPE_INT24 , FIELD_TYPE_LONG :
892- var val []byte
893890 if unsigned {
894- val = uintToByteStr (uint64 (bytesToUint32 (data [pos : pos + 4 ])))
891+ ( * dest )[ i ] = uintToByteStr (uint64 (bytesToUint32 (data [pos : pos + 4 ])))
895892 } else {
896- val = intToByteStr (int64 (int32 (bytesToUint32 (data [pos : pos + 4 ]))))
893+ ( * dest )[ i ] = intToByteStr (int64 (int32 (bytesToUint32 (data [pos : pos + 4 ]))))
897894 }
898- row [i ] = & val
899895 pos += 4
900896
901897 case FIELD_TYPE_LONGLONG :
902- var val []byte
903898 if unsigned {
904- val = uintToByteStr (bytesToUint64 (data [pos : pos + 8 ]))
899+ ( * dest )[ i ] = uintToByteStr (bytesToUint64 (data [pos : pos + 8 ]))
905900 } else {
906- val = intToByteStr (int64 (bytesToUint64 (data [pos : pos + 8 ])))
901+ ( * dest )[ i ] = intToByteStr (int64 (bytesToUint64 (data [pos : pos + 8 ])))
907902 }
908- row [i ] = & val
909903 pos += 8
910904
911905 case FIELD_TYPE_FLOAT :
912- var val []byte
913- val = float32ToByteStr (bytesToFloat32 (data [pos : pos + 4 ]))
914- row [i ] = & val
906+ (* dest )[i ] = float32ToByteStr (bytesToFloat32 (data [pos : pos + 4 ]))
915907 pos += 4
916908
917909 case FIELD_TYPE_DOUBLE :
918- var val []byte
919- val = float64ToByteStr (bytesToFloat64 (data [pos : pos + 8 ]))
920- row [i ] = & val
910+ (* dest )[i ] = float64ToByteStr (bytesToFloat64 (data [pos : pos + 8 ]))
921911 pos += 8
922912
923- case FIELD_TYPE_DECIMAL , FIELD_TYPE_NEWDECIMAL :
924- row [i ], n , isNull , err = readLengthCodedBinary (data [pos :])
925-
926- if err != nil {
927- return nil , err
928- }
929-
930- if isNull && rc .columns [i ].flags & FLAG_NOT_NULL == 0 {
931- row [i ] = nil
932- }
933- pos += n
934-
935913 // Length coded Binary Strings
936- case FIELD_TYPE_VARCHAR , FIELD_TYPE_BIT , FIELD_TYPE_ENUM ,
937- FIELD_TYPE_SET , FIELD_TYPE_TINY_BLOB , FIELD_TYPE_MEDIUM_BLOB ,
938- FIELD_TYPE_LONG_BLOB , FIELD_TYPE_BLOB , FIELD_TYPE_VAR_STRING ,
939- FIELD_TYPE_STRING , FIELD_TYPE_GEOMETRY :
940- row [i ], n , isNull , err = readLengthCodedBinary (data [pos :])
914+ case FIELD_TYPE_DECIMAL , FIELD_TYPE_NEWDECIMAL , FIELD_TYPE_VARCHAR ,
915+ FIELD_TYPE_BIT , FIELD_TYPE_ENUM , FIELD_TYPE_SET ,
916+ FIELD_TYPE_TINY_BLOB , FIELD_TYPE_MEDIUM_BLOB , FIELD_TYPE_LONG_BLOB ,
917+ FIELD_TYPE_BLOB , FIELD_TYPE_VAR_STRING , FIELD_TYPE_STRING ,
918+ FIELD_TYPE_GEOMETRY :
919+ var val * []byte
920+ val , n , isNull , err = readLengthCodedBinary (data [pos :])
941921 if err != nil {
942- return nil , err
922+ return
943923 }
944924
945925 if isNull && rc .columns [i ].flags & FLAG_NOT_NULL == 0 {
946- row [i ] = nil
926+ (* dest )[i ] = nil
927+ } else {
928+ (* dest )[i ] = * val
947929 }
930+
948931 pos += n
949932
950933 // Date YYYY-MM-DD
951934 case FIELD_TYPE_DATE , FIELD_TYPE_NEWDATE :
952935 var num uint64
953936 num , n , err = bytesToLengthCodedBinary (data [pos :])
954937 if err != nil {
955- return nil , err
938+ return
956939 }
957940 pos += n
958941
959- var val []byte
960942 if num == 0 {
961- val = []byte ("0000-00-00" )
943+ ( * dest )[ i ] = []byte ("0000-00-00" )
962944 } else {
963- val = []byte (fmt .Sprintf ("%04d-%02d-%02d" ,
945+ ( * dest )[ i ] = []byte (fmt .Sprintf ("%04d-%02d-%02d" ,
964946 bytesToUint16 (data [pos :pos + 2 ]),
965947 data [pos + 2 ],
966948 data [pos + 3 ]))
967949 }
968- row [i ] = & val
969950 pos += int (num )
970951
971952 // Time HH:MM:SS
972953 case FIELD_TYPE_TIME :
973954 var num uint64
974955 num , n , err = bytesToLengthCodedBinary (data [pos :])
975956 if err != nil {
976- return nil , err
957+ return
977958 }
978959
979- var val []byte
980960 if num == 0 {
981- val = []byte ("00:00:00" )
961+ ( * dest )[ i ] = []byte ("00:00:00" )
982962 } else {
983- val = []byte (fmt .Sprintf ("%02d:%02d:%02d" ,
963+ ( * dest )[ i ] = []byte (fmt .Sprintf ("%02d:%02d:%02d" ,
984964 data [pos + 6 ],
985965 data [pos + 7 ],
986966 data [pos + 8 ]))
987967 }
988- row [i ] = & val
989968 pos += n + int (num )
990969
991970 // Timestamp YYYY-MM-DD HH:MM:SS
992971 case FIELD_TYPE_TIMESTAMP , FIELD_TYPE_DATETIME :
993972 var num uint64
994973 num , n , err = bytesToLengthCodedBinary (data [pos :])
995974 if err != nil {
996- return nil , err
975+ return
997976 }
998977 pos += n
999978
1000- var val []byte
1001979 switch num {
1002980 case 0 :
1003- val = []byte ("0000-00-00 00:00:00" )
981+ ( * dest )[ i ] = []byte ("0000-00-00 00:00:00" )
1004982 case 4 :
1005- val = []byte (fmt .Sprintf ("%04d-%02d-%02d 00:00:00" ,
983+ ( * dest )[ i ] = []byte (fmt .Sprintf ("%04d-%02d-%02d 00:00:00" ,
1006984 bytesToUint16 (data [pos :pos + 2 ]),
1007985 data [pos + 2 ],
1008986 data [pos + 3 ]))
1009987 default :
1010988 if num < 7 {
1011- return nil , fmt .Errorf ("Invalid datetime-packet length %d" , num )
989+ return fmt .Errorf ("Invalid datetime-packet length %d" , num )
1012990 }
1013- val = []byte (fmt .Sprintf ("%04d-%02d-%02d %02d:%02d:%02d" ,
991+ ( * dest )[ i ] = []byte (fmt .Sprintf ("%04d-%02d-%02d %02d:%02d:%02d" ,
1014992 bytesToUint16 (data [pos :pos + 2 ]),
1015993 data [pos + 2 ],
1016994 data [pos + 3 ],
1017995 data [pos + 4 ],
1018996 data [pos + 5 ],
1019997 data [pos + 6 ]))
1020998 }
1021- row [i ] = & val
1022999 pos += int (num )
10231000
10241001 // Please report if this happens!
10251002 default :
1026- return nil , fmt .Errorf ("Unknown FieldType %d" , rc .columns [i ].fieldType )
1003+ return fmt .Errorf ("Unknown FieldType %d" , rc .columns [i ].fieldType )
10271004 }
10281005 }
10291006
1030- return & row , nil
1007+ return
10311008}
0 commit comments