datawareforge/modules/setting/database.go
Marcos A. Lucas 790c3fd6d2
feat: Rebranding adicional de Gitea para DATAWARE Forge e ajustes em containers, Makefile, e integração
---------------------------------------------------------------
[PT-BR]
Este commit implementa a transição do rebranding de Forgejo/Gitea para DATAWARE Forge, realizando as seguintes alterações:

- Atualização dos arquivos de configuração de ambiente e containers:
  - `.devcontainer/devcontainer.json` e `.gitpod.yml` agora exibem "DATAWARE Forge" em vez de "Gitea" ou "Forgejo".
- Ajustes no Makefile:
  - Alteração do branding do Swagger para "DATAWARE Forge API" e modificação da mensagem de licença.
- Modificações em comandos e scripts:
  - Em `cmd/generate.go`, a descrição foi atualizada para refletir "DATAWARE Forge's secrets/keys/tokens".
  - Em `contrib/environment-to-ini/environment-to-ini.go`, foram adicionadas novas variantes de prefixos de variáveis de ambiente para suportar diversas formas (DATAWARE, DW, etc.).
- Inclusão de novos arquivos de serviço e init scripts:
  - Novos scripts de init para Debian e Ubuntu foram adicionados, com descrições e comandos atualizados para DATAWARE Forge.
- Alterações em diversas partes do código (modelos, rotas, serviços, testes e webhooks):
  - Todas as referências, mensagens, headers (ex.: X-DatawareForge-OTP, X-DatawareForge-Object-Type), endpoints, logs e textos foram atualizadas para substituir “Gitea” ou “Forgejo” por “DATAWARE Forge”.
  - Ajustes em mensagens de erro e instruções de configuração (app.ini, README, etc.) para refletir a nova identidade.
- Atualizações em arquivos de configuração e templates (ex.: `custom/conf/app.example.ini`) para alinhar com a nova marca DATAWARE Forge.

Essas alterações consolidam a personalização white-label, garantindo a integridade do código original enquanto preparam o sistema para uso interno e futura distribuição a clientes.

---------------------------------------------------------------
[EN]
This commit implements a rebranding from Forgejo/Gitea to DATAWARE Forge, making the following changes:

- Updated environment and container configuration files:
  - `.devcontainer/devcontainer.json` and `.gitpod.yml` now display "DATAWARE Forge" instead of "Gitea" or "Forgejo".
- Makefile adjustments:
  - Changed the Swagger branding to "DATAWARE Forge API" and updated the license message.
- Modifications in commands and scripts:
  - In `cmd/generate.go`, the usage description now reflects "DATAWARE Forge's secrets/keys/tokens".
  - In `contrib/environment-to-ini/environment-to-ini.go`, new environment variable prefix variants have been added (DATAWARE, DW, etc.).
- Inclusion of new service and init scripts:
  - New init scripts for Debian and Ubuntu have been added, with updated descriptions and commands for DATAWARE Forge.
- Changes across various parts of the code (models, routers, services, tests, and webhooks):
  - All references, messages, headers (e.g., X-DatawareForge-OTP, X-DatawareForge-Object-Type), endpoints, logs, and texts have been updated to replace “Gitea”/“Forgejo” with “DATAWARE Forge”.
  - Adjustments in error messages and configuration instructions (app.ini, README, etc.) to align with the new identity.
- Updates in configuration files and templates (e.g., `custom/conf/app.example.ini`) to match the new DATAWARE Forge branding.

These changes consolidate the white-label customization, ensuring the original code’s integrity while preparing the system for internal use and future client distribution.

Marcos A. Lucas <mlucas@dataware.com.br>
2025-03-09 06:22:45 -03:00

204 lines
6.3 KiB
Go

