Przeglądaj źródła

added a helper function and struct named RowData

cwandrews 11 lat temu
rodzic
commit
27567f74e2
1 zmienionych plików z 33 dodań i 20 usunięć
  1. 33 20
      helpers.go

+ 33 - 20
helpers.go

@@ -2,6 +2,12 @@ package gocql
 
 import "reflect"
 
+type RowData struct {
+	Columns []string
+	Values []interface{}
+	RowMap map[string]interface{}
+}
+
 func (t *TypeInfo) New() interface{} {
 	return reflect.New(goType(t)).Interface()
 }
@@ -37,13 +43,23 @@ func dereference(i interface{}) interface{} {
 	return reflect.Indirect(reflect.ValueOf(i)).Interface()
 }
 
-func (iter *Iter) RowData() (map[string]interface{}, error) {
+func (iter *Iter) RowData() (RowData, error) {
 	if iter.err != nil {
-		return nil, iter.err
+		return RowData{}, iter.err
 	}
-	rowData := make(map[string]interface{})
+	rowMap := make(map[string]interface{})
+	columns := make([]string, 0)
+	values := make([]interface{}, 0)
 	for _, column := range iter.Columns() {
-		rowData[column.Name] = column.TypeInfo.New()
+		val := column.TypeInfo.New()
+		rowMap[column.Name] = val
+		columns = append(columns, column.Name)
+		values = append(values, val)
+	}
+	rowData := RowData{
+		Columns: columns,
+		Values: values,
+		RowMap: rowMap,
 	}
 	return rowData, nil
 }
@@ -54,16 +70,14 @@ func (iter *Iter) SliceMap() ([]map[string]interface{}, error) {
 	if iter.err != nil {
 		return nil, iter.err
 	}
-	interfacesToScan := make([]interface{}, 0)
-	for _, column := range iter.Columns() {
-		i := column.TypeInfo.New()
-		interfacesToScan = append(interfacesToScan, i)
-	}
+
+	// Not checking for the error because we just did
+	rowData, _ := iter.RowData()
 	dataToReturn := make([]map[string]interface{}, 0)
-	for iter.Scan(interfacesToScan...) {
+	for iter.Scan(rowData.Values...) {
 		m := make(map[string]interface{})
-		for i, column := range iter.Columns() {
-			m[column.Name] = dereference(interfacesToScan[i])
+		for i, column := range rowData.Columns {
+			m[column] = dereference(rowData.Values[i])
 		}
 		dataToReturn = append(dataToReturn, m)
 	}
@@ -77,14 +91,13 @@ func (iter *Iter) MapScan(m map[string]interface{}) bool {
 	if iter.err != nil {
 		return false
 	}
-	interfacesToScan := make([]interface{}, 0)
-	for _, column := range iter.Columns() {
-		i := column.TypeInfo.New()
-		interfacesToScan = append(interfacesToScan, i)
-	}
-	if iter.Scan(interfacesToScan...) {
-		for i, column := range iter.Columns() {
-			m[column.Name] = dereference(interfacesToScan[i])
+
+	// Not checking for the error because we just did
+	rowData, _ := iter.RowData()
+
+	if iter.Scan(rowData.Values...) {
+		for i, column := range rowData.Columns {
+			m[column] = dereference(rowData.Values[i])
 		}
 		return true
 	}