128 lines
3.6 KiB
Go
128 lines
3.6 KiB
Go
package device
|
|
|
|
import (
|
|
"database/sql"
|
|
"time"
|
|
)
|
|
|
|
// MySQLStorage MySQL设备存储
|
|
|
|
type MySQLStorage struct {
|
|
db *sql.DB
|
|
}
|
|
|
|
// NewMySQLStorage 创建MySQL设备存储实例
|
|
func NewMySQLStorage(db *sql.DB) (*MySQLStorage, error) {
|
|
// 创建表
|
|
if err := createDeviceTable(db); err != nil {
|
|
return nil, err
|
|
}
|
|
return &MySQLStorage{db: db}, nil
|
|
}
|
|
|
|
// createDeviceTable 创建设备表
|
|
func createDeviceTable(db *sql.DB) error {
|
|
query := `
|
|
CREATE TABLE IF NOT EXISTS devices (
|
|
id VARCHAR(64) PRIMARY KEY,
|
|
name VARCHAR(128) NOT NULL,
|
|
ip VARCHAR(64),
|
|
token VARCHAR(64) NOT NULL,
|
|
status VARCHAR(32) NOT NULL DEFAULT 'inactive',
|
|
created_at BIGINT NOT NULL,
|
|
updated_at BIGINT NOT NULL,
|
|
UNIQUE KEY uk_token (token)
|
|
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci
|
|
`
|
|
_, err := db.Exec(query)
|
|
return err
|
|
}
|
|
|
|
// GetDevices 获取所有设备
|
|
func (s *MySQLStorage) GetDevices() []Device {
|
|
query := "SELECT id, name, ip, token, status, created_at, updated_at FROM devices"
|
|
rows, err := s.db.Query(query)
|
|
if err != nil {
|
|
return []Device{}
|
|
}
|
|
defer rows.Close()
|
|
|
|
devices := make([]Device, 0)
|
|
for rows.Next() {
|
|
var device Device
|
|
var createdAt, updatedAt int64
|
|
if err := rows.Scan(&device.ID, &device.Name, &device.IP, &device.Token, &device.Status, &createdAt, &updatedAt); err != nil {
|
|
continue
|
|
}
|
|
device.CreatedAt = createdAt
|
|
device.UpdatedAt = updatedAt
|
|
devices = append(devices, device)
|
|
}
|
|
|
|
return devices
|
|
}
|
|
|
|
// GetDevice 获取指定设备
|
|
func (s *MySQLStorage) GetDevice(id string) (Device, bool) {
|
|
query := "SELECT id, name, ip, token, status, created_at, updated_at FROM devices WHERE id = ?"
|
|
row := s.db.QueryRow(query, id)
|
|
|
|
var device Device
|
|
var createdAt, updatedAt int64
|
|
err := row.Scan(&device.ID, &device.Name, &device.IP, &device.Token, &device.Status, &createdAt, &updatedAt)
|
|
if err != nil {
|
|
return Device{}, false
|
|
}
|
|
device.CreatedAt = createdAt
|
|
device.UpdatedAt = updatedAt
|
|
|
|
return device, true
|
|
}
|
|
|
|
// GetDeviceByToken 通过令牌获取设备
|
|
func (s *MySQLStorage) GetDeviceByToken(token string) (Device, bool) {
|
|
query := "SELECT id, name, ip, token, status, created_at, updated_at FROM devices WHERE token = ?"
|
|
row := s.db.QueryRow(query, token)
|
|
|
|
var device Device
|
|
var createdAt, updatedAt int64
|
|
|
|
err := row.Scan(&device.ID, &device.Name, &device.IP, &device.Token, &device.Status, &createdAt, &updatedAt)
|
|
if err != nil {
|
|
return Device{}, false
|
|
}
|
|
|
|
device.CreatedAt = createdAt
|
|
device.UpdatedAt = updatedAt
|
|
|
|
return device, true
|
|
}
|
|
|
|
// AddDevice 添加设备
|
|
func (s *MySQLStorage) AddDevice(device Device) error {
|
|
query := "INSERT INTO devices (id, name, ip, token, status, created_at, updated_at) VALUES (?, ?, ?, ?, ?, ?, ?) ON DUPLICATE KEY UPDATE name = VALUES(name), ip = VALUES(ip), updated_at = VALUES(updated_at)"
|
|
_, err := s.db.Exec(query, device.ID, device.Name, device.IP, device.Token, device.Status, device.CreatedAt, device.UpdatedAt)
|
|
return err
|
|
}
|
|
|
|
// UpdateDevice 更新设备
|
|
func (s *MySQLStorage) UpdateDevice(device Device) error {
|
|
query := "UPDATE devices SET name = ?, ip = ?, status = ?, updated_at = ? WHERE id = ?"
|
|
_, err := s.db.Exec(query, device.Name, device.IP, device.Status, device.UpdatedAt, device.ID)
|
|
return err
|
|
}
|
|
|
|
// DeleteDevice 删除设备
|
|
func (s *MySQLStorage) DeleteDevice(id string) error {
|
|
query := "DELETE FROM devices WHERE id = ?"
|
|
_, err := s.db.Exec(query, id)
|
|
return err
|
|
}
|
|
|
|
// UpdateDeviceStatus 更新设备状态
|
|
func (s *MySQLStorage) UpdateDeviceStatus(id string, status string) error {
|
|
query := "UPDATE devices SET status = ?, updated_at = ? WHERE id = ?"
|
|
_, err := s.db.Exec(query, status, time.Now().Unix(), id)
|
|
return err
|
|
}
|