// Copyright 2015 The Vanadium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style
// license that can be found in the LICENSE file.

// This file was auto-generated by the vanadium vdl tool.
// Source: types.vdl

package nosql

import (
	// VDL system imports
	"v.io/v23/vdl"

	// VDL user imports
	"v.io/syncbase/v23/services/syncbase/nosql"
	"v.io/v23/security/access"
)

// databaseData represents the persistent state of a Database.
type databaseData struct {
	Name           string
	Version        uint64 // covers the Perms field below
	Perms          access.Permissions
	SchemaMetadata *nosql.SchemaMetadata
}

func (databaseData) __VDLReflect(struct {
	Name string `vdl:"v.io/syncbase/x/ref/services/syncbase/server/nosql.databaseData"`
}) {
}

// tableData represents the persistent state of a Table.
// TODO(sadovsky): Decide whether to track "empty-prefix" perms here.
type tableData struct {
	Name  string
	Perms access.Permissions
}

func (tableData) __VDLReflect(struct {
	Name string `vdl:"v.io/syncbase/x/ref/services/syncbase/server/nosql.tableData"`
}) {
}

// stPrefixPerms describes internal representation of prefix permissions
// in the store.
//
// Each pair of (key, perms) is stored as two key-value pairs:
// "$perms:%table:key"  - stPrefixPerms{parent, perms}
// "$perms:%table:key~" - stPrefixPerms{parent, perms}
// where "~" represents a reserved char that's lexicographically greater than
// all chars allowed by clients, %table is the name of the table and parent is
// the longest proper prefix of the key that has associated permissions object.
type stPrefixPerms struct {
	Parent string
	Perms  access.Permissions
}

func (stPrefixPerms) __VDLReflect(struct {
	Name string `vdl:"v.io/syncbase/x/ref/services/syncbase/server/nosql.stPrefixPerms"`
}) {
}

func init() {
	vdl.Register((*databaseData)(nil))
	vdl.Register((*tableData)(nil))
	vdl.Register((*stPrefixPerms)(nil))
}
