package main

import (
	"database/sql"
	"database/sql/driver"
	"net/http"
	"runtime"
	"time"
)

type drv struct{}
type stmt struct{}
type conn struct{}
type rows struct{}

func init() { sql.Register("postgres", &drv{}) }

func (d *drv) Open(string) (driver.Conn, error)            { return &conn{}, nil }
func (cn *conn) Prepare(string) (driver.Stmt, error)       { return &stmt{}, nil }
func (st *stmt) Query([]driver.Value) (driver.Rows, error) { return &rows{}, nil }
func (st *stmt) NumInput() int                             { return 0 }

func (cn *conn) Close() error { return nil }
func (st *stmt) Close() error { return nil }
func (rs *rows) Close() error { return nil }

func (cn *conn) Begin() (driver.Tx, error)                          { panic("begin driver") }
func (st *stmt) Exec([]driver.Value) (driver.Result, error)         { panic("Exec driver") }
func (cn *conn) Query(string, []driver.Value) (driver.Rows, error)  { panic("Query string") }
func (cn *conn) Exec(string, []driver.Value) (driver.Result, error) { panic("Exec string") }
func (rs *rows) Next([]driver.Value) error                          { panic("Next row") }
func (rs *rows) Columns() []string                                  { panic("columns rows") }

// ACTUAL LISTENER STARTS BELOW
var (
	mystmt *sql.Stmt
)

func main() {
	runtime.GOMAXPROCS(1)

	db, err := sql.Open("postgres", "")
	if err != nil {
		panic("open_err")
	}
	db.SetMaxIdleConns(1)
	mystmt, err = db.Prepare("select 5 from pg_class limit 1")
	if err != nil {
		panic("prep_err")
	}

	println("starting")
	for i := 0; i < 10; i++ {
		go reqreq()
	}
	http.HandleFunc("/golang/abcdefg", abc)
	if err := http.ListenAndServe(":9000", nil); err != nil {
		panic("listen_err")
	}
}

func reqreq() {
	time.Sleep(1 * time.Second)
	for {
		resp, err := http.Get("http://localhost:9000/golang/abcdefg")
		if err != nil {
			panic("get_err")
		}
		resp.Body.Close()
	}
}

func abc(http.ResponseWriter, *http.Request) {
	_ = mystmt.QueryRow()
}