in helpers.go [169:244]
func getCassandraLongType(name string, protoVer byte, logger StdLogger) TypeInfo {
if strings.HasPrefix(name, SET_TYPE) {
return CollectionType{
NativeType: NewNativeType(protoVer, TypeSet),
Elem: getCassandraLongType(unwrapCompositeTypeDefinition(name, SET_TYPE, '('), protoVer, logger),
}
} else if strings.HasPrefix(name, LIST_TYPE) {
return CollectionType{
NativeType: NewNativeType(protoVer, TypeList),
Elem: getCassandraLongType(unwrapCompositeTypeDefinition(name, LIST_TYPE, '('), protoVer, logger),
}
} else if strings.HasPrefix(name, MAP_TYPE) {
names := splitJavaCompositeTypes(name, MAP_TYPE)
if len(names) != 2 {
logger.Printf("gocql: error parsing map type, it has %d subelements, expecting 2\n", len(names))
return NewNativeType(protoVer, TypeCustom)
}
return CollectionType{
NativeType: NewNativeType(protoVer, TypeMap),
Key: getCassandraLongType(names[0], protoVer, logger),
Elem: getCassandraLongType(names[1], protoVer, logger),
}
} else if strings.HasPrefix(name, TUPLE_TYPE) {
names := splitJavaCompositeTypes(name, TUPLE_TYPE)
types := make([]TypeInfo, len(names))
for i, name := range names {
types[i] = getCassandraLongType(name, protoVer, logger)
}
return TupleTypeInfo{
NativeType: NewNativeType(protoVer, TypeTuple),
Elems: types,
}
} else if strings.HasPrefix(name, UDT_TYPE) {
names := splitJavaCompositeTypes(name, UDT_TYPE)
fields := make([]UDTField, len(names)-2)
for i := 2; i < len(names); i++ {
spec := strings.Split(names[i], ":")
fieldName, _ := hex.DecodeString(spec[0])
fields[i-2] = UDTField{
Name: string(fieldName),
Type: getCassandraLongType(spec[1], protoVer, logger),
}
}
udtName, _ := hex.DecodeString(names[1])
return UDTTypeInfo{
NativeType: NewNativeType(protoVer, TypeUDT),
KeySpace: names[0],
Name: string(udtName),
Elements: fields,
}
} else if strings.HasPrefix(name, VECTOR_TYPE) {
names := splitJavaCompositeTypes(name, VECTOR_TYPE)
subType := getCassandraLongType(strings.TrimSpace(names[0]), protoVer, logger)
dim, err := strconv.Atoi(strings.TrimSpace(names[1]))
if err != nil {
logger.Printf("gocql: error parsing vector dimensions: %v\n", err)
return NewNativeType(protoVer, TypeCustom)
}
return VectorType{
NativeType: NewCustomType(protoVer, TypeCustom, VECTOR_TYPE),
SubType: subType,
Dimensions: dim,
}
} else {
// basic type
return NativeType{
proto: protoVer,
typ: getApacheCassandraType(name),
}
}
}