A very fast kyoto cabinet powered memcache interface http proxy caching server.
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 

82 lines
1.7 KiB

package main
import (
"bitbucket.org/ww/cabinet"
"flag"
"fmt"
"github.com/brettlangdon/ferrite/commands"
"github.com/brettlangdon/ferrite/common"
"net"
"os"
"os/signal"
"sync/atomic"
)
func handler(client net.Conn, db *cabinet.KCDB) {
atomic.AddInt32(&common.CONNECTIONS, 1)
defer func() {
client.Close()
atomic.AddInt32(&common.CONNECTIONS, -1)
}()
buffer := make([]byte, 1024)
for {
n, err := client.Read(buffer)
if err != nil {
break
}
if n <= 0 {
continue
}
command, tokens := commands.ParseCommand(string(buffer[:n]))
if len(command) == 0 {
continue
}
if command == "quit" || command == "exit" {
break
}
response := commands.HandleCommand(command, tokens, db)
_, err = client.Write([]byte(response))
}
}
func main() {
flag.Parse()
fmt.Printf("Using TTL: %d (sec)\r\n", *common.TTL)
fmt.Printf("Opening Cache: %s\r\n", *common.CACHE)
db := cabinet.New()
err := db.Open(*common.CACHE, cabinet.KCOWRITER|cabinet.KCOCREATE)
if err != nil {
fmt.Fprintf(os.Stderr, "Could not open cache \"%s\": %s\r\n", *common.CACHE, err.Error())
os.Exit(-1)
}
listener, err := net.Listen("tcp", *common.BIND)
if err != nil {
fmt.Fprintf(os.Stderr, "Could not bind to \"%s\": %s\r\n", *common.BIND, err.Error())
os.Exit(-1)
}
fmt.Printf("Listening at %s\t\n", *common.BIND)
c := make(chan os.Signal, 1)
signal.Notify(c, os.Interrupt)
go func() {
for _ = range c {
fmt.Println("")
fmt.Printf("Shutting down ferrite\r\n")
db.Close()
db.Del()
os.Exit(0)
}
}()
for {
client, err := listener.Accept()
if err == nil {
go handler(client, db)
} else {
fmt.Fprintf(os.Stderr, "Error Accepting Client Connection: %s\r\n", err.Error())
}
}
}