route/vendor/github.com/GoRethink/gorethink/node.go

134 lines
2.7 KiB
Go

package gorethink
import (
"sync"
p "gopkg.in/gorethink/gorethink.v2/ql2"
)
// Node represents a database server in the cluster
type Node struct {
ID string
Host Host
aliases []Host
cluster *Cluster
pool *Pool
mu sync.RWMutex
closed bool
}
func newNode(id string, aliases []Host, cluster *Cluster, pool *Pool) *Node {
node := &Node{
ID: id,
Host: aliases[0],
aliases: aliases,
cluster: cluster,
pool: pool,
}
return node
}
// Closed returns true if the node is closed
func (n *Node) Closed() bool {
n.mu.RLock()
defer n.mu.RUnlock()
return n.closed
}
// Close closes the session
func (n *Node) Close(optArgs ...CloseOpts) error {
n.mu.Lock()
defer n.mu.Unlock()
if n.closed {
return nil
}
if len(optArgs) >= 1 {
if optArgs[0].NoReplyWait {
n.NoReplyWait()
}
}
if n.pool != nil {
n.pool.Close()
}
n.pool = nil
n.closed = true
return nil
}
// SetInitialPoolCap sets the initial capacity of the connection pool.
func (n *Node) SetInitialPoolCap(idleConns int) {
n.pool.SetInitialPoolCap(idleConns)
}
// SetMaxIdleConns sets the maximum number of connections in the idle
// connection pool.
func (n *Node) SetMaxIdleConns(idleConns int) {
n.pool.SetMaxIdleConns(idleConns)
}
// SetMaxOpenConns sets the maximum number of open connections to the database.
func (n *Node) SetMaxOpenConns(openConns int) {
n.pool.SetMaxOpenConns(openConns)
}
// NoReplyWait ensures that previous queries with the noreply flag have been
// processed by the server. Note that this guarantee only applies to queries
// run on the given connection
func (n *Node) NoReplyWait() error {
return n.pool.Exec(Query{
Type: p.Query_NOREPLY_WAIT,
})
}
// Query executes a ReQL query using this nodes connection pool.
func (n *Node) Query(q Query) (cursor *Cursor, err error) {
if n.Closed() {
return nil, ErrInvalidNode
}
return n.pool.Query(q)
}
// Exec executes a ReQL query using this nodes connection pool.
func (n *Node) Exec(q Query) (err error) {
if n.Closed() {
return ErrInvalidNode
}
return n.pool.Exec(q)
}
// Server returns the server name and server UUID being used by a connection.
func (n *Node) Server() (ServerResponse, error) {
var response ServerResponse
if n.Closed() {
return response, ErrInvalidNode
}
return n.pool.Server()
}
type nodeStatus struct {
ID string `gorethink:"id"`
Name string `gorethink:"name"`
Status string `gorethink:"status"`
Network struct {
Hostname string `gorethink:"hostname"`
ClusterPort int64 `gorethink:"cluster_port"`
ReqlPort int64 `gorethink:"reql_port"`
CanonicalAddresses []struct {
Host string `gorethink:"host"`
Port int64 `gorethink:"port"`
} `gorethink:"canonical_addresses"`
} `gorethink:"network"`
}