Skip to content

Commit

Permalink
Merge pull request #11 from Drafteame/feat/AH/restart-connection-changes
Browse files Browse the repository at this point in the history
feat: restart connection changes
  • Loading branch information
andihaskel authored Feb 28, 2023
2 parents 29def51 + f572221 commit be0dd49
Show file tree
Hide file tree
Showing 24 changed files with 482 additions and 235 deletions.
6 changes: 6 additions & 0 deletions go.mod
Original file line number Diff line number Diff line change
Expand Up @@ -3,13 +3,19 @@ module github.com/Drafteame/cassandra-builder
go 1.18

require (
github.com/avast/retry-go/v4 v4.3.3
github.com/gocql/gocql v1.3.1
github.com/magefile/mage v1.14.0
github.com/scylladb/gocqlx v1.5.0
github.com/stretchr/testify v1.8.1
)

require (
github.com/davecgh/go-spew v1.1.1 // indirect
github.com/golang/snappy v0.0.4 // indirect
github.com/hailocab/go-hostpool v0.0.0-20160125115350-e80d13ce29ed // indirect
github.com/pmezard/go-difflib v1.0.0 // indirect
github.com/stretchr/objx v0.5.0 // indirect
gopkg.in/inf.v0 v0.9.1 // indirect
gopkg.in/yaml.v3 v3.0.1 // indirect
)
16 changes: 16 additions & 0 deletions go.sum
Original file line number Diff line number Diff line change
@@ -1,8 +1,11 @@
github.com/avast/retry-go/v4 v4.3.3 h1:G56Bp6mU0b5HE1SkaoVjscZjlQb0oy4mezwY/cGH19w=
github.com/avast/retry-go/v4 v4.3.3/go.mod h1:rg6XFaiuFYII0Xu3RDbZQkxCofFwruZKW8oEF1jpWiU=
github.com/bitly/go-hostpool v0.0.0-20171023180738-a3a6125de932 h1:mXoPYz/Ul5HYEDvkta6I8/rnYM5gSdSV2tJ6XbZuEtY=
github.com/bitly/go-hostpool v0.0.0-20171023180738-a3a6125de932/go.mod h1:NOuUCSz6Q9T7+igc/hlvDOUdtWKryOrtFyIVABv/p7k=
github.com/bmizerany/assert v0.0.0-20160611221934-b7ed37b82869 h1:DDGfHa7BWjL4YnC6+E63dPcxHo2sUxDIu8g3QgEJdRY=
github.com/bmizerany/assert v0.0.0-20160611221934-b7ed37b82869/go.mod h1:Ekp36dRnpXw/yCqJaO+ZrUyxD+3VXMFFr56k5XYrpB4=
github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c=
github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
github.com/gocql/gocql v0.0.0-20200131111108-92af2e088537/go.mod h1:DL0ekTmBSTdlNF25Orwt/JMzqIq3EJ4MVa/J/uK64OY=
github.com/gocql/gocql v1.3.1 h1:BTwM4rux+ah5G3oH6/MQa+tur/TDd/XAAOXDxBBs7rg=
Expand All @@ -23,11 +26,24 @@ github.com/kr/text v0.1.0 h1:45sCR5RtlFHMR4UwH9sdQ5TC8v0qDQCHnXt+kaKSTVE=
github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI=
github.com/magefile/mage v1.14.0 h1:6QDX3g6z1YvJ4olPhT1wksUcSa/V0a1B+pJb73fBjyo=
github.com/magefile/mage v1.14.0/go.mod h1:z5UZb/iS3GoOSn0JgWuiw7dxlurVYTu+/jHXqQg881A=
github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM=
github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=
github.com/scylladb/go-reflectx v1.0.1/go.mod h1:rWnOfDIRWBGN0miMLIcoPt/Dhi2doCMZqwMCJ3KupFc=
github.com/scylladb/gocqlx v1.5.0 h1:p7NEqRaCMAtW2nvq62iyUNXmIYP29373YOC7D2Xd7Qg=
github.com/scylladb/gocqlx v1.5.0/go.mod h1:QarZcw5kpYh31MXfxiN2JWWvF1cgZbYqfTfXwmwhpEQ=
github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=
github.com/stretchr/objx v0.4.0/go.mod h1:YvHI0jy2hoMjB+UWwv71VJQ9isScKT/TqJzVSSt89Yw=
github.com/stretchr/objx v0.5.0 h1:1zr/of2m5FGMsad5YfcqgdqdWrIhu+EBEJRhR1U7z/c=
github.com/stretchr/objx v0.5.0/go.mod h1:Yh+to48EsGEfYuaHDzXPcE3xhTkx73EhmCGUpEOglKo=
github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI=
github.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=
github.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU=
github.com/stretchr/testify v1.8.1 h1:w7B6lhMri9wdJUVmEZPGGhZzrYTPvgJArz7wNPgYKsk=
github.com/stretchr/testify v1.8.1/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4=
gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405 h1:yhCVgyC4o1eVCa2tZl7eS0r+SDo693bJlVdllGtEeKM=
gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
gopkg.in/inf.v0 v0.9.1 h1:73M5CoZyi3ZLMOyDlQh031Cx6N9NDJ2Vvfl76EDAgDc=
gopkg.in/inf.v0 v0.9.1/go.mod h1:cWUDdTG/fYaXco+Dcufb5Vnc6Gp2YChqWtbxRZE0mXw=
gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=
gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA=
gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=
91 changes: 54 additions & 37 deletions qb/client.go
Original file line number Diff line number Diff line change
Expand Up @@ -5,68 +5,45 @@ import (

"github.com/Drafteame/cassandra-builder/qb/qcount"
"github.com/Drafteame/cassandra-builder/qb/qdelete"

models "github.com/Drafteame/cassandra-builder/qb/models"
"github.com/Drafteame/cassandra-builder/qb/qinsert"
"github.com/Drafteame/cassandra-builder/qb/qselect"
"github.com/Drafteame/cassandra-builder/qb/query"
"github.com/Drafteame/cassandra-builder/qb/qupdate"
)

