Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

go-stdlib #45

Open
wants to merge 4 commits into
base: master
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
19 changes: 19 additions & 0 deletions go-stdlib/README.rst
Original file line number Diff line number Diff line change
@@ -0,0 +1,19 @@
================================================================================
Go test code for The Great Web Framework Shootout
================================================================================

| Copyright: (c) 2012 Andrew Gerrand


Synopsis
================================================================================

An implementation of the 'webgo' benchmark that uses Go's built-in net/http and
html/template pacakges instead of web.go and mustache.go. This implementation
also provides a database example using the built-in database/sql abstraction
layer and mattn's go-sqlite3.

Go's http and template packages are more mature and featureful than the libraries
orignally chosen for the shootout.

This was written to run against Go version weekly.2012-02-14.
Binary file added go-stdlib/hello.db
Binary file not shown.
83 changes: 83 additions & 0 deletions go-stdlib/hello.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,83 @@
package main

import (
"database/sql"
"fmt"
"log"
"net/http"
"text/template"

_ "github.com/mattn/go-sqlite3"
)

func helloHandler(w http.ResponseWriter, r *http.Request) {
fmt.Fprint(w, "Hello world!")
}

var (
lipsumTmpl = template.Must(template.ParseFiles("tmpl/main.tmpl", "tmpl/lipsum.tmpl"))
databaseTmpl = template.Must(template.ParseFiles("tmpl/main.tmpl", "tmpl/database.tmpl"))
)

func templateHandler(w http.ResponseWriter, r *http.Request) {
lipsumTmpl.Execute(w, nil)
}

const query = "SELECT id, data FROM hello ORDER BY id ASC"

type Row struct {
Id int
Data string
}

func makeDatabaseHandler() http.HandlerFunc {
db, err := sql.Open("sqlite3", "hello.db")
if err != nil {
//serveError(w, err)
//return
panic("AAAAAARGH !") // Yeah, I know... it needs better error handling...
}
return func(w http.ResponseWriter, r *http.Request) {
// defer db.Close()
// Never close it, huh ?!?!?!
databaseHandler(w, r, db)
}
}

func databaseHandler(w http.ResponseWriter, r *http.Request, db *sql.DB) {
rows, err := db.Query(query)
if err != nil {
serveError(w, err)
return
}
defer rows.Close()

var tmplData []*Row
for rows.Next() {
var row Row
err = rows.Scan(&row.Id, &row.Data)
if err != nil {
serveError(w, err)
return
}
tmplData = append(tmplData, &row)
}

err = databaseTmpl.Execute(w, tmplData)
if err != nil {
serveError(w, err)
}
}

func serveError(w http.ResponseWriter, err error) {
http.Error(w, "Internal server error", 500)
log.Println(err)
return
}

func main() {
http.HandleFunc("/", helloHandler)
http.HandleFunc("/template", templateHandler)
http.HandleFunc("/database", makeDatabaseHandler())
http.ListenAndServe(":8080", nil)
}
9 changes: 9 additions & 0 deletions go-stdlib/tmpl/database.tmpl
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
{{define "body"}}
<p>Lorem ipsum dolor sit amet, consecteteur adipiscing elit nisi ultricies. Condimentum vel, at augue nibh sed. Diam praesent metus ut eros, sem penatibus. Pellentesque. Fusce odio posuere litora non integer habitant proin. Metus accumsan nibh facilisis nostra lobortis cum diam tellus. Malesuada nostra a volutpat pede primis congue nisl feugiat in fermentum. Orci in hymenaeos. Eni tempus mi mollis lacinia orci interdum lacus. Sollicitudin aliquet, etiam. Ac. Mi, nullam ligula, tristique penatibus nisi eros nisl pede pharetra congue, aptent nulla, rhoncus tellus morbi, ornare. Magna condimentum erat turpis. Fusce arcu ve suscipit nisi phasellus rutrum a dictumst leo, laoreet dui, ultricies platea. Porta venenatis fringilla vestibulum arcu etiam condimentum non.</p>

<table border="1">
{{range .}}
<tr><td>{{.Id}}</td><td>{{.Data}}</td></tr>
{{end}}
</table>
{{end}}
3 changes: 3 additions & 0 deletions go-stdlib/tmpl/lipsum.tmpl
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
{{define "body"}}
<p>Lorem ipsum dolor sit amet, consecteteur adipiscing elit nisi ultricies. Condimentum vel, at augue nibh sed. Diam praesent metus ut eros, sem penatibus. Pellentesque. Fusce odio posuere litora non integer habitant proin. Metus accumsan nibh facilisis nostra lobortis cum diam tellus. Malesuada nostra a volutpat pede primis congue nisl feugiat in fermentum. Orci in hymenaeos. Eni tempus mi mollis lacinia orci interdum lacus. Sollicitudin aliquet, etiam. Ac. Mi, nullam ligula, tristique penatibus nisi eros nisl pede pharetra congue, aptent nulla, rhoncus tellus morbi, ornare. Magna condimentum erat turpis. Fusce arcu ve suscipit nisi phasellus rutrum a dictumst leo, laoreet dui, ultricies platea. Porta venenatis fringilla vestibulum arcu etiam condimentum non.</p>
{{end}}
11 changes: 11 additions & 0 deletions go-stdlib/tmpl/main.tmpl
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en">
<head>
<title>Hello World</title>
</head>
<body>

{{template "body" .}}

</body>
</html>