forked from rethinkdb/rethinkdb-go
-
Notifications
You must be signed in to change notification settings - Fork 0
/
errors.go
140 lines (115 loc) · 3.31 KB
/
errors.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
140
package gorethink
import (
"bytes"
"encoding/json"
"errors"
"fmt"
p "github.com/dancannon/gorethink/ql2"
)
var (
// ErrNoHosts is returned when no hosts to the Connect method.
ErrNoHosts = errors.New("no hosts provided")
// ErrNoConnectionsStarted is returned when the driver couldn't to any of
// the provided hosts.
ErrNoConnectionsStarted = errors.New("no connections were made when creating the session")
// ErrInvalidNode is returned when attempting to connect to a node which
// returns an invalid response.
ErrInvalidNode = errors.New("invalid node")
// ErrNoConnections is returned when there are no active connections in the
// clusters connection pool.
ErrNoConnections = errors.New("gorethink: no connections were available")
// ErrConnectionClosed is returned when trying to send a query with a closed
// connection.
ErrConnectionClosed = errors.New("gorethink: the connection is closed")
)
func printCarrots(t Term, frames []*p.Frame) string {
var frame *p.Frame
if len(frames) > 1 {
frame, frames = frames[0], frames[1:]
} else if len(frames) == 1 {
frame, frames = frames[0], []*p.Frame{}
}
for i, arg := range t.args {
if frame.GetPos() == int64(i) {
t.args[i] = Term{
termType: p.Term_DATUM,
data: printCarrots(arg, frames),
}
}
}
for k, arg := range t.optArgs {
if frame.GetOpt() == k {
t.optArgs[k] = Term{
termType: p.Term_DATUM,
data: printCarrots(arg, frames),
}
}
}
b := &bytes.Buffer{}
for _, c := range t.String() {
if c != '^' {
b.WriteString(" ")
} else {
b.WriteString("^")
}
}
return b.String()
}
// Error constants
var ErrEmptyResult = errors.New("The result does not contain any more rows")
// Connection/Response errors
// rqlResponseError is the base type for all errors, it formats both
// for the response and query if set.
type rqlResponseError struct {
response *Response
term *Term
}
func (e rqlResponseError) Error() string {
var err = "An error occurred"
if e.response != nil {
json.Unmarshal(e.response.Responses[0], &err)
}
if e.term == nil {
return fmt.Sprintf("gorethink: %s", err)
}
return fmt.Sprintf("gorethink: %s in: \n%s", err, e.term.String())
}
func (e rqlResponseError) String() string {
return e.Error()
}
// RQLCompileError represents an error that occurs when compiling a query on
// the database server.
type RQLCompileError struct {
rqlResponseError
}
// RQLRuntimeError represents an error when executing an error on the database
// server, this is also returned by the database when using the `Error` term.
type RQLRuntimeError struct {
rqlResponseError
}
// RQLClientError represents a client error returned from the database.
type RQLClientError struct {
rqlResponseError
}
// RQLDriverError represents an unexpected error with the driver, if this error
// persists please create an issue.
type RQLDriverError struct {
message string
}
func (e RQLDriverError) Error() string {
return fmt.Sprintf("gorethink: %s", e.message)
}
func (e RQLDriverError) String() string {
return e.Error()
}
// RQLConnectionError represents an error when communicating with the database
// server.
type RQLConnectionError struct {
message string
}
func (e RQLConnectionError) Error() string {
return fmt.Sprintf("gorethink: %s", e.message)
}
func (e RQLConnectionError) String() string {
return e.Error()
}