forked from scylladb/gocql
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathudt_test.go
139 lines (115 loc) · 2.78 KB
/
udt_test.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
// +build all integration
package gocql
import (
"fmt"
"testing"
)
type position struct {
Lat int
Lon int
}
// NOTE: due to current implementation details it is not currently possible to use
// a pointer receiver type for the UDTMarshaler interface to handle UDT's
func (p position) MarshalUDT(name string, info TypeInfo) ([]byte, error) {
switch name {
case "lat":
return Marshal(info, p.Lat)
case "lon":
return Marshal(info, p.Lon)
default:
return nil, fmt.Errorf("unknown column for position: %q", name)
}
}
func (p *position) UnmarshalUDT(name string, info TypeInfo, data []byte) error {
switch name {
case "lat":
return Unmarshal(info, data, &p.Lat)
case "lon":
return Unmarshal(info, data, &p.Lon)
default:
return fmt.Errorf("unknown column for position: %q", name)
}
}
func TestUDT_Marshaler(t *testing.T) {
if *flagProto < protoVersion3 {
t.Skip("UDT are only available on protocol >= 3")
}
session := createSession(t)
defer session.Close()
err := createTable(session, `CREATE TYPE position(
lat int,
lon int);`)
if err != nil {
t.Fatal(err)
}
err = createTable(session, `CREATE TABLE houses(
id int,
name text,
loc frozen<position>,
primary key(id)
);`)
if err != nil {
t.Fatal(err)
}
const (
expLat = -1
expLon = 2
)
err = session.Query("INSERT INTO houses(id, name, loc) VALUES(?, ?, ?)", 1, "test", &position{expLat, expLon}).Exec()
if err != nil {
t.Fatal(err)
}
pos := &position{}
err = session.Query("SELECT loc FROM houses WHERE id = ?", 1).Scan(pos)
if err != nil {
t.Fatal(err)
}
if pos.Lat != expLat {
t.Errorf("expeceted lat to be be %d got %d", expLat, pos.Lat)
}
if pos.Lon != expLon {
t.Errorf("expeceted lon to be be %d got %d", expLon, pos.Lon)
}
}
func TestUDT_Reflect(t *testing.T) {
// Uses reflection instead of implementing the marshaling type
if *flagProto < protoVersion3 {
t.Skip("UDT are only available on protocol >= 3")
}
session := createSession(t)
defer session.Close()
err := createTable(session, `CREATE TYPE horse(
name text,
owner text);`)
if err != nil {
t.Fatal(err)
}
err = createTable(session, `CREATE TABLE horse_race(
position int,
horse frozen<horse>,
primary key(position)
);`)
if err != nil {
t.Fatal(err)
}
type horse struct {
Name string `cql:"name"`
Owner string `cql:"owner"`
}
insertedHorse := &horse{
Name: "pony",
Owner: "jim",
}
err = session.Query("INSERT INTO horse_race(position, horse) VALUES(?, ?)", 1, insertedHorse).Exec()
if err != nil {
t.Fatal(err)
}
retrievedHorse := &horse{}
err = session.Query("SELECT horse FROM horse_race WHERE position = ?", 1).Scan(retrievedHorse)
if err != nil {
t.Fatal(err)
}
if *retrievedHorse != *insertedHorse {
t.Fatal("exepcted to get %+v got %+v", insertedHorse, retrievedHorse)
}
}