// Copyright 2026 The Gitea Authors. All rights reserved.
// SPDX-License-Identifier: MIT

//go:build !sqlite_mattn

// modernc driver is chosen as the default one (compared to mattn, ncruces)
// * mattn was used as default, but it requires CGO
// * the CI times are almost the same for these three (race detector must be disabled)
// * modernc increases the binary size about 2MB, ncruces increases about 7MB
// * compiling time: modernc is slightly slower than mattn, ncruces is the slowest

package db

import (
	"database/sql"
	"fmt"
	"strings"

	"modernc.org/sqlite"
)

func init() {
	// this driver contains huge amount of Golang code, so it is much slower when "-race" check is enabled.
	registerSQLiteConnStrMaker(makeSQLiteConnStrModerncCCGO)
	sql.Register(sqlDriverSQLite3, &sqlite.Driver{})
}

func makeSQLiteConnStrModerncCCGO(opts SQLiteConnStrOptions) (string, string, error) {
	var params []string
	// TODO: there is a changed behavior from mattn driver:
	// * mattn driver can wait for pretty long time for concurrent accesses (not limited by the busy timeout)
	// * but other drivers will report something like "database is locked (5) (SQLITE_BUSY)" if the timeout is reached
	// Maybe we need to relax the busy timeout to a reasonable long time in the future
	params = append(params, fmt.Sprintf("_pragma=busy_timeout(%d)", opts.BusyTimeout))
	params = append(params, "_txlock=immediate")
	if opts.JournalMode != "" {
		params = append(params, fmt.Sprintf("_pragma=journal_mode(%s)", opts.JournalMode))
	}
	connStr := fmt.Sprintf("file:%s?%s", opts.FilePath, strings.Join(params, "&"))
	return sqlDriverSQLite3, connStr, nil
}
