postgresql.go 2.1 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465
  1. package postgresql
  2. import (
  3. "database/sql"
  4. "fmt"
  5. "backend/database/schema"
  6. _ "github.com/lib/pq"
  7. log "github.com/sirupsen/logrus"
  8. )
  9. const (
  10. connectionStringTemplate = `postgres://%s:%s@%s/%s?sslmode=disable`
  11. )
  12. type PostgreSQL struct {
  13. db *sql.DB
  14. }
  15. func Open(hostname, username, password, database string) *PostgreSQL {
  16. connStr := fmt.Sprintf(connectionStringTemplate, username, password, hostname, database)
  17. conn, err := sql.Open("postgres", connStr)
  18. if err != nil {
  19. log.Fatalf("Cannot open PostgreSQL database: %s", err)
  20. }
  21. return &PostgreSQL{db: conn}
  22. }
  23. func (p *PostgreSQL) Insert(data *schema.TelemetryData) (sql.Result, error) {
  24. stmt := `INSERT INTO speedtest_users (ip, ispinfo, extra, ua, lang, dl, ul, ping, jitter, log, uuid) VALUES ($1, $2, $3, $4, $5, $6, $7, $8, $9, $10, $11) RETURNING id;`
  25. return p.db.Exec(stmt, data.IPAddress, data.ISPInfo, data.Extra, data.UserAgent, data.Language, data.Download, data.Upload, data.Ping, data.Jitter, data.Log, data.UUID)
  26. }
  27. func (p *PostgreSQL) FetchByUUID(uuid string) (*schema.TelemetryData, error) {
  28. var record schema.TelemetryData
  29. row := p.db.QueryRow(`SELECT * FROM speedtest_users WHERE uuid = $1`, uuid)
  30. if row != nil {
  31. var id string
  32. if err := row.Scan(&id, &record.Timestamp, &record.IPAddress, &record.ISPInfo, &record.Extra, &record.UserAgent, &record.Language, &record.Download, &record.Upload, &record.Ping, &record.Jitter, &record.Log, &record.UUID); err != nil {
  33. return nil, err
  34. }
  35. }
  36. return &record, nil
  37. }
  38. func (p *PostgreSQL) FetchLast100() ([]schema.TelemetryData, error) {
  39. var records []schema.TelemetryData
  40. rows, err := p.db.Query(`SELECT * FROM speedtest_users ORDER BY "timestamp" DESC LIMIT 100;`)
  41. if err != nil {
  42. return nil, err
  43. }
  44. if rows != nil {
  45. var id string
  46. for rows.Next() {
  47. var record schema.TelemetryData
  48. if err := rows.Scan(&id, &record.Timestamp, &record.IPAddress, &record.ISPInfo, &record.Extra, &record.UserAgent, &record.Language, &record.Download, &record.Upload, &record.Ping, &record.Jitter, &record.Log, &record.UUID); err != nil {
  49. return nil, err
  50. }
  51. records = append(records, record)
  52. }
  53. }
  54. return records, nil
  55. }