Spaces:
Configuration error
Configuration error
| package explorer | |
| // A simple JSON database for storing and retrieving p2p network tokens and a name and description. | |
| import ( | |
| "encoding/json" | |
| "os" | |
| "sort" | |
| "sync" | |
| "github.com/gofrs/flock" | |
| ) | |
| // Database is a simple JSON database for storing and retrieving p2p network tokens and a name and description. | |
| type Database struct { | |
| path string | |
| data map[string]TokenData | |
| flock *flock.Flock | |
| sync.Mutex | |
| } | |
| // TokenData is a p2p network token with a name and description. | |
| type TokenData struct { | |
| Name string `json:"name"` | |
| Description string `json:"description"` | |
| Clusters []ClusterData | |
| Failures int | |
| } | |
| type ClusterData struct { | |
| Workers []string | |
| Type string | |
| NetworkID string | |
| } | |
| // NewDatabase creates a new Database with the given path. | |
| func NewDatabase(path string) (*Database, error) { | |
| fileLock := flock.New(path + ".lock") | |
| db := &Database{ | |
| data: make(map[string]TokenData), | |
| path: path, | |
| flock: fileLock, | |
| } | |
| return db, db.load() | |
| } | |
| // Get retrieves a Token from the Database by its token. | |
| func (db *Database) Get(token string) (TokenData, bool) { | |
| db.flock.Lock() // we are making sure that the file is not being written to | |
| defer db.flock.Unlock() | |
| db.Lock() // we are making sure that is safe if called by another instance in the same process | |
| defer db.Unlock() | |
| db.load() | |
| t, ok := db.data[token] | |
| return t, ok | |
| } | |
| // Set stores a Token in the Database by its token. | |
| func (db *Database) Set(token string, t TokenData) error { | |
| db.flock.Lock() | |
| defer db.flock.Unlock() | |
| db.Lock() | |
| defer db.Unlock() | |
| db.load() | |
| db.data[token] = t | |
| return db.save() | |
| } | |
| // Delete removes a Token from the Database by its token. | |
| func (db *Database) Delete(token string) error { | |
| db.flock.Lock() | |
| defer db.flock.Unlock() | |
| db.Lock() | |
| defer db.Unlock() | |
| db.load() | |
| delete(db.data, token) | |
| return db.save() | |
| } | |
| func (db *Database) TokenList() []string { | |
| db.flock.Lock() | |
| defer db.flock.Unlock() | |
| db.Lock() | |
| defer db.Unlock() | |
| db.load() | |
| tokens := []string{} | |
| for k := range db.data { | |
| tokens = append(tokens, k) | |
| } | |
| sort.Slice(tokens, func(i, j int) bool { | |
| // sort by token | |
| return tokens[i] < tokens[j] | |
| }) | |
| return tokens | |
| } | |
| // load reads the Database from disk. | |
| func (db *Database) load() error { | |
| if _, err := os.Stat(db.path); os.IsNotExist(err) { | |
| return nil | |
| } | |
| // Read the file from disk | |
| // Unmarshal the JSON into db.data | |
| f, err := os.ReadFile(db.path) | |
| if err != nil { | |
| return err | |
| } | |
| return json.Unmarshal(f, &db.data) | |
| } | |
| // Save writes the Database to disk. | |
| func (db *Database) save() error { | |
| // Marshal db.data into JSON | |
| // Write the JSON to the file | |
| f, err := os.Create(db.path) | |
| if err != nil { | |
| return err | |
| } | |
| defer f.Close() | |
| return json.NewEncoder(f).Encode(db.data) | |
| } | |