Files
Lumberjack-Go-Backend/model_tagvalue.go

122 lines
3.3 KiB
Go

package main
import (
"database/sql"
"log"
"time"
)
// TagValue : holds information about a specific TagValue
type TagValue struct {
ID int `json:"id"`
TagID int `json:"tagId"`
Val string `json:"val"`
TagName int `json:"tagName"`
Units int `json:"units"`
DataType string `json:"dataType"`
CreatedAt time.Time `json:"createdAt"`
UpdatedAt time.Time `json:"updatedAt"`
}
// TagValues : a list of TagValue items
type TagValues []TagValue
const tagValueTableCreationQuery = `CREATE TABLE IF NOT EXISTS tagValues (
id int(10) unsigned NOT NULL AUTO_INCREMENT,
tagId int(10) unsigned,
val varchar(64),
createdAt datetime,
updatedAt datetime,
PRIMARY KEY (id),
CONSTRAINT fk_tag FOREIGN KEY (tagId) REFERENCES tags(id)
)`
func ensureTagValueTableExists(db *sql.DB) {
if _, err := db.Exec(tagValueTableCreationQuery); err != nil {
log.Fatal(err)
}
}
// getTagValue : used during GET command
func (t *TagValue) getTagValue(db *sql.DB) error {
sqlQuery := `SELECT
tagValues.tagId,
tagValues.val,
tags.name,
tags.units,
dataTypes.dataType,
tagValues.createdAt,
tagValues.updatedAt
FROM tagValues
JOIN tags ON tagValues.tagId = tags.id
JOIN dataTypes ON tags.dataTypeId = dataTypes.id
WHERE tagValues.id=?`
return db.QueryRow(sqlQuery, t.ID).Scan(&t.TagID, &t.Val, &t.TagName, &t.Units, &t.DataType, &t.CreatedAt, &t.UpdatedAt)
}
// updateTagValue : used during PUT command
func (t *TagValue) updateTagValue(db *sql.DB) error {
updStmt, updErr := db.Prepare("UPDATE tagValues SET tagId=?, val=?, updatedAt=? WHERE id=?")
if updErr != nil {
panic(updErr.Error()) // proper error handling instead of panic in your app
}
defer updStmt.Close() // Close the statement when we leave main() / the program terminates
_, err := updStmt.Exec(t.TagID, t.Val, time.Now(), t.ID)
return err
}
// deleteTagValue : used during DELETE command
func (t *TagValue) deleteTagValue(db *sql.DB) error {
_, err := db.Exec("DELETE FROM tagValues WHERE id=?", t.ID)
return err
}
// createTagValue : used during PUSH command
func (t *TagValue) createTagValue(db *sql.DB) error {
stmtIns, insErr := db.Prepare("INSERT INTO tagValues (tagId, val, createdAt, updatedAt) VALUES (?, ?, ?, ?);")
if insErr != nil {
panic(insErr.Error()) // proper error handling instead of panic in your app
}
defer stmtIns.Close() // Close the statement when we leave main() / the program terminates
_, err := stmtIns.Exec(t.TagID, t.Val, time.Now(), time.Now())
return err
}
// getTagValues : used during GET command for all
func getTagValues(db *sql.DB, start, count int) (TagValues, error) {
sqlQuery := `SELECT
tagValues.id,
tagValues.tagId,
tagValues.val,
tags.name,
tags.units,
dataTypes.dataType,
tagValues.createdAt,
tagValues.updatedAt
FROM tagValues
JOIN tags ON tagValues.tagId = tags.id
JOIN dataTypes ON tags.dataTypeId = dataTypes.id
LIMIT ? OFFSET ?`
rows, err := db.Query(sqlQuery, count, start)
if err != nil {
return nil, err
}
defer rows.Close()
tagValues := TagValues{}
for rows.Next() {
var t TagValue
if err := rows.Scan(&t.ID, &t.TagID, &t.Val, &t.TagName, &t.Units, &t.DataType, &t.CreatedAt, &t.UpdatedAt); err != nil {
return nil, err
}
tagValues = append(tagValues, t)
}
return tagValues, nil
}