@@ -9,82 +9,96 @@ import (
99 "github.com/google/sqlcommenter/go/core"
1010 gosql "github.com/google/sqlcommenter/go/database/sql"
1111 httpnet "github.com/google/sqlcommenter/go/net/http"
12+ "github.com/julienschmidt/httprouter"
1213 "go.opentelemetry.io/otel/exporters/stdout/stdouttrace"
1314 sdktrace "go.opentelemetry.io/otel/sdk/trace"
1415
1516 "sqlcommenter-http/mysqldb"
1617 "sqlcommenter-http/pgdb"
18+ "sqlcommenter-http/todos"
1719)
1820
19- var db * gosql.DB
21+ func MakeIndexRoute (db * gosql.DB ) func (w http.ResponseWriter , r * http.Request , _ httprouter.Params ) {
22+ return func (w http.ResponseWriter , r * http.Request , _ httprouter.Params ) {
23+ exp , _ := stdouttrace .New (stdouttrace .WithPrettyPrint ())
24+ bsp := sdktrace .NewSimpleSpanProcessor (exp ) // You should use batch span processor in prod
25+ tp := sdktrace .NewTracerProvider (
26+ sdktrace .WithSampler (sdktrace .AlwaysSample ()),
27+ sdktrace .WithSpanProcessor (bsp ),
28+ )
2029
21- func Index (w http.ResponseWriter , r * http.Request ) {
22- exp , _ := stdouttrace .New (stdouttrace .WithPrettyPrint ())
23- bsp := sdktrace .NewSimpleSpanProcessor (exp ) // You should use batch span processor in prod
24- tp := sdktrace .NewTracerProvider (
25- sdktrace .WithSampler (sdktrace .AlwaysSample ()),
26- sdktrace .WithSpanProcessor (bsp ),
27- )
30+ ctx , span := tp .Tracer ("foo" ).Start (r .Context (), "parent-span-name" )
31+ defer span .End ()
2832
29- ctx , span := tp . Tracer ( "foo" ). Start ( r . Context () , "parent-span-name " )
30- defer span . End ( )
33+ db . ExecContext ( ctx , "Select 1 " )
34+ db . Exec ( "Select 2" )
3135
32- db .ExecContext (ctx , "Select 1" )
33- db .Exec ("Select 2" )
36+ stmt1 , err := db .Prepare ("Select 3" )
37+ if err != nil {
38+ log .Fatal (err )
39+ }
40+ stmt1 .QueryRow ()
3441
35- stmt1 , err := db .Prepare ("Select 3" )
36- if err != nil {
37- log .Fatal (err )
42+ stmt2 , err := db .PrepareContext (ctx , "Select 4" )
43+ if err != nil {
44+ log .Fatal (err )
45+ }
46+ stmt2 .QueryRow ()
47+
48+ db .QueryContext (ctx , "Select 5" )
49+
50+ fmt .Fprintf (w , "Hello World!\r \n " )
3851 }
39- stmt1 . QueryRow ()
52+ }
4053
41- stmt2 , err := db .PrepareContext (ctx , "Select 4" )
54+ // middleware is used to intercept incoming HTTP calls and apply general functions upon them.
55+ func middleware (next httprouter.Handle ) httprouter.Handle {
56+ return func (w http.ResponseWriter , r * http.Request , p httprouter.Params ) {
57+ ctx := core .ContextInject (r .Context (), httpnet .NewHTTPRequestExtractor (r , next ))
58+ log .Printf ("HTTP request sent to %s from %v" , r .URL .Path , next )
59+ next (w , r .WithContext (ctx ), p )
60+ }
61+ }
62+
63+ func runApp (todosController * todos.TodosController ) {
64+ err := todosController .CreateTodosTableIfNotExists ()
4265 if err != nil {
4366 log .Fatal (err )
4467 }
45- stmt2 .QueryRow ()
4668
47- db . QueryContext ( ctx , "Select 5" )
69+ router := httprouter . New ( )
4870
49- fmt . Fprintf ( w , "Hello World! \r \n " )
50- }
71+ index := MakeIndexRoute ( todosController . DB )
72+ router . GET ( "/" , middleware ( index ))
5173
52- // middleware is used to intercept incoming HTTP calls and apply general functions upon them.
53- func middleware (next http.Handler ) http.Handler {
54- return http .HandlerFunc (func (w http.ResponseWriter , r * http.Request ) {
55- ctx := core .ContextInject (r .Context (), httpnet .NewHTTPRequestExtractor (r , next ))
56- log .Printf ("HTTP request sent to %s from %v" , r .URL .Path , next )
57- next .ServeHTTP (w , r .WithContext (ctx ))
58- })
74+ router .GET ("/todos" , middleware (todosController .ActionList ))
75+ router .POST ("/todos" , middleware (todosController .ActionInsert ))
76+ router .PUT ("/todos/:id" , middleware (todosController .ActionUpdate ))
77+ router .DELETE ("/todos/:id" , middleware (todosController .ActionDelete ))
78+
79+ http .ListenAndServe (":8080" , router )
5980}
6081
6182func runForMysql () * gosql.DB {
6283 connection := "root:password@/sqlcommenter_db"
63- db = mysqldb .ConnectMySQL (connection )
64-
65- mux := http .NewServeMux ()
66- finalHandler := http .HandlerFunc (Index )
67- mux .Handle ("/" , middleware ((finalHandler )))
68- log .Fatal (http .ListenAndServe (":8080" , mux ))
69- return db
84+ db := mysqldb .ConnectMySQL (connection )
85+ todosController := & todos.TodosController {DB : db , SQL : todos.MySQLQueries {}}
86+ runApp (todosController )
7087 return db
7188}
7289
7390func runForPg () * gosql.DB {
7491 connection := "postgres://dev:dev@localhost/sqlcommenter_db?sslmode=disable"
75- db = pgdb .ConnectPG (connection )
76-
77- mux := http .NewServeMux ()
78- finalHandler := http .HandlerFunc (Index )
79- mux .Handle ("/" , middleware ((finalHandler )))
80- log .Fatal (http .ListenAndServe (":8080" , mux ))
92+ db := pgdb .ConnectPG (connection )
93+ todosController := & todos.TodosController {DB : db , SQL : todos.PGQueries {}}
94+ runApp (todosController )
8195 return db
8296}
8397
8498func main () {
8599 var engine string
86100
87- flag .StringVar (& engine , "db_engine" , "mysql" , "db-engine to run the sample on" )
101+ flag .StringVar (& engine , "db_engine" , "mysql" , "db-engine to run the sample application on" )
88102 flag .Parse ()
89103
90104 if engine != "mysql" && engine != "pg" {
0 commit comments