database.go 2.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115
  1. package database
  2. import (
  3. "context"
  4. "database/sql"
  5. "fmt"
  6. "os"
  7. "path/filepath"
  8. _ "github.com/mattn/go-sqlite3"
  9. )
  10. type DB struct {
  11. conn *sql.Conn
  12. }
  13. type MQTTConfig struct {
  14. ID int `json:"id"`
  15. Broker string `json:"broker"`
  16. ClientID string `json:"client_id"`
  17. Topic string `json:"topic"`
  18. Enabled bool `json:"enabled"`
  19. }
  20. func New(dbPath string) (*DB, error) {
  21. dir := filepath.Dir(dbPath)
  22. if err := os.MkdirAll(dir, 0755); err != nil {
  23. return nil, fmt.Errorf("创建目录失败: %w", err)
  24. }
  25. db, err := sql.Open("sqlite3", dbPath)
  26. if err != nil {
  27. return nil, fmt.Errorf("打开数据库失败: %w", err)
  28. }
  29. conn, err := db.Conn(context.Background())
  30. if err != nil {
  31. return nil, fmt.Errorf("获取连接失败: %w", err)
  32. }
  33. d := &DB{conn: conn}
  34. if err := d.init(); err != nil {
  35. return nil, err
  36. }
  37. return d, nil
  38. }
  39. func (d *DB) init() error {
  40. query := `
  41. CREATE TABLE IF NOT EXISTS mqtt_config (
  42. id INTEGER PRIMARY KEY AUTOINCREMENT,
  43. broker TEXT NOT NULL,
  44. client_id TEXT NOT NULL,
  45. topic TEXT NOT NULL,
  46. enabled BOOLEAN DEFAULT 1
  47. );
  48. `
  49. _, err := d.conn.ExecContext(context.Background(), query)
  50. return err
  51. }
  52. func (d *DB) GetMQTTConfig() (*MQTTConfig, error) {
  53. query := "SELECT id, broker, client_id, topic, enabled FROM mqtt_config WHERE enabled = 1 LIMIT 1"
  54. row := d.conn.QueryRowContext(context.Background(), query)
  55. var cfg MQTTConfig
  56. err := row.Scan(&cfg.ID, &cfg.Broker, &cfg.ClientID, &cfg.Topic, &cfg.Enabled)
  57. if err == sql.ErrNoRows {
  58. return nil, nil
  59. }
  60. if err != nil {
  61. return nil, fmt.Errorf("查询配置失败: %w", err)
  62. }
  63. return &cfg, nil
  64. }
  65. func (d *DB) SaveMQTTConfig(cfg *MQTTConfig) error {
  66. if cfg.ID == 0 {
  67. query := "INSERT INTO mqtt_config (broker, client_id, topic, enabled) VALUES (?, ?, ?, ?)"
  68. _, err := d.conn.ExecContext(context.Background(), query, cfg.Broker, cfg.ClientID, cfg.Topic, cfg.Enabled)
  69. return err
  70. }
  71. query := "UPDATE mqtt_config SET broker = ?, client_id = ?, topic = ?, enabled = ? WHERE id = ?"
  72. _, err := d.conn.ExecContext(context.Background(), query, cfg.Broker, cfg.ClientID, cfg.Topic, cfg.Enabled, cfg.ID)
  73. return err
  74. }
  75. func (d *DB) DeleteMQTTConfig(id int) error {
  76. query := "DELETE FROM mqtt_config WHERE id = ?"
  77. _, err := d.conn.ExecContext(context.Background(), query, id)
  78. return err
  79. }
  80. func (d *DB) ListMQTTConfigs() ([]MQTTConfig, error) {
  81. query := "SELECT id, broker, client_id, topic, enabled FROM mqtt_config ORDER BY id"
  82. rows, err := d.conn.QueryContext(context.Background(), query)
  83. if err != nil {
  84. return nil, err
  85. }
  86. defer rows.Close()
  87. var configs []MQTTConfig
  88. for rows.Next() {
  89. var cfg MQTTConfig
  90. if err := rows.Scan(&cfg.ID, &cfg.Broker, &cfg.ClientID, &cfg.Topic, &cfg.Enabled); err != nil {
  91. continue
  92. }
  93. configs = append(configs, cfg)
  94. }
  95. return configs, nil
  96. }
  97. func (d *DB) Close() error {
  98. return d.conn.Close()
  99. }