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.

182 lines
4.3 KiB
Go

package insight
import (
"database/sql"
"fmt"
_ "github.com/go-sql-driver/mysql"
"io/ioutil"
"log"
"os"
"strings"
)
const (
InsightDatabaseName = "insight"
)
//<editor-fold name="DBConnector">
/*======================================================================================
DBConnector
======================================================================================*/
type DBConnector struct{}
func NewDBConnection() *DBConnector {
return &DBConnector{}
}
func (c *DBConnector) CreateTables() {
tableCreationScripts := []string{"create-user-table.sql", "create-timeentry-table.sql"}
for _, scriptName := range tableCreationScripts {
c.ExecuteSqlScript(InsightDatabaseName, scriptName)
}
}
func (c *DBConnector) 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 *DBConnector) 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 *DBConnector) FetchUsers() *[]*User {
ret := make([]*User, 0, 50)
cx := c.checkoutConnection(InsightDatabaseName)
queryText := "SELECT * FROM users;"
rs, err := cx.Query(queryText)
if err != nil {
log.Fatalln(err)
}
for rs.Next() {
u := User{}
err := rs.Scan(&u.Id, &u.FirstName, &u.LastName, &u.EmailAddress)
if err != nil {
log.Fatalln(err)
}
ret = append(ret, &u)
}
return &ret
}
func (c *DBConnector) 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 *DBConnector) checkoutConnection(dataBase string) *sql.DB {
return createDbConnection(dataBase)
}
func (c *DBConnector) returnConnection(db *sql.DB) {
db.Close()
}
//</editor-fold>
//<editor-fold name="Utility Functions">
/*======================================================================================
Utility Functions
======================================================================================*/
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
}
//</editor-fold>