Skip to content

Instantly share code, notes, and snippets.

@raliste
Created July 20, 2013 04:52
Show Gist options
  • Save raliste/6043918 to your computer and use it in GitHub Desktop.
Save raliste/6043918 to your computer and use it in GitHub Desktop.
Simple reporting server in Go
package main
import (
"log"
"flag"
"fmt"
"database/sql"
_ "github.com/go-sql-driver/mysql"
)
var (
reportName = flag.String("name", "", "Name of the report to generate.")
)
type reportInstructions struct {
query string
scan []string
}
func main() {
flag.Parse()
var instructions reportInstructions
switch *reportName {
case "users":
instructions = reportInstructions{
query: "SELECT DATE(date_joined) date, COUNT(id) total FROM auth_user WHERE 1=1 GROUP BY 1",
scan: []string{"%s ", "%d"},
}
}
if instructions.query == "" {
log.Fatal("No query")
return
}
db, err := sql.Open("mysql", "prod_user:prod_password@/prod")
if err != nil {
log.Fatal("Could not connect to database:", err)
}
rows, err := db.Query(instructions.query)
if err != nil {
log.Println("Query Error:", err)
}
columns, err := rows.Columns()
if err != nil {
log.Fatal("Columns Error:", err)
}
valueColumn := make(map[string]*interface{})
pointers := make([]interface{}, len(columns))
for i, column := range columns {
var value interface{}
valueColumn[column] = &value
pointers[i] = &value
}
for rows.Next() {
if err := rows.Scan(pointers...); err != nil {
log.Fatal("Scan Error:", err)
}
for i, scan := range instructions.scan {
fmt.Printf(scan, *pointers[i].(*interface{}))
}
fmt.Printf("\n")
}
if err := rows.Err(); err != nil {
log.Fatal(err)
}
}
@raliste
Copy link
Author

raliste commented Jul 20, 2013

Simple reporting cli/service/server in Go, could be easily extended as an RPC service using net/rpc/jsonrpc or expose via HTTP using net/http.

You can also play by the command line using github.com/holman/spark !

Future work:

  • HTTP Frontend
  • CRUD For reportInstructions
  • Filtering of reports
  • Cursor for reports
  • Async for cursors

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment