// 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 server

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

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

// ServiceData represents the persistent state of a Service.
type ServiceData struct {
	Version uint64 // covers the fields below
	Perms   access.Permissions
}

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

// AppData represents the persistent state of an App.
type AppData struct {
	Name    string
	Version uint64 // covers the fields below
	Perms   access.Permissions
}

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

// DbInfo contains information about one database for an App.
// TODO(sadovsky): Track NoSQL vs. SQL.
type DbInfo struct {
	Name string
	// Select fields from nosql.DatabaseOptions, needed in order to open storage
	// engine on restart.
	RootDir string // interpreted by storage engine
	Engine  string // name of storage engine, e.g. "leveldb"
}

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

func init() {
	vdl.Register((*ServiceData)(nil))
	vdl.Register((*AppData)(nil))
	vdl.Register((*DbInfo)(nil))
}
