Gopher2600/database/database.go
JetSetIlly f98a775d37 regression and database improvements
added Replace() to database package

simplified Regressor interface

playback regressor can now be reduxed

regression Redux() now uses database.Replace() instead of separate
Delete() and Add(). this makes sure that the redux entry gets the same
database key once the redux has completed

removed -dryrun option from REGRESS REDUX

removed regression fails log. it wasn't well developed and not a
particularly useful idea

fixed television.SetSimple(). the signal function was not set correctly
2024-11-23 14:56:36 +00:00

117 lines
2.7 KiB
Go

// This file is part of Gopher2600.
//
// Gopher2600 is free software: you can redistribute it and/or modify
// it under the terms of the GNU General Public License as published by
// the Free Software Foundation, either version 3 of the License, or
// (at your option) any later version.
//
// Gopher2600 is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
// GNU General Public License for more details.
//
// You should have received a copy of the GNU General Public License
// along with Gopher2600. If not, see <https://www.gnu.org/licenses/>.
package database
import (
"fmt"
"sort"
)
// arbitrary maximum number of entries.
const maxEntries = 1000
const fieldSep = ","
const entrySep = "\n"
const (
leaderFieldKey int = iota
leaderFieldID
numLeaderFields
)
func recordHeader(key int, id string) string {
return fmt.Sprintf("%03d%s%s", key, fieldSep, id)
}
// NumEntries returns the number of entries in the database.
func (db Session) NumEntries() int {
return len(db.entries)
}
// SortedKeyList returns a sorted list of database keys.
func (db Session) SortedKeyList() []int {
// sort entries into key order
keyList := make([]int, 0, len(db.entries))
for k := range db.entries {
keyList = append(keyList, k)
}
sort.Ints(keyList)
return keyList
}
// Replace an entry with another.
func (db *Session) Replace(key int, old Entry, ent Entry) error {
_, ok := db.entries[key]
if !ok {
return fmt.Errorf("database: key not available (%d)", key)
}
delete(db.entries, key)
db.entries[key] = ent
return old.CleanUp()
}
// Add an entry to the db.
func (db *Session) Add(ent Entry) error {
var key int
// find spare key
for key = 0; key < maxEntries; key++ {
if _, ok := db.entries[key]; !ok {
break
}
}
if key == maxEntries {
return fmt.Errorf("database: maximum entries exceeded (max %d)", maxEntries)
}
db.entries[key] = ent
return nil
}
// Delete deletes an entry with the specified key. returns DatabaseKeyError
// if not such entry exists.
func (db *Session) Delete(key int) error {
ent, ok := db.entries[key]
if !ok {
return fmt.Errorf("database: key not available (%d)", key)
}
if err := ent.CleanUp(); err != nil {
return fmt.Errorf("database: %w", err)
}
delete(db.entries, key)
return nil
}
// ForEach entry in the database run the function against that entry.
func (db Session) ForEach(f func(key int, e Entry) error) error {
keyList := db.SortedKeyList()
for k := range keyList {
key := keyList[k]
ent := db.entries[key]
err := f(key, ent)
if err != nil {
return fmt.Errorf("database: %w", err)
}
}
return nil
}