11package httparenahandler
22
33import (
4+ "database/sql"
45 "encoding/json"
56 "fmt"
67 "hash/crc32"
@@ -9,13 +10,15 @@ import (
910 "net/http"
1011 "os"
1112 "path/filepath"
13+ "runtime"
1214 "strconv"
1315 "strings"
1416
1517 "github.com/caddyserver/caddy/v2"
1618 "github.com/caddyserver/caddy/v2/caddyconfig/caddyfile"
1719 "github.com/caddyserver/caddy/v2/caddyconfig/httpcaddyfile"
1820 "github.com/caddyserver/caddy/v2/modules/caddyhttp"
21+ _ "modernc.org/sqlite"
1922)
2023
2124func init () {
@@ -54,6 +57,7 @@ type Handler struct {
5457 jsonResponse []byte
5558 jsonLargeResponse []byte
5659 staticFiles map [string ]staticFile
60+ db * sql.DB
5761}
5862
5963func (Handler ) CaddyModule () caddy.ModuleInfo {
@@ -149,6 +153,13 @@ func (h *Handler) Provision(ctx caddy.Context) error {
149153 }
150154 }
151155
156+ // Open SQLite database
157+ db , err := sql .Open ("sqlite" , "file:/data/benchmark.db?mode=ro&immutable=1" )
158+ if err == nil {
159+ db .SetMaxOpenConns (runtime .NumCPU ())
160+ h .db = db
161+ }
162+
152163 return nil
153164}
154165
@@ -226,6 +237,57 @@ func (h *Handler) ServeHTTP(w http.ResponseWriter, r *http.Request, next caddyht
226237 http .Error (w , "No dataset" , 500 )
227238 }
228239 return nil
240+
241+ case "/db" :
242+ if h .db == nil {
243+ http .Error (w , "DB not available" , 500 )
244+ return nil
245+ }
246+ minStr := r .URL .Query ().Get ("min" )
247+ maxStr := r .URL .Query ().Get ("max" )
248+ minPrice := 10.0
249+ maxPrice := 50.0
250+ if v , err := strconv .ParseFloat (minStr , 64 ); err == nil {
251+ minPrice = v
252+ }
253+ if v , err := strconv .ParseFloat (maxStr , 64 ); err == nil {
254+ maxPrice = v
255+ }
256+ rows , err := h .db .Query ("SELECT id, name, category, price, quantity, active, tags, rating_score, rating_count FROM items WHERE price BETWEEN ? AND ? LIMIT 50" , minPrice , maxPrice )
257+ if err != nil {
258+ http .Error (w , "Query failed" , 500 )
259+ return nil
260+ }
261+ defer rows .Close ()
262+ var items []map [string ]interface {}
263+ for rows .Next () {
264+ var dbId int
265+ var name , category , tags string
266+ var price float64
267+ var quantity int
268+ var active int
269+ var ratingScore float64
270+ var ratingCount int
271+ if err := rows .Scan (& dbId , & name , & category , & price , & quantity , & active , & tags , & ratingScore , & ratingCount ); err != nil {
272+ continue
273+ }
274+ var tagsArr []string
275+ json .Unmarshal ([]byte (tags ), & tagsArr )
276+ items = append (items , map [string ]interface {}{
277+ "id" : dbId , "name" : name , "category" : category ,
278+ "price" : price , "quantity" : quantity , "active" : active == 1 ,
279+ "tags" : tagsArr ,
280+ "rating" : map [string ]interface {}{"score" : ratingScore , "count" : ratingCount },
281+ })
282+ }
283+ resp := map [string ]interface {}{
284+ "items" : items ,
285+ "count" : len (items ),
286+ }
287+ w .Header ().Set ("Content-Type" , "application/json" )
288+ w .Header ().Set ("Server" , "caddy" )
289+ json .NewEncoder (w ).Encode (resp )
290+ return nil
229291 }
230292
231293 if strings .HasPrefix (path , "/static/" ) {
0 commit comments