type client struct {
canRestart bool
config models.Config
session *gocql.Session
debug bool
printQuery query.DebugPrint
}

// NewClient creates a new cassandra client manager from config
func NewClient(conf Config) (Client, error) {
session, err := getSession(conf)
if err != nil {
return nil, err
}

c := &client{session: session, debug: conf.Debug, printQuery: query.DefaultDebugPrint}

if conf.PrintQuery != nil {
c.printQuery = conf.PrintQuery
}

return c, nil
}

// NewClientWithSession creates a new cassandra client manager from a given session.
func NewClientWithSession(session *gocql.Session, conf Config) (Client, error) {
c := &client{session: session, debug: conf.Debug, printQuery: query.DefaultDebugPrint}

if conf.PrintQuery != nil {
c.printQuery = conf.PrintQuery
}

return c, nil
}

var _ Client = &client{}

func (c *client) Select(f ...string) *qselect.Query {
return qselect.New(c.session, c.debug, c.printQuery).Fields(f...)
return qselect.New(c).Fields(f...)
}

func (c *client) Insert(f ...string) *qinsert.Query {
return qinsert.New(c.session, c.debug, c.printQuery).Fields(f...)
return qinsert.New(c).Fields(f...)
}

func (c *client) Update(t string) *qupdate.Query {
return qupdate.New(c.session, c.debug, c.printQuery).Table(t)
return qupdate.New(c).Table(t)
}

func (c *client) Delete() *qdelete.Query {
return qdelete.New(c.session, c.debug, c.printQuery)
return qdelete.New(c)
}

func (c *client) Count() *qcount.Query {
return qcount.New(c.session, c.debug, c.printQuery)
return qcount.New(c)
}

func (c *client) Debug() bool {
return c.config.Debug
}

// Close finish cassandra session
func (c *client) Close() {
c.session.Close()
}
Expand All @@ -75,7 +52,24 @@ func (c *client) Session() *gocql.Session {
return c.session
}

