database.go 3.4 KB

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