新增 internal/logging,slog、标准库 log、GORM 与 Gin 访问日志共用同一 Handler,由 CANVAS_LOG_LEVEL / CANVAS_LOG_FORMAT 控制。info 级别不再输出成功的查询类请求、成功 SQL、message_end 等 Agent 流式事件和常规画布自动保存;4xx/5xx、慢请求、慢 SQL、SQL 失败与 panic 仍会记录,SQL 不内联参数值。
62 lines
1.4 KiB
Go
62 lines
1.4 KiB
Go
package database
|
|
|
|
import (
|
|
"errors"
|
|
"fmt"
|
|
"os"
|
|
"strings"
|
|
|
|
"infinite-canvas/backend/internal/logging"
|
|
|
|
"gorm.io/driver/postgres"
|
|
"gorm.io/driver/sqlite"
|
|
"gorm.io/gorm"
|
|
)
|
|
|
|
type Config struct {
|
|
Driver string
|
|
DSN string
|
|
DataDir string
|
|
}
|
|
|
|
func Open(config Config) (*gorm.DB, error) {
|
|
driver := strings.ToLower(strings.TrimSpace(config.Driver))
|
|
if driver == "" {
|
|
driver = "sqlite"
|
|
}
|
|
switch driver {
|
|
case "sqlite":
|
|
dsn := strings.TrimSpace(config.DSN)
|
|
if dsn == "" {
|
|
if err := os.MkdirAll(config.DataDir, 0o755); err != nil {
|
|
return nil, err
|
|
}
|
|
dsn = config.DataDir + "/open_ai_canvas.db?_busy_timeout=5000&_journal_mode=WAL&_foreign_keys=on&_synchronous=NORMAL"
|
|
}
|
|
return gorm.Open(sqlite.Open(dsn), &gorm.Config{Logger: logging.GormLogger()})
|
|
case "postgres", "postgresql":
|
|
dsn := strings.TrimSpace(config.DSN)
|
|
if dsn == "" {
|
|
return nil, errors.New("PostgreSQL 模式必须配置 DATABASE_URL")
|
|
}
|
|
return gorm.Open(postgres.Open(dsn), &gorm.Config{Logger: logging.GormLogger()})
|
|
default:
|
|
return nil, fmt.Errorf("不支持的数据库驱动:%s", driver)
|
|
}
|
|
}
|
|
|
|
func ConfigurePool(db *gorm.DB) error {
|
|
sqlDB, err := db.DB()
|
|
if err != nil {
|
|
return err
|
|
}
|
|
if db.Dialector.Name() == "postgres" {
|
|
sqlDB.SetMaxOpenConns(30)
|
|
sqlDB.SetMaxIdleConns(10)
|
|
return nil
|
|
}
|
|
sqlDB.SetMaxOpenConns(8)
|
|
sqlDB.SetMaxIdleConns(4)
|
|
return nil
|
|
}
|