func getSession(c Config) (*gocql.Session, error) {
func (c *client) Config() models.Config {
return c.config
}

func (c *client) Restart() error {
c.Close()

session, err := createSession(c.config)
if err != nil {
return err
}

c.session = session

return nil
}

func createSession(c models.Config) (*gocql.Session, error) {
cluster := gocql.NewCluster(c.ContactPoints...)
cluster.Keyspace = c.KeyspaceName
cluster.Consistency = gocql.Consistency(c.Consistency)
Expand Down Expand Up @@ -112,3 +106,26 @@ func getSession(c Config) (*gocql.Session, error) {

return cluster.CreateSession()
}

// NewClient creates a new cassandra client manager from config
func NewClient(conf models.Config) (Client, error) {
session, err := createSession(conf)
if err != nil {
return nil, err
}

return &client{
session: session,
config: conf,
canRestart: true,
}, nil
}

// NewClientWithSession creates a new cassandra client manager from a given session.
func NewClientWithSession(session *gocql.Session, conf models.Config) Client {
return &client{
session: session,
config: conf,
canRestart: false,
}
}
13 changes: 13 additions & 0 deletions qb/errors/errors.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
package errors

import "errors"

var (
ErrNilBinding = errors.New("cassandra-builder: nil bind is not allowed")
ErrNoPtrBinding = errors.New("cassandra-builder: bind value should be a pointer")
ErrNoStructOrSliceBinding = errors.New("cassandra-builder: bind value should be a struct or slice")
ErrNoSliceOfStructsBinding = errors.New("cassandra-builder: bind value should be a slice of structs")
ErrClosedConnection = errors.New("cassandra-builder: can execute on closed connection")
ErrNilIterator = errors.New("cassandra-builder: nil iterator is not allowed")
ErrParsing = errors.New("cassandra-builder: error parsing row")
)
36 changes: 36 additions & 0 deletions qb/models/config.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,36 @@
package models

import (
"time"
)

type Consistency uint16

const (
Any Consistency = 0x00
One Consistency = 0x01
Two Consistency = 0x02
Three Consistency = 0x03
Quorum Consistency = 0x04
All Consistency = 0x05
LocalQuorum Consistency = 0x06
EachQuorum Consistency = 0x07
LocalOne Consistency = 0x0A
)

// Config is the main cassandra configuration needed
type Config struct {
Port int
KeyspaceName string
Username string
Password string
ContactPoints []string
Debug bool
ProtoVersion int
Consistency Consistency
CaPath string
DisableInitialHostLookup bool
Timeout time.Duration
ConnectTimeout time.Duration
NumRetries uint
}
46 changes: 11 additions & 35 deletions qb/qb.go
Original file line number Diff line number Diff line change
@@ -1,49 +1,16 @@
package qb

import (
"time"

"github.com/gocql/gocql"

models "github.com/Drafteame/cassandra-builder/qb/models"
"github.com/Drafteame/cassandra-builder/qb/qcount"
delete2 "github.com/Drafteame/cassandra-builder/qb/qdelete"
"github.com/Drafteame/cassandra-builder/qb/qinsert"
_select "github.com/Drafteame/cassandra-builder/qb/qselect"
"github.com/Drafteame/cassandra-builder/qb/query"
"github.com/Drafteame/cassandra-builder/qb/qupdate"
)

type Consistency uint16

const (
Any Consistency = 0x00
One Consistency = 0x01
Two Consistency = 0x02
Three Consistency = 0x03
Quorum Consistency = 0x04
All Consistency = 0x05
LocalQuorum Consistency = 0x06
EachQuorum Consistency = 0x07
LocalOne Consistency = 0x0A
)

// Config is the main cassandra configuration needed
type Config struct {
Port int `yaml:"port" json:"port"`
KeyspaceName string `yaml:"keyspace_name" json:"keyspace_name"`
Username string `yaml:"username" json:"username"`
Password string `yaml:"password" json:"password"`
ContactPoints []string `yaml:"contact_points" json:"contact_points"`
Debug bool `yaml:"debug" json:"debug"`
ProtoVersion int `yaml:"proto_version" json:"proto_version"`
Consistency Consistency `yaml:"consistency" json:"consistency"`
CaPath string `yaml:"ca_path" json:"ca_path"`
DisableInitialHostLookup bool `yaml:"disable_initial_host_lookup" json:"disable_initial_host_lookup"`
Timeout time.Duration `yaml:"timeout" json:"timeout"`
ConnectTimeout time.Duration `yaml:"connect_timeout" json:"connect_timeout"`
PrintQuery query.DebugPrint
}

// Client is the main cassandra client abstraction to work with the database
type Client interface {
// Select start a select query
Expand All @@ -64,6 +31,15 @@ type Client interface {
// Session return the plain session object to build some direct query
Session() *gocql.Session

// Close close cassandra connection pool
// Debug return an assertion for debugging
Debug() bool

// Restart should close and start a new connection.
Restart() error

// Config return current client configuration
Config() models.Config

// Close ends cassandra connection pool
Close()
}
13 changes: 4 additions & 9 deletions qb/qcount/count.go
Original file line number Diff line number Diff line change
@@ -1,14 +1,13 @@
package qcount

import (
"github.com/gocql/gocql"

"github.com/Drafteame/cassandra-builder/qb/query"
"github.com/Drafteame/cassandra-builder/qb/runner"
)

// Query create new select count query
type Query struct {
ctx query.Query
client runner.Client
table string
column string
where []query.WhereStm
Expand All @@ -17,12 +16,8 @@ type Query struct {
}

// New create a new count query instance by passing a cassandra session
func New(s *gocql.Session, d bool, dp query.DebugPrint) *Query {
return &Query{ctx: query.Query{
Session: s,
Debug: d,
PrintQuery: dp,
}}
func New(c runner.Client) *Query {
return &Query{client: c}
}

// Column set count column of the query
Expand Down
16 changes: 4 additions & 12 deletions qb/qcount/count_exec.go
Original file line number Diff line number Diff line change
Expand Up @@ -3,23 +3,19 @@ package qcount
import (
"strings"

"github.com/gocql/gocql"
"github.com/scylladb/gocqlx/qb"

"github.com/Drafteame/cassandra-builder/qb/query"
"github.com/Drafteame/cassandra-builder/qb/runner"
)

// Exec release count query an return the number of rows and a possible error
func (cq *Query) Exec() (int64, error) {
q := cq.build()

var count int64
run := runner.New(cq.client)

if err := cq.ctx.Session.Query(q, cq.args...).Consistency(gocql.One).Scan(&count); err != nil {
return 0, err
}
q := cq.build()

return count, nil
return run.QueryCount(q, cq.args)
}

func (cq *Query) build() string {
Expand All @@ -35,9 +31,5 @@ func (cq *Query) build() string {

queryStr, _ := q.ToCql()

if cq.ctx.Debug {
cq.ctx.PrintQuery(queryStr, cq.args)
}

return strings.TrimSpace(queryStr)
}
Loading

0 comments on commit be0dd49

Please sign in to comment.