-
Notifications
You must be signed in to change notification settings - Fork 5
/
Copy pathreadsql.go
181 lines (164 loc) · 5.27 KB
/
readsql.go
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
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
//
// Read the Campaign Manager MySQL Database
// Do this if you need to decorate your aggregation log records with additional campaign information.
//
package main
import (
mysqlpkg "database/sql"
"errors"
"fmt"
_ "github.com/go-sql-driver/mysql"
)
// CampaignBannerFields - Joined fields Campaigns and Banners
// Add other database fields as required.
type CampaignBannerFields struct {
ID int64
BannerID int64
Regions mysqlpkg.NullString
}
// CampaignVideoFields - Joined fields Campaigns and BannerVideos
// Add other database fields as required.
type CampaignVideoFields struct {
ID int64
VideoID int64
Regions mysqlpkg.NullString
}
// CampaignCreativeFields - generic campaign and creative fields
type CampaignCreativeFields struct {
Regions mysqlpkg.NullString
}
// CampaignBanners - Array of records with structure CampaignBannerFields
type CampaignBanners []CampaignBannerFields
// CampaignVideos - Array of records with structure CampaignVideoFields
type CampaignVideos []CampaignVideoFields
// Instantiate the banner and video objects
var dbCampaignBanners = CampaignBanners{}
var dbCampaignVideos = CampaignVideos{}
//
// Read the rtb4free mysql database and set the banner/vidoe objects.
func readMySQLTables(mysqlHost string, mysqlDbname string, mysqlUser string, mysqlPassword string) bool {
log1 := logger.GetLogger("readMySQLTables")
var retError = false
var dsn = mysqlUser + ":" + mysqlPassword + "@tcp(" + mysqlHost + ")/" + mysqlDbname
db, err := mysqlpkg.Open("mysql", dsn)
if err != nil {
log1.Error(err.Error())
return true
}
defer db.Close()
iface, _ := executeMySQLSelect(db, "select campaigns.id,banners.id as banner_id,campaigns.regions from banners, campaigns where banners.campaign_id=campaigns.id AND campaigns.status=\"runnable\"", "campaign_banner") // c1x table
if camprecs, ok := iface.([]CampaignBannerFields); ok {
dbCampaignBanners = camprecs
} else {
return true
}
iface, _ = executeMySQLSelect(db, "select campaigns.id,videos.id as video_id,campaigns.regions from banner_videos as videos, campaigns where videos.campaign_id=campaigns.id AND campaigns.status=\"runnable\"", "campaign_video") // c1x table
if camprecs, ok := iface.([]CampaignVideoFields); ok {
dbCampaignVideos = camprecs
} else {
return true
}
return retError
}
// Execute an SQL statement
func executeMySQLSelect(db *mysqlpkg.DB, selectStmt string, rtype string) (interface{}, error) {
log1 := logger.GetLogger("executeMySQLSelect")
var rvals interface{}
rows, err := db.Query(selectStmt)
if err != nil {
log1.Error(err.Error())
return rvals, errors.New("Query error -" + selectStmt)
}
defer rows.Close()
switch rtype {
case "campaign_banner":
recs := []CampaignBannerFields{}
count := 0
for rows.Next() {
rec := CampaignBannerFields{}
err = rows.Scan(&rec.ID, &rec.BannerID, &rec.Regions)
if err != nil {
log1.Error(err.Error())
return rvals, errors.New("Row error on select -" + selectStmt)
}
recs = append(recs, rec)
count++
}
rvals = recs
if err = rows.Err(); err != nil {
log1.Error(err.Error())
return rvals, errors.New("Rows error on select -" + selectStmt)
}
log1.Info(fmt.Sprintf("%d Campaign-Banner records read.", count))
case "campaign_video":
recs := []CampaignVideoFields{}
count := 0
for rows.Next() {
rec := CampaignVideoFields{}
err = rows.Scan(&rec.ID, &rec.VideoID, &rec.Regions)
if err != nil {
log1.Error(err.Error())
return rvals, errors.New("Row error on select -" + selectStmt)
}
recs = append(recs, rec)
count++
}
rvals = recs
if err = rows.Err(); err != nil {
log1.Error(err.Error())
return rvals, errors.New("Rows error on select -" + selectStmt)
}
log1.Info(fmt.Sprintf("%d Campaign-Video records read.", count))
default:
log1.Error("executeMySQLSelect can't find select type - ", rtype)
}
return rvals, nil
}
// Find the campaign and creative attributes, given the camp and creative ID
func findCampaign(campIDint int64, creatIDint int64) CampaignCreativeFields {
for _, v := range dbCampaignBanners {
if v.ID == creatIDint {
return CampaignCreativeFields{
Regions: v.Regions,
}
}
}
for _, v := range dbCampaignVideos {
if v.ID == creatIDint {
return CampaignCreativeFields{
Regions: v.Regions,
}
}
}
if val, found := dbCampaignBanners.findID(campIDint, creatIDint); found {
return val
}
if val, found := dbCampaignVideos.findID(campIDint, creatIDint); found {
return val
}
return CampaignCreativeFields{}
}
func (campaigns CampaignBanners) findID(ID int64, BannerID int64) (CampaignCreativeFields, bool) {
log1 := logger.GetLogger("CampaignBanners findID")
log1.Debug(fmt.Sprintf("Look in campaign-banner records for id %d.", ID))
for _, v := range campaigns {
if v.ID == ID && v.BannerID == BannerID {
return CampaignCreativeFields{
Regions: v.Regions,
}, true
}
}
return CampaignCreativeFields{}, false
}
func (campaigns CampaignVideos) findID(ID int64, VideoID int64) (CampaignCreativeFields, bool) {
log1 := logger.GetLogger("CampaignVideos findID")
log1.Info(fmt.Sprintf("Look in campaign-video records for id %d.", ID))
for _, v := range campaigns {
if v.ID == ID && v.VideoID == VideoID {
return CampaignCreativeFields{
Regions: v.Regions,
}, true
}
}
return CampaignCreativeFields{}, false
}