Skip to content

Instantly share code, notes, and snippets.

@gs0510
Created December 17, 2018 08:50
Show Gist options
  • Save gs0510/33e60cd670c1455bdc453e44bab9716c to your computer and use it in GitHub Desktop.
Save gs0510/33e60cd670c1455bdc453e44bab9716c to your computer and use it in GitHub Desktop.
Database server that stores {key, value} in memory.

Database server, to compile and run, run ./run.sh

cache.go has the cache store. server.go creates the server and serves request. main.go is the driver file.

package main
import (
"log"
)
var store = make(map[string]string)
func setValue(key, value string) {
store[key] = value
log.Print("setValue: Key %s, Value %s:", key, value)
}
func getValue(key string) string {
value := store[key]
log.Print("getValue: Key %s, Value %s:", key, value)
return value
}
package main
import "log"
const port = 4000
func main() {
setRouter()
err := setListeningPort(PORT)
if err != nil {
log.Fatal("Oops there was an error: ", err)
}
}
#!
go build main.go server.go cache.go
./main
package main
import (
"bytes"
"fmt"
"log"
"net/http"
"strconv"
"strings"
)
func setRouter() {
http.HandleFunc("/", listen)
}
func getPortString(port int) string {
var portBuffer bytes.Buffer
portBuffer.WriteString(":")
portBuffer.WriteString(strconv.Itoa(port))
return portBuffer.String()
}
func setListeningPort(port int) error {
err := http.ListenAndServe(getPortString(port), nil)
return err
}
func requestDecoder(request http.Request) (string, string) {
for k, v := range request.Form {
return k, strings.Join(v, "")
}
return "", ""
}
func requestSelector(response http.ResponseWriter, request *http.Request) {
key, value := requestDecoder(*request)
if len(key) == 0 || len(value) == 0 {
fmt.Fprintf(response, "Request is ill-formed")
} else if request.URL.Path == "/set" {
setValue(key, value)
fmt.Fprintf(response, "Stored data in cache")
} else if request.URL.Path == "/get" {
storedValue := getValue(value)
if len(storedValue) == 0 {
fmt.Fprintf(response, "Key does not exist in cache")
}
log.Print("Response %s:", storedValue)
fmt.Fprintf(response, storedValue)
} else {
log.Print("Request not supported")
fmt.Fprintf(response, "Request not supported")
}
}
func listen(response http.ResponseWriter, request *http.Request) {
log.Print("Request: %T", request)
request.ParseForm()
requestSelector(response, request)
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment