package main import ( "database/sql" "log" "time" ) // DeviceType : holds information about a specific DeviceType type DeviceType struct { ID int `json:"id"` Name string `json:"name"` CreatedAt time.Time `json:"createdAt"` UpdatedAt time.Time `json:"updatedAt"` } // DeviceTypes : a list of DeviceType items type DeviceTypes []DeviceType const deviceTypeTableCreationQuery = `CREATE TABLE IF NOT EXISTS deviceTypes ( id int(10) unsigned AUTO_INCREMENT, name varchar(255), createdAt datetime, updatedAt datetime, UNIQUE KEY name (name), PRIMARY KEY (id) )` func ensureDeviceTypeTableExists(db *sql.DB) { if _, err := db.Exec(deviceTypeTableCreationQuery); err != nil { log.Fatal(err) } } func seedDeviceTypeData(db *sql.DB) { sqlQuery := `INSERT INTO deviceTypes VALUES (1,'CLX','2016-10-13 15:05:32','2016-10-13 15:05:32'), (2,'Micro800','2016-10-13 15:05:32','2016-10-13 15:05:32');` insStmt, insErr := db.Prepare(sqlQuery) if insErr != nil { panic(insErr.Error()) // proper error handling instead of panic in your app } defer insStmt.Close() // Close the statement when we leave main() / the program terminates insStmt.Exec() } // getDeviceType : used during GET command func (c *DeviceType) getDeviceType(db *sql.DB) error { return db.QueryRow("SELECT name, createdAt, updatedAt FROM deviceTypes WHERE id=?", c.ID).Scan(&c.Name, &c.CreatedAt, &c.UpdatedAt) } // updateDeviceType : used during PUT command func (c *DeviceType) updateDeviceType(db *sql.DB) error { updStmt, updErr := db.Prepare("UPDATE deviceTypes SET name=?, 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(c.Name, time.Now(), c.ID) return err } // deleteDeviceType : used during DELETE command func (c *DeviceType) deleteDeviceType(db *sql.DB) error { _, err := db.Exec("DELETE FROM deviceTypes WHERE id=?", c.ID) return err } // createDeviceType : used during PUSH command func (c *DeviceType) createDeviceType(db *sql.DB) error { stmtIns, insErr := db.Prepare("INSERT INTO deviceTypes (name, 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(c.Name, time.Now(), time.Now()) return err } // getDeviceTypes : used during GET command for all func getDeviceTypes(db *sql.DB, start, count int) (DeviceTypes, error) { rows, err := db.Query( "SELECT id, name, createdAt, updatedAt FROM deviceTypes LIMIT ? OFFSET ?", count, start) if err != nil { return nil, err } defer rows.Close() deviceTypes := DeviceTypes{} for rows.Next() { var c DeviceType if err := rows.Scan(&c.ID, &c.Name, &c.CreatedAt, &c.UpdatedAt); err != nil { return nil, err } deviceTypes = append(deviceTypes, c) } return deviceTypes, nil }