Improve errors throught codebase
This commit is contained in:
parent
c3df9d791d
commit
6a719d815b
7 changed files with 79 additions and 89 deletions
10
db/create.go
10
db/create.go
|
@ -39,23 +39,29 @@ func (e *executor) executeCreateStatement(ast *sql.CreateStatement) (out []inter
|
|||
|
||||
case *sql.Thing:
|
||||
key := &keys.Thing{KV: ast.KV, NS: ast.NS, DB: ast.DB, TB: what.TB, ID: what.ID}
|
||||
kv, _ := e.txn.Get(0, key.Encode())
|
||||
if kv, err := e.txn.Get(0, key.Encode()); err != nil {
|
||||
return nil, err
|
||||
} else {
|
||||
doc := item.New(kv, e.txn, key, e.ctx)
|
||||
if ret, err := create(doc, ast); err != nil {
|
||||
return nil, err
|
||||
} else if ret != nil {
|
||||
out = append(out, ret)
|
||||
}
|
||||
}
|
||||
|
||||
case *sql.Table:
|
||||
key := &keys.Thing{KV: ast.KV, NS: ast.NS, DB: ast.DB, TB: what.TB, ID: uuid.NewV5(uuid.NewV4().UUID, ast.KV).String()}
|
||||
kv, _ := e.txn.Get(0, key.Encode())
|
||||
if kv, err := e.txn.Get(0, key.Encode()); err != nil {
|
||||
return nil, err
|
||||
} else {
|
||||
doc := item.New(kv, e.txn, key, e.ctx)
|
||||
if ret, err := create(doc, ast); err != nil {
|
||||
return nil, err
|
||||
} else if ret != nil {
|
||||
out = append(out, ret)
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
|
|
8
db/db.go
8
db/db.go
|
@ -36,6 +36,8 @@ import (
|
|||
// _ "github.com/abcum/surreal/kvs/dendro"
|
||||
)
|
||||
|
||||
var QueryNotExecuted = fmt.Errorf("Query not executed")
|
||||
|
||||
var pool sync.Pool
|
||||
|
||||
func init() {
|
||||
|
@ -325,7 +327,7 @@ func (e *executor) execute(quit <-chan bool, send chan<- *Response) {
|
|||
if err == nil {
|
||||
res, err = e.operate(stm)
|
||||
} else {
|
||||
res, err = []interface{}{}, fmt.Errorf("Query not executed")
|
||||
res, err = []interface{}{}, QueryNotExecuted
|
||||
}
|
||||
|
||||
rsp = &Response{
|
||||
|
@ -483,10 +485,6 @@ func status(e error) (s string) {
|
|||
return "OK"
|
||||
case *kvs.DBError:
|
||||
return "ERR_DB"
|
||||
case *kvs.TXError:
|
||||
return "ERR_TX"
|
||||
case *kvs.CKError:
|
||||
return "ERR_CK"
|
||||
case *kvs.KVError:
|
||||
return "ERR_KV"
|
||||
case error:
|
||||
|
|
33
kvs/err.go
33
kvs/err.go
|
@ -16,17 +16,6 @@ package kvs
|
|||
|
||||
import "fmt"
|
||||
|
||||
// DSError is an error which occurs when there is a
|
||||
// problem with writing keys/values to the database.
|
||||
type DSError struct {
|
||||
Err error
|
||||
}
|
||||
|
||||
// Error returns the string representation of the error.
|
||||
func (e *DSError) Error() string {
|
||||
return fmt.Sprintf("There was a problem connecting to the datastore")
|
||||
}
|
||||
|
||||
// DBError is an error which occurs when there is a
|
||||
// problem with writing keys/values to the database.
|
||||
type DBError struct {
|
||||
|
@ -38,28 +27,6 @@ func (e *DBError) Error() string {
|
|||
return fmt.Sprintf("There was a problem writing to the database")
|
||||
}
|
||||
|
||||
// TXError is an error which occurs when there is a
|
||||
// problem with a writable transaction.
|
||||
type TXError struct {
|
||||
Err error
|
||||
}
|
||||
|
||||
// Error returns the string representation of the error.
|
||||
func (e *TXError) Error() string {
|
||||
return fmt.Sprintf("There was a problem with the transaction")
|
||||
}
|
||||
|
||||
// CKError is an error which occurs when there is a
|
||||
// problem with encrypting/decrypting values.
|
||||
type CKError struct {
|
||||
Err error
|
||||
}
|
||||
|
||||
// Error returns the string representation of the error.
|
||||
func (e *CKError) Error() string {
|
||||
return fmt.Sprintf("This cipherkey used is not valid")
|
||||
}
|
||||
|
||||
// KVError is an error which occurs when there is a
|
||||
// problem with a conditional put or delete.
|
||||
type KVError struct {
|
||||
|
|
|
@ -23,6 +23,36 @@ type TX struct {
|
|||
pntr *rixxdb.TX
|
||||
}
|
||||
|
||||
func one(all kvs.KV, err error) (kvs.KV, error) {
|
||||
|
||||
switch err {
|
||||
case nil:
|
||||
break
|
||||
default:
|
||||
return nil, &kvs.DBError{}
|
||||
case rixxdb.ErrTxNotExpectedValue:
|
||||
return nil, &kvs.KVError{}
|
||||
}
|
||||
|
||||
return all, err
|
||||
|
||||
}
|
||||
|
||||
func many(all []kvs.KV, err error) ([]kvs.KV, error) {
|
||||
|
||||
switch err {
|
||||
case nil:
|
||||
break
|
||||
default:
|
||||
return nil, &kvs.DBError{}
|
||||
case rixxdb.ErrTxNotExpectedValue:
|
||||
return nil, &kvs.KVError{}
|
||||
}
|
||||
|
||||
return all, err
|
||||
|
||||
}
|
||||
|
||||
func (tx *TX) Closed() bool {
|
||||
return tx.pntr.Closed()
|
||||
}
|
||||
|
@ -36,7 +66,8 @@ func (tx *TX) Commit() error {
|
|||
}
|
||||
|
||||
func (tx *TX) Get(ver int64, key []byte) (kvs.KV, error) {
|
||||
return tx.pntr.Get(ver, key)
|
||||
all, err := tx.pntr.Get(ver, key)
|
||||
return one(all, err)
|
||||
}
|
||||
|
||||
func (tx *TX) GetL(ver int64, key []byte) ([]kvs.KV, error) {
|
||||
|
@ -45,7 +76,7 @@ func (tx *TX) GetL(ver int64, key []byte) ([]kvs.KV, error) {
|
|||
for i, v := range all {
|
||||
out[i] = v
|
||||
}
|
||||
return out, err
|
||||
return many(out, err)
|
||||
}
|
||||
|
||||
func (tx *TX) GetP(ver int64, key []byte, max uint64) ([]kvs.KV, error) {
|
||||
|
@ -54,7 +85,7 @@ func (tx *TX) GetP(ver int64, key []byte, max uint64) ([]kvs.KV, error) {
|
|||
for i, v := range all {
|
||||
out[i] = v
|
||||
}
|
||||
return out, err
|
||||
return many(out, err)
|
||||
}
|
||||
|
||||
func (tx *TX) GetR(ver int64, beg []byte, end []byte, max uint64) ([]kvs.KV, error) {
|
||||
|
@ -63,11 +94,12 @@ func (tx *TX) GetR(ver int64, beg []byte, end []byte, max uint64) ([]kvs.KV, err
|
|||
for i, v := range all {
|
||||
out[i] = v
|
||||
}
|
||||
return out, err
|
||||
return many(out, err)
|
||||
}
|
||||
|
||||
func (tx *TX) Del(ver int64, key []byte) (kvs.KV, error) {
|
||||
return tx.pntr.Del(ver, key)
|
||||
all, err := tx.pntr.Del(ver, key)
|
||||
return one(all, err)
|
||||
}
|
||||
|
||||
func (tx *TX) DelC(ver int64, key []byte, exp []byte) (kvs.KV, error) {
|
||||
|
@ -80,7 +112,7 @@ func (tx *TX) DelL(ver int64, key []byte) ([]kvs.KV, error) {
|
|||
for i, v := range all {
|
||||
out[i] = v
|
||||
}
|
||||
return out, err
|
||||
return many(out, err)
|
||||
}
|
||||
|
||||
func (tx *TX) DelP(ver int64, key []byte, max uint64) ([]kvs.KV, error) {
|
||||
|
@ -89,7 +121,7 @@ func (tx *TX) DelP(ver int64, key []byte, max uint64) ([]kvs.KV, error) {
|
|||
for i, v := range all {
|
||||
out[i] = v
|
||||
}
|
||||
return out, err
|
||||
return many(out, err)
|
||||
}
|
||||
|
||||
func (tx *TX) DelR(ver int64, beg []byte, end []byte, max uint64) ([]kvs.KV, error) {
|
||||
|
@ -98,15 +130,17 @@ func (tx *TX) DelR(ver int64, beg []byte, end []byte, max uint64) ([]kvs.KV, err
|
|||
for i, v := range all {
|
||||
out[i] = v
|
||||
}
|
||||
return out, err
|
||||
return many(out, err)
|
||||
}
|
||||
|
||||
func (tx *TX) Put(ver int64, key []byte, val []byte) (kvs.KV, error) {
|
||||
return tx.pntr.Put(ver, key, val)
|
||||
all, err := tx.pntr.Put(ver, key, val)
|
||||
return one(all, err)
|
||||
}
|
||||
|
||||
func (tx *TX) PutC(ver int64, key []byte, val []byte, exp []byte) (kvs.KV, error) {
|
||||
return tx.pntr.PutC(ver, key, val, exp)
|
||||
all, err := tx.pntr.PutC(ver, key, val, exp)
|
||||
return one(all, err)
|
||||
}
|
||||
|
||||
func (tx *TX) PutL(ver int64, key []byte, val []byte) ([]kvs.KV, error) {
|
||||
|
@ -115,7 +149,7 @@ func (tx *TX) PutL(ver int64, key []byte, val []byte) ([]kvs.KV, error) {
|
|||
for i, v := range all {
|
||||
out[i] = v
|
||||
}
|
||||
return out, err
|
||||
return many(out, err)
|
||||
}
|
||||
|
||||
func (tx *TX) PutP(ver int64, key []byte, val []byte, max uint64) ([]kvs.KV, error) {
|
||||
|
@ -124,7 +158,7 @@ func (tx *TX) PutP(ver int64, key []byte, val []byte, max uint64) ([]kvs.KV, err
|
|||
for i, v := range all {
|
||||
out[i] = v
|
||||
}
|
||||
return out, err
|
||||
return many(out, err)
|
||||
}
|
||||
|
||||
func (tx *TX) PutR(ver int64, key []byte, val []byte, exp []byte, max uint64) ([]kvs.KV, error) {
|
||||
|
@ -133,5 +167,5 @@ func (tx *TX) PutR(ver int64, key []byte, val []byte, exp []byte, max uint64) ([
|
|||
for i, v := range all {
|
||||
out[i] = v
|
||||
}
|
||||
return out, err
|
||||
return many(out, err)
|
||||
}
|
||||
|
|
20
sql/error.go
20
sql/error.go
|
@ -43,24 +43,14 @@ func (e *BlankError) Error() string {
|
|||
return fmt.Sprint("You need to specify a namespace and a database to use")
|
||||
}
|
||||
|
||||
// NSError represents an error that occured when switching access.
|
||||
type NSError struct {
|
||||
NS string
|
||||
// PermsError represents an error that occured when switching access.
|
||||
type PermsError struct {
|
||||
Resource string
|
||||
}
|
||||
|
||||
// Error returns the string representation of the error.
|
||||
func (e *NSError) Error() string {
|
||||
return fmt.Sprintf("You don't have permission to access the '%s' namespace", e.NS)
|
||||
}
|
||||
|
||||
// DBError represents an error that occured when switching access.
|
||||
type DBError struct {
|
||||
DB string
|
||||
}
|
||||
|
||||
// Error returns the string representation of the error.
|
||||
func (e *DBError) Error() string {
|
||||
return fmt.Sprintf("You don't have permission to access the '%s' database", e.DB)
|
||||
func (e *PermsError) Error() string {
|
||||
return fmt.Sprintf("You don't have permission to access the '%s' resource", e.Resource)
|
||||
}
|
||||
|
||||
// ParseError represents an error that occurred during parsing.
|
||||
|
|
|
@ -75,7 +75,7 @@ func (o *options) ns(ns string) (err error) {
|
|||
// to be able to specify this namespace.
|
||||
|
||||
if o.auth.Possible.NS != "*" && o.auth.Possible.NS != ns {
|
||||
return &NSError{NS: ns}
|
||||
return &PermsError{Resource: ns}
|
||||
}
|
||||
|
||||
// Specify the NS on the context session, so
|
||||
|
@ -95,7 +95,7 @@ func (o *options) db(db string) (err error) {
|
|||
// to be able to specify this namespace.
|
||||
|
||||
if o.auth.Possible.DB != "*" && o.auth.Possible.DB != db {
|
||||
return &DBError{DB: db}
|
||||
return &PermsError{Resource: db}
|
||||
}
|
||||
|
||||
// Specify the DB on the context session, so
|
||||
|
|
17
web/err.go
17
web/err.go
|
@ -16,29 +16,24 @@ package web
|
|||
|
||||
import (
|
||||
"github.com/abcum/fibre"
|
||||
"github.com/abcum/surreal/kvs"
|
||||
"github.com/abcum/surreal/sql"
|
||||
)
|
||||
|
||||
func errors(val error, c *fibre.Context) {
|
||||
|
||||
if c.Socket() != nil {
|
||||
return
|
||||
}
|
||||
|
||||
var code int
|
||||
var info string
|
||||
|
||||
switch e := val.(type) {
|
||||
default:
|
||||
code, info = 400, e.Error()
|
||||
case *kvs.DBError:
|
||||
code, info = 503, e.Error()
|
||||
case *kvs.TXError:
|
||||
code, info = 500, e.Error()
|
||||
case *kvs.KVError:
|
||||
code, info = 409, e.Error()
|
||||
case *kvs.CKError:
|
||||
case *sql.PermsError:
|
||||
code, info = 403, e.Error()
|
||||
case *sql.NSError:
|
||||
code, info = 403, e.Error()
|
||||
case *sql.DBError:
|
||||
case *sql.BlankError:
|
||||
code, info = 403, e.Error()
|
||||
case *sql.QueryError:
|
||||
code, info = 401, e.Error()
|
||||
|
|
Loading…
Reference in a new issue