//go:build ignore package main import ( "database/sql" "encoding/json" "fmt" "net" "net/url" "os" "sort" "strings" "time" _ "github.com/go-sql-driver/mysql" ) func main() { if len(os.Args)!=3 { panic("usage: query_capacity ") } var selected []struct{ VIN string `json:"vin"` } b,err:=os.ReadFile(os.Args[1]);if err!=nil{panic(err)};if err=json.Unmarshal(b,&selected);err!=nil{panic(err)} prefix := "HYDROGEN_DB_" host := strings.TrimSpace(os.Getenv(prefix + "HOST")) port := strings.TrimSpace(os.Getenv(prefix + "PORT")); if port == "" { port = "3306" } name := strings.TrimSpace(os.Getenv(prefix + "NAME")) user := os.Getenv(prefix + "USER"); pass := os.Getenv(prefix + "PASSWORD") dsn := user+":"+pass+"@tcp("+net.JoinHostPort(host,port)+")/"+name+"?parseTime=true&loc="+url.QueryEscape("Asia/Shanghai")+"&timeout=5s&readTimeout=15s" db,err:=sql.Open("mysql",dsn); if err!=nil{panic(err)}; defer db.Close(); db.SetConnMaxLifetime(time.Minute); if err=db.Ping();err!=nil{panic(err)} vins:=make([]string,0,len(selected));args:=make([]any,0,len(selected));for _,s:=range selected{v:=strings.ToUpper(strings.TrimSpace(s.VIN));vins=append(vins,v);args=append(args,v)} placeholders:=strings.TrimRight(strings.Repeat("?,",len(vins)),",") rows,err:=db.Query(`SELECT UPPER(TRIM(vin)),plate_number,brand_name,model_name,tank_capacity_l,active,source_model_id,source_updated_at,synced_at FROM lingniu_vehicle_data.vehicle_hydrogen_tank_capacity WHERE UPPER(TRIM(vin)) IN (`+placeholders+`) ORDER BY vin`,args...);if err!=nil{panic(err)};defer rows.Close() type row struct{VIN,Plate,Brand,Model string;TankCapacityL float64;Active int;SourceModelID *int64;SourceUpdatedAt, SyncedAt *time.Time} out:=make([]row,0,len(vins));for rows.Next(){var r row;if err=rows.Scan(&r.VIN,&r.Plate,&r.Brand,&r.Model,&r.TankCapacityL,&r.Active,&r.SourceModelID,&r.SourceUpdatedAt,&r.SyncedAt);err!=nil{panic(err)};out=append(out,r)};if err=rows.Err();err!=nil{panic(err)} sort.Slice(out,func(i,j int)bool{return out[i].VIN