yanic/database/socket/database.go

69 lines
1.5 KiB
Go

package socket
/*
* This socket database is to run another service
* (without flooding the network with respondd packages)
* e.g. https://github.com/FreifunkBremen/freifunkmanager
*/
import (
"log"
"net"
"sync"
"time"
"github.com/FreifunkBremen/yanic/database"
"github.com/FreifunkBremen/yanic/runtime"
)
type Connection struct {
database.Connection
listener net.Listener
clients map[net.Addr]net.Conn
clientMux sync.Mutex
}
func init() {
database.RegisterAdapter("socket", Connect)
}
func Connect(configuration interface{}) (database.Connection, error) {
config := configuration.(map[string]interface{})
if !config["enable"].(bool) {
return nil, nil
}
ln, err := net.Listen(config["type"].(string), config["address"].(string))
if err != nil {
return nil, err
}
conn := &Connection{listener: ln, clients: make(map[net.Addr]net.Conn)}
go conn.handleSocketConnection(ln)
log.Println("[socket-database] listen on: ", ln.Addr())
return conn, nil
}
func (conn *Connection) InsertNode(node *runtime.Node) {
conn.sendJSON(Message{Event: MessageEventInsertNode, Body: node})
}
func (conn *Connection) InsertGlobals(stats *runtime.GlobalStats, time time.Time) {
conn.sendJSON(Message{Event: MessageEventInsertGlobals, Body: stats})
}
func (conn *Connection) PruneNodes(deleteAfter time.Duration) {
conn.sendJSON(Message{Event: MessageEventPruneNodes})
}
func (conn *Connection) Close() {
conn.clientMux.Lock()
for _, c := range conn.clients {
c.Close()
}
conn.clientMux.Unlock()
conn.listener.Close()
}