72 lines
		
	
	
		
			1.3 KiB
		
	
	
	
		
			Go
		
	
	
	
	
	
			
		
		
	
	
			72 lines
		
	
	
		
			1.3 KiB
		
	
	
	
		
			Go
		
	
	
	
	
	
package main
 | 
						|
 | 
						|
import (
 | 
						|
"net"
 | 
						|
"fmt"
 | 
						|
"os"
 | 
						|
"strings"
 | 
						|
)
 | 
						|
 | 
						|
type DatabaseServer struct {
 | 
						|
	port uint16
 | 
						|
	store map[string]string
 | 
						|
}
 | 
						|
 | 
						|
func NewDatabaseServer(port uint16) *DatabaseServer {
 | 
						|
	return &DatabaseServer{
 | 
						|
		port,
 | 
						|
		make(map[string]string),
 | 
						|
	}
 | 
						|
}
 | 
						|
 | 
						|
func (s *DatabaseServer) Run() {
 | 
						|
	addr := fmt.Sprintf("0.0.0.0:%d", s.port)
 | 
						|
	pc, err := net.ListenPacket("udp", addr)
 | 
						|
	if err != nil {
 | 
						|
		fmt.Println(err)
 | 
						|
		os.Exit(1)
 | 
						|
	}
 | 
						|
	defer pc.Close()
 | 
						|
	buf := make([]byte, 1000)
 | 
						|
	fmt.Println("Database server listening for packets")
 | 
						|
	for {
 | 
						|
		n, addr, err := pc.ReadFrom(buf)
 | 
						|
		if err != nil {
 | 
						|
			continue
 | 
						|
		}
 | 
						|
		s.handle(pc, addr, string(buf[:n]))
 | 
						|
	}	
 | 
						|
}
 | 
						|
 | 
						|
func (s *DatabaseServer) handle(pc net.PacketConn, addr net.Addr, req string) {
 | 
						|
	var resp string
 | 
						|
	fmt.Printf(">> %s\n", req)
 | 
						|
	if strings.Contains(req, "=") {
 | 
						|
		s.handleInsert(req)
 | 
						|
	} else {
 | 
						|
		resp = s.handleRetrieve(req)
 | 
						|
	}
 | 
						|
	if resp != "" {
 | 
						|
		fmt.Printf("<< %s\n", resp)
 | 
						|
		pc.WriteTo([]byte(resp), addr)
 | 
						|
	}
 | 
						|
}
 | 
						|
 | 
						|
func (s *DatabaseServer) handleInsert(req string) {
 | 
						|
	parts := strings.SplitAfterN(req, "=", 2)
 | 
						|
	key := strings.Trim(parts[0], "=")
 | 
						|
	value := parts[1]
 | 
						|
	if key == "version" {
 | 
						|
		return
 | 
						|
	}
 | 
						|
	s.store[key] = value
 | 
						|
}
 | 
						|
 | 
						|
func (s *DatabaseServer) handleRetrieve(req string) string{
 | 
						|
	if req == "version" {
 | 
						|
		return "version=Deathstar planetary target database v2.9 build 73839"
 | 
						|
	}
 | 
						|
	value := s.store[req]
 | 
						|
	return fmt.Sprintf("%s=%s", req, value)
 | 
						|
}
 |