// Copyright 2014, 2015 by Sascha L. Teichmann
// Use of this source code is governed by the MIT license
// that can be found in the LICENSE file.

package main

type (
	// Block is the essential transfer unit from to the database.
	// Key is the serialized spatial position.
	// Data is the serialized from of the corresponding block data.
	Block struct {
		Key  []byte
		Data []byte
	}

	// Session is a database session.
	Session interface {
		// Del deletes a block by a given key.
		Del(hash, key []byte) (bool, error)
		// Fetch fetches the block data for a given position.
		Fetch(hash, key []byte) ([]byte, error)
		// InTransaction returns true if a transaction is running.
		InTransaction() bool
		// Store stores a block with a given position and data.
		Store(hash, key, value []byte) (bool, error)
		// AllKeys returns all keys in the database.
		AllKeys(hash []byte, done <-chan struct{}) (<-chan []byte, int, error)
		// SpatialQuery performs a box query between the positions first and second.
		SpatialQuery(hash, first, second []byte, done <-chan struct{}) (<-chan Block, error)
		// BeginTransaction starts a transcation.
		BeginTransaction() error
		// CommitTransaction finishes a transaction.
		CommitTransaction() error
		// Close closes the database session.
		Close() error
	}

	// Backend is the interface representing a database.
	Backend interface {
		// NewSession opens a new session.
		NewSession() (Session, error)
		// Shutdown shuts down the database server.
		Shutdown() error
	}
)