Created
July 20, 2013 04:52
-
-
Save raliste/6043918 to your computer and use it in GitHub Desktop.
Simple reporting server in Go
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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) | |
} | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
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: