ccpoad / internal /storage /sql /system_settings.go
anyalerob's picture
Upload folder using huggingface_hub
2986042 verified
Raw
History Blame Contribute Delete
2.99 kB
package sql
import (
"context"
"database/sql"
"fmt"
"time"
"ccLoad/internal/model"
)
// GetSetting 获取单个配置项
func (s *SQLStore) GetSetting(ctx context.Context, key string) (*model.SystemSetting, error) {
row := s.db.QueryRowContext(ctx, `
SELECT `+"`key`"+`, `+"`value`"+`, value_type, description, default_value, updated_at
FROM system_settings
WHERE `+"`key`"+` = ?
`, key)
var setting model.SystemSetting
if err := row.Scan(&setting.Key, &setting.Value, &setting.ValueType, &setting.Description, &setting.DefaultValue, &setting.UpdatedAt); err != nil {
if err == sql.ErrNoRows {
return nil, model.ErrSettingNotFound
}
return nil, fmt.Errorf("query setting: %w", err)
}
return &setting, nil
}
// ListAllSettings 获取所有配置项
func (s *SQLStore) ListAllSettings(ctx context.Context) ([]*model.SystemSetting, error) {
rows, err := s.db.QueryContext(ctx, `
SELECT `+"`key`"+`, `+"`value`"+`, value_type, description, default_value, updated_at
FROM system_settings
ORDER BY `+"`key`"+` ASC
`)
if err != nil {
return nil, fmt.Errorf("query all settings: %w", err)
}
defer func() { _ = rows.Close() }()
var settings []*model.SystemSetting
for rows.Next() {
var setting model.SystemSetting
if err := rows.Scan(&setting.Key, &setting.Value, &setting.ValueType, &setting.Description, &setting.DefaultValue, &setting.UpdatedAt); err != nil {
return nil, fmt.Errorf("scan setting: %w", err)
}
settings = append(settings, &setting)
}
return settings, rows.Err()
}
// UpdateSetting 更新配置项(仅更新value和updated_at)
func (s *SQLStore) UpdateSetting(ctx context.Context, key, value string) error {
now := timeToUnix(time.Now())
result, err := s.db.ExecContext(ctx, `
UPDATE system_settings
SET `+"`value`"+` = ?, updated_at = ?
WHERE `+"`key`"+` = ?
`, value, now, key)
if err != nil {
return fmt.Errorf("update setting: %w", err)
}
rows, err := result.RowsAffected()
if err != nil {
return fmt.Errorf("check rows affected: %w", err)
}
if rows == 0 {
return model.ErrSettingNotFound
}
return nil
}
// BatchUpdateSettings 批量更新配置项(事务保护)
func (s *SQLStore) BatchUpdateSettings(ctx context.Context, updates map[string]string) error {
return s.WithTransaction(ctx, func(tx *sql.Tx) error {
now := timeToUnix(time.Now())
stmt, err := tx.PrepareContext(ctx, `
UPDATE system_settings
SET `+"`value`"+` = ?, updated_at = ?
WHERE `+"`key`"+` = ?
`)
if err != nil {
return fmt.Errorf("prepare statement: %w", err)
}
defer func() { _ = stmt.Close() }()
for key, value := range updates {
result, err := stmt.ExecContext(ctx, value, now, key)
if err != nil {
return fmt.Errorf("update setting %s: %w", key, err)
}
rows, err := result.RowsAffected()
if err != nil {
return fmt.Errorf("check rows affected for %s: %w", key, err)
}
if rows == 0 {
return model.ErrSettingNotFound
}
}
return nil
})
}