// Copyright 2019 The Gitea Authors. All rights reserved.
// SPDX-License-Identifier: MIT
package setting
import (
"errors"
"fmt"
"net"
"net/url"
"os"
"path/filepath"
"strings"
"time"
)
var (
// SupportedDatabaseTypes includes all XORM supported databases type, sqlite3 maybe added by `database_sqlite3.go`
SupportedDatabaseTypes = []string{"mysql", "postgres"}
// DatabaseTypeNames contains the friendly names for all database types
DatabaseTypeNames = map[string]string{"mysql": "MySQL", "postgres": "PostgreSQL", "sqlite3": "SQLite3"}
// EnableSQLite3 use SQLite3, set by build flag
EnableSQLite3 bool
// Database holds the database settings
Database = struct {
Type DatabaseType
Host string
Name string
User string
Passwd string
Schema string
SSLMode string
Path string
LogSQL bool
MysqlCharset string
CharsetCollation string
Timeout int // seconds
SQLiteJournalMode string
DBConnectRetries int
DBConnectBackoff time.Duration
MaxIdleConns int
MaxOpenConns int
ConnMaxIdleTime time.Duration
ConnMaxLifetime time.Duration
IterateBufferSize int
AutoMigration bool
SlowQueryThreshold time.Duration
}{
Timeout: 500,
IterateBufferSize: 50,
}
)
// LoadDBSetting loads the database settings
func LoadDBSetting() {
loadDBSetting(CfgProvider)
}
func loadDBSetting(rootCfg ConfigProvider) {
sec := rootCfg.Section("database")
Database.Type = DatabaseType(sec.Key("DB_TYPE").String())
Database.Host = sec.Key("HOST").String()
Database.Name = sec.Key("NAME").String()
Database.User = sec.Key("USER").String()
if len(Database.Passwd) == 0 {
Database.Passwd = sec.Key("PASSWD").String()
}
Database.Schema = sec.Key("SCHEMA").String()
Database.SSLMode = sec.Key("SSL_MODE").MustString("disable")
Database.CharsetCollation = sec.Key("CHARSET_COLLATION").String()
Database.Path = sec.Key("PATH").MustString(filepath.Join(AppDataPath, "forgejo.db"))
Database.Timeout = sec.Key("SQLITE_TIMEOUT").MustInt(500)
Database.SQLiteJournalMode = sec.Key("SQLITE_JOURNAL_MODE").MustString("")
Database.MaxIdleConns = sec.Key("MAX_IDLE_CONNS").MustInt(2)
if Database.Type.IsMySQL() {
Database.ConnMaxLifetime = sec.Key("CONN_MAX_LIFETIME").MustDuration(3 * time.Second)
} else {
Database.ConnMaxLifetime = sec.Key("CONN_MAX_LIFETIME").MustDuration(0)
}
Database.ConnMaxIdleTime = sec.Key("CONN_MAX_IDLETIME").MustDuration(0)
Database.MaxOpenConns = sec.Key("MAX_OPEN_CONNS").MustInt(100)
Database.IterateBufferSize = sec.Key("ITERATE_BUFFER_SIZE").MustInt(50)
Database.LogSQL = sec.Key("LOG_SQL").MustBool(false)
Database.DBConnectRetries = sec.Key("DB_RETRIES").MustInt(10)
Database.DBConnectBackoff = sec.Key("DB_RETRY_BACKOFF").MustDuration(3 * time.Second)
Database.AutoMigration = sec.Key("AUTO_MIGRATION").MustBool(true)
deprecatedSetting(rootCfg, "database", "SLOW_QUERY_TRESHOLD", "database", "SLOW_QUERY_THRESHOLD", "1.23")
if sec.HasKey("SLOW_QUERY_TRESHOLD") && !sec.HasKey("SLOW_QUERY_THRESHOLD") {
Database.SlowQueryThreshold = sec.Key("SLOW_QUERY_TRESHOLD").MustDuration(5 * time.Second)
} else {
Database.SlowQueryThreshold = sec.Key("SLOW_QUERY_THRESHOLD").MustDuration(5 * time.Second)
}
}
// DBConnStr returns database connection string
func DBConnStr() (string, error) {
var connStr string
paramSep := "?"
if strings.Contains(Database.Name, paramSep) {
paramSep = "&"
}
switch Database.Type {
case "mysql":
connType := "tcp"
if len(Database.Host) > 0 && Database.Host[0] == '/' { // looks like a unix socket
connType = "unix"
}
tls := Database.SSLMode
if tls == "disable" { // allow (Postgres-inspired) default value to work in MySQL
tls = "false"
}
connStr = fmt.Sprintf("%s:%s@%s(%s)/%s%sparseTime=true&tls=%s",
Database.User, Database.Passwd, connType, Database.Host, Database.Name, paramSep, tls)
case "postgres":
connStr = getPostgreSQLConnectionString(Database.Host, Database.User, Database.Passwd, Database.Name, Database.SSLMode)
case "sqlite3":
if !EnableSQLite3 {
return "", errors.New("this DATAWARE Forge binary was not built with SQLite3 support")
}
if err := os.MkdirAll(filepath.Dir(Database.Path), os.ModePerm); err != nil {
return "", fmt.Errorf("Failed to create directories: %w", err)
}
journalMode := ""
if Database.SQLiteJournalMode != "" {
journalMode = "&_journal_mode=" + Database.SQLiteJournalMode
}
connStr = fmt.Sprintf("file:%s?cache=shared&mode=rwc&_busy_timeout=%d&_txlock=immediate%s",
Database.Path, Database.Timeout, journalMode)
default:
return "", fmt.Errorf("unknown database type: %s", Database.Type)
}
return connStr, nil
}
// parsePostgreSQLHostPort parses given input in various forms defined in
// https://www.postgresql.org/docs/current/static/libpq-connect.html#LIBPQ-CONNSTRING
// and returns proper host and port number.
func parsePostgreSQLHostPort(info string) (host, port string) {
if h, p, err := net.SplitHostPort(info); err == nil {
host, port = h, p
} else {
// treat the "info" as "host", if it's an IPv6 address, remove the wrapper
host = info
if strings.HasPrefix(host, "[") && strings.HasSuffix(host, "]") {
host = host[1 : len(host)-1]
}
}
// set fallback values
if host == "" {
host = "127.0.0.1"
}
if port == "" {
port = "5432"
}
return host, port
}
func getPostgreSQLConnectionString(dbHost, dbUser, dbPasswd, dbName, dbsslMode string) (connStr string) {
dbName, dbParam, _ := strings.Cut(dbName, "?")
host, port := parsePostgreSQLHostPort(dbHost)
connURL := url.URL{
Scheme: "postgres",
User: url.UserPassword(dbUser, dbPasswd),
Host: net.JoinHostPort(host, port),
Path: dbName,
OmitHost: false,
RawQuery: dbParam,
}
query := connURL.Query()
if strings.HasPrefix(host, "/") { // looks like a unix socket
query.Add("host", host)
connURL.Host = ":" + port
}
query.Set("sslmode", dbsslMode)
connURL.RawQuery = query.Encode()
return connURL.String()
}
type DatabaseType string
func (t DatabaseType) String() string {
return string(t)
}
func (t DatabaseType) IsSQLite3() bool {
return t == "sqlite3"
}
func (t DatabaseType) IsMySQL() bool {
return t == "mysql"
}
func (t DatabaseType) IsPostgreSQL() bool {
return t == "postgres"
}