mirror of
https://github.com/JetSetIlly/Gopher2600.git
synced 2025-04-02 11:02:17 -04:00
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
117 lines
2.7 KiB
Go
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
|
|
}
|