bolt

package
v0.0.0-...-4ede3f3 Latest Latest
Warning

This package is not in the latest version of its module.

Go to latest
Published: Nov 11, 2022 License: BSD-2-Clause Imports: 6 Imported by: 0

README

game/bolt

Paket bolt ermöglicht es Spieldaten in eine bbolt Datenbank zu speichern.

Aktive Spieldaten werden meistens erst in den Speicher geladen und Änderungen dann gesammelt in die nach einer Zeit in die Datenbank gespeichert.

Warum bbolt?

Es gibt viele verschiedene Datenbanken die wir nutzen könnten, deren Hauptunterscheidung ist ob es SQL Datenbanken sind oder nicht. SQL ist eine Abfragesprache für relationale Datenbanken, die konzeptionell wie eine Menge von Tabellen aufgebaut ist. No-SQL Datenbanken sind konzeptionell einfache Paare von Schlüssel zu Werten (key-value-stores).

Wir wollen eine DB die: * wir nicht extra installieren müssen, also in unser Programm einbetten können. * sehr schnell und flexibel ist und trotzdem die daten dauerhaft speichert. * die nur eine Datei auf der Festplatte benutzt. * erprobt ist, damit Spieldaten nicht verloren gehen. * minimal ist aber praktisch ausreicht

Die bbolt Datenbank erfüllt alle diese Anforderungen und bietet eine praktische möglichkeit Daten in verschiedene Buckets (Eimer) zu struckturieren. Buckets enthalten einfache key-value Paare oder wiederum verschachtelte buckets und eine Sequenznummer die wir als ID benutzen können. Alle Paare in einem bucket können außerdem sortiert abgefragt werden.

Aufbau

Wir wollen vorerst eine Datenbank für alle Welten, Bilder und Spiele benutzen. Anders als zuvor möchte ich, dass alle Spieldaten zu einer einzelnen Welt gehören, stattdessen sollte es einfach sein Spieldaten aus anderen Welten zu importieren.

Jede Welt hat einen Namen und eine Version, so können wir z.B. veröffentlichte Versionen der Welt erhalten und gleichzeitig an einer neuen Version arbeiten.

Jeder Spielstand soll grundsätzlich eine voll veränderbare Welt sein. Um aber nicht alle Daten kopieren zu müssen könnten vor eine sog. copy-on-write Konzept benutzen, also dass wir im Spielstand nur Welt und die geänderten Daten speichern.

Die Datenbank hat also eine Liste von welt und spiel buckets die durch eine prefix getrennt sind:

* w~moon: Welt bucket mit verschachtelten buckets für allen Arten von Spieldaten
	* lvl: bucket mit allen Levels
		* 00000001: level data
* w~moon@1: alte veröffentlichte Welt mit allen Spieldaten
* w~mars: andere Welt
* g~uvw: savegame bucket
* g~xyz: other savegame bucket

Documentation

Overview

Packages bolt provides ways to store and query game data in the bbolt database.

Index

Constants

This section is empty.

Variables

View Source
var ErrShort = fmt.Errorf("short id data")

Functions

func LoadWorldInfos

func LoadWorldInfos(tx *bbolt.Tx) (res []string)

func ReadID

func ReadID(raw []byte) (uint32, error)

func WriteID

func WriteID(id uint32) []byte

Types

type HashSync

type HashSync[ID ids.ID, T any, D ids.Dec[T]] ids.HashTable[ID, T, D]

func (*HashSync[ID, T, D]) Dirty

func (s *HashSync[ID, T, D]) Dirty() bool

func (*HashSync[ID, T, D]) Load

func (s *HashSync[ID, T, D]) Load(tx Src) error

func (*HashSync[ID, T, D]) Save

func (s *HashSync[ID, T, D]) Save(tx Src) error

func (*HashSync[ID, T, D]) Sync

func (s *HashSync[ID, T, D]) Sync(tx Src) error

type ListSync

type ListSync[ID ids.ID, T any, D ids.Dec[T]] ids.ListTable[ID, T, D]

func NewListSync

func NewListSync[ID ids.ID, T any, D ids.Dec[T]](t *ids.ListTable[ID, T, D]) *ListSync[ID, T, D]

func (*ListSync[ID, T, D]) Dirty

func (s *ListSync[ID, T, D]) Dirty() bool

func (*ListSync[ID, T, D]) Load

func (s *ListSync[ID, T, D]) Load(tx Src) error

func (*ListSync[ID, T, D]) Save

func (s *ListSync[ID, T, D]) Save(tx Src) error

func (*ListSync[ID, T, D]) Sync

func (s *ListSync[ID, T, D]) Sync(tx Src) error

type Src

type Src interface {
	Bucket([]byte) *bbolt.Bucket
	CreateBucket([]byte) (*bbolt.Bucket, error)
	DeleteBucket([]byte) error
	CreateBucketIfNotExists([]byte) (*bbolt.Bucket, error)
	Cursor() *bbolt.Cursor
}

type Sync

type Sync interface {
	Load(Src) error
	Dirty() bool
	Sync(Src) error
	Save(Src) error
}

type Syncs

type Syncs []Sync

func (Syncs) Dirty

func (ss Syncs) Dirty() bool

func (Syncs) Load

func (ss Syncs) Load(tx Src) error

func (Syncs) Save

func (ss Syncs) Save(tx Src) error

func (Syncs) Sync

func (ss Syncs) Sync(tx Src) error

type WorldSync

type WorldSync struct {
	*game.World
	Syncs
}

func MakeWorldSync

func MakeWorldSync(w *game.World) WorldSync

func (*WorldSync) Load

func (s *WorldSync) Load(tx Src) error

func (*WorldSync) Save

func (s *WorldSync) Save(tx Src) error

func (*WorldSync) Sync

func (s *WorldSync) Sync(tx Src) error

Jump to

Keyboard shortcuts

? : This menu
/ : Search site
f or F : Jump to
y or Y : Canonical URL