Преглед изворни кода

added all types possible to ptrOfType and dereference functions

cwandrews пре 12 година
родитељ
комит
bf7c0bc858
1 измењених фајлова са 319 додато и 19 уклоњено
  1. 319 19
      helpers.go

+ 319 - 19
helpers.go

@@ -1,30 +1,203 @@
 package gocql
 
-func ptrOfType(t string) interface{} {
-	switch t {
-	case "ascii", "varchar", "inet":
+func ptrOfType(t *TypeInfo) interface{} {
+	switch t.Type {
+	case TypeVarchar, TypeAscii:
 		return new(string)
-	case "bigint", "counter", "timestamp":
+	case TypeBigInt, TypeCounter, TypeTimestamp:
 		return new(int64)
-	case "blob":
+	case TypeBlob:
 		return new([]byte)
-	case "boolean":
+	case TypeBoolean:
 		return new(bool)
-	case "decimal", "float":
+	case TypeFloat:
 		return new(float32)
-	case "double":
+	case TypeDouble:
 		return new(float64)
-	case "int":
+	case TypeInt:
 		return new(int32)
-	case "uuid", "timeuuid":
+	case TypeUUID, TypeTimeUUID:
 		return new(UUID)
-	case "list", "set":
-		return new([]interface{})
-	case "map":
-		return new(map[interface{}]interface{})
+	case TypeList, TypeSet:
+		switch t.Elem.Type {
+		case TypeVarchar, TypeAscii:
+			return new([]string)
+		case TypeBigInt, TypeCounter, TypeTimestamp:
+			return new([]int64)
+		case TypeBlob:
+			return new([][]byte)
+		case TypeBoolean:
+			return new([]bool)
+		case TypeFloat:
+			return new([]float32)
+		case TypeDouble:
+			return new([]float64)
+		case TypeInt:
+			return new([]int32)
+		case TypeUUID, TypeTimeUUID:
+			return new([]UUID)
+		}
+		return new([][]byte)
+
+	case TypeMap:
+		switch t.Key.Type {
+		case TypeVarchar, TypeAscii:
+			switch t.Elem.Type {
+			case TypeVarchar, TypeAscii:
+				return new(map[string]string)
+			case TypeBigInt, TypeCounter, TypeTimestamp:
+				return new(map[string]int64)
+			case TypeBlob:
+				return new(map[string][]byte)
+			case TypeBoolean:
+				return new(map[string]bool)
+			case TypeFloat:
+				return new(map[string]float32)
+			case TypeDouble:
+				return new(map[string]float64)
+			case TypeInt:
+				return new(map[string]int32)
+			case TypeUUID, TypeTimeUUID:
+				return new(map[string]UUID)
+			}			
+		case TypeBigInt, TypeCounter, TypeTimestamp:
+			switch t.Elem.Type {
+			case TypeVarchar, TypeAscii:
+				return new(map[int64]string)
+			case TypeBigInt, TypeCounter, TypeTimestamp:
+				return new(map[int64]int64)
+			case TypeBlob:
+				return new(map[int64][]byte)
+			case TypeBoolean:
+				return new(map[int64]bool)
+			case TypeFloat:
+				return new(map[int64]float32)
+			case TypeDouble:
+				return new(map[int64]float64)
+			case TypeInt:
+				return new(map[int64]int32)
+			case TypeUUID, TypeTimeUUID:
+				return new(map[int64]UUID)
+			}
+		case TypeBlob:
+			switch t.Elem.Type {
+			case TypeVarchar, TypeAscii:
+				return new(map[string]string)
+			case TypeBigInt, TypeCounter, TypeTimestamp:
+				return new(map[string]int64)
+			case TypeBlob:
+				return new(map[string][]byte)
+			case TypeBoolean:
+				return new(map[string]bool)
+			case TypeFloat:
+				return new(map[string]float32)
+			case TypeDouble:
+				return new(map[string]float64)
+			case TypeInt:
+				return new(map[string]int32)
+			case TypeUUID, TypeTimeUUID:
+				return new(map[string]UUID)
+			}
+		case TypeBoolean:
+			switch t.Elem.Type {
+			case TypeVarchar, TypeAscii:
+				return new(map[bool]string)
+			case TypeBigInt, TypeCounter, TypeTimestamp:
+				return new(map[bool]int64)
+			case TypeBlob:
+				return new(map[bool][]byte)
+			case TypeBoolean:
+				return new(map[bool]bool)
+			case TypeFloat:
+				return new(map[bool]float32)
+			case TypeDouble:
+				return new(map[bool]float64)
+			case TypeInt:
+				return new(map[bool]int32)
+			case TypeUUID, TypeTimeUUID:
+				return new(map[bool]UUID)
+			}
+		case TypeFloat:
+			switch t.Elem.Type {
+			case TypeVarchar, TypeAscii:
+				return new(map[float32]string)
+			case TypeBigInt, TypeCounter, TypeTimestamp:
+				return new(map[float32]int64)
+			case TypeBlob:
+				return new(map[float32][]byte)
+			case TypeBoolean:
+				return new(map[float32]bool)
+			case TypeFloat:
+				return new(map[float32]float32)
+			case TypeDouble:
+				return new(map[float32]float64)
+			case TypeInt:
+				return new(map[float32]int32)
+			case TypeUUID, TypeTimeUUID:
+				return new(map[float32]UUID)
+			}
+		case TypeDouble:
+			switch t.Elem.Type {
+			case TypeVarchar, TypeAscii:
+				return new(map[float64]string)
+			case TypeBigInt, TypeCounter, TypeTimestamp:
+				return new(map[float64]int64)
+			case TypeBlob:
+				return new(map[float64][]byte)
+			case TypeBoolean:
+				return new(map[float64]bool)
+			case TypeFloat:
+				return new(map[float64]float32)
+			case TypeDouble:
+				return new(map[float64]float64)
+			case TypeInt:
+				return new(map[float64]int32)
+			case TypeUUID, TypeTimeUUID:
+				return new(map[float64]UUID)
+			}
+		case TypeInt:
+			switch t.Elem.Type {
+			case TypeVarchar, TypeAscii:
+				return new(map[int32]string)
+			case TypeBigInt, TypeCounter, TypeTimestamp:
+				return new(map[int32]int64)
+			case TypeBlob:
+				return new(map[int32][]byte)
+			case TypeBoolean:
+				return new(map[int32]bool)
+			case TypeFloat:
+				return new(map[int32]float32)
+			case TypeDouble:
+				return new(map[int32]float64)
+			case TypeInt:
+				return new(map[int32]int32)
+			case TypeUUID, TypeTimeUUID:
+				return new(map[int32]UUID)
+			}
+		case TypeUUID, TypeTimeUUID:
+			switch t.Elem.Type {
+			case TypeVarchar, TypeAscii:
+				return new(map[UUID]string)
+			case TypeBigInt, TypeCounter, TypeTimestamp:
+				return new(map[UUID]int64)
+			case TypeBlob:
+				return new(map[UUID][]byte)
+			case TypeBoolean:
+				return new(map[UUID]bool)
+			case TypeFloat:
+				return new(map[UUID]float32)
+			case TypeDouble:
+				return new(map[UUID]float64)
+			case TypeInt:
+				return new(map[UUID]int32)
+			case TypeUUID, TypeTimeUUID:
+				return new(map[UUID]UUID)
+			}
+		}
 	default:
 		return new([]byte)
 	}
+	return new(map[string]string)
 }
 
 func dereference(i interface{}) interface{} {
@@ -45,10 +218,134 @@ func dereference(i interface{}) interface{} {
 		return *i.(*int32)
 	case *UUID:
 		return *i.(*UUID)
-	case *[]interface{}:
-		return *i.(*[]interface{})
-	case *map[interface{}]interface{}:
-		return *i.(*map[interface{}]interface{})
+	case *[]string:
+		return *i.(*[]string)
+	case *[]int64:
+		return *i.(*[]int64)
+	case *[][]byte:
+		return *i.(*[][]byte)
+	case *[]bool:
+		return *i.(*[]bool)
+	case *[]float32:
+		return *i.(*[]float32)
+	case *[]float64:
+		return *i.(*[]float64)
+	case *[]int32:
+		return *i.(*[]int32)
+	case *[]UUID:
+		return *i.(*[]UUID)
+	case *map[string]string:
+		return *i.(*map[string]string)
+	case *map[string]int64:
+		return *i.(*map[string]int64)
+	case *map[string][]byte:
+		return *i.(*map[string][]byte)
+	case *map[string]bool:
+		return *i.(*map[string]bool)
+	case *map[string]float32:
+		return *i.(*map[string]float32)
+	case *map[string]float64:
+		return *i.(*map[string]float64)
+	case *map[string]int32:
+		return *i.(*map[string]int32)
+	case *map[string]UUID:
+		return *i.(*map[string]UUID)
+	case *map[int64]string:
+		return *i.(*map[int64]string)
+	case *map[int64]int64:
+		return *i.(*map[int64]int64)
+	case *map[int64][]byte:
+		return *i.(*map[int64][]byte)
+	case *map[int64]bool:
+		return *i.(*map[int64]bool)
+	case *map[int64]float32:
+		return *i.(*map[int64]float32)
+	case *map[int64]float64:
+		return *i.(*map[int64]float64)
+	case *map[int64]int32:
+		return *i.(*map[int64]int32)
+	case *map[int64]UUID:
+		return *i.(*map[int64]UUID)
+	case *map[bool]string:
+		return *i.(*map[bool]string)
+	case *map[bool]int64:
+		return *i.(*map[bool]int64)
+	case *map[bool][]byte:
+		return *i.(*map[bool][]byte)
+	case *map[bool]bool:
+		return *i.(*map[bool]bool)
+	case *map[bool]float32:
+		return *i.(*map[bool]float32)
+	case *map[bool]float64:
+		return *i.(*map[bool]float64)
+	case *map[bool]int32:
+		return *i.(*map[bool]int32)
+	case *map[bool]UUID:
+		return *i.(*map[bool]UUID)
+	case *map[float32]string:
+		return *i.(*map[float32]string)
+	case *map[float32]int64:
+		return *i.(*map[float32]int64)
+	case *map[float32][]byte:
+		return *i.(*map[float32][]byte)
+	case *map[float32]bool:
+		return *i.(*map[float32]bool)
+	case *map[float32]float32:
+		return *i.(*map[float32]float32)
+	case *map[float32]float64:
+		return *i.(*map[float32]float64)
+	case *map[float32]int32:
+		return *i.(*map[float32]int32)
+	case *map[float32]UUID:
+		return *i.(*map[float32]UUID)
+	case *map[float64]string:
+		return *i.(*map[float64]string)
+	case *map[float64]int64:
+		return *i.(*map[float64]int64)
+	case *map[float64][]byte:
+		return *i.(*map[float64][]byte)
+	case *map[float64]bool:
+		return *i.(*map[float64]bool)
+	case *map[float64]float32:
+		return *i.(*map[float64]float32)
+	case *map[float64]float64:
+		return *i.(*map[float64]float64)
+	case *map[float64]int32:
+		return *i.(*map[float64]int32)
+	case *map[float64]UUID:
+		return *i.(*map[float64]UUID)
+	case *map[int32]string:
+		return *i.(*map[int32]string)
+	case *map[int32]int64:
+		return *i.(*map[int32]int64)
+	case *map[int32][]byte:
+		return *i.(*map[int32][]byte)
+	case *map[int32]bool:
+		return *i.(*map[int32]bool)
+	case *map[int32]float32:
+		return *i.(*map[int32]float32)
+	case *map[int32]float64:
+		return *i.(*map[int32]float64)
+	case *map[int32]int32:
+		return *i.(*map[int32]int32)
+	case *map[int32]UUID:
+		return *i.(*map[int32]UUID)
+	case *map[UUID]string:
+		return *i.(*map[UUID]string)
+	case *map[UUID]int64:
+		return *i.(*map[UUID]int64)
+	case *map[UUID][]byte:
+		return *i.(*map[UUID][]byte)
+	case *map[UUID]bool:
+		return *i.(*map[UUID]bool)
+	case *map[UUID]float32:
+		return *i.(*map[UUID]float32)
+	case *map[UUID]float64:
+		return *i.(*map[UUID]float64)
+	case *map[UUID]int32:
+		return *i.(*map[UUID]int32)
+	case *map[UUID]UUID:
+		return *i.(*map[UUID]UUID)
 	default:
 		return i
 	}
@@ -62,7 +359,7 @@ func (iter *Iter) SliceMap() ([]map[string]interface{}, error) {
 	}
 	interfacesToScan := make([]interface{}, 0)
 	for _, column := range iter.Columns() {
-		i := ptrOfType(column.TypeInfo.String())
+		i := ptrOfType(column.TypeInfo)
 		interfacesToScan = append(interfacesToScan, i)
 	}
 	dataToReturn := make([]map[string]interface{}, 0)
@@ -73,5 +370,8 @@ func (iter *Iter) SliceMap() ([]map[string]interface{}, error) {
 		}
 		dataToReturn = append(dataToReturn, m)
 	}
+	if iter.err != nil {
+		return nil, iter.err
+	}
 	return dataToReturn, nil
 }