Skip to content

Commit 83b8c1a

Browse files

19 files changed

+1193
-1164
lines changed

conn.go

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -39,6 +39,7 @@ import (
3939
"sync/atomic"
4040
"time"
4141

42+
"github.com/gocql/gocql/internal"
4243
"github.com/gocql/gocql/internal/lru"
4344
"github.com/gocql/gocql/internal/streams"
4445
)
@@ -1276,7 +1277,7 @@ func (c *Conn) prepareStatement(ctx context.Context, stmt string, tracer Tracer)
12761277
flight.preparedStatment = &preparedStatment{
12771278
// defensively copy as we will recycle the underlying buffer after we
12781279
// return.
1279-
id: copyBytes(x.preparedID),
1280+
id: internal.CopyBytes(x.preparedID),
12801281
// the type info's should _not_ have a reference to the framers read buffer,
12811282
// therefore we can just copy them directly.
12821283
request: x.reqMeta,
@@ -1308,7 +1309,7 @@ func marshalQueryValue(typ TypeInfo, value interface{}, dst *queryValues) error
13081309
value = named.value
13091310
}
13101311

1311-
if _, ok := value.(unsetColumn); !ok {
1312+
if _, ok := value.(internal.UnsetColumn); !ok {
13121313
val, err := Marshal(typ, value)
13131314
if err != nil {
13141315
return err
@@ -1431,7 +1432,7 @@ func (c *Conn) executeQuery(ctx context.Context, qry *Query) *Iter {
14311432
if params.skipMeta {
14321433
if info != nil {
14331434
iter.meta = info.response
1434-
iter.meta.pagingState = copyBytes(x.meta.pagingState)
1435+
iter.meta.pagingState = internal.CopyBytes(x.meta.pagingState)
14351436
} else {
14361437
return &Iter{framer: framer, err: errors.New("gocql: did not receive metadata but prepared info is nil")}
14371438
}
@@ -1442,7 +1443,7 @@ func (c *Conn) executeQuery(ctx context.Context, qry *Query) *Iter {
14421443
if x.meta.morePages() && !qry.disableAutoPage {
14431444
newQry := new(Query)
14441445
*newQry = *qry
1445-
newQry.pageState = copyBytes(x.meta.pagingState)
1446+
newQry.pageState = internal.CopyBytes(x.meta.pagingState)
14461447
newQry.metrics = &queryMetrics{m: make(map[string]*hostMetrics)}
14471448

14481449
iter.next = &nextIter{

control.go

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -37,6 +37,8 @@ import (
3737
"sync"
3838
"sync/atomic"
3939
"time"
40+
41+
"github.com/gocql/gocql/internal"
4042
)
4143

4244
var (
@@ -50,7 +52,7 @@ func init() {
5052
panic(fmt.Sprintf("unable to seed random number generator: %v", err))
5153
}
5254

53-
randr = rand.New(rand.NewSource(int64(readInt(b))))
55+
randr = rand.New(rand.NewSource(int64(internal.ReadInt(b))))
5456
}
5557

5658
const (

frame.go

Lines changed: 12 additions & 59 deletions
Original file line numberDiff line numberDiff line change
@@ -34,9 +34,9 @@ import (
3434
"runtime"
3535
"strings"
3636
"time"
37-
)
3837

39-
type unsetColumn struct{}
38+
"github.com/gocql/gocql/internal"
39+
)
4040

4141
// UnsetValue represents a value used in a query binding that will be ignored by Cassandra.
4242
//
@@ -45,7 +45,7 @@ type unsetColumn struct{}
4545
// want to update some fields, where before you needed to make another prepared statement.
4646
//
4747
// UnsetValue is only available when using the version 4 of the protocol.
48-
var UnsetValue = unsetColumn{}
48+
var UnsetValue = internal.UnsetColumn{}
4949

5050
type namedValue struct {
5151
name string
@@ -331,10 +331,6 @@ var (
331331

332332
const maxFrameHeaderSize = 9
333333

334-
func readInt(p []byte) int32 {
335-
return int32(p[0])<<24 | int32(p[1])<<16 | int32(p[2])<<8 | int32(p[3])
336-
}
337-
338334
type frameHeader struct {
339335
version protoVersion
340336
flags byte
@@ -474,15 +470,15 @@ func readHeader(r io.Reader, p []byte) (head frameHeader, err error) {
474470

475471
head.stream = int(int16(p[2])<<8 | int16(p[3]))
476472
head.op = frameOp(p[4])
477-
head.length = int(readInt(p[5:]))
473+
head.length = int(internal.ReadInt(p[5:]))
478474
} else {
479475
if len(p) != 8 {
480476
return frameHeader{}, fmt.Errorf("not enough bytes to read header require 8 got: %d", len(p))
481477
}
482478

483479
head.stream = int(int8(p[2]))
484480
head.op = frameOp(p[3])
485-
head.length = int(readInt(p[4:]))
481+
head.length = int(internal.ReadInt(p[4:]))
486482
}
487483

488484
return head, nil
@@ -647,7 +643,7 @@ func (f *framer) parseErrorFrame() frame {
647643
stmtId := f.readShortBytes()
648644
return &RequestErrUnprepared{
649645
errorFrame: errD,
650-
StatementId: copyBytes(stmtId), // defensively copy
646+
StatementId: internal.CopyBytes(stmtId), // defensively copy
651647
}
652648
case ErrCodeReadFailure:
653649
res := &RequestErrReadFailure{
@@ -969,7 +965,7 @@ func (f *framer) parsePreparedMetadata() preparedMetadata {
969965
}
970966

971967
if meta.flags&flagHasMorePages == flagHasMorePages {
972-
meta.pagingState = copyBytes(f.readBytes())
968+
meta.pagingState = internal.CopyBytes(f.readBytes())
973969
}
974970

975971
if meta.flags&flagNoMetaData == flagNoMetaData {
@@ -1057,7 +1053,7 @@ func (f *framer) parseResultMetadata() resultMetadata {
10571053
meta.actualColCount = meta.colCount
10581054

10591055
if meta.flags&flagHasMorePages == flagHasMorePages {
1060-
meta.pagingState = copyBytes(f.readBytes())
1056+
meta.pagingState = internal.CopyBytes(f.readBytes())
10611057
}
10621058

10631059
if meta.flags&flagNoMetaData == flagNoMetaData {
@@ -1940,49 +1936,6 @@ func (f *framer) writeByte(b byte) {
19401936
f.buf = append(f.buf, b)
19411937
}
19421938

1943-
func appendBytes(p []byte, d []byte) []byte {
1944-
if d == nil {
1945-
return appendInt(p, -1)
1946-
}
1947-
p = appendInt(p, int32(len(d)))
1948-
p = append(p, d...)
1949-
return p
1950-
}
1951-
1952-
func appendShort(p []byte, n uint16) []byte {
1953-
return append(p,
1954-
byte(n>>8),
1955-
byte(n),
1956-
)
1957-
}
1958-
1959-
func appendInt(p []byte, n int32) []byte {
1960-
return append(p, byte(n>>24),
1961-
byte(n>>16),
1962-
byte(n>>8),
1963-
byte(n))
1964-
}
1965-
1966-
func appendUint(p []byte, n uint32) []byte {
1967-
return append(p, byte(n>>24),
1968-
byte(n>>16),
1969-
byte(n>>8),
1970-
byte(n))
1971-
}
1972-
1973-
func appendLong(p []byte, n int64) []byte {
1974-
return append(p,
1975-
byte(n>>56),
1976-
byte(n>>48),
1977-
byte(n>>40),
1978-
byte(n>>32),
1979-
byte(n>>24),
1980-
byte(n>>16),
1981-
byte(n>>8),
1982-
byte(n),
1983-
)
1984-
}
1985-
19861939
func (f *framer) writeCustomPayload(customPayload *map[string][]byte) {
19871940
if len(*customPayload) > 0 {
19881941
if f.proto < protoVersion4 {
@@ -1994,19 +1947,19 @@ func (f *framer) writeCustomPayload(customPayload *map[string][]byte) {
19941947

19951948
// these are protocol level binary types
19961949
func (f *framer) writeInt(n int32) {
1997-
f.buf = appendInt(f.buf, n)
1950+
f.buf = internal.AppendInt(f.buf, n)
19981951
}
19991952

20001953
func (f *framer) writeUint(n uint32) {
2001-
f.buf = appendUint(f.buf, n)
1954+
f.buf = internal.AppendUint(f.buf, n)
20021955
}
20031956

20041957
func (f *framer) writeShort(n uint16) {
2005-
f.buf = appendShort(f.buf, n)
1958+
f.buf = internal.AppendShort(f.buf, n)
20061959
}
20071960

20081961
func (f *framer) writeLong(n int64) {
2009-
f.buf = appendLong(f.buf, n)
1962+
f.buf = internal.AppendLong(f.buf, n)
20101963
}
20111964

20121965
func (f *framer) writeString(s string) {

go.mod

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,7 @@ require (
2323
github.com/golang/snappy v0.0.3
2424
github.com/hailocab/go-hostpool v0.0.0-20160125115350-e80d13ce29ed
2525
github.com/kr/pretty v0.1.0 // indirect
26-
github.com/stretchr/testify v1.3.0 // indirect
26+
github.com/stretchr/testify v1.3.0
2727
gopkg.in/inf.v0 v0.9.1
2828
)
2929

helpers.go

Lines changed: 4 additions & 36 deletions
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,8 @@ import (
3232
"strings"
3333
"time"
3434

35+
"github.com/gocql/gocql/internal"
36+
3537
"gopkg.in/inf.v0"
3638
)
3739

@@ -176,7 +178,7 @@ func getCassandraType(name string, logger StdLogger) TypeInfo {
176178
Elem: getCassandraType(strings.TrimPrefix(name[:len(name)-1], "list<"), logger),
177179
}
178180
} else if strings.HasPrefix(name, "map<") {
179-
names := splitCompositeTypes(strings.TrimPrefix(name[:len(name)-1], "map<"))
181+
names := internal.SplitCompositeTypes(strings.TrimPrefix(name[:len(name)-1], "map<"))
180182
if len(names) != 2 {
181183
logger.Printf("Error parsing map type, it has %d subelements, expecting 2\n", len(names))
182184
return NativeType{
@@ -189,7 +191,7 @@ func getCassandraType(name string, logger StdLogger) TypeInfo {
189191
Elem: getCassandraType(names[1], logger),
190192
}
191193
} else if strings.HasPrefix(name, "tuple<") {
192-
names := splitCompositeTypes(strings.TrimPrefix(name[:len(name)-1], "tuple<"))
194+
names := internal.SplitCompositeTypes(strings.TrimPrefix(name[:len(name)-1], "tuple<"))
193195
types := make([]TypeInfo, len(names))
194196

195197
for i, name := range names {
@@ -207,34 +209,6 @@ func getCassandraType(name string, logger StdLogger) TypeInfo {
207209
}
208210
}
209211

210-
func splitCompositeTypes(name string) []string {
211-
if !strings.Contains(name, "<") {
212-
return strings.Split(name, ", ")
213-
}
214-
var parts []string
215-
lessCount := 0
216-
segment := ""
217-
for _, char := range name {
218-
if char == ',' && lessCount == 0 {
219-
if segment != "" {
220-
parts = append(parts, strings.TrimSpace(segment))
221-
}
222-
segment = ""
223-
continue
224-
}
225-
segment += string(char)
226-
if char == '<' {
227-
lessCount++
228-
} else if char == '>' {
229-
lessCount--
230-
}
231-
}
232-
if segment != "" {
233-
parts = append(parts, strings.TrimSpace(segment))
234-
}
235-
return parts
236-
}
237-
238212
func apacheToCassandraType(t string) string {
239213
t = strings.Replace(t, apacheCassandraTypePrefix, "", -1)
240214
t = strings.Replace(t, "(", "<", -1)
@@ -451,12 +425,6 @@ func (iter *Iter) MapScan(m map[string]interface{}) bool {
451425
return false
452426
}
453427

454-
func copyBytes(p []byte) []byte {
455-
b := make([]byte, len(p))
456-
copy(b, p)
457-
return b
458-
}
459-
460428
var failDNS = false
461429

462430
func LookupIP(host string) ([]net.IP, error) {

internal/frame.go

Lines changed: 50 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,50 @@
1+
package internal
2+
3+
type UnsetColumn struct{}
4+
5+
func ReadInt(p []byte) int32 {
6+
return int32(p[0])<<24 | int32(p[1])<<16 | int32(p[2])<<8 | int32(p[3])
7+
}
8+
9+
func AppendBytes(p []byte, d []byte) []byte {
10+
if d == nil {
11+
return AppendInt(p, -1)
12+
}
13+
p = AppendInt(p, int32(len(d)))
14+
p = append(p, d...)
15+
return p
16+
}
17+
18+
func AppendShort(p []byte, n uint16) []byte {
19+
return append(p,
20+
byte(n>>8),
21+
byte(n),
22+
)
23+
}
24+
25+
func AppendInt(p []byte, n int32) []byte {
26+
return append(p, byte(n>>24),
27+
byte(n>>16),
28+
byte(n>>8),
29+
byte(n))
30+
}
31+
32+
func AppendUint(p []byte, n uint32) []byte {
33+
return append(p, byte(n>>24),
34+
byte(n>>16),
35+
byte(n>>8),
36+
byte(n))
37+
}
38+
39+
func AppendLong(p []byte, n int64) []byte {
40+
return append(p,
41+
byte(n>>56),
42+
byte(n>>48),
43+
byte(n>>40),
44+
byte(n>>32),
45+
byte(n>>24),
46+
byte(n>>16),
47+
byte(n>>8),
48+
byte(n),
49+
)
50+
}

internal/helpers.go

Lines changed: 37 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,37 @@
1+
package internal
2+
3+
import "strings"
4+
5+
func SplitCompositeTypes(name string) []string {
6+
if !strings.Contains(name, "<") {
7+
return strings.Split(name, ", ")
8+
}
9+
var parts []string
10+
lessCount := 0
11+
segment := ""
12+
for _, char := range name {
13+
if char == ',' && lessCount == 0 {
14+
if segment != "" {
15+
parts = append(parts, strings.TrimSpace(segment))
16+
}
17+
segment = ""
18+
continue
19+
}
20+
segment += string(char)
21+
if char == '<' {
22+
lessCount++
23+
} else if char == '>' {
24+
lessCount--
25+
}
26+
}
27+
if segment != "" {
28+
parts = append(parts, strings.TrimSpace(segment))
29+
}
30+
return parts
31+
}
32+
33+
func CopyBytes(p []byte) []byte {
34+
b := make([]byte, len(p))
35+
copy(b, p)
36+
return b
37+
}

0 commit comments

Comments
 (0)