helpers.go 2.3 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192
  1. package gocql
  2. import "reflect"
  3. func (t *TypeInfo) New() interface{} {
  4. return reflect.New(goType(t)).Interface()
  5. }
  6. func goType(t *TypeInfo) reflect.Type {
  7. switch t.Type {
  8. case TypeVarchar, TypeAscii:
  9. return reflect.TypeOf(*new(string))
  10. case TypeBigInt, TypeCounter, TypeTimestamp:
  11. return reflect.TypeOf(*new(int64))
  12. case TypeBlob:
  13. return reflect.TypeOf(*new([]byte))
  14. case TypeBoolean:
  15. return reflect.TypeOf(*new(bool))
  16. case TypeFloat:
  17. return reflect.TypeOf(*new(float32))
  18. case TypeDouble:
  19. return reflect.TypeOf(*new(float64))
  20. case TypeInt:
  21. return reflect.TypeOf(*new(int))
  22. case TypeUUID, TypeTimeUUID:
  23. return reflect.TypeOf(*new(UUID))
  24. case TypeList, TypeSet:
  25. return reflect.SliceOf(goType(t.Elem))
  26. case TypeMap:
  27. return reflect.MapOf(goType(t.Key), goType(t.Elem))
  28. default:
  29. return nil
  30. }
  31. }
  32. func dereference(i interface{}) interface{} {
  33. return reflect.Indirect(reflect.ValueOf(i)).Interface()
  34. }
  35. func (iter *Iter) RowData() (map[string]interface{}, error) {
  36. if iter.err != nil {
  37. return nil, iter.err
  38. }
  39. rowData := make(map[string]interface{})
  40. for _, column := range iter.Columns() {
  41. rowData[column.Name] = column.TypeInfo.New()
  42. }
  43. return rowData, nil
  44. }
  45. // SliceMap is a helper function to make the API easier to use
  46. // returns the data from the query in the form of []map[string]interface{}
  47. func (iter *Iter) SliceMap() ([]map[string]interface{}, error) {
  48. if iter.err != nil {
  49. return nil, iter.err
  50. }
  51. interfacesToScan := make([]interface{}, 0)
  52. for _, column := range iter.Columns() {
  53. i := column.TypeInfo.New()
  54. interfacesToScan = append(interfacesToScan, i)
  55. }
  56. dataToReturn := make([]map[string]interface{}, 0)
  57. for iter.Scan(interfacesToScan...) {
  58. m := make(map[string]interface{})
  59. for i, column := range iter.Columns() {
  60. m[column.Name] = dereference(interfacesToScan[i])
  61. }
  62. dataToReturn = append(dataToReturn, m)
  63. }
  64. if iter.err != nil {
  65. return nil, iter.err
  66. }
  67. return dataToReturn, nil
  68. }
  69. func (iter *Iter) MapScan(m map[string]interface{}) bool {
  70. if iter.err != nil {
  71. return false
  72. }
  73. interfacesToScan := make([]interface{}, 0)
  74. for _, column := range iter.Columns() {
  75. i := column.TypeInfo.New()
  76. interfacesToScan = append(interfacesToScan, i)
  77. }
  78. if iter.Scan(interfacesToScan...) {
  79. for i, column := range iter.Columns() {
  80. m[column.Name] = dereference(interfacesToScan[i])
  81. }
  82. return true
  83. }
  84. return false
  85. }