surrealpatch/sql/options.go
Tobie Morgan Hitchcock b724d864f8 Add ability to define NAMESPACE without DATABASE
Once somebody had specified USE NAMESPACE to select a namespace, it was not possible to DEFINE a DATABASE underneath the NAMESPACE, as an error that ‘no database is selected’ would be returned. Not it is possible to DEFINE DATABASE having selected only a NAMESPACE.
2017-02-20 01:44:11 +00:00

109 lines
2.2 KiB
Go

// Copyright © 2016 Abcum Ltd
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
package sql
import (
"github.com/abcum/fibre"
"github.com/abcum/surreal/cnf"
)
const (
// Root access
AuthKV int = iota
// Namespace access
AuthNS
// Database access
AuthDB
// Scoped user access
AuthSC
// No access
AuthNO
)
// options represents context runtime config.
type options struct {
auth *cnf.Auth
}
func newOptions(c *fibre.Context) *options {
return &options{
auth: c.Get("auth").(*cnf.Auth),
}
}
func (o *options) get(kind int) (kv, ns, db string, err error) {
kv = cnf.Settings.DB.Base
ns = o.auth.Selected.NS
db = o.auth.Selected.DB
if kind < o.auth.Kind {
err = &QueryError{}
return
}
if kind >= AuthNS && ns == "" {
err = &BlankError{}
return
}
if kind >= AuthDB && db == "" {
err = &BlankError{}
return
}
return
}
func (o *options) ns(ns string) (err error) {
// Check to see that the current user has
// the necessary authentication privileges
// to be able to specify this namespace.
if o.auth.Possible.NS != "*" && o.auth.Possible.NS != ns {
return &NSError{NS: ns}
}
// Specify the NS on the context session, so
// that it is remembered across requests on
// any persistent connections.
o.auth.Selected.NS = ns
return
}
func (o *options) db(db string) (err error) {
// Check to see that the current user has
// the necessary authentication privileges
// to be able to specify this namespace.
if o.auth.Possible.DB != "*" && o.auth.Possible.DB != db {
return &DBError{DB: db}
}
// Specify the DB on the context session, so
// that it is remembered across requests on
// any persistent connections.
o.auth.Selected.DB = db
return
}