1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
|
package sfive
import (
"time"
)
// compared to JSON DTOs, DB types are flattened, and use key-relations instead of collections
// this is very much not normalized at all, because I'm too lazy to type
// table names
const (
tagsTn = "Tags"
sourceTagsTn = "StreamToTagMap"
sourcesTn = "Sources"
clientdataUpdatesTn = "ClientDataUpdates"
dataUpdatesTn = "DataUpdates"
hubInfoTn = "HubInfo"
)
type hubInfoDb struct {
Name string
Value string
}
// stored in tagsTn
type tagDb struct {
Id int
Name string
}
// stored in sourceTagsTn
// Stream m:n Tag
type sourceTagsDb struct {
TagId int // foreign key to tagsTn
SourceId int // foreign key to sourcesTn
}
// stored in sourcesTn
type sourceDb struct {
Id int
StreamId
SourceId
}
// stored in clientdataUpdatesTn
// ClientData n:1 DataUpdate
type clientDataDb struct {
Id int
DataUpdatesId int // foreign key to dataUpdatesTn
ClientData
}
// stored in dataUpdatesTn
// in DB, StatisticsData/DataUpdate is flattened compared to JSON DTOs
type dataUpdateDb struct {
Id int
SourceId int // foreign key to sourcesTn
SourceHubUuid *string
SourceHubDataUpdateId *int
StartTime int64 // time.Time
Duration int64 // time.Duration
ClientCount uint
BytesReceived uint
BytesSent uint
}
func (self *SourceId) CopyFromSourceDb(value sourceDb) {
self.Version = value.Version
self.Hostname = value.Hostname
self.StreamId.ContentId = value.ContentId
self.StreamId.Format = value.Format
self.StreamId.Quality = value.Quality
}
func (self *SourceId) CopyFromTagsDb(values []tagDb) {
tags := make([]string, len(values))
for i := range values {
tags[i] = values[i].Name
}
self.Tags = tags
}
func (self *StatisticsData) CopyFromDataUpdateDb(value dataUpdateDb, hubId string) {
if value.SourceHubUuid == nil {
self.SourceHubUuid = &hubId
} else {
self.SourceHubUuid = value.SourceHubUuid
}
if value.SourceHubDataUpdateId == nil {
self.SourceHubDataUpdateId = &value.Id
} else {
self.SourceHubDataUpdateId = value.SourceHubDataUpdateId
}
self.StartTime = time.Unix(value.StartTime, 0)
self.Duration = value.Duration
self.Data.ClientCount = value.ClientCount
self.Data.BytesReceived = value.BytesReceived
self.Data.BytesSent = value.BytesSent
}
func (self *StatisticsData) CopyFromClientDataDb(values []clientDataDb) {
clients := make([]ClientData, len(values))
for i := range values {
clients[i].Ip = values[i].Ip
clients[i].UserAgent = values[i].UserAgent
clients[i].BytesSent = values[i].BytesSent
}
self.Data.Clients = clients
}
func cvtToApiStatisticsData(
hubId string, source sourceDb, update dataUpdateDb, clients []clientDataDb, tags []tagDb) StatisticsData {
res := StatisticsData{}
res.CopyFromSourceDb(source)
res.CopyFromDataUpdateDb(update, hubId)
res.CopyFromClientDataDb(clients)
res.CopyFromTagsDb(tags)
return res
}
|