func (self *Connection) buildFields(result *C.MYSQL_RES) (fields []Field) { nfields := int(C.mysql_num_fields(result)) cfieldsptr := C.mysql_fetch_fields(result) cfields := (*[1 << 30]C.MYSQL_FIELD)(unsafe.Pointer(cfieldsptr)) arena := hack.NewStringArena(1024) // prealloc a reasonable amount of space fields = make([]Field, nfields) for i := 0; i < nfields; i++ { length := strlen(cfields[i].name) fname := (*[1 << 30]byte)(unsafe.Pointer(cfields[i].name))[:length] fields[i].Name = arena.NewString(fname) fields[i].Type = int64(cfields[i]._type) } return fields }
func (self *Connection) fetchNext(result *C.MYSQL_RES, colCount int) (row []interface{}) { rowPtr := (*[1 << 30]*[1 << 30]byte)(unsafe.Pointer(C.mysql_fetch_row(result))) if rowPtr == nil { panic(self.lastError(nil)) } row = make([]interface{}, colCount) lengths := (*[1 << 30]uint64)(unsafe.Pointer(C.mysql_fetch_lengths(result))) totalLength := uint64(0) for i := 0; i < colCount; i++ { totalLength += (*lengths)[i] } arena := hack.NewStringArena(int(totalLength)) for i := 0; i < colCount; i++ { colLength := (*lengths)[i] colPtr := (*rowPtr)[i] if colPtr == nil { continue } row[i] = arena.NewString((*colPtr)[:colLength]) } return row }