Wrapper for querying a Database struct
(db *sql.DB, timeRange *database.TimeRange)
| 12 | |
| 13 | // Wrapper for querying a Database struct |
| 14 | func Query(db *sql.DB, timeRange *database.TimeRange) (*database.Analytics, error) { |
| 15 | // Query |
| 16 | queryBuilder := sq. |
| 17 | Select("time", "event", "path", "ip", "platform", "refererDomain", "countryCode"). |
| 18 | From("visits") |
| 19 | |
| 20 | // Add time constraints if timeRange provided |
| 21 | if timeRange != nil { |
| 22 | if !timeRange.Start.Equal(time.Time{}) { |
| 23 | timeQuery := fmt.Sprintf("time >= %d", timeRange.Start.Unix()) |
| 24 | queryBuilder = queryBuilder.Where(timeQuery) |
| 25 | } |
| 26 | if !timeRange.End.Equal(time.Time{}) { |
| 27 | timeQuery := fmt.Sprintf("time <= %d", timeRange.End.Unix()) |
| 28 | queryBuilder = queryBuilder.Where(timeQuery) |
| 29 | } |
| 30 | } |
| 31 | |
| 32 | query, _, err := queryBuilder.ToSql() |
| 33 | if err != nil { |
| 34 | return nil, err |
| 35 | } |
| 36 | |
| 37 | // Exec query |
| 38 | rows, err := db.Query(query) |
| 39 | if err != nil { |
| 40 | return nil, err |
| 41 | } |
| 42 | defer rows.Close() |
| 43 | |
| 44 | analytics := database.Analytics{} |
| 45 | for rows.Next() { |
| 46 | analytic := database.Analytic{} |
| 47 | var analyticTime int64 |
| 48 | rows.Scan(&analyticTime, |
| 49 | &analytic.Event, |
| 50 | &analytic.Path, |
| 51 | &analytic.Ip, |
| 52 | &analytic.Platform, |
| 53 | &analytic.RefererDomain, |
| 54 | &analytic.CountryCode) |
| 55 | |
| 56 | analytic.Time = time.Unix(analyticTime, 0).UTC() |
| 57 | analytics.List = append(analytics.List, analytic) |
| 58 | } |
| 59 | |
| 60 | return &analytics, nil |
| 61 | } |