You cannot select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
149 lines
3.3 KiB
Go
149 lines
3.3 KiB
Go
package insight
|
|
|
|
import (
|
|
"database/sql"
|
|
"fmt"
|
|
_ "github.com/go-sql-driver/mysql"
|
|
"io/ioutil"
|
|
"log"
|
|
"os"
|
|
"strings"
|
|
)
|
|
|
|
const (
|
|
InsightDatabaseName = "insight"
|
|
)
|
|
|
|
type Connector struct{}
|
|
|
|
func NewInsightConnection() *Connector {
|
|
return &Connector{}
|
|
}
|
|
|
|
func (c *Connector) CreateTables() {
|
|
tableCreationScripts := []string{"create-user-table.sql", "create-timeentry-table.sql"}
|
|
|
|
for _, scriptName := range tableCreationScripts {
|
|
c.ExecuteSqlScript(InsightDatabaseName, scriptName)
|
|
}
|
|
}
|
|
|
|
func (c *Connector) UpdateTimeEntries(entries *[]TimeEntry) {
|
|
statement := loadSqlFile("update-timeentry.sql")
|
|
db := c.checkoutConnection(InsightDatabaseName)
|
|
defer c.returnConnection(db)
|
|
s, err := db.Prepare(*statement)
|
|
defer s.Close()
|
|
if err != nil {
|
|
log.Fatalln(err)
|
|
}
|
|
for _, ent := range *entries {
|
|
_, err = s.Exec(ent.ActualHours,
|
|
ent.ActualHoursFormattedString,
|
|
ent.ActualTimeString,
|
|
ent.ActualTotal,
|
|
ent.BillableHours,
|
|
ent.BillableHoursFormattedString,
|
|
ent.BillableTimeString,
|
|
ent.BillableTotal,
|
|
ent.Date,
|
|
ent.Description,
|
|
ent.ProjectId,
|
|
ent.RateBill,
|
|
ent.RateBurden,
|
|
ent.TaskId,
|
|
ent.TimeSheetId,
|
|
ent.UserId)
|
|
if err != nil {
|
|
log.Printf("%#v\n", s)
|
|
log.Fatalln(err)
|
|
}
|
|
}
|
|
}
|
|
|
|
func (c *Connector) UpdateUsers(users *[]User) {
|
|
statement := loadSqlFile("update-users.sql")
|
|
db := c.checkoutConnection(InsightDatabaseName)
|
|
defer c.returnConnection(db)
|
|
s, err := db.Prepare(*statement)
|
|
defer s.Close()
|
|
if err != nil {
|
|
log.Fatalln(err)
|
|
}
|
|
for _, user := range *users {
|
|
_, err = s.Exec(user.Id, user.FirstName, user.LastName, user.EmailAddress)
|
|
if err != nil {
|
|
log.Printf("%#v\n", s)
|
|
log.Fatalln(err)
|
|
}
|
|
}
|
|
}
|
|
|
|
func (c *Connector) ExecuteSqlScript(database string, scriptName string) {
|
|
db := c.checkoutConnection(database)
|
|
defer c.returnConnection(db)
|
|
queryWhole := *loadSqlFile(scriptName)
|
|
queryParts := strings.Split(queryWhole, ";")
|
|
|
|
log.Printf("\n=============================================\n%s\n==============================================\n", queryWhole)
|
|
|
|
for _, query := range queryParts {
|
|
if len(query) == 0 || query == "\n" {
|
|
continue
|
|
}
|
|
_, err := db.Exec(query + ";")
|
|
if err != nil {
|
|
log.Printf("Query involved in error: %s\n", query)
|
|
log.Fatal(err)
|
|
}
|
|
}
|
|
}
|
|
|
|
func (c *Connector) checkoutConnection(dataBase string) *sql.DB {
|
|
return createDbConnection(dataBase)
|
|
}
|
|
|
|
func (c *Connector) returnConnection(db *sql.DB) {
|
|
db.Close()
|
|
}
|
|
|
|
func createDbConnection(database string) *sql.DB {
|
|
secret := getSecret("/home/dtookey/work/datastudio-db-creds.txt")
|
|
dbString := "clarity:%s@tcp(data-connect.carolina.engineering)/%s"
|
|
connectString := fmt.Sprintf(dbString, *secret, database)
|
|
|
|
db, err := sql.Open("mysql", connectString)
|
|
if err != nil {
|
|
log.Fatalln(err)
|
|
}
|
|
return db
|
|
}
|
|
|
|
func getSecret(pathlike string) *string {
|
|
file, err := os.OpenFile(pathlike, os.O_RDONLY, 0755)
|
|
if err != nil {
|
|
log.Fatalln(err)
|
|
}
|
|
defer file.Close()
|
|
raw, err := ioutil.ReadAll(file)
|
|
if err != nil {
|
|
log.Fatalln(err)
|
|
}
|
|
str := strings.Trim(string(raw), "\n")
|
|
return &str
|
|
}
|
|
|
|
func loadSqlFile(scriptName string) *string {
|
|
file, err := os.OpenFile("src/sql/"+scriptName, os.O_RDONLY, 0755)
|
|
if err != nil {
|
|
log.Fatalln(err)
|
|
}
|
|
defer file.Close()
|
|
raw, err := ioutil.ReadAll(file)
|
|
if err != nil {
|
|
log.Fatalln(err)
|
|
}
|
|
str := strings.Trim(string(raw), "\n")
|
|
return &str
|
|
}
|