mirror of
https://codeberg.org/forgejo/forgejo.git
synced 2024-12-27 06:03:51 +03:00
Merge pull request '[CHORE] Remove Microsoft SQL Server support' (#3040) from gusted/forgejo-rm-mssql into forgejo
Reviewed-on: https://codeberg.org/forgejo/forgejo/pulls/3040 Reviewed-by: Otto <otto@codeberg.org> Reviewed-by: Earl Warren <earl-warren@noreply.codeberg.org>
This commit is contained in:
commit
2d3705bb81
70 changed files with 70 additions and 789 deletions
|
@ -87,4 +87,3 @@ body:
|
||||||
- SQLite
|
- SQLite
|
||||||
- PostgreSQL
|
- PostgreSQL
|
||||||
- MySQL
|
- MySQL
|
||||||
- MSSQL
|
|
||||||
|
|
61
Makefile
61
Makefile
|
@ -196,10 +196,6 @@ TEST_PGSQL_DBNAME ?= testgitea
|
||||||
TEST_PGSQL_USERNAME ?= postgres
|
TEST_PGSQL_USERNAME ?= postgres
|
||||||
TEST_PGSQL_PASSWORD ?= postgres
|
TEST_PGSQL_PASSWORD ?= postgres
|
||||||
TEST_PGSQL_SCHEMA ?= gtestschema
|
TEST_PGSQL_SCHEMA ?= gtestschema
|
||||||
TEST_MSSQL_HOST ?= mssql:1433
|
|
||||||
TEST_MSSQL_DBNAME ?= gitea
|
|
||||||
TEST_MSSQL_USERNAME ?= sa
|
|
||||||
TEST_MSSQL_PASSWORD ?= MwantsaSecurePassword1
|
|
||||||
|
|
||||||
.PHONY: all
|
.PHONY: all
|
||||||
all: build
|
all: build
|
||||||
|
@ -309,7 +305,7 @@ clean:
|
||||||
e2e*.test \
|
e2e*.test \
|
||||||
tests/integration/gitea-integration-* \
|
tests/integration/gitea-integration-* \
|
||||||
tests/integration/indexers-* \
|
tests/integration/indexers-* \
|
||||||
tests/mysql.ini tests/pgsql.ini tests/mssql.ini man/ \
|
tests/mysql.ini tests/pgsql.ini man/ \
|
||||||
tests/e2e/gitea-e2e-*/ \
|
tests/e2e/gitea-e2e-*/ \
|
||||||
tests/e2e/indexers-*/ \
|
tests/e2e/indexers-*/ \
|
||||||
tests/e2e/reports/ tests/e2e/test-artifacts/ tests/e2e/test-snapshots/
|
tests/e2e/reports/ tests/e2e/test-artifacts/ tests/e2e/test-snapshots/
|
||||||
|
@ -612,27 +608,6 @@ test-pgsql\#%: integrations.pgsql.test generate-ini-pgsql
|
||||||
.PHONY: test-pgsql-migration
|
.PHONY: test-pgsql-migration
|
||||||
test-pgsql-migration: migrations.pgsql.test migrations.individual.pgsql.test
|
test-pgsql-migration: migrations.pgsql.test migrations.individual.pgsql.test
|
||||||
|
|
||||||
generate-ini-mssql:
|
|
||||||
sed -e 's|{{TEST_MSSQL_HOST}}|${TEST_MSSQL_HOST}|g' \
|
|
||||||
-e 's|{{TEST_MSSQL_DBNAME}}|${TEST_MSSQL_DBNAME}|g' \
|
|
||||||
-e 's|{{TEST_MSSQL_USERNAME}}|${TEST_MSSQL_USERNAME}|g' \
|
|
||||||
-e 's|{{TEST_MSSQL_PASSWORD}}|${TEST_MSSQL_PASSWORD}|g' \
|
|
||||||
-e 's|{{REPO_TEST_DIR}}|${REPO_TEST_DIR}|g' \
|
|
||||||
-e 's|{{TEST_LOGGER}}|$(or $(TEST_LOGGER),test$(COMMA)file)|g' \
|
|
||||||
-e 's|{{TEST_TYPE}}|$(or $(TEST_TYPE),integration)|g' \
|
|
||||||
tests/mssql.ini.tmpl > tests/mssql.ini
|
|
||||||
|
|
||||||
.PHONY: test-mssql
|
|
||||||
test-mssql: integrations.mssql.test generate-ini-mssql
|
|
||||||
GITEA_ROOT="$(CURDIR)" GITEA_CONF=tests/mssql.ini ./integrations.mssql.test
|
|
||||||
|
|
||||||
.PHONY: test-mssql\#%
|
|
||||||
test-mssql\#%: integrations.mssql.test generate-ini-mssql
|
|
||||||
GITEA_ROOT="$(CURDIR)" GITEA_CONF=tests/mssql.ini ./integrations.mssql.test -test.run $(subst .,/,$*)
|
|
||||||
|
|
||||||
.PHONY: test-mssql-migration
|
|
||||||
test-mssql-migration: migrations.mssql.test migrations.individual.mssql.test
|
|
||||||
|
|
||||||
.PHONY: playwright
|
.PHONY: playwright
|
||||||
playwright: deps-frontend
|
playwright: deps-frontend
|
||||||
npx playwright install $(PLAYWRIGHT_FLAGS)
|
npx playwright install $(PLAYWRIGHT_FLAGS)
|
||||||
|
@ -669,14 +644,6 @@ test-e2e-pgsql: playwright e2e.pgsql.test generate-ini-pgsql
|
||||||
test-e2e-pgsql\#%: playwright e2e.pgsql.test generate-ini-pgsql
|
test-e2e-pgsql\#%: playwright e2e.pgsql.test generate-ini-pgsql
|
||||||
GITEA_ROOT="$(CURDIR)" GITEA_CONF=tests/pgsql.ini ./e2e.pgsql.test -test.run TestE2e/$*
|
GITEA_ROOT="$(CURDIR)" GITEA_CONF=tests/pgsql.ini ./e2e.pgsql.test -test.run TestE2e/$*
|
||||||
|
|
||||||
.PHONY: test-e2e-mssql
|
|
||||||
test-e2e-mssql: playwright e2e.mssql.test generate-ini-mssql
|
|
||||||
GITEA_ROOT="$(CURDIR)" GITEA_CONF=tests/mssql.ini ./e2e.mssql.test -test.run TestE2e
|
|
||||||
|
|
||||||
.PHONY: test-e2e-mssql\#%
|
|
||||||
test-e2e-mssql\#%: playwright e2e.mssql.test generate-ini-mssql
|
|
||||||
GITEA_ROOT="$(CURDIR)" GITEA_CONF=tests/mssql.ini ./e2e.mssql.test -test.run TestE2e/$*
|
|
||||||
|
|
||||||
.PHONY: test-e2e-debugserver
|
.PHONY: test-e2e-debugserver
|
||||||
test-e2e-debugserver: e2e.sqlite.test generate-ini-sqlite
|
test-e2e-debugserver: e2e.sqlite.test generate-ini-sqlite
|
||||||
sed -i s/3003/3000/g tests/sqlite.ini
|
sed -i s/3003/3000/g tests/sqlite.ini
|
||||||
|
@ -690,10 +657,6 @@ bench-sqlite: integrations.sqlite.test generate-ini-sqlite
|
||||||
bench-mysql: integrations.mysql.test generate-ini-mysql
|
bench-mysql: integrations.mysql.test generate-ini-mysql
|
||||||
GITEA_ROOT="$(CURDIR)" GITEA_CONF=tests/mysql.ini ./integrations.mysql.test -test.cpuprofile=cpu.out -test.run DontRunTests -test.bench .
|
GITEA_ROOT="$(CURDIR)" GITEA_CONF=tests/mysql.ini ./integrations.mysql.test -test.cpuprofile=cpu.out -test.run DontRunTests -test.bench .
|
||||||
|
|
||||||
.PHONY: bench-mssql
|
|
||||||
bench-mssql: integrations.mssql.test generate-ini-mssql
|
|
||||||
GITEA_ROOT="$(CURDIR)" GITEA_CONF=tests/mssql.ini ./integrations.mssql.test -test.cpuprofile=cpu.out -test.run DontRunTests -test.bench .
|
|
||||||
|
|
||||||
.PHONY: bench-pgsql
|
.PHONY: bench-pgsql
|
||||||
bench-pgsql: integrations.pgsql.test generate-ini-pgsql
|
bench-pgsql: integrations.pgsql.test generate-ini-pgsql
|
||||||
GITEA_ROOT="$(CURDIR)" GITEA_CONF=tests/pgsql.ini ./integrations.pgsql.test -test.cpuprofile=cpu.out -test.run DontRunTests -test.bench .
|
GITEA_ROOT="$(CURDIR)" GITEA_CONF=tests/pgsql.ini ./integrations.pgsql.test -test.cpuprofile=cpu.out -test.run DontRunTests -test.bench .
|
||||||
|
@ -712,9 +675,6 @@ integrations.mysql.test: git-check $(GO_SOURCES)
|
||||||
integrations.pgsql.test: git-check $(GO_SOURCES)
|
integrations.pgsql.test: git-check $(GO_SOURCES)
|
||||||
$(GO) test $(GOTESTFLAGS) -c code.gitea.io/gitea/tests/integration -o integrations.pgsql.test
|
$(GO) test $(GOTESTFLAGS) -c code.gitea.io/gitea/tests/integration -o integrations.pgsql.test
|
||||||
|
|
||||||
integrations.mssql.test: git-check $(GO_SOURCES)
|
|
||||||
$(GO) test $(GOTESTFLAGS) -c code.gitea.io/gitea/tests/integration -o integrations.mssql.test
|
|
||||||
|
|
||||||
integrations.sqlite.test: git-check $(GO_SOURCES)
|
integrations.sqlite.test: git-check $(GO_SOURCES)
|
||||||
$(GO) test $(GOTESTFLAGS) -c code.gitea.io/gitea/tests/integration -o integrations.sqlite.test -tags '$(TEST_TAGS)'
|
$(GO) test $(GOTESTFLAGS) -c code.gitea.io/gitea/tests/integration -o integrations.sqlite.test -tags '$(TEST_TAGS)'
|
||||||
|
|
||||||
|
@ -734,11 +694,6 @@ migrations.pgsql.test: $(GO_SOURCES) generate-ini-pgsql
|
||||||
$(GO) test $(GOTESTFLAGS) -c code.gitea.io/gitea/tests/integration/migration-test -o migrations.pgsql.test
|
$(GO) test $(GOTESTFLAGS) -c code.gitea.io/gitea/tests/integration/migration-test -o migrations.pgsql.test
|
||||||
GITEA_ROOT="$(CURDIR)" GITEA_CONF=tests/pgsql.ini ./migrations.pgsql.test
|
GITEA_ROOT="$(CURDIR)" GITEA_CONF=tests/pgsql.ini ./migrations.pgsql.test
|
||||||
|
|
||||||
.PHONY: migrations.mssql.test
|
|
||||||
migrations.mssql.test: $(GO_SOURCES) generate-ini-mssql
|
|
||||||
$(GO) test $(GOTESTFLAGS) -c code.gitea.io/gitea/tests/integration/migration-test -o migrations.mssql.test
|
|
||||||
GITEA_ROOT="$(CURDIR)" GITEA_CONF=tests/mssql.ini ./migrations.mssql.test
|
|
||||||
|
|
||||||
.PHONY: migrations.sqlite.test
|
.PHONY: migrations.sqlite.test
|
||||||
migrations.sqlite.test: $(GO_SOURCES) generate-ini-sqlite
|
migrations.sqlite.test: $(GO_SOURCES) generate-ini-sqlite
|
||||||
$(GO) test $(GOTESTFLAGS) -c code.gitea.io/gitea/tests/integration/migration-test -o migrations.sqlite.test -tags '$(TEST_TAGS)'
|
$(GO) test $(GOTESTFLAGS) -c code.gitea.io/gitea/tests/integration/migration-test -o migrations.sqlite.test -tags '$(TEST_TAGS)'
|
||||||
|
@ -764,17 +719,6 @@ migrations.individual.pgsql.test: $(GO_SOURCES)
|
||||||
migrations.individual.pgsql.test\#%: $(GO_SOURCES) generate-ini-pgsql
|
migrations.individual.pgsql.test\#%: $(GO_SOURCES) generate-ini-pgsql
|
||||||
GITEA_ROOT="$(CURDIR)" GITEA_CONF=tests/pgsql.ini $(GO) test $(GOTESTFLAGS) -tags '$(TEST_TAGS)' code.gitea.io/gitea/models/migrations/$*
|
GITEA_ROOT="$(CURDIR)" GITEA_CONF=tests/pgsql.ini $(GO) test $(GOTESTFLAGS) -tags '$(TEST_TAGS)' code.gitea.io/gitea/models/migrations/$*
|
||||||
|
|
||||||
|
|
||||||
.PHONY: migrations.individual.mssql.test
|
|
||||||
migrations.individual.mssql.test: $(GO_SOURCES) generate-ini-mssql
|
|
||||||
for pkg in $(MIGRATION_PACKAGES); do \
|
|
||||||
GITEA_ROOT="$(CURDIR)" GITEA_CONF=tests/mssql.ini $(GO) test $(GOTESTFLAGS) -tags '$(TEST_TAGS)' -test.failfast $$pkg || exit 1; \
|
|
||||||
done
|
|
||||||
|
|
||||||
.PHONY: migrations.individual.mssql.test\#%
|
|
||||||
migrations.individual.mssql.test\#%: $(GO_SOURCES) generate-ini-mssql
|
|
||||||
GITEA_ROOT="$(CURDIR)" GITEA_CONF=tests/mssql.ini $(GO) test $(GOTESTFLAGS) -tags '$(TEST_TAGS)' code.gitea.io/gitea/models/migrations/$*
|
|
||||||
|
|
||||||
.PHONY: migrations.individual.sqlite.test
|
.PHONY: migrations.individual.sqlite.test
|
||||||
migrations.individual.sqlite.test: $(GO_SOURCES) generate-ini-sqlite
|
migrations.individual.sqlite.test: $(GO_SOURCES) generate-ini-sqlite
|
||||||
for pkg in $(MIGRATION_PACKAGES); do \
|
for pkg in $(MIGRATION_PACKAGES); do \
|
||||||
|
@ -791,9 +735,6 @@ e2e.mysql.test: $(GO_SOURCES)
|
||||||
e2e.pgsql.test: $(GO_SOURCES)
|
e2e.pgsql.test: $(GO_SOURCES)
|
||||||
$(GO) test $(GOTESTFLAGS) -c code.gitea.io/gitea/tests/e2e -o e2e.pgsql.test
|
$(GO) test $(GOTESTFLAGS) -c code.gitea.io/gitea/tests/e2e -o e2e.pgsql.test
|
||||||
|
|
||||||
e2e.mssql.test: $(GO_SOURCES)
|
|
||||||
$(GO) test $(GOTESTFLAGS) -c code.gitea.io/gitea/tests/e2e -o e2e.mssql.test
|
|
||||||
|
|
||||||
e2e.sqlite.test: $(GO_SOURCES)
|
e2e.sqlite.test: $(GO_SOURCES)
|
||||||
$(GO) test $(GOTESTFLAGS) -c code.gitea.io/gitea/tests/e2e -o e2e.sqlite.test -tags '$(TEST_TAGS)'
|
$(GO) test $(GOTESTFLAGS) -c code.gitea.io/gitea/tests/e2e -o e2e.sqlite.test -tags '$(TEST_TAGS)'
|
||||||
|
|
||||||
|
|
15
assets/go-licenses.json
generated
15
assets/go-licenses.json
generated
File diff suppressed because one or more lines are too long
|
@ -17,7 +17,7 @@ import (
|
||||||
var cmdDoctorConvert = &cli.Command{
|
var cmdDoctorConvert = &cli.Command{
|
||||||
Name: "convert",
|
Name: "convert",
|
||||||
Usage: "Convert the database",
|
Usage: "Convert the database",
|
||||||
Description: "A command to convert an existing MySQL database from utf8 to utf8mb4 or MSSQL database from varchar to nvarchar",
|
Description: "A command to convert an existing MySQL database from utf8 to utf8mb4",
|
||||||
Action: runDoctorConvert,
|
Action: runDoctorConvert,
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -35,21 +35,14 @@ func runDoctorConvert(ctx *cli.Context) error {
|
||||||
log.Info("Log path: %s", setting.Log.RootPath)
|
log.Info("Log path: %s", setting.Log.RootPath)
|
||||||
log.Info("Configuration file: %s", setting.CustomConf)
|
log.Info("Configuration file: %s", setting.CustomConf)
|
||||||
|
|
||||||
switch {
|
if setting.Database.Type.IsMySQL() {
|
||||||
case setting.Database.Type.IsMySQL():
|
|
||||||
if err := db.ConvertDatabaseTable(); err != nil {
|
if err := db.ConvertDatabaseTable(); err != nil {
|
||||||
log.Fatal("Failed to convert database & table: %v", err)
|
log.Fatal("Failed to convert database & table: %v", err)
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
fmt.Println("Converted successfully, please confirm your database's character set is now utf8mb4")
|
fmt.Println("Converted successfully, please confirm your database's character set is now utf8mb4")
|
||||||
case setting.Database.Type.IsMSSQL():
|
} else {
|
||||||
if err := db.ConvertVarcharToNVarchar(); err != nil {
|
fmt.Println("This command can only be used with a MySQL database")
|
||||||
log.Fatal("Failed to convert database from varchar to nvarchar: %v", err)
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
fmt.Println("Converted successfully, please confirm your database's all columns character is NVARCHAR now")
|
|
||||||
default:
|
|
||||||
fmt.Println("This command can only be used with a MySQL or MSSQL database")
|
|
||||||
}
|
}
|
||||||
|
|
||||||
return nil
|
return nil
|
||||||
|
|
|
@ -128,7 +128,7 @@ It can be used for backup and capture Forgejo server image to send to maintainer
|
||||||
&cli.StringFlag{
|
&cli.StringFlag{
|
||||||
Name: "database",
|
Name: "database",
|
||||||
Aliases: []string{"d"},
|
Aliases: []string{"d"},
|
||||||
Usage: "Specify the database SQL syntax: sqlite3, mysql, mssql, postgres",
|
Usage: "Specify the database SQL syntax: sqlite3, mysql, postgres",
|
||||||
},
|
},
|
||||||
&cli.BoolFlag{
|
&cli.BoolFlag{
|
||||||
Name: "skip-repository",
|
Name: "skip-repository",
|
||||||
|
|
3
go.mod
3
go.mod
|
@ -22,7 +22,6 @@ require (
|
||||||
github.com/buildkite/terminal-to-html/v3 v3.10.1
|
github.com/buildkite/terminal-to-html/v3 v3.10.1
|
||||||
github.com/caddyserver/certmagic v0.20.0
|
github.com/caddyserver/certmagic v0.20.0
|
||||||
github.com/chi-middleware/proxy v1.1.1
|
github.com/chi-middleware/proxy v1.1.1
|
||||||
github.com/denisenkom/go-mssqldb v0.12.3
|
|
||||||
github.com/dimiro1/reply v0.0.0-20200315094148-d0136a4c9e21
|
github.com/dimiro1/reply v0.0.0-20200315094148-d0136a4c9e21
|
||||||
github.com/djherbis/buffer v1.2.0
|
github.com/djherbis/buffer v1.2.0
|
||||||
github.com/djherbis/nio/v3 v3.0.1
|
github.com/djherbis/nio/v3 v3.0.1
|
||||||
|
@ -192,8 +191,6 @@ require (
|
||||||
github.com/go-webauthn/x v0.1.6 // indirect
|
github.com/go-webauthn/x v0.1.6 // indirect
|
||||||
github.com/goccy/go-json v0.10.2 // indirect
|
github.com/goccy/go-json v0.10.2 // indirect
|
||||||
github.com/golang-jwt/jwt/v4 v4.5.0 // indirect
|
github.com/golang-jwt/jwt/v4 v4.5.0 // indirect
|
||||||
github.com/golang-sql/civil v0.0.0-20220223132316-b832511892a9 // indirect
|
|
||||||
github.com/golang-sql/sqlexp v0.1.0 // indirect
|
|
||||||
github.com/golang/geo v0.0.0-20230421003525-6adc56603217 // indirect
|
github.com/golang/geo v0.0.0-20230421003525-6adc56603217 // indirect
|
||||||
github.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da // indirect
|
github.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da // indirect
|
||||||
github.com/golang/protobuf v1.5.3 // indirect
|
github.com/golang/protobuf v1.5.3 // indirect
|
||||||
|
|
10
go.sum
10
go.sum
|
@ -70,9 +70,6 @@ github.com/42wim/sshsig v0.0.0-20211121163825-841cf5bbc121 h1:r3qt8PCHnfjOv9PN3H
|
||||||
github.com/42wim/sshsig v0.0.0-20211121163825-841cf5bbc121/go.mod h1:Ock8XgA7pvULhIaHGAk/cDnRfNrF9Jey81nPcc403iU=
|
github.com/42wim/sshsig v0.0.0-20211121163825-841cf5bbc121/go.mod h1:Ock8XgA7pvULhIaHGAk/cDnRfNrF9Jey81nPcc403iU=
|
||||||
github.com/6543/go-version v1.3.1 h1:HvOp+Telns7HWJ2Xo/05YXQSB2bE0WmVgbHqwMPZT4U=
|
github.com/6543/go-version v1.3.1 h1:HvOp+Telns7HWJ2Xo/05YXQSB2bE0WmVgbHqwMPZT4U=
|
||||||
github.com/6543/go-version v1.3.1/go.mod h1:oqFAHCwtLVUTLdhQmVZWYvaHXTdsbB4SY85at64SQEo=
|
github.com/6543/go-version v1.3.1/go.mod h1:oqFAHCwtLVUTLdhQmVZWYvaHXTdsbB4SY85at64SQEo=
|
||||||
github.com/Azure/azure-sdk-for-go/sdk/azcore v0.19.0/go.mod h1:h6H6c8enJmmocHUbLiiGY6sx7f9i+X3m1CHdd5c6Rdw=
|
|
||||||
github.com/Azure/azure-sdk-for-go/sdk/azidentity v0.11.0/go.mod h1:HcM1YX14R7CJcghJGOYCgdezslRSVzqwLf/q+4Y2r/0=
|
|
||||||
github.com/Azure/azure-sdk-for-go/sdk/internal v0.7.0/go.mod h1:yqy467j36fJxcRV2TzfVZ1pCb5vxm4BtZPUdYWe/Xo8=
|
|
||||||
github.com/Azure/go-ntlmssp v0.0.0-20221128193559-754e69321358 h1:mFRzDkZVAjdal+s7s0MwaRv9igoPqLRdzOLzw/8Xvq8=
|
github.com/Azure/go-ntlmssp v0.0.0-20221128193559-754e69321358 h1:mFRzDkZVAjdal+s7s0MwaRv9igoPqLRdzOLzw/8Xvq8=
|
||||||
github.com/Azure/go-ntlmssp v0.0.0-20221128193559-754e69321358/go.mod h1:chxPXzSsl7ZWRAuOIE23GDNzjWuZquvFlgA8xmpunjU=
|
github.com/Azure/go-ntlmssp v0.0.0-20221128193559-754e69321358/go.mod h1:chxPXzSsl7ZWRAuOIE23GDNzjWuZquvFlgA8xmpunjU=
|
||||||
github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU=
|
github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU=
|
||||||
|
@ -236,7 +233,6 @@ github.com/dlclark/regexp2 v1.4.0/go.mod h1:2pZnwuY/m+8K6iRw6wQdMtk+rH5tNGR1i55k
|
||||||
github.com/dlclark/regexp2 v1.7.0/go.mod h1:DHkYz0B9wPfa6wondMfaivmHpzrQ3v9q8cnmRbL6yW8=
|
github.com/dlclark/regexp2 v1.7.0/go.mod h1:DHkYz0B9wPfa6wondMfaivmHpzrQ3v9q8cnmRbL6yW8=
|
||||||
github.com/dlclark/regexp2 v1.11.0 h1:G/nrcoOa7ZXlpoa/91N3X7mM3r8eIlMBBJZvsz/mxKI=
|
github.com/dlclark/regexp2 v1.11.0 h1:G/nrcoOa7ZXlpoa/91N3X7mM3r8eIlMBBJZvsz/mxKI=
|
||||||
github.com/dlclark/regexp2 v1.11.0/go.mod h1:DHkYz0B9wPfa6wondMfaivmHpzrQ3v9q8cnmRbL6yW8=
|
github.com/dlclark/regexp2 v1.11.0/go.mod h1:DHkYz0B9wPfa6wondMfaivmHpzrQ3v9q8cnmRbL6yW8=
|
||||||
github.com/dnaeon/go-vcr v1.2.0/go.mod h1:R4UdLID7HZT3taECzJs4YgbbH6PIGXB6W/sc5OLb6RQ=
|
|
||||||
github.com/dsnet/compress v0.0.2-0.20210315054119-f66993602bf5 h1:iFaUwBSo5Svw6L7HYpRu/0lE3e0BaElwnNO1qkNQxBY=
|
github.com/dsnet/compress v0.0.2-0.20210315054119-f66993602bf5 h1:iFaUwBSo5Svw6L7HYpRu/0lE3e0BaElwnNO1qkNQxBY=
|
||||||
github.com/dsnet/compress v0.0.2-0.20210315054119-f66993602bf5/go.mod h1:qssHWj60/X5sZFNxpG4HBPDHVqxNm4DfnCKgrbZOT+s=
|
github.com/dsnet/compress v0.0.2-0.20210315054119-f66993602bf5/go.mod h1:qssHWj60/X5sZFNxpG4HBPDHVqxNm4DfnCKgrbZOT+s=
|
||||||
github.com/dsnet/golib v0.0.0-20171103203638-1ea166775780/go.mod h1:Lj+Z9rebOhdfkVLjJ8T6VcRQv3SXugXy999NBtR9aFY=
|
github.com/dsnet/golib v0.0.0-20171103203638-1ea166775780/go.mod h1:Lj+Z9rebOhdfkVLjJ8T6VcRQv3SXugXy999NBtR9aFY=
|
||||||
|
@ -376,7 +372,6 @@ github.com/golang-jwt/jwt/v4 v4.5.0 h1:7cYmW1XlMY7h7ii7UhUyChSgS5wUJEnm9uZVTGqOW
|
||||||
github.com/golang-jwt/jwt/v4 v4.5.0/go.mod h1:m21LjoU+eqJr34lmDMbreY2eSTRJ1cv77w39/MY0Ch0=
|
github.com/golang-jwt/jwt/v4 v4.5.0/go.mod h1:m21LjoU+eqJr34lmDMbreY2eSTRJ1cv77w39/MY0Ch0=
|
||||||
github.com/golang-jwt/jwt/v5 v5.2.0 h1:d/ix8ftRUorsN+5eMIlF4T6J8CAt9rch3My2winC1Jw=
|
github.com/golang-jwt/jwt/v5 v5.2.0 h1:d/ix8ftRUorsN+5eMIlF4T6J8CAt9rch3My2winC1Jw=
|
||||||
github.com/golang-jwt/jwt/v5 v5.2.0/go.mod h1:pqrtFR0X4osieyHYxtmOUWsAWrfe1Q5UVIyoH402zdk=
|
github.com/golang-jwt/jwt/v5 v5.2.0/go.mod h1:pqrtFR0X4osieyHYxtmOUWsAWrfe1Q5UVIyoH402zdk=
|
||||||
github.com/golang-sql/civil v0.0.0-20190719163853-cb61b32ac6fe/go.mod h1:8vg3r2VgvsThLBIFL93Qb5yWzgyZWhEmBwUJWevAkK0=
|
|
||||||
github.com/golang-sql/civil v0.0.0-20220223132316-b832511892a9 h1:au07oEsX2xN0ktxqI+Sida1w446QrXBRJ0nee3SNZlA=
|
github.com/golang-sql/civil v0.0.0-20220223132316-b832511892a9 h1:au07oEsX2xN0ktxqI+Sida1w446QrXBRJ0nee3SNZlA=
|
||||||
github.com/golang-sql/civil v0.0.0-20220223132316-b832511892a9/go.mod h1:8vg3r2VgvsThLBIFL93Qb5yWzgyZWhEmBwUJWevAkK0=
|
github.com/golang-sql/civil v0.0.0-20220223132316-b832511892a9/go.mod h1:8vg3r2VgvsThLBIFL93Qb5yWzgyZWhEmBwUJWevAkK0=
|
||||||
github.com/golang-sql/sqlexp v0.1.0 h1:ZCD6MBpcuOVfGVqsEmY5/4FtYiKz6tSyUv9LPEDei6A=
|
github.com/golang-sql/sqlexp v0.1.0 h1:ZCD6MBpcuOVfGVqsEmY5/4FtYiKz6tSyUv9LPEDei6A=
|
||||||
|
@ -640,7 +635,6 @@ github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd h1:TRLaZ9cD/w
|
||||||
github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q=
|
github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q=
|
||||||
github.com/modern-go/reflect2 v1.0.2 h1:xBagoLtFs94CBntxluKeaWgTMpvLxC4ur3nMaC9Gz0M=
|
github.com/modern-go/reflect2 v1.0.2 h1:xBagoLtFs94CBntxluKeaWgTMpvLxC4ur3nMaC9Gz0M=
|
||||||
github.com/modern-go/reflect2 v1.0.2/go.mod h1:yWuevngMOJpCy52FWWMvUC8ws7m/LJsjYzDa0/r8luk=
|
github.com/modern-go/reflect2 v1.0.2/go.mod h1:yWuevngMOJpCy52FWWMvUC8ws7m/LJsjYzDa0/r8luk=
|
||||||
github.com/modocache/gover v0.0.0-20171022184752-b58185e213c5/go.mod h1:caMODM3PzxT8aQXRPkAt8xlV/e7d7w8GM5g0fa5F0D8=
|
|
||||||
github.com/montanaflynn/stats v0.0.0-20171201202039-1bf9dbcd8cbe/go.mod h1:wL8QJuTMNUDYhXwkmfOly8iTdp5TEcJFWZD2D7SIkUc=
|
github.com/montanaflynn/stats v0.0.0-20171201202039-1bf9dbcd8cbe/go.mod h1:wL8QJuTMNUDYhXwkmfOly8iTdp5TEcJFWZD2D7SIkUc=
|
||||||
github.com/mrjones/oauth v0.0.0-20180629183705-f4e24b6d100c/go.mod h1:skjdDftzkFALcuGzYSklqYd8gvat6F1gZJ4YPVbkZpM=
|
github.com/mrjones/oauth v0.0.0-20180629183705-f4e24b6d100c/go.mod h1:skjdDftzkFALcuGzYSklqYd8gvat6F1gZJ4YPVbkZpM=
|
||||||
github.com/mrjones/oauth v0.0.0-20190623134757-126b35219450 h1:j2kD3MT1z4PXCiUllUJF9mWUESr9TWKS7iEKsQ/IipM=
|
github.com/mrjones/oauth v0.0.0-20190623134757-126b35219450 h1:j2kD3MT1z4PXCiUllUJF9mWUESr9TWKS7iEKsQ/IipM=
|
||||||
|
@ -691,7 +685,6 @@ github.com/pierrec/lz4/v4 v4.1.21 h1:yOVMLb6qSIDP67pl/5F7RepeKYu/VmTyEXvuMI5d9mQ
|
||||||
github.com/pierrec/lz4/v4 v4.1.21/go.mod h1:gZWDp/Ze/IJXGXf23ltt2EXimqmTUXEy0GFuRQyBid4=
|
github.com/pierrec/lz4/v4 v4.1.21/go.mod h1:gZWDp/Ze/IJXGXf23ltt2EXimqmTUXEy0GFuRQyBid4=
|
||||||
github.com/pjbgf/sha1cd v0.3.0 h1:4D5XXmUUBUl/xQ6IjCkEAbqXskkq/4O7LmGn0AqMDs4=
|
github.com/pjbgf/sha1cd v0.3.0 h1:4D5XXmUUBUl/xQ6IjCkEAbqXskkq/4O7LmGn0AqMDs4=
|
||||||
github.com/pjbgf/sha1cd v0.3.0/go.mod h1:nZ1rrWOcGJ5uZgEEVL1VUM9iRQiZvWdbZjkKyFzPPsI=
|
github.com/pjbgf/sha1cd v0.3.0/go.mod h1:nZ1rrWOcGJ5uZgEEVL1VUM9iRQiZvWdbZjkKyFzPPsI=
|
||||||
github.com/pkg/browser v0.0.0-20180916011732-0a3d74bf9ce4/go.mod h1:4OwLy04Bl9Ef3GJJCoec+30X3LQs/0/m4HFRt/2LUSA=
|
|
||||||
github.com/pkg/diff v0.0.0-20210226163009-20ebb0f2a09e/go.mod h1:pJLUxLENpZxwdsKMEsNbx1VGcRFpLqf3715MtcvvzbA=
|
github.com/pkg/diff v0.0.0-20210226163009-20ebb0f2a09e/go.mod h1:pJLUxLENpZxwdsKMEsNbx1VGcRFpLqf3715MtcvvzbA=
|
||||||
github.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4=
|
github.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4=
|
||||||
github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=
|
github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=
|
||||||
|
@ -885,7 +878,6 @@ golang.org/x/crypto v0.0.0-20190510104115-cbcb75029529/go.mod h1:yigFU9vqHzYiE8U
|
||||||
golang.org/x/crypto v0.0.0-20190605123033-f99c8df09eb5/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=
|
golang.org/x/crypto v0.0.0-20190605123033-f99c8df09eb5/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=
|
||||||
golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=
|
golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=
|
||||||
golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto=
|
golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto=
|
||||||
golang.org/x/crypto v0.0.0-20201016220609-9e8e0b390897/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto=
|
|
||||||
golang.org/x/crypto v0.0.0-20201221181555-eec23a3978ad/go.mod h1:jdWPYTVW3xRLrWPugEBEK3UY2ZEsg3UU495nc5E+M+I=
|
golang.org/x/crypto v0.0.0-20201221181555-eec23a3978ad/go.mod h1:jdWPYTVW3xRLrWPugEBEK3UY2ZEsg3UU495nc5E+M+I=
|
||||||
golang.org/x/crypto v0.0.0-20210513164829-c07d793c2f9a/go.mod h1:P+XmwS30IXTQdn5tA2iutPOUgjI07+tq3H3K9MVA1s8=
|
golang.org/x/crypto v0.0.0-20210513164829-c07d793c2f9a/go.mod h1:P+XmwS30IXTQdn5tA2iutPOUgjI07+tq3H3K9MVA1s8=
|
||||||
golang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc=
|
golang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc=
|
||||||
|
@ -967,7 +959,6 @@ golang.org/x/net v0.0.0-20200822124328-c89045814202/go.mod h1:/O7V0waA8r7cgGh81R
|
||||||
golang.org/x/net v0.0.0-20200927032502-5d4f70055728/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA=
|
golang.org/x/net v0.0.0-20200927032502-5d4f70055728/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA=
|
||||||
golang.org/x/net v0.0.0-20201021035429-f5854403a974/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU=
|
golang.org/x/net v0.0.0-20201021035429-f5854403a974/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU=
|
||||||
golang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg=
|
golang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg=
|
||||||
golang.org/x/net v0.0.0-20210610132358-84b48f89b13b/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y=
|
|
||||||
golang.org/x/net v0.0.0-20210916014120-12bc252f5db8/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y=
|
golang.org/x/net v0.0.0-20210916014120-12bc252f5db8/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y=
|
||||||
golang.org/x/net v0.0.0-20211112202133-69e39bad7dc2/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y=
|
golang.org/x/net v0.0.0-20211112202133-69e39bad7dc2/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y=
|
||||||
golang.org/x/net v0.0.0-20220225172249-27dd8689420f/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk=
|
golang.org/x/net v0.0.0-20220225172249-27dd8689420f/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk=
|
||||||
|
@ -1262,7 +1253,6 @@ gopkg.in/yaml.v2 v2.3.0/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
|
||||||
gopkg.in/yaml.v2 v2.4.0 h1:D8xgwECY7CYvx+Y2n4sBz93Jn9JRvxdiyyo8CTfuKaY=
|
gopkg.in/yaml.v2 v2.4.0 h1:D8xgwECY7CYvx+Y2n4sBz93Jn9JRvxdiyyo8CTfuKaY=
|
||||||
gopkg.in/yaml.v2 v2.4.0/go.mod h1:RDklbk79AGWmwhnvt/jBztapEOGDOx6ZbXqjP6csGnQ=
|
gopkg.in/yaml.v2 v2.4.0/go.mod h1:RDklbk79AGWmwhnvt/jBztapEOGDOx6ZbXqjP6csGnQ=
|
||||||
gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=
|
gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=
|
||||||
gopkg.in/yaml.v3 v3.0.0-20210107192922-496545a6307b/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=
|
|
||||||
gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA=
|
gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA=
|
||||||
gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=
|
gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=
|
||||||
honnef.co/go/tools v0.0.0-20190102054323-c2f93a96b099/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4=
|
honnef.co/go/tools v0.0.0-20190102054323-c2f93a96b099/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4=
|
||||||
|
|
|
@ -39,12 +39,8 @@ func getUserHeatmapData(ctx context.Context, user *user_model.User, team *organi
|
||||||
// Group by 15 minute intervals which will allow the client to accurately shift the timestamp to their timezone.
|
// Group by 15 minute intervals which will allow the client to accurately shift the timestamp to their timezone.
|
||||||
// The interval is based on the fact that there are timezones such as UTC +5:30 and UTC +12:45.
|
// The interval is based on the fact that there are timezones such as UTC +5:30 and UTC +12:45.
|
||||||
groupBy := "created_unix / 900 * 900"
|
groupBy := "created_unix / 900 * 900"
|
||||||
groupByName := "timestamp" // We need this extra case because mssql doesn't allow grouping by alias
|
if setting.Database.Type.IsMySQL() {
|
||||||
switch {
|
|
||||||
case setting.Database.Type.IsMySQL():
|
|
||||||
groupBy = "created_unix DIV 900 * 900"
|
groupBy = "created_unix DIV 900 * 900"
|
||||||
case setting.Database.Type.IsMSSQL():
|
|
||||||
groupByName = groupBy
|
|
||||||
}
|
}
|
||||||
|
|
||||||
cond, err := activityQueryCondition(ctx, GetFeedsOptions{
|
cond, err := activityQueryCondition(ctx, GetFeedsOptions{
|
||||||
|
@ -67,7 +63,7 @@ func getUserHeatmapData(ctx context.Context, user *user_model.User, team *organi
|
||||||
Table("action").
|
Table("action").
|
||||||
Where(cond).
|
Where(cond).
|
||||||
And("created_unix > ?", timeutil.TimeStampNow()-31536000).
|
And("created_unix > ?", timeutil.TimeStampNow()-31536000).
|
||||||
GroupBy(groupByName).
|
GroupBy("timestamp").
|
||||||
OrderBy("timestamp").
|
OrderBy("timestamp").
|
||||||
Find(&hdata)
|
Find(&hdata)
|
||||||
}
|
}
|
||||||
|
|
|
@ -41,20 +41,6 @@ func findAvailableCollationsMySQL(x *xorm.Engine) (ret container.Set[string], er
|
||||||
return ret, nil
|
return ret, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
func findAvailableCollationsMSSQL(x *xorm.Engine) (ret container.Set[string], err error) {
|
|
||||||
var res []struct {
|
|
||||||
Name string
|
|
||||||
}
|
|
||||||
if err = x.SQL("SELECT * FROM sys.fn_helpcollations() WHERE name LIKE '%[_]CS[_]AS%'").Find(&res); err != nil {
|
|
||||||
return nil, err
|
|
||||||
}
|
|
||||||
ret = make(container.Set[string], len(res))
|
|
||||||
for _, r := range res {
|
|
||||||
ret.Add(r.Name)
|
|
||||||
}
|
|
||||||
return ret, nil
|
|
||||||
}
|
|
||||||
|
|
||||||
func CheckCollations(x *xorm.Engine) (*CheckCollationsResult, error) {
|
func CheckCollations(x *xorm.Engine) (*CheckCollationsResult, error) {
|
||||||
dbTables, err := x.DBMetas()
|
dbTables, err := x.DBMetas()
|
||||||
if err != nil {
|
if err != nil {
|
||||||
|
@ -84,18 +70,6 @@ func CheckCollations(x *xorm.Engine) (*CheckCollationsResult, error) {
|
||||||
// At the moment, it's safe to ignore the database difference, just trim the prefix and compare. It could be fixed easily if there is any problem in the future.
|
// At the moment, it's safe to ignore the database difference, just trim the prefix and compare. It could be fixed easily if there is any problem in the future.
|
||||||
return a == b || strings.TrimPrefix(a, "utf8mb4_") == strings.TrimPrefix(b, "utf8mb4_")
|
return a == b || strings.TrimPrefix(a, "utf8mb4_") == strings.TrimPrefix(b, "utf8mb4_")
|
||||||
}
|
}
|
||||||
} else if x.Dialect().URI().DBType == schemas.MSSQL {
|
|
||||||
if _, err = x.SQL("SELECT DATABASEPROPERTYEX(DB_NAME(), 'Collation')").Get(&res.DatabaseCollation); err != nil {
|
|
||||||
return nil, err
|
|
||||||
}
|
|
||||||
res.IsCollationCaseSensitive = func(s string) bool {
|
|
||||||
return strings.HasSuffix(s, "_CS_AS")
|
|
||||||
}
|
|
||||||
candidateCollations = []string{"Latin1_General_CS_AS"}
|
|
||||||
res.AvailableCollation, err = findAvailableCollationsMSSQL(x)
|
|
||||||
if err != nil {
|
|
||||||
return nil, err
|
|
||||||
}
|
|
||||||
} else {
|
} else {
|
||||||
return nil, nil
|
return nil, nil
|
||||||
}
|
}
|
||||||
|
@ -146,10 +120,6 @@ func alterDatabaseCollation(x *xorm.Engine, collation string) error {
|
||||||
if x.Dialect().URI().DBType == schemas.MYSQL {
|
if x.Dialect().URI().DBType == schemas.MYSQL {
|
||||||
_, err := x.Exec("ALTER DATABASE CHARACTER SET utf8mb4 COLLATE " + collation)
|
_, err := x.Exec("ALTER DATABASE CHARACTER SET utf8mb4 COLLATE " + collation)
|
||||||
return err
|
return err
|
||||||
} else if x.Dialect().URI().DBType == schemas.MSSQL {
|
|
||||||
// TODO: MSSQL has many limitations on changing database collation, it could fail in many cases.
|
|
||||||
_, err := x.Exec("ALTER DATABASE CURRENT COLLATE " + collation)
|
|
||||||
return err
|
|
||||||
}
|
}
|
||||||
return errors.New("unsupported database type")
|
return errors.New("unsupported database type")
|
||||||
}
|
}
|
||||||
|
@ -165,12 +135,11 @@ func preprocessDatabaseCollation(x *xorm.Engine) {
|
||||||
}
|
}
|
||||||
|
|
||||||
// try to alter database collation to expected if the database is empty, it might fail in some cases (and it isn't necessary to succeed)
|
// try to alter database collation to expected if the database is empty, it might fail in some cases (and it isn't necessary to succeed)
|
||||||
// at the moment, there is no "altering" solution for MSSQL, site admin should manually change the database collation
|
// at the moment.
|
||||||
if !r.CollationEquals(r.DatabaseCollation, r.ExpectedCollation) && r.ExistingTableNumber == 0 {
|
if !r.CollationEquals(r.DatabaseCollation, r.ExpectedCollation) && r.ExistingTableNumber == 0 {
|
||||||
if err = alterDatabaseCollation(x, r.ExpectedCollation); err != nil {
|
if err = alterDatabaseCollation(x, r.ExpectedCollation); err != nil {
|
||||||
log.Error("Failed to change database collation to %q: %v", r.ExpectedCollation, err)
|
log.Error("Failed to change database collation to %q: %v", r.ExpectedCollation, err)
|
||||||
} else {
|
} else {
|
||||||
_, _ = x.Exec("SELECT 1") // after "altering", MSSQL's session becomes invalid, so make a simple query to "refresh" the session
|
|
||||||
if r, err = CheckCollations(x); err != nil {
|
if r, err = CheckCollations(x); err != nil {
|
||||||
log.Error("Failed to check database collation again after altering: %v", err) // impossible case
|
log.Error("Failed to check database collation again after altering: %v", err) // impossible case
|
||||||
return
|
return
|
||||||
|
|
|
@ -47,8 +47,6 @@ func BuilderDialect() string {
|
||||||
return builder.SQLITE
|
return builder.SQLITE
|
||||||
case setting.Database.Type.IsPostgreSQL():
|
case setting.Database.Type.IsPostgreSQL():
|
||||||
return builder.POSTGRES
|
return builder.POSTGRES
|
||||||
case setting.Database.Type.IsMSSQL():
|
|
||||||
return builder.MSSQL
|
|
||||||
default:
|
default:
|
||||||
return ""
|
return ""
|
||||||
}
|
}
|
||||||
|
|
|
@ -47,33 +47,6 @@ func ConvertDatabaseTable() error {
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
// ConvertVarcharToNVarchar converts database and tables from varchar to nvarchar if it's mssql
|
|
||||||
func ConvertVarcharToNVarchar() error {
|
|
||||||
if x.Dialect().URI().DBType != schemas.MSSQL {
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
|
|
||||||
sess := x.NewSession()
|
|
||||||
defer sess.Close()
|
|
||||||
res, err := sess.QuerySliceString(`SELECT 'ALTER TABLE ' + OBJECT_NAME(SC.object_id) + ' MODIFY SC.name NVARCHAR(' + CONVERT(VARCHAR(5),SC.max_length) + ')'
|
|
||||||
FROM SYS.columns SC
|
|
||||||
JOIN SYS.types ST
|
|
||||||
ON SC.system_type_id = ST.system_type_id
|
|
||||||
AND SC.user_type_id = ST.user_type_id
|
|
||||||
WHERE ST.name ='varchar'`)
|
|
||||||
if err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
for _, row := range res {
|
|
||||||
if len(row) == 1 {
|
|
||||||
if _, err = sess.Exec(row[0]); err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
|
|
||||||
// Cell2Int64 converts a xorm.Cell type to int64,
|
// Cell2Int64 converts a xorm.Cell type to int64,
|
||||||
// and handles possible irregular cases.
|
// and handles possible irregular cases.
|
||||||
func Cell2Int64(val xorm.Cell) int64 {
|
func Cell2Int64(val xorm.Cell) int64 {
|
||||||
|
|
|
@ -22,9 +22,8 @@ import (
|
||||||
"xorm.io/xorm/names"
|
"xorm.io/xorm/names"
|
||||||
"xorm.io/xorm/schemas"
|
"xorm.io/xorm/schemas"
|
||||||
|
|
||||||
_ "github.com/denisenkom/go-mssqldb" // Needed for the MSSQL driver
|
_ "github.com/go-sql-driver/mysql" // Needed for the MySQL driver
|
||||||
_ "github.com/go-sql-driver/mysql" // Needed for the MySQL driver
|
_ "github.com/lib/pq" // Needed for the Postgresql driver
|
||||||
_ "github.com/lib/pq" // Needed for the Postgresql driver
|
|
||||||
)
|
)
|
||||||
|
|
||||||
var (
|
var (
|
||||||
|
@ -114,10 +113,8 @@ func newXORMEngine() (*xorm.Engine, error) {
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
if setting.Database.Type == "mysql" {
|
if setting.Database.Type.IsMySQL() {
|
||||||
engine.Dialect().SetParams(map[string]string{"rowFormat": "DYNAMIC"})
|
engine.Dialect().SetParams(map[string]string{"rowFormat": "DYNAMIC"})
|
||||||
} else if setting.Database.Type == "mssql" {
|
|
||||||
engine.Dialect().SetParams(map[string]string{"DEFAULT_VARCHAR": "nvarchar"})
|
|
||||||
}
|
}
|
||||||
engine.SetSchema(setting.Database.Schema)
|
engine.SetSchema(setting.Database.Schema)
|
||||||
return engine, nil
|
return engine, nil
|
||||||
|
|
|
@ -89,33 +89,6 @@ func mysqlGetNextResourceIndex(ctx context.Context, tableName string, groupID in
|
||||||
return idx, nil
|
return idx, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
func mssqlGetNextResourceIndex(ctx context.Context, tableName string, groupID int64) (int64, error) {
|
|
||||||
if _, err := GetEngine(ctx).Exec(fmt.Sprintf(`
|
|
||||||
MERGE INTO %s WITH (HOLDLOCK) AS target
|
|
||||||
USING (SELECT %d AS group_id) AS source
|
|
||||||
(group_id)
|
|
||||||
ON target.group_id = source.group_id
|
|
||||||
WHEN MATCHED
|
|
||||||
THEN UPDATE
|
|
||||||
SET max_index = max_index + 1
|
|
||||||
WHEN NOT MATCHED
|
|
||||||
THEN INSERT (group_id, max_index)
|
|
||||||
VALUES (%d, 1);
|
|
||||||
`, tableName, groupID, groupID)); err != nil {
|
|
||||||
return 0, err
|
|
||||||
}
|
|
||||||
|
|
||||||
var idx int64
|
|
||||||
_, err := GetEngine(ctx).SQL(fmt.Sprintf("SELECT max_index FROM %s WHERE group_id = ?", tableName), groupID).Get(&idx)
|
|
||||||
if err != nil {
|
|
||||||
return 0, err
|
|
||||||
}
|
|
||||||
if idx == 0 {
|
|
||||||
return 0, errors.New("cannot get the correct index")
|
|
||||||
}
|
|
||||||
return idx, nil
|
|
||||||
}
|
|
||||||
|
|
||||||
// GetNextResourceIndex generates a resource index, it must run in the same transaction where the resource is created
|
// GetNextResourceIndex generates a resource index, it must run in the same transaction where the resource is created
|
||||||
func GetNextResourceIndex(ctx context.Context, tableName string, groupID int64) (int64, error) {
|
func GetNextResourceIndex(ctx context.Context, tableName string, groupID int64) (int64, error) {
|
||||||
switch {
|
switch {
|
||||||
|
@ -123,8 +96,6 @@ func GetNextResourceIndex(ctx context.Context, tableName string, groupID int64)
|
||||||
return postgresGetNextResourceIndex(ctx, tableName, groupID)
|
return postgresGetNextResourceIndex(ctx, tableName, groupID)
|
||||||
case setting.Database.Type.IsMySQL():
|
case setting.Database.Type.IsMySQL():
|
||||||
return mysqlGetNextResourceIndex(ctx, tableName, groupID)
|
return mysqlGetNextResourceIndex(ctx, tableName, groupID)
|
||||||
case setting.Database.Type.IsMSSQL():
|
|
||||||
return mssqlGetNextResourceIndex(ctx, tableName, groupID)
|
|
||||||
}
|
}
|
||||||
|
|
||||||
e := GetEngine(ctx)
|
e := GetEngine(ctx)
|
||||||
|
|
|
@ -103,7 +103,7 @@ func (err ErrBranchesEqual) Unwrap() error {
|
||||||
type Branch struct {
|
type Branch struct {
|
||||||
ID int64
|
ID int64
|
||||||
RepoID int64 `xorm:"UNIQUE(s)"`
|
RepoID int64 `xorm:"UNIQUE(s)"`
|
||||||
Name string `xorm:"UNIQUE(s) NOT NULL"` // git's ref-name is case-sensitive internally, however, in some databases (mssql, mysql, by default), it's case-insensitive at the moment
|
Name string `xorm:"UNIQUE(s) NOT NULL"` // git's ref-name is case-sensitive internally, however, in some databases (mysql, by default), it's case-insensitive at the moment
|
||||||
CommitID string
|
CommitID string
|
||||||
CommitMessage string `xorm:"TEXT"` // it only stores the message summary (the first line)
|
CommitMessage string `xorm:"TEXT"` // it only stores the message summary (the first line)
|
||||||
PusherID int64
|
PusherID int64
|
||||||
|
|
|
@ -84,34 +84,6 @@ func mysqlGetCommitStatusIndex(ctx context.Context, repoID int64, sha string) (i
|
||||||
return idx, nil
|
return idx, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
func mssqlGetCommitStatusIndex(ctx context.Context, repoID int64, sha string) (int64, error) {
|
|
||||||
if _, err := db.GetEngine(ctx).Exec(`
|
|
||||||
MERGE INTO commit_status_index WITH (HOLDLOCK) AS target
|
|
||||||
USING (SELECT ? AS repo_id, ? AS sha) AS source
|
|
||||||
(repo_id, sha)
|
|
||||||
ON target.repo_id = source.repo_id AND target.sha = source.sha
|
|
||||||
WHEN MATCHED
|
|
||||||
THEN UPDATE
|
|
||||||
SET max_index = max_index + 1
|
|
||||||
WHEN NOT MATCHED
|
|
||||||
THEN INSERT (repo_id, sha, max_index)
|
|
||||||
VALUES (?, ?, 1);
|
|
||||||
`, repoID, sha, repoID, sha); err != nil {
|
|
||||||
return 0, err
|
|
||||||
}
|
|
||||||
|
|
||||||
var idx int64
|
|
||||||
_, err := db.GetEngine(ctx).SQL("SELECT max_index FROM `commit_status_index` WHERE repo_id = ? AND sha = ?",
|
|
||||||
repoID, sha).Get(&idx)
|
|
||||||
if err != nil {
|
|
||||||
return 0, err
|
|
||||||
}
|
|
||||||
if idx == 0 {
|
|
||||||
return 0, errors.New("cannot get the correct index")
|
|
||||||
}
|
|
||||||
return idx, nil
|
|
||||||
}
|
|
||||||
|
|
||||||
// GetNextCommitStatusIndex retried 3 times to generate a resource index
|
// GetNextCommitStatusIndex retried 3 times to generate a resource index
|
||||||
func GetNextCommitStatusIndex(ctx context.Context, repoID int64, sha string) (int64, error) {
|
func GetNextCommitStatusIndex(ctx context.Context, repoID int64, sha string) (int64, error) {
|
||||||
_, err := git.NewIDFromString(sha)
|
_, err := git.NewIDFromString(sha)
|
||||||
|
@ -124,8 +96,6 @@ func GetNextCommitStatusIndex(ctx context.Context, repoID int64, sha string) (in
|
||||||
return postgresGetCommitStatusIndex(ctx, repoID, sha)
|
return postgresGetCommitStatusIndex(ctx, repoID, sha)
|
||||||
case setting.Database.Type.IsMySQL():
|
case setting.Database.Type.IsMySQL():
|
||||||
return mysqlGetCommitStatusIndex(ctx, repoID, sha)
|
return mysqlGetCommitStatusIndex(ctx, repoID, sha)
|
||||||
case setting.Database.Type.IsMSSQL():
|
|
||||||
return mssqlGetCommitStatusIndex(ctx, repoID, sha)
|
|
||||||
}
|
}
|
||||||
|
|
||||||
e := db.GetEngine(ctx)
|
e := db.GetEngine(ctx)
|
||||||
|
|
|
@ -89,13 +89,6 @@ func RecreateTable(sess *xorm.Session, bean any) error {
|
||||||
hasID = hasID || (column.IsPrimaryKey && column.IsAutoIncrement)
|
hasID = hasID || (column.IsPrimaryKey && column.IsAutoIncrement)
|
||||||
}
|
}
|
||||||
|
|
||||||
if hasID && setting.Database.Type.IsMSSQL() {
|
|
||||||
if _, err := sess.Exec(fmt.Sprintf("SET IDENTITY_INSERT `%s` ON", tempTableName)); err != nil {
|
|
||||||
log.Error("Unable to set identity insert for table %s. Error: %v", tempTableName, err)
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
sqlStringBuilder := &strings.Builder{}
|
sqlStringBuilder := &strings.Builder{}
|
||||||
_, _ = sqlStringBuilder.WriteString("INSERT INTO `")
|
_, _ = sqlStringBuilder.WriteString("INSERT INTO `")
|
||||||
_, _ = sqlStringBuilder.WriteString(tempTableName)
|
_, _ = sqlStringBuilder.WriteString(tempTableName)
|
||||||
|
@ -143,13 +136,6 @@ func RecreateTable(sess *xorm.Session, bean any) error {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
||||||
if hasID && setting.Database.Type.IsMSSQL() {
|
|
||||||
if _, err := sess.Exec(fmt.Sprintf("SET IDENTITY_INSERT `%s` OFF", tempTableName)); err != nil {
|
|
||||||
log.Error("Unable to switch off identity insert for table %s. Error: %v", tempTableName, err)
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
switch {
|
switch {
|
||||||
case setting.Database.Type.IsSQLite3():
|
case setting.Database.Type.IsSQLite3():
|
||||||
// SQLite will drop all the constraints on the old table
|
// SQLite will drop all the constraints on the old table
|
||||||
|
@ -296,19 +282,6 @@ func RecreateTable(sess *xorm.Session, bean any) error {
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
case setting.Database.Type.IsMSSQL():
|
|
||||||
// MSSQL will drop all the constraints on the old table
|
|
||||||
if _, err := sess.Exec(fmt.Sprintf("DROP TABLE `%s`", tableName)); err != nil {
|
|
||||||
log.Error("Unable to drop old table %s. Error: %v", tableName, err)
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
|
|
||||||
// MSSQL sp_rename will move all the constraints from the temporary table to the new table
|
|
||||||
if _, err := sess.Exec(fmt.Sprintf("sp_rename `%s`,`%s`", tempTableName, tableName)); err != nil {
|
|
||||||
log.Error("Unable to rename %s to %s. Error: %v", tempTableName, tableName, err)
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
|
|
||||||
default:
|
default:
|
||||||
log.Fatal("Unrecognized DB")
|
log.Fatal("Unrecognized DB")
|
||||||
}
|
}
|
||||||
|
@ -444,40 +417,6 @@ func DropTableColumns(sess *xorm.Session, tableName string, columnNames ...strin
|
||||||
if _, err := sess.Exec(fmt.Sprintf("ALTER TABLE `%s` %s", tableName, cols)); err != nil {
|
if _, err := sess.Exec(fmt.Sprintf("ALTER TABLE `%s` %s", tableName, cols)); err != nil {
|
||||||
return fmt.Errorf("Drop table `%s` columns %v: %v", tableName, columnNames, err)
|
return fmt.Errorf("Drop table `%s` columns %v: %v", tableName, columnNames, err)
|
||||||
}
|
}
|
||||||
case setting.Database.Type.IsMSSQL():
|
|
||||||
cols := ""
|
|
||||||
for _, col := range columnNames {
|
|
||||||
if cols != "" {
|
|
||||||
cols += ", "
|
|
||||||
}
|
|
||||||
cols += "`" + strings.ToLower(col) + "`"
|
|
||||||
}
|
|
||||||
sql := fmt.Sprintf("SELECT Name FROM sys.default_constraints WHERE parent_object_id = OBJECT_ID('%[1]s') AND parent_column_id IN (SELECT column_id FROM sys.columns WHERE LOWER(name) IN (%[2]s) AND object_id = OBJECT_ID('%[1]s'))",
|
|
||||||
tableName, strings.ReplaceAll(cols, "`", "'"))
|
|
||||||
constraints := make([]string, 0)
|
|
||||||
if err := sess.SQL(sql).Find(&constraints); err != nil {
|
|
||||||
return fmt.Errorf("Find constraints: %v", err)
|
|
||||||
}
|
|
||||||
for _, constraint := range constraints {
|
|
||||||
if _, err := sess.Exec(fmt.Sprintf("ALTER TABLE `%s` DROP CONSTRAINT `%s`", tableName, constraint)); err != nil {
|
|
||||||
return fmt.Errorf("Drop table `%s` default constraint `%s`: %v", tableName, constraint, err)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
sql = fmt.Sprintf("SELECT DISTINCT Name FROM sys.indexes INNER JOIN sys.index_columns ON indexes.index_id = index_columns.index_id AND indexes.object_id = index_columns.object_id WHERE indexes.object_id = OBJECT_ID('%[1]s') AND index_columns.column_id IN (SELECT column_id FROM sys.columns WHERE LOWER(name) IN (%[2]s) AND object_id = OBJECT_ID('%[1]s'))",
|
|
||||||
tableName, strings.ReplaceAll(cols, "`", "'"))
|
|
||||||
constraints = make([]string, 0)
|
|
||||||
if err := sess.SQL(sql).Find(&constraints); err != nil {
|
|
||||||
return fmt.Errorf("Find constraints: %v", err)
|
|
||||||
}
|
|
||||||
for _, constraint := range constraints {
|
|
||||||
if _, err := sess.Exec(fmt.Sprintf("DROP INDEX `%[2]s` ON `%[1]s`", tableName, constraint)); err != nil {
|
|
||||||
return fmt.Errorf("Drop index `%[2]s` on `%[1]s`: %v", tableName, constraint, err)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if _, err := sess.Exec(fmt.Sprintf("ALTER TABLE `%s` DROP COLUMN %s", tableName, cols)); err != nil {
|
|
||||||
return fmt.Errorf("Drop table `%s` columns %v: %v", tableName, columnNames, err)
|
|
||||||
}
|
|
||||||
default:
|
default:
|
||||||
log.Fatal("Unrecognized DB")
|
log.Fatal("Unrecognized DB")
|
||||||
}
|
}
|
||||||
|
@ -489,21 +428,6 @@ func DropTableColumns(sess *xorm.Session, tableName string, columnNames ...strin
|
||||||
func ModifyColumn(x *xorm.Engine, tableName string, col *schemas.Column) error {
|
func ModifyColumn(x *xorm.Engine, tableName string, col *schemas.Column) error {
|
||||||
var indexes map[string]*schemas.Index
|
var indexes map[string]*schemas.Index
|
||||||
var err error
|
var err error
|
||||||
// MSSQL have to remove index at first, otherwise alter column will fail
|
|
||||||
// ref. https://sqlzealots.com/2018/05/09/error-message-the-index-is-dependent-on-column-alter-table-alter-column-failed-because-one-or-more-objects-access-this-column/
|
|
||||||
if x.Dialect().URI().DBType == schemas.MSSQL {
|
|
||||||
indexes, err = x.Dialect().GetIndexes(x.DB(), context.Background(), tableName)
|
|
||||||
if err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
|
|
||||||
for _, index := range indexes {
|
|
||||||
_, err = x.Exec(x.Dialect().DropIndexSQL(tableName, index))
|
|
||||||
if err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
defer func() {
|
defer func() {
|
||||||
for _, index := range indexes {
|
for _, index := range indexes {
|
||||||
|
@ -612,21 +536,6 @@ func deleteDB() error {
|
||||||
}
|
}
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
case setting.Database.Type.IsMSSQL():
|
|
||||||
host, port := setting.ParseMSSQLHostPort(setting.Database.Host)
|
|
||||||
db, err := sql.Open("mssql", fmt.Sprintf("server=%s; port=%s; database=%s; user id=%s; password=%s;",
|
|
||||||
host, port, "master", setting.Database.User, setting.Database.Passwd))
|
|
||||||
if err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
defer db.Close()
|
|
||||||
|
|
||||||
if _, err = db.Exec(fmt.Sprintf("DROP DATABASE IF EXISTS [%s]", setting.Database.Name)); err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
if _, err = db.Exec(fmt.Sprintf("CREATE DATABASE [%s]", setting.Database.Name)); err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
return nil
|
return nil
|
||||||
|
|
|
@ -16,9 +16,6 @@ func ChangeReviewContentToText(x *xorm.Engine) error {
|
||||||
case schemas.ORACLE:
|
case schemas.ORACLE:
|
||||||
_, err := x.Exec("ALTER TABLE review MODIFY content TEXT")
|
_, err := x.Exec("ALTER TABLE review MODIFY content TEXT")
|
||||||
return err
|
return err
|
||||||
case schemas.MSSQL:
|
|
||||||
_, err := x.Exec("ALTER TABLE review ALTER COLUMN content TEXT")
|
|
||||||
return err
|
|
||||||
case schemas.POSTGRES:
|
case schemas.POSTGRES:
|
||||||
_, err := x.Exec("ALTER TABLE review ALTER COLUMN content TYPE TEXT")
|
_, err := x.Exec("ALTER TABLE review ALTER COLUMN content TYPE TEXT")
|
||||||
return err
|
return err
|
||||||
|
|
|
@ -12,12 +12,9 @@ import (
|
||||||
func PrependRefsHeadsToIssueRefs(x *xorm.Engine) error {
|
func PrependRefsHeadsToIssueRefs(x *xorm.Engine) error {
|
||||||
var query string
|
var query string
|
||||||
|
|
||||||
switch {
|
if setting.Database.Type.IsMySQL() {
|
||||||
case setting.Database.Type.IsMSSQL():
|
|
||||||
query = "UPDATE `issue` SET `ref` = 'refs/heads/' + `ref` WHERE `ref` IS NOT NULL AND `ref` <> '' AND `ref` NOT LIKE 'refs/%'"
|
|
||||||
case setting.Database.Type.IsMySQL():
|
|
||||||
query = "UPDATE `issue` SET `ref` = CONCAT('refs/heads/', `ref`) WHERE `ref` IS NOT NULL AND `ref` <> '' AND `ref` NOT LIKE 'refs/%';"
|
query = "UPDATE `issue` SET `ref` = CONCAT('refs/heads/', `ref`) WHERE `ref` IS NOT NULL AND `ref` <> '' AND `ref` NOT LIKE 'refs/%';"
|
||||||
default:
|
} else {
|
||||||
query = "UPDATE `issue` SET `ref` = 'refs/heads/' || `ref` WHERE `ref` IS NOT NULL AND `ref` <> '' AND `ref` NOT LIKE 'refs/%'"
|
query = "UPDATE `issue` SET `ref` = 'refs/heads/' || `ref` WHERE `ref` IS NOT NULL AND `ref` <> '' AND `ref` NOT LIKE 'refs/%'"
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -45,32 +45,6 @@ func IncreaseLanguageField(x *xorm.Engine) error {
|
||||||
if _, err := sess.Exec(fmt.Sprintf("ALTER TABLE language_stat MODIFY COLUMN language %s", sqlType)); err != nil {
|
if _, err := sess.Exec(fmt.Sprintf("ALTER TABLE language_stat MODIFY COLUMN language %s", sqlType)); err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
case setting.Database.Type.IsMSSQL():
|
|
||||||
// Yet again MSSQL just has to be awkward.
|
|
||||||
// Here we have to drop the constraints first and then rebuild them
|
|
||||||
constraints := make([]string, 0)
|
|
||||||
if err := sess.SQL(`SELECT i.name AS Name
|
|
||||||
FROM sys.indexes i INNER JOIN sys.index_columns ic
|
|
||||||
ON i.index_id = ic.index_id AND i.object_id = ic.object_id
|
|
||||||
INNER JOIN sys.tables AS t
|
|
||||||
ON t.object_id = i.object_id
|
|
||||||
INNER JOIN sys.columns c
|
|
||||||
ON t.object_id = c.object_id AND ic.column_id = c.column_id
|
|
||||||
WHERE t.name = 'language_stat' AND c.name = 'language'`).Find(&constraints); err != nil {
|
|
||||||
return fmt.Errorf("Find constraints: %w", err)
|
|
||||||
}
|
|
||||||
for _, constraint := range constraints {
|
|
||||||
if _, err := sess.Exec(fmt.Sprintf("DROP INDEX [%s] ON `language_stat`", constraint)); err != nil {
|
|
||||||
return fmt.Errorf("Drop table `language_stat` constraint `%s`: %w", constraint, err)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if _, err := sess.Exec(fmt.Sprintf("ALTER TABLE language_stat ALTER COLUMN language %s", sqlType)); err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
// Finally restore the constraint
|
|
||||||
if err := sess.CreateUniques(new(LanguageStat)); err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
case setting.Database.Type.IsPostgreSQL():
|
case setting.Database.Type.IsPostgreSQL():
|
||||||
if _, err := sess.Exec(fmt.Sprintf("ALTER TABLE language_stat ALTER COLUMN language TYPE %s", sqlType)); err != nil {
|
if _, err := sess.Exec(fmt.Sprintf("ALTER TABLE language_stat ALTER COLUMN language TYPE %s", sqlType)); err != nil {
|
||||||
return err
|
return err
|
||||||
|
|
|
@ -23,36 +23,6 @@ func SetDefaultPasswordToArgon2(x *xorm.Engine) error {
|
||||||
case setting.Database.Type.IsPostgreSQL():
|
case setting.Database.Type.IsPostgreSQL():
|
||||||
_, err := x.Exec("ALTER TABLE `user` ALTER COLUMN passwd_hash_algo SET DEFAULT 'argon2';")
|
_, err := x.Exec("ALTER TABLE `user` ALTER COLUMN passwd_hash_algo SET DEFAULT 'argon2';")
|
||||||
return err
|
return err
|
||||||
case setting.Database.Type.IsMSSQL():
|
|
||||||
// need to find the constraint and drop it, then recreate it.
|
|
||||||
sess := x.NewSession()
|
|
||||||
defer sess.Close()
|
|
||||||
if err := sess.Begin(); err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
res, err := sess.QueryString("SELECT [name] FROM sys.default_constraints WHERE parent_object_id=OBJECT_ID(?) AND COL_NAME(parent_object_id, parent_column_id)=?;", "user", "passwd_hash_algo")
|
|
||||||
if err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
if len(res) > 0 {
|
|
||||||
constraintName := res[0]["name"]
|
|
||||||
log.Error("Results of select constraint: %s", constraintName)
|
|
||||||
_, err := sess.Exec("ALTER TABLE [user] DROP CONSTRAINT " + constraintName)
|
|
||||||
if err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
_, err = sess.Exec("ALTER TABLE [user] ADD CONSTRAINT " + constraintName + " DEFAULT 'argon2' FOR passwd_hash_algo")
|
|
||||||
if err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
_, err := sess.Exec("ALTER TABLE [user] ADD DEFAULT('argon2') FOR passwd_hash_algo")
|
|
||||||
if err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return sess.Commit()
|
|
||||||
|
|
||||||
case setting.Database.Type.IsSQLite3():
|
case setting.Database.Type.IsSQLite3():
|
||||||
// drop through
|
// drop through
|
||||||
default:
|
default:
|
||||||
|
|
|
@ -62,13 +62,6 @@ func UpdateCodeCommentReplies(x *xorm.Engine) error {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
||||||
if setting.Database.Type.IsMSSQL() {
|
|
||||||
if _, err := sess.Exec(sqlSelect + " INTO #temp_comments" + sqlTail); err != nil {
|
|
||||||
log.Error("unable to create temporary table")
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
comments := make([]*Comment, 0, batchSize)
|
comments := make([]*Comment, 0, batchSize)
|
||||||
|
|
||||||
switch {
|
switch {
|
||||||
|
@ -78,9 +71,6 @@ func UpdateCodeCommentReplies(x *xorm.Engine) error {
|
||||||
fallthrough
|
fallthrough
|
||||||
case setting.Database.Type.IsSQLite3():
|
case setting.Database.Type.IsSQLite3():
|
||||||
sqlCmd = sqlSelect + sqlTail + " LIMIT " + strconv.Itoa(batchSize) + " OFFSET " + strconv.Itoa(start)
|
sqlCmd = sqlSelect + sqlTail + " LIMIT " + strconv.Itoa(batchSize) + " OFFSET " + strconv.Itoa(start)
|
||||||
case setting.Database.Type.IsMSSQL():
|
|
||||||
sqlCmd = "SELECT TOP " + strconv.Itoa(batchSize) + " * FROM #temp_comments WHERE " +
|
|
||||||
"(id NOT IN ( SELECT TOP " + strconv.Itoa(start) + " id FROM #temp_comments ORDER BY id )) ORDER BY id"
|
|
||||||
default:
|
default:
|
||||||
return fmt.Errorf("Unsupported database type")
|
return fmt.Errorf("Unsupported database type")
|
||||||
}
|
}
|
||||||
|
|
|
@ -32,13 +32,7 @@ func ConvertHookTaskTypeToVarcharAndTrim(x *xorm.Engine) error {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
||||||
var hookTaskTrimSQL string
|
if _, err := x.Exec("UPDATE hook_task SET typ = TRIM(typ)"); err != nil {
|
||||||
if dbType == schemas.MSSQL {
|
|
||||||
hookTaskTrimSQL = "UPDATE hook_task SET typ = RTRIM(LTRIM(typ))"
|
|
||||||
} else {
|
|
||||||
hookTaskTrimSQL = "UPDATE hook_task SET typ = TRIM(typ)"
|
|
||||||
}
|
|
||||||
if _, err := x.Exec(hookTaskTrimSQL); err != nil {
|
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -58,12 +52,6 @@ func ConvertHookTaskTypeToVarcharAndTrim(x *xorm.Engine) error {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
||||||
var webhookTrimSQL string
|
_, err := x.Exec("UPDATE webhook SET type = TRIM(type)")
|
||||||
if dbType == schemas.MSSQL {
|
|
||||||
webhookTrimSQL = "UPDATE webhook SET type = RTRIM(LTRIM(type))"
|
|
||||||
} else {
|
|
||||||
webhookTrimSQL = "UPDATE webhook SET type = TRIM(type)"
|
|
||||||
}
|
|
||||||
_, err := x.Exec(webhookTrimSQL)
|
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
|
@ -53,16 +53,11 @@ func RenameTaskErrorsToMessage(x *xorm.Engine) error {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
switch {
|
if setting.Database.Type.IsMySQL() {
|
||||||
case setting.Database.Type.IsMySQL():
|
|
||||||
if _, err := sess.Exec("ALTER TABLE `task` CHANGE errors message text"); err != nil {
|
if _, err := sess.Exec("ALTER TABLE `task` CHANGE errors message text"); err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
case setting.Database.Type.IsMSSQL():
|
} else {
|
||||||
if _, err := sess.Exec("sp_rename 'task.errors', 'message', 'COLUMN'"); err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
default:
|
|
||||||
if _, err := sess.Exec("ALTER TABLE `task` RENAME COLUMN errors TO message"); err != nil {
|
if _, err := sess.Exec("ALTER TABLE `task` RENAME COLUMN errors TO message"); err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
|
@ -10,7 +10,6 @@ import (
|
||||||
"fmt"
|
"fmt"
|
||||||
"strings"
|
"strings"
|
||||||
|
|
||||||
"code.gitea.io/gitea/models/migrations/base"
|
|
||||||
"code.gitea.io/gitea/modules/timeutil"
|
"code.gitea.io/gitea/modules/timeutil"
|
||||||
|
|
||||||
"xorm.io/xorm"
|
"xorm.io/xorm"
|
||||||
|
@ -74,26 +73,6 @@ func RemigrateU2FCredentials(x *xorm.Engine) error {
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
case schemas.MSSQL:
|
|
||||||
// This column has an index on it. I could write all of the code to attempt to change the index OR
|
|
||||||
// I could just use recreate table.
|
|
||||||
sess := x.NewSession()
|
|
||||||
if err := sess.Begin(); err != nil {
|
|
||||||
_ = sess.Close()
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
|
|
||||||
if err := base.RecreateTable(sess, new(webauthnCredential)); err != nil {
|
|
||||||
_ = sess.Close()
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
if err := sess.Commit(); err != nil {
|
|
||||||
_ = sess.Close()
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
if err := sess.Close(); err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
case schemas.POSTGRES:
|
case schemas.POSTGRES:
|
||||||
_, err := x.Exec("ALTER TABLE webauthn_credential ALTER COLUMN credential_id TYPE VARCHAR(410)")
|
_, err := x.Exec("ALTER TABLE webauthn_credential ALTER COLUMN credential_id TYPE VARCHAR(410)")
|
||||||
if err != nil {
|
if err != nil {
|
||||||
|
@ -137,11 +116,6 @@ func RemigrateU2FCredentials(x *xorm.Engine) error {
|
||||||
if err := sess.Begin(); err != nil {
|
if err := sess.Begin(); err != nil {
|
||||||
return fmt.Errorf("unable to allow start session. Error: %w", err)
|
return fmt.Errorf("unable to allow start session. Error: %w", err)
|
||||||
}
|
}
|
||||||
if x.Dialect().URI().DBType == schemas.MSSQL {
|
|
||||||
if _, err := sess.Exec("SET IDENTITY_INSERT `webauthn_credential` ON"); err != nil {
|
|
||||||
return fmt.Errorf("unable to allow identity insert on webauthn_credential. Error: %w", err)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
for _, reg := range regs {
|
for _, reg := range regs {
|
||||||
pubKey, keyHandle, err := parseU2FRegistration(reg.Raw)
|
pubKey, keyHandle, err := parseU2FRegistration(reg.Raw)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
|
|
|
@ -12,14 +12,10 @@ import (
|
||||||
)
|
)
|
||||||
|
|
||||||
func AddContainerRepositoryProperty(x *xorm.Engine) (err error) {
|
func AddContainerRepositoryProperty(x *xorm.Engine) (err error) {
|
||||||
switch x.Dialect().URI().DBType {
|
if x.Dialect().URI().DBType == schemas.SQLITE {
|
||||||
case schemas.SQLITE:
|
|
||||||
_, err = x.Exec("INSERT INTO package_property (ref_type, ref_id, name, value) SELECT ?, p.id, ?, u.lower_name || '/' || p.lower_name FROM package p JOIN `user` u ON p.owner_id = u.id WHERE p.type = ?",
|
_, err = x.Exec("INSERT INTO package_property (ref_type, ref_id, name, value) SELECT ?, p.id, ?, u.lower_name || '/' || p.lower_name FROM package p JOIN `user` u ON p.owner_id = u.id WHERE p.type = ?",
|
||||||
packages_model.PropertyTypePackage, container_module.PropertyRepository, packages_model.TypeContainer)
|
packages_model.PropertyTypePackage, container_module.PropertyRepository, packages_model.TypeContainer)
|
||||||
case schemas.MSSQL:
|
} else {
|
||||||
_, err = x.Exec("INSERT INTO package_property (ref_type, ref_id, name, value) SELECT ?, p.id, ?, u.lower_name + '/' + p.lower_name FROM package p JOIN `user` u ON p.owner_id = u.id WHERE p.type = ?",
|
|
||||||
packages_model.PropertyTypePackage, container_module.PropertyRepository, packages_model.TypeContainer)
|
|
||||||
default:
|
|
||||||
_, err = x.Exec("INSERT INTO package_property (ref_type, ref_id, name, value) SELECT ?, p.id, ?, CONCAT(u.lower_name, '/', p.lower_name) FROM package p JOIN `user` u ON p.owner_id = u.id WHERE p.type = ?",
|
_, err = x.Exec("INSERT INTO package_property (ref_type, ref_id, name, value) SELECT ?, p.id, ?, CONCAT(u.lower_name, '/', p.lower_name) FROM package p JOIN `user` u ON p.owner_id = u.id WHERE p.type = ?",
|
||||||
packages_model.PropertyTypePackage, container_module.PropertyRepository, packages_model.TypeContainer)
|
packages_model.PropertyTypePackage, container_module.PropertyRepository, packages_model.TypeContainer)
|
||||||
}
|
}
|
||||||
|
|
|
@ -64,16 +64,11 @@ func RenameCredentialIDBytes(x *xorm.Engine) error {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
switch {
|
if setting.Database.Type.IsMySQL() {
|
||||||
case setting.Database.Type.IsMySQL():
|
|
||||||
if _, err := sess.Exec("ALTER TABLE `webauthn_credential` CHANGE credential_id_bytes credential_id VARBINARY(1024)"); err != nil {
|
if _, err := sess.Exec("ALTER TABLE `webauthn_credential` CHANGE credential_id_bytes credential_id VARBINARY(1024)"); err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
case setting.Database.Type.IsMSSQL():
|
} else {
|
||||||
if _, err := sess.Exec("sp_rename 'webauthn_credential.credential_id_bytes', 'credential_id', 'COLUMN'"); err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
default:
|
|
||||||
if _, err := sess.Exec("ALTER TABLE `webauthn_credential` RENAME COLUMN credential_id_bytes TO credential_id"); err != nil {
|
if _, err := sess.Exec("ALTER TABLE `webauthn_credential` RENAME COLUMN credential_id_bytes TO credential_id"); err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
|
@ -50,8 +50,7 @@ func RenameWebhookOrgToOwner(x *xorm.Engine) error {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
switch {
|
if setting.Database.Type.IsMySQL() {
|
||||||
case setting.Database.Type.IsMySQL():
|
|
||||||
inferredTable, err := x.TableInfo(new(Webhook))
|
inferredTable, err := x.TableInfo(new(Webhook))
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
|
@ -60,11 +59,7 @@ func RenameWebhookOrgToOwner(x *xorm.Engine) error {
|
||||||
if _, err := sess.Exec(fmt.Sprintf("ALTER TABLE `webhook` CHANGE org_id owner_id %s", sqlType)); err != nil {
|
if _, err := sess.Exec(fmt.Sprintf("ALTER TABLE `webhook` CHANGE org_id owner_id %s", sqlType)); err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
case setting.Database.Type.IsMSSQL():
|
} else {
|
||||||
if _, err := sess.Exec("sp_rename 'webhook.org_id', 'owner_id', 'COLUMN'"); err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
default:
|
|
||||||
if _, err := sess.Exec("ALTER TABLE `webhook` RENAME COLUMN org_id TO owner_id"); err != nil {
|
if _, err := sess.Exec("ALTER TABLE `webhook` RENAME COLUMN org_id TO owner_id"); err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
|
@ -4,10 +4,7 @@
|
||||||
package v1_22 //nolint
|
package v1_22 //nolint
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"fmt"
|
|
||||||
|
|
||||||
"xorm.io/xorm"
|
"xorm.io/xorm"
|
||||||
"xorm.io/xorm/schemas"
|
|
||||||
)
|
)
|
||||||
|
|
||||||
func AddCombinedIndexToIssueUser(x *xorm.Engine) error {
|
func AddCombinedIndexToIssueUser(x *xorm.Engine) error {
|
||||||
|
@ -23,18 +20,12 @@ func AddCombinedIndexToIssueUser(x *xorm.Engine) error {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
for _, issueUser := range duplicatedIssueUsers {
|
for _, issueUser := range duplicatedIssueUsers {
|
||||||
if x.Dialect().URI().DBType == schemas.MSSQL {
|
var ids []int64
|
||||||
if _, err := x.Exec(fmt.Sprintf("delete from issue_user where id in (SELECT top %d id FROM issue_user WHERE issue_id = ? and uid = ?)", issueUser.Cnt-1), issueUser.IssueID, issueUser.UID); err != nil {
|
if err := x.SQL("SELECT id FROM issue_user WHERE issue_id = ? and uid = ? limit ?", issueUser.IssueID, issueUser.UID, issueUser.Cnt-1).Find(&ids); err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
} else {
|
if _, err := x.Table("issue_user").In("id", ids).Delete(); err != nil {
|
||||||
var ids []int64
|
return err
|
||||||
if err := x.SQL("SELECT id FROM issue_user WHERE issue_id = ? and uid = ? limit ?", issueUser.IssueID, issueUser.UID, issueUser.Cnt-1).Find(&ids); err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
if _, err := x.Table("issue_user").In("id", ids).Delete(); err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -3,7 +3,6 @@
|
||||||
package v1_22 //nolint
|
package v1_22 //nolint
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"errors"
|
|
||||||
"fmt"
|
"fmt"
|
||||||
|
|
||||||
"code.gitea.io/gitea/modules/log"
|
"code.gitea.io/gitea/modules/log"
|
||||||
|
@ -33,27 +32,10 @@ func expandHashReferencesToSha256(x *xorm.Engine) error {
|
||||||
}
|
}
|
||||||
|
|
||||||
if !setting.Database.Type.IsSQLite3() {
|
if !setting.Database.Type.IsSQLite3() {
|
||||||
if setting.Database.Type.IsMSSQL() {
|
|
||||||
// drop indexes that need to be re-created afterwards
|
|
||||||
droppedIndexes := []string{
|
|
||||||
"DROP INDEX IF EXISTS [IDX_commit_status_context_hash] ON [commit_status]",
|
|
||||||
"DROP INDEX IF EXISTS [UQE_review_state_pull_commit_user] ON [review_state]",
|
|
||||||
"DROP INDEX IF EXISTS [UQE_repo_archiver_s] ON [repo_archiver]",
|
|
||||||
}
|
|
||||||
for _, s := range droppedIndexes {
|
|
||||||
_, err := db.Exec(s)
|
|
||||||
if err != nil {
|
|
||||||
return errors.New(s + " " + err.Error())
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
for _, alts := range alteredTables {
|
for _, alts := range alteredTables {
|
||||||
var err error
|
var err error
|
||||||
if setting.Database.Type.IsMySQL() {
|
if setting.Database.Type.IsMySQL() {
|
||||||
_, err = db.Exec(fmt.Sprintf("ALTER TABLE `%s` MODIFY COLUMN `%s` VARCHAR(64)", alts[0], alts[1]))
|
_, err = db.Exec(fmt.Sprintf("ALTER TABLE `%s` MODIFY COLUMN `%s` VARCHAR(64)", alts[0], alts[1]))
|
||||||
} else if setting.Database.Type.IsMSSQL() {
|
|
||||||
_, err = db.Exec(fmt.Sprintf("ALTER TABLE [%s] ALTER COLUMN [%s] VARCHAR(64)", alts[0], alts[1]))
|
|
||||||
} else {
|
} else {
|
||||||
_, err = db.Exec(fmt.Sprintf("ALTER TABLE `%s` ALTER COLUMN `%s` TYPE VARCHAR(64)", alts[0], alts[1]))
|
_, err = db.Exec(fmt.Sprintf("ALTER TABLE `%s` ALTER COLUMN `%s` TYPE VARCHAR(64)", alts[0], alts[1]))
|
||||||
}
|
}
|
||||||
|
@ -61,20 +43,6 @@ func expandHashReferencesToSha256(x *xorm.Engine) error {
|
||||||
return fmt.Errorf("alter column '%s' of table '%s' failed: %w", alts[1], alts[0], err)
|
return fmt.Errorf("alter column '%s' of table '%s' failed: %w", alts[1], alts[0], err)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if setting.Database.Type.IsMSSQL() {
|
|
||||||
recreateIndexes := []string{
|
|
||||||
"CREATE INDEX IDX_commit_status_context_hash ON commit_status(context_hash)",
|
|
||||||
"CREATE UNIQUE INDEX UQE_review_state_pull_commit_user ON review_state(user_id, pull_id, commit_sha)",
|
|
||||||
"CREATE UNIQUE INDEX UQE_repo_archiver_s ON repo_archiver(repo_id, type, commit_id)",
|
|
||||||
}
|
|
||||||
for _, s := range recreateIndexes {
|
|
||||||
_, err := db.Exec(s)
|
|
||||||
if err != nil {
|
|
||||||
return errors.New(s + " " + err.Error())
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
log.Debug("Updated database tables to hold SHA256 git hash references")
|
log.Debug("Updated database tables to hold SHA256 git hash references")
|
||||||
|
|
||||||
|
|
|
@ -18,8 +18,6 @@ func ChangeU2FCounterType(x *xorm.Engine) error {
|
||||||
_, err = x.Exec("ALTER TABLE `u2f_registration` MODIFY `counter` BIGINT")
|
_, err = x.Exec("ALTER TABLE `u2f_registration` MODIFY `counter` BIGINT")
|
||||||
case schemas.POSTGRES:
|
case schemas.POSTGRES:
|
||||||
_, err = x.Exec("ALTER TABLE `u2f_registration` ALTER COLUMN `counter` SET DATA TYPE bigint")
|
_, err = x.Exec("ALTER TABLE `u2f_registration` ALTER COLUMN `counter` SET DATA TYPE bigint")
|
||||||
case schemas.MSSQL:
|
|
||||||
_, err = x.Exec("ALTER TABLE `u2f_registration` ALTER COLUMN `counter` BIGINT")
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if err != nil {
|
if err != nil {
|
||||||
|
|
|
@ -60,8 +60,6 @@ func InitFixtures(opts FixturesOptions, engine ...*xorm.Engine) (err error) {
|
||||||
dialect = "postgres"
|
dialect = "postgres"
|
||||||
case schemas.MYSQL:
|
case schemas.MYSQL:
|
||||||
dialect = "mysql"
|
dialect = "mysql"
|
||||||
case schemas.MSSQL:
|
|
||||||
dialect = "mssql"
|
|
||||||
case schemas.SQLITE:
|
case schemas.SQLITE:
|
||||||
dialect = "sqlite3"
|
dialect = "sqlite3"
|
||||||
default:
|
default:
|
||||||
|
|
|
@ -16,9 +16,9 @@ import (
|
||||||
|
|
||||||
var (
|
var (
|
||||||
// SupportedDatabaseTypes includes all XORM supported databases type, sqlite3 maybe added by `database_sqlite3.go`
|
// SupportedDatabaseTypes includes all XORM supported databases type, sqlite3 maybe added by `database_sqlite3.go`
|
||||||
SupportedDatabaseTypes = []string{"mysql", "postgres", "mssql"}
|
SupportedDatabaseTypes = []string{"mysql", "postgres"}
|
||||||
// DatabaseTypeNames contains the friendly names for all database types
|
// DatabaseTypeNames contains the friendly names for all database types
|
||||||
DatabaseTypeNames = map[string]string{"mysql": "MySQL", "postgres": "PostgreSQL", "mssql": "MSSQL", "sqlite3": "SQLite3"}
|
DatabaseTypeNames = map[string]string{"mysql": "MySQL", "postgres": "PostgreSQL", "sqlite3": "SQLite3"}
|
||||||
|
|
||||||
// EnableSQLite3 use SQLite3, set by build flag
|
// EnableSQLite3 use SQLite3, set by build flag
|
||||||
EnableSQLite3 bool
|
EnableSQLite3 bool
|
||||||
|
@ -120,9 +120,6 @@ func DBConnStr() (string, error) {
|
||||||
Database.User, Database.Passwd, connType, Database.Host, Database.Name, paramSep, tls)
|
Database.User, Database.Passwd, connType, Database.Host, Database.Name, paramSep, tls)
|
||||||
case "postgres":
|
case "postgres":
|
||||||
connStr = getPostgreSQLConnectionString(Database.Host, Database.User, Database.Passwd, Database.Name, Database.SSLMode)
|
connStr = getPostgreSQLConnectionString(Database.Host, Database.User, Database.Passwd, Database.Name, Database.SSLMode)
|
||||||
case "mssql":
|
|
||||||
host, port := ParseMSSQLHostPort(Database.Host)
|
|
||||||
connStr = fmt.Sprintf("server=%s; port=%s; database=%s; user id=%s; password=%s;", host, port, Database.Name, Database.User, Database.Passwd)
|
|
||||||
case "sqlite3":
|
case "sqlite3":
|
||||||
if !EnableSQLite3 {
|
if !EnableSQLite3 {
|
||||||
return "", errors.New("this Gitea binary was not built with SQLite3 support")
|
return "", errors.New("this Gitea binary was not built with SQLite3 support")
|
||||||
|
@ -188,28 +185,6 @@ func getPostgreSQLConnectionString(dbHost, dbUser, dbPasswd, dbName, dbsslMode s
|
||||||
return connURL.String()
|
return connURL.String()
|
||||||
}
|
}
|
||||||
|
|
||||||
// ParseMSSQLHostPort splits the host into host and port
|
|
||||||
func ParseMSSQLHostPort(info string) (string, string) {
|
|
||||||
// the default port "0" might be related to MSSQL's dynamic port, maybe it should be double-confirmed in the future
|
|
||||||
host, port := "127.0.0.1", "0"
|
|
||||||
if strings.Contains(info, ":") {
|
|
||||||
host = strings.Split(info, ":")[0]
|
|
||||||
port = strings.Split(info, ":")[1]
|
|
||||||
} else if strings.Contains(info, ",") {
|
|
||||||
host = strings.Split(info, ",")[0]
|
|
||||||
port = strings.TrimSpace(strings.Split(info, ",")[1])
|
|
||||||
} else if len(info) > 0 {
|
|
||||||
host = info
|
|
||||||
}
|
|
||||||
if host == "" {
|
|
||||||
host = "127.0.0.1"
|
|
||||||
}
|
|
||||||
if port == "" {
|
|
||||||
port = "0"
|
|
||||||
}
|
|
||||||
return host, port
|
|
||||||
}
|
|
||||||
|
|
||||||
type DatabaseType string
|
type DatabaseType string
|
||||||
|
|
||||||
func (t DatabaseType) String() string {
|
func (t DatabaseType) String() string {
|
||||||
|
@ -224,10 +199,6 @@ func (t DatabaseType) IsMySQL() bool {
|
||||||
return t == "mysql"
|
return t == "mysql"
|
||||||
}
|
}
|
||||||
|
|
||||||
func (t DatabaseType) IsMSSQL() bool {
|
|
||||||
return t == "mssql"
|
|
||||||
}
|
|
||||||
|
|
||||||
func (t DatabaseType) IsPostgreSQL() bool {
|
func (t DatabaseType) IsPostgreSQL() bool {
|
||||||
return t == "postgres"
|
return t == "postgres"
|
||||||
}
|
}
|
||||||
|
|
|
@ -137,7 +137,7 @@ reinstall_confirm_message = إعادة التثبيت باستخدام قاعد
|
||||||
db_schema = مخطط
|
db_schema = مخطط
|
||||||
reinstall_error = أنت تحاول التثبيت في قاعدة بيانات فورجيو موجودة
|
reinstall_error = أنت تحاول التثبيت في قاعدة بيانات فورجيو موجودة
|
||||||
sqlite_helper = مسار المِلَفّ لقاعدة بيانات SQLite3.<br>أدخل المسار المطلق إذا شغلت فورجيو كخدمة.
|
sqlite_helper = مسار المِلَفّ لقاعدة بيانات SQLite3.<br>أدخل المسار المطلق إذا شغلت فورجيو كخدمة.
|
||||||
require_db_desc = فورجيو يحتاج MySQL أو PostgreSQL أو MSSQL أو SQLite3 أو TiDB.
|
require_db_desc = فورجيو يحتاج MySQL أو PostgreSQL أو SQLite3 أو TiDB.
|
||||||
password = كلمة المرور
|
password = كلمة المرور
|
||||||
host = المضيف
|
host = المضيف
|
||||||
docker_helper = إذا كنت تستخدم فورجيو داخل دوكر، يرجي قراءة <a target="_blank" rel="noopener noreferrer" href="%s">المستندات</a> قبل تغيير أي إعدادات.
|
docker_helper = إذا كنت تستخدم فورجيو داخل دوكر، يرجي قراءة <a target="_blank" rel="noopener noreferrer" href="%s">المستندات</a> قبل تغيير أي إعدادات.
|
||||||
|
@ -1547,7 +1547,6 @@ dashboard.sync_tag.started = بدأ تزامن الوسوم
|
||||||
dashboard.sync_repo_tags = زامن الوسوم من بيانات جِت إلى قاعدة البيانات
|
dashboard.sync_repo_tags = زامن الوسوم من بيانات جِت إلى قاعدة البيانات
|
||||||
self_check = فحص ذاتي
|
self_check = فحص ذاتي
|
||||||
self_check.database_collation_case_insensitive = تستخدم قاعدة البيانات تجميع %s ، وهو تجميع غير حساس. على الرغم من أن فورجيو يمكن أن يعمل معها قد تكون هناك حالات نادرة لا تعمل كما هو متوقع.
|
self_check.database_collation_case_insensitive = تستخدم قاعدة البيانات تجميع %s ، وهو تجميع غير حساس. على الرغم من أن فورجيو يمكن أن يعمل معها قد تكون هناك حالات نادرة لا تعمل كما هو متوقع.
|
||||||
self_check.database_fix_mssql = بالنسبة لمستخدمي الـإم إس سيكول، يمكنك إصلاح المشكلة بتعديل السيكول يدوياً فقط في الوقت الراهن.
|
|
||||||
monitor.process.cancel_desc = قد يسبب إلغاء العملية فقدانًا للبيانات
|
monitor.process.cancel_desc = قد يسبب إلغاء العملية فقدانًا للبيانات
|
||||||
monitor.queue.type = النوع
|
monitor.queue.type = النوع
|
||||||
monitor.process.cancel_notices = أتريد إلغاء: <strong>%s</strong>؟
|
monitor.process.cancel_notices = أتريد إلغاء: <strong>%s</strong>؟
|
||||||
|
|
|
@ -1217,7 +1217,7 @@ admin_name = Потреб. име за администратор
|
||||||
confirm_password = Потвърдете паролата
|
confirm_password = Потвърдете паролата
|
||||||
title = Първоначална конфигурация
|
title = Първоначална конфигурация
|
||||||
domain = Домейн на сървъра
|
domain = Домейн на сървъра
|
||||||
require_db_desc = Forgejo изисква MySQL, PostgreSQL, MSSQL, SQLite3 или TiDB (MySQL протокол).
|
require_db_desc = Forgejo изисква MySQL, PostgreSQL, SQLite3 или TiDB (MySQL протокол).
|
||||||
general_title = Общи настройки
|
general_title = Общи настройки
|
||||||
email_title = Настройки на ел. поща
|
email_title = Настройки на ел. поща
|
||||||
db_schema = Схема
|
db_schema = Схема
|
||||||
|
|
|
@ -219,7 +219,7 @@ license_desc=Vše je na <a target="_blank" rel="noopener noreferrer" href="https
|
||||||
install=Instalace
|
install=Instalace
|
||||||
title=Počáteční konfigurace
|
title=Počáteční konfigurace
|
||||||
docker_helper=Pokud spouštíte Forgejo v Dockeru, přečtěte si <a target="_blank" rel="noopener noreferrer" href="%s">dokumentaci</a>, než budete měnit jakákoliv nastavení.
|
docker_helper=Pokud spouštíte Forgejo v Dockeru, přečtěte si <a target="_blank" rel="noopener noreferrer" href="%s">dokumentaci</a>, než budete měnit jakákoliv nastavení.
|
||||||
require_db_desc=Forgejo vyžaduje MySQL, PostgreSQL, MSSQL, SQLite3 nebo TiDB (protokol MySQL).
|
require_db_desc=Forgejo vyžaduje MySQL, PostgreSQL, SQLite3 nebo TiDB (protokol MySQL).
|
||||||
db_title=Nastavení databáze
|
db_title=Nastavení databáze
|
||||||
db_type=Typ databáze
|
db_type=Typ databáze
|
||||||
host=Hostitel
|
host=Hostitel
|
||||||
|
@ -3396,7 +3396,6 @@ self_check = Vlastní kontrola
|
||||||
dashboard.sync_tag.started = Synchronizace značek spuštěna
|
dashboard.sync_tag.started = Synchronizace značek spuštěna
|
||||||
dashboard.rebuild_issue_indexer = Přestavit indexer vydání
|
dashboard.rebuild_issue_indexer = Přestavit indexer vydání
|
||||||
self_check.database_collation_case_insensitive = Databáze používá collation %s. Jedná se o intenzivní collation. Ačkoli s ní Forgejo nejspíše bude pracovat, mohou nastat určité vzácné případy, kdy nebude pracovat tak, jak má.
|
self_check.database_collation_case_insensitive = Databáze používá collation %s. Jedná se o intenzivní collation. Ačkoli s ní Forgejo nejspíše bude pracovat, mohou nastat určité vzácné případy, kdy nebude pracovat tak, jak má.
|
||||||
self_check.database_fix_mssql = Uživatelé MSSQL mohou tento problém vyřešit pouze ručními SQL příkazy „ALTER ... COLLATE ...“.
|
|
||||||
auths.oauth2_map_group_to_team = Zmapovat zabrané skupiny u týmů organizací (volitelné - vyžaduje název claimu výše)
|
auths.oauth2_map_group_to_team = Zmapovat zabrané skupiny u týmů organizací (volitelné - vyžaduje název claimu výše)
|
||||||
monitor.queue.settings.desc = Pooly dynamicky rostou podle blokování fronty jejich workerů.
|
monitor.queue.settings.desc = Pooly dynamicky rostou podle blokování fronty jejich workerů.
|
||||||
|
|
||||||
|
@ -3405,7 +3404,6 @@ self_check.database_collation_mismatch=Očekávejte, že databáze použije coll
|
||||||
self_check.database_collation_case_insensitive=Databáze používá collation %s, což je collation nerozlišující velká a malá písmena. Ačkoli s ní Gitea může pracovat, mohou se vyskytnout vzácné případy, kdy nebude fungovat podle očekávání.
|
self_check.database_collation_case_insensitive=Databáze používá collation %s, což je collation nerozlišující velká a malá písmena. Ačkoli s ní Gitea může pracovat, mohou se vyskytnout vzácné případy, kdy nebude fungovat podle očekávání.
|
||||||
self_check.database_inconsistent_collation_columns=Databáze používá collation %s, ale tyto sloupce používají chybné collation. To může způsobit neočekávané problémy.
|
self_check.database_inconsistent_collation_columns=Databáze používá collation %s, ale tyto sloupce používají chybné collation. To může způsobit neočekávané problémy.
|
||||||
self_check.database_fix_mysql=Pro uživatele MySQL/MariaDB můžete použít příkaz "gitea doctor convert", který opraví problémy s collation, nebo můžete také problém vyřešit příkazem "ALTER ... COLLATE ..." SQL ručně.
|
self_check.database_fix_mysql=Pro uživatele MySQL/MariaDB můžete použít příkaz "gitea doctor convert", který opraví problémy s collation, nebo můžete také problém vyřešit příkazem "ALTER ... COLLATE ..." SQL ručně.
|
||||||
self_check.database_fix_mssql=Uživatelé MSSQL mohou problém vyřešit pouze pomocí příkazu "ALTER ... COLLATE ..." SQL ručně.
|
|
||||||
auths.tips.gmail_settings = Nastavení služby Gmail:
|
auths.tips.gmail_settings = Nastavení služby Gmail:
|
||||||
config_summary = Souhrn
|
config_summary = Souhrn
|
||||||
config.open_with_editor_app_help = Editory v nabídce „Otevřít pomocí“ v nabídce klonování. Ponechte prázdné pro použití výchozího editoru (zobrazíte jej rozšířením).
|
config.open_with_editor_app_help = Editory v nabídce „Otevřít pomocí“ v nabídce klonování. Ponechte prázdné pro použití výchozího editoru (zobrazíte jej rozšířením).
|
||||||
|
|
|
@ -217,7 +217,7 @@ license_desc=Hole dir <a target="_blank" rel="noopener noreferrer" href="https:/
|
||||||
install=Installation
|
install=Installation
|
||||||
title=Erstkonfiguration
|
title=Erstkonfiguration
|
||||||
docker_helper=Wenn du Forgejo in einem Docker-Container nutzt, lies bitte die <a target="_blank" rel="noopener noreferrer" href="%s">Dokumentation</a>, bevor du irgendwelche Einstellungen veränderst.
|
docker_helper=Wenn du Forgejo in einem Docker-Container nutzt, lies bitte die <a target="_blank" rel="noopener noreferrer" href="%s">Dokumentation</a>, bevor du irgendwelche Einstellungen veränderst.
|
||||||
require_db_desc=Forgejo benötigt MySQL, PostgreSQL, MSSQL, SQLite3 oder TiDB (MySQL-Protokoll).
|
require_db_desc=Forgejo benötigt MySQL, PostgreSQL, SQLite3 oder TiDB (MySQL-Protokoll).
|
||||||
db_title=Datenbankeinstellungen
|
db_title=Datenbankeinstellungen
|
||||||
db_type=Datenbanktyp
|
db_type=Datenbanktyp
|
||||||
host=Host
|
host=Host
|
||||||
|
@ -3368,7 +3368,6 @@ self_check = Selbstprüfung
|
||||||
dashboard.sync_repo_tags = Tags aus Git-Daten zu Datenbank synchronisieren
|
dashboard.sync_repo_tags = Tags aus Git-Daten zu Datenbank synchronisieren
|
||||||
emails.change_email_text = Bist du dir sicher, dass du diese E-Mail-Addresse aktualisieren möchtest?
|
emails.change_email_text = Bist du dir sicher, dass du diese E-Mail-Addresse aktualisieren möchtest?
|
||||||
packages.cleanup.success = Abgelaufene Daten erfolgreich gesäubert
|
packages.cleanup.success = Abgelaufene Daten erfolgreich gesäubert
|
||||||
self_check.database_fix_mssql = Für MSSQL-Benutzer: Du kannst das Problem im Moment nur mit „ALTER … COLLATE …“-SQLs beheben.
|
|
||||||
self_check.no_problem_found = Noch kein Problem gefunden.
|
self_check.no_problem_found = Noch kein Problem gefunden.
|
||||||
self_check.database_inconsistent_collation_columns = Datenbank benutzt Collation %s, aber diese Spalten benutzen Collations, die nicht zusammenpassen. Das könnte ein paar unerwartete Probleme verursachen.
|
self_check.database_inconsistent_collation_columns = Datenbank benutzt Collation %s, aber diese Spalten benutzen Collations, die nicht zusammenpassen. Das könnte ein paar unerwartete Probleme verursachen.
|
||||||
self_check.database_collation_mismatch = Erwarte von Datenbank, folgende Collation zu verwenden: %s
|
self_check.database_collation_mismatch = Erwarte von Datenbank, folgende Collation zu verwenden: %s
|
||||||
|
|
|
@ -211,7 +211,7 @@ license_desc=Κατέβασε το <a target="_blank" rel="noopener noreferrer"
|
||||||
install=Εγκατάσταση
|
install=Εγκατάσταση
|
||||||
title=Αρχικές ρυθμίσεις
|
title=Αρχικές ρυθμίσεις
|
||||||
docker_helper=Αν εκτελέσετε το Forgejo μέσα στο Docker, παρακαλώ διαβάστε το <a target="_blank" rel="noopener noreferrer" href="%s">εγχειρίδιο</a> πριν αλλάξετε τις ρυθμίσεις.
|
docker_helper=Αν εκτελέσετε το Forgejo μέσα στο Docker, παρακαλώ διαβάστε το <a target="_blank" rel="noopener noreferrer" href="%s">εγχειρίδιο</a> πριν αλλάξετε τις ρυθμίσεις.
|
||||||
require_db_desc=Το Forgejo απαιτεί MySQL, PostgreSQL, MSSQL, SQLite3 ή TiDB (με πρωτόκολλο MySQL).
|
require_db_desc=Το Forgejo απαιτεί MySQL, PostgreSQL, SQLite3 ή TiDB (με πρωτόκολλο MySQL).
|
||||||
db_title=Ρυθμίσεις βάσης δεδομένων
|
db_title=Ρυθμίσεις βάσης δεδομένων
|
||||||
db_type=Είδος βάσης δεδομένων
|
db_type=Είδος βάσης δεδομένων
|
||||||
host=Διακομιστής
|
host=Διακομιστής
|
||||||
|
@ -3322,7 +3322,6 @@ notices.desc=Περιγραφή
|
||||||
notices.op=Λειτ.
|
notices.op=Λειτ.
|
||||||
notices.delete_success=Οι ειδοποιήσεις του συστήματος έχουν διαγραφεί.
|
notices.delete_success=Οι ειδοποιήσεις του συστήματος έχουν διαγραφεί.
|
||||||
self_check.no_problem_found = Μέχρι τώρα, δεν έχει βρεθεί κάποιο πρόβλημα.
|
self_check.no_problem_found = Μέχρι τώρα, δεν έχει βρεθεί κάποιο πρόβλημα.
|
||||||
self_check.database_fix_mssql = Προς το παρόν, οι χρήστες του MSSQL μπορούν να διορθώσουν το πρόβλημα αυτό χειροκίνητα χρησιμοποιώντας τις εντολές SQL «ALTER ... COLLATE ...».
|
|
||||||
self_check = Αυτοέλεγχος
|
self_check = Αυτοέλεγχος
|
||||||
dashboard.sync_repo_tags = Συγχρονισμός tag από δεδομένα git στην βάση δεδομένων
|
dashboard.sync_repo_tags = Συγχρονισμός tag από δεδομένα git στην βάση δεδομένων
|
||||||
dashboard.sync_tag.started = Ο συγχρονισμός tag έχει ξεκινήσει
|
dashboard.sync_tag.started = Ο συγχρονισμός tag έχει ξεκινήσει
|
||||||
|
|
|
@ -239,7 +239,7 @@ license_desc = Go get <a target="_blank" rel="noopener noreferrer" href="https:/
|
||||||
install = Installation
|
install = Installation
|
||||||
title = Initial configuration
|
title = Initial configuration
|
||||||
docker_helper = If you run Forgejo inside Docker, please read the <a target="_blank" rel="noopener noreferrer" href="%s">documentation</a> before changing any settings.
|
docker_helper = If you run Forgejo inside Docker, please read the <a target="_blank" rel="noopener noreferrer" href="%s">documentation</a> before changing any settings.
|
||||||
require_db_desc = Forgejo requires MySQL, PostgreSQL, MSSQL, SQLite3 or TiDB (MySQL protocol).
|
require_db_desc = Forgejo requires MySQL, PostgreSQL, SQLite3 or TiDB (MySQL protocol).
|
||||||
db_title = Database settings
|
db_title = Database settings
|
||||||
db_type = Database type
|
db_type = Database type
|
||||||
host = Host
|
host = Host
|
||||||
|
@ -3381,7 +3381,6 @@ self_check.database_collation_mismatch = Expect database to use collation: %s
|
||||||
self_check.database_collation_case_insensitive = Database is using a collation %s, which is an insensitive collation. Although Forgejo could work with it, there might be some rare cases which don't work as expected.
|
self_check.database_collation_case_insensitive = Database is using a collation %s, which is an insensitive collation. Although Forgejo could work with it, there might be some rare cases which don't work as expected.
|
||||||
self_check.database_inconsistent_collation_columns = Database is using collation %s, but these columns are using mismatched collations. It might cause some unexpected problems.
|
self_check.database_inconsistent_collation_columns = Database is using collation %s, but these columns are using mismatched collations. It might cause some unexpected problems.
|
||||||
self_check.database_fix_mysql = For MySQL/MariaDB users, you could use the "gitea doctor convert" command to fix the collation problems, or you could also fix the problem by "ALTER ... COLLATE ..." SQLs manually.
|
self_check.database_fix_mysql = For MySQL/MariaDB users, you could use the "gitea doctor convert" command to fix the collation problems, or you could also fix the problem by "ALTER ... COLLATE ..." SQLs manually.
|
||||||
self_check.database_fix_mssql = For MSSQL users, you could only fix the problem by "ALTER ... COLLATE ..." SQLs manually at the moment.
|
|
||||||
|
|
||||||
[action]
|
[action]
|
||||||
create_repo = created repository <a href="%s">%s</a>
|
create_repo = created repository <a href="%s">%s</a>
|
||||||
|
|
|
@ -226,7 +226,7 @@ disable_gravatar = Malŝalti profilbildojn per Gravatar
|
||||||
repo_path_helper = Foraj Git-deponejoj konserviĝos al tiu ĉi dosierujo.
|
repo_path_helper = Foraj Git-deponejoj konserviĝos al tiu ĉi dosierujo.
|
||||||
sqlite_helper = Dosiervojo por la datumbazo SQLite3.<br>Enigu absolutan vojon se vi rulas Forgejon kiel servo.
|
sqlite_helper = Dosiervojo por la datumbazo SQLite3.<br>Enigu absolutan vojon se vi rulas Forgejon kiel servo.
|
||||||
enable_captcha = Ŝalti dumregistriĝan teston de homeco
|
enable_captcha = Ŝalti dumregistriĝan teston de homeco
|
||||||
require_db_desc = Forgejo bezonas kiel datumbazo MySQL, PostgreSQL, MSSQL, SQLite3, aŭ TiDB (MySQL komunikformo).
|
require_db_desc = Forgejo bezonas kiel datumbazo MySQL, PostgreSQL, SQLite3, aŭ TiDB (MySQL komunikformo).
|
||||||
smtp_from = Sendu retleterojn kiel
|
smtp_from = Sendu retleterojn kiel
|
||||||
general_title = Ĝeneralaj agordoj
|
general_title = Ĝeneralaj agordoj
|
||||||
password = Pasvorto
|
password = Pasvorto
|
||||||
|
|
|
@ -210,7 +210,7 @@ license_desc=¡Está todo en < <a target="_blank" rel="noopener noreferrer" href
|
||||||
install=Instalación
|
install=Instalación
|
||||||
title=Configuración inicial
|
title=Configuración inicial
|
||||||
docker_helper=Si está ejecutando Forgejo dentro de un contenedor Docker, por favor lea la <a target="_blank" rel="noopener noreferrer" href="%s">documentación</a> antes de realizar cambios en la configuración.
|
docker_helper=Si está ejecutando Forgejo dentro de un contenedor Docker, por favor lea la <a target="_blank" rel="noopener noreferrer" href="%s">documentación</a> antes de realizar cambios en la configuración.
|
||||||
require_db_desc=Forgejo requiere una base de datos MySQL, PostgreSQL, MSSQL, SQLite3 o TiDB (usar el protocolo MySQL).
|
require_db_desc=Forgejo requiere una base de datos MySQL, PostgreSQL, SQLite3 o TiDB (usar el protocolo MySQL).
|
||||||
db_title=Configuración de base de datos
|
db_title=Configuración de base de datos
|
||||||
db_type=Tipo de base de datos
|
db_type=Tipo de base de datos
|
||||||
host=Servidor
|
host=Servidor
|
||||||
|
|
|
@ -144,7 +144,7 @@ license_desc=Mene osoitteeseen <a target="_blank" rel="noopener noreferrer" href
|
||||||
install=Asennus
|
install=Asennus
|
||||||
title=Alkuperäiset asetukset
|
title=Alkuperäiset asetukset
|
||||||
docker_helper=Jos ajat Forgejoa Dockerin sisällä, lue <a target="_blank" rel="noopener noreferrer" href="%s">ohjeet</a> ennen minkään asetuksen muuttamista.
|
docker_helper=Jos ajat Forgejoa Dockerin sisällä, lue <a target="_blank" rel="noopener noreferrer" href="%s">ohjeet</a> ennen minkään asetuksen muuttamista.
|
||||||
require_db_desc=Forgejo tarvitsee toimiakseen MySQL, PostgreSQL, MSSQL, SQLite3 tai TiDB (MySQL protokolla) tietokannan.
|
require_db_desc=Forgejo tarvitsee toimiakseen MySQL, PostgreSQL, SQLite3 tai TiDB (MySQL protokolla) tietokannan.
|
||||||
db_title=Tietokanta asetukset
|
db_title=Tietokanta asetukset
|
||||||
db_type=Tietokanta tyyppi
|
db_type=Tietokanta tyyppi
|
||||||
host=Isäntä
|
host=Isäntä
|
||||||
|
|
|
@ -211,7 +211,7 @@ reinstall_error = Sinusubukan mong mag-install sa umiiral na Forgejo database
|
||||||
install = Pag-install
|
install = Pag-install
|
||||||
title = Paunang pagsasaayos
|
title = Paunang pagsasaayos
|
||||||
docker_helper = Kapag tinatakbo mo ang Forgejo sa loob ng Docker, mangyaring basahin ang <a target="_blank" rel="noopener noreferrer" href="%s">dokumentasyon</a> bago baguhin ang anumang mga setting.
|
docker_helper = Kapag tinatakbo mo ang Forgejo sa loob ng Docker, mangyaring basahin ang <a target="_blank" rel="noopener noreferrer" href="%s">dokumentasyon</a> bago baguhin ang anumang mga setting.
|
||||||
require_db_desc = Kinakailangan ng Forgejo ang MySQL, PostgreSQL, MSSQL, SQLite3 o TiDB (MySQL protocol).
|
require_db_desc = Kinakailangan ng Forgejo ang MySQL, PostgreSQL, SQLite3 o TiDB (MySQL protocol).
|
||||||
db_title = Mga setting ng database
|
db_title = Mga setting ng database
|
||||||
db_type = Uri ng database
|
db_type = Uri ng database
|
||||||
host = Host
|
host = Host
|
||||||
|
|
|
@ -218,7 +218,7 @@ license_desc=Toutes les sources sont sur <a target="_blank" rel="noopener norefe
|
||||||
install=Installation
|
install=Installation
|
||||||
title=Configuration initiale
|
title=Configuration initiale
|
||||||
docker_helper=Si vous exécutez Forgejo dans Docker, veuillez lire la <a target="_blank" rel="noopener noreferrer" href="%s">documentation</a> avant de modifier les paramètres.
|
docker_helper=Si vous exécutez Forgejo dans Docker, veuillez lire la <a target="_blank" rel="noopener noreferrer" href="%s">documentation</a> avant de modifier les paramètres.
|
||||||
require_db_desc=Forgejo nécessite MySQL, PostgreSQL, MSSQL, SQLite3 ou TiDB (avec le protocole MySQL).
|
require_db_desc=Forgejo nécessite MySQL, PostgreSQL, SQLite3 ou TiDB (avec le protocole MySQL).
|
||||||
db_title=Paramètres de la base de données
|
db_title=Paramètres de la base de données
|
||||||
db_type=Type de base de données
|
db_type=Type de base de données
|
||||||
host=Hôte
|
host=Hôte
|
||||||
|
@ -3388,14 +3388,12 @@ self_check.database_collation_mismatch = La base de donnée devrait utiliser la
|
||||||
self_check.database_collation_case_insensitive = La base de donnée utilise la collation %s qui n'est pas sensible à la casse. Bien que Forgejo puisse fonctionner de cette façon, il est possible que certains cas limite d'utilisation de la casse ne fonctionne pas comme attendu.
|
self_check.database_collation_case_insensitive = La base de donnée utilise la collation %s qui n'est pas sensible à la casse. Bien que Forgejo puisse fonctionner de cette façon, il est possible que certains cas limite d'utilisation de la casse ne fonctionne pas comme attendu.
|
||||||
self_check.database_inconsistent_collation_columns = La base de donnée utilise la collation %s, mais ces colonnes utilisent des collations incohérentes. Cela peut causer des problèmes inattendus.
|
self_check.database_inconsistent_collation_columns = La base de donnée utilise la collation %s, mais ces colonnes utilisent des collations incohérentes. Cela peut causer des problèmes inattendus.
|
||||||
self_check.database_fix_mysql = Les utilisateurs de MySQL/MariaDB peuvent utiliser la commande "forgejo doctor convert" pour corriger les problèmes de collation, ou bien manuellement avec la commande SQL "ALTER ... COLLATE ...".
|
self_check.database_fix_mysql = Les utilisateurs de MySQL/MariaDB peuvent utiliser la commande "forgejo doctor convert" pour corriger les problèmes de collation, ou bien manuellement avec la commande SQL "ALTER ... COLLATE ...".
|
||||||
self_check.database_fix_mssql = Les utilisateurs de MSSQL sont pour l'instant contraint d'utiliser la commande SQL "ALTER ... COLLATE ..." pour corriger ce problème.
|
|
||||||
|
|
||||||
self_check.no_problem_found=Aucun problème trouvé pour l’instant.
|
self_check.no_problem_found=Aucun problème trouvé pour l’instant.
|
||||||
self_check.database_collation_mismatch=Exige que la base de données utilise la collation %s.
|
self_check.database_collation_mismatch=Exige que la base de données utilise la collation %s.
|
||||||
self_check.database_collation_case_insensitive=La base de données utilise la collation %s, insensible à la casse. Bien que Gitea soit compatible, il peut y avoir quelques rares cas qui ne fonctionnent pas comme prévu.
|
self_check.database_collation_case_insensitive=La base de données utilise la collation %s, insensible à la casse. Bien que Gitea soit compatible, il peut y avoir quelques rares cas qui ne fonctionnent pas comme prévu.
|
||||||
self_check.database_inconsistent_collation_columns=La base de données utilise la collation %s, mais ces colonnes utilisent des collations différentes. Cela peut causer des problèmes imprévus.
|
self_check.database_inconsistent_collation_columns=La base de données utilise la collation %s, mais ces colonnes utilisent des collations différentes. Cela peut causer des problèmes imprévus.
|
||||||
self_check.database_fix_mysql=Pour les utilisateurs de MySQL ou MariaDB, vous pouvez utiliser la commande « gitea doctor convert » dans un terminal ou exécuter une requête du type « ALTER … COLLATE ... » pour résoudre les problèmes de collation.
|
self_check.database_fix_mysql=Pour les utilisateurs de MySQL ou MariaDB, vous pouvez utiliser la commande « gitea doctor convert » dans un terminal ou exécuter une requête du type « ALTER … COLLATE ... » pour résoudre les problèmes de collation.
|
||||||
self_check.database_fix_mssql=Pour les utilisateurs de MSSQL, vous ne pouvez résoudre le problème qu’en exécutant une requête SQL du type « ALTER … COLLATE … ».
|
|
||||||
|
|
||||||
[action]
|
[action]
|
||||||
create_repo=a créé le dépôt <a href="%s">%s</a>
|
create_repo=a créé le dépôt <a href="%s">%s</a>
|
||||||
|
|
|
@ -141,7 +141,7 @@ license_desc=Sæktu <a target="_blank" rel="noopener noreferrer" href="https://f
|
||||||
install=Uppsetning
|
install=Uppsetning
|
||||||
title=Upphafleg Uppsetning
|
title=Upphafleg Uppsetning
|
||||||
docker_helper=Ef þú keyrir Forgejo inni í Docker þá viltu vinsamlegast lesa <a target="_blank" rel="noopener noreferrer" href="%s">leiðbeiningaritið</a> áður en þú breytir stillingum.
|
docker_helper=Ef þú keyrir Forgejo inni í Docker þá viltu vinsamlegast lesa <a target="_blank" rel="noopener noreferrer" href="%s">leiðbeiningaritið</a> áður en þú breytir stillingum.
|
||||||
require_db_desc=Forgejo krefst MySQL, PostgreSQL, MSSQL, SQLite3 eða TiDB (MySQL samskiptareglur).
|
require_db_desc=Forgejo krefst MySQL, PostgreSQL, SQLite3 eða TiDB (MySQL samskiptareglur).
|
||||||
db_title=Gagnagrunnsstillingar
|
db_title=Gagnagrunnsstillingar
|
||||||
db_type=Tegund Gagnagrunns
|
db_type=Tegund Gagnagrunns
|
||||||
host=Hýsill
|
host=Hýsill
|
||||||
|
|
|
@ -215,7 +215,7 @@ install_desc = Semplicemente <a target="_blank" rel="noopener noreferrer" href="
|
||||||
install=Installazione
|
install=Installazione
|
||||||
title=Configurazione iniziale
|
title=Configurazione iniziale
|
||||||
docker_helper=Se stai usando Forgejo con Docker, leggi <a target="_blank" rel="noopener noreferrer" href="%s">la documentazione</a> prima di cambiare qualsiasi impostazione.
|
docker_helper=Se stai usando Forgejo con Docker, leggi <a target="_blank" rel="noopener noreferrer" href="%s">la documentazione</a> prima di cambiare qualsiasi impostazione.
|
||||||
require_db_desc=Forgejo requires MySQL, PostgreSQL, MSSQL, SQLite3 or TiDB (MySQL protocol).
|
require_db_desc=Forgejo requires MySQL, PostgreSQL, SQLite3 or TiDB (MySQL protocol).
|
||||||
db_title=Impostazioni database
|
db_title=Impostazioni database
|
||||||
db_type=Tipo di database
|
db_type=Tipo di database
|
||||||
host=Host
|
host=Host
|
||||||
|
@ -3351,7 +3351,6 @@ monitor.queue.settings.remove_all_items_done = Tutti gli elementi in coda sono s
|
||||||
self_check.database_collation_mismatch = Pretendi che la base di dati usi la collazione: %s
|
self_check.database_collation_mismatch = Pretendi che la base di dati usi la collazione: %s
|
||||||
self_check.database_fix_mysql = Per utenti MySQL/MariaDB, potresti usare il comando "gitea doctor convert" per risolvere problemi di collazione, o potresti risolvere il problema manualmente tramite SQL con "ALTER ... COLLATE ...".
|
self_check.database_fix_mysql = Per utenti MySQL/MariaDB, potresti usare il comando "gitea doctor convert" per risolvere problemi di collazione, o potresti risolvere il problema manualmente tramite SQL con "ALTER ... COLLATE ...".
|
||||||
self_check.database_collation_case_insensitive = La base di dati sta usando la collazione %s, che è una collazione insensibile. Nonostante Forgejo potrebbe lavorarci, ci potrebbero essere rari casi che non vanno come previsto.
|
self_check.database_collation_case_insensitive = La base di dati sta usando la collazione %s, che è una collazione insensibile. Nonostante Forgejo potrebbe lavorarci, ci potrebbero essere rari casi che non vanno come previsto.
|
||||||
self_check.database_fix_mssql = Gli utenti MSSQL possono provare a risolvere il problema tramite SQL con "ALTER ... COLLATE ..." manualmente, per il momento.
|
|
||||||
|
|
||||||
|
|
||||||
[action]
|
[action]
|
||||||
|
|
|
@ -214,7 +214,7 @@ license_desc=Go get <a target="_blank" rel="noopener noreferrer" href="https://f
|
||||||
install=インストール
|
install=インストール
|
||||||
title=初期設定
|
title=初期設定
|
||||||
docker_helper=ForgejoをDocker内で実行する場合は、設定を変更する前に<a target="_blank" rel="noopener noreferrer" href="%s">ドキュメント</a>を読んでください。
|
docker_helper=ForgejoをDocker内で実行する場合は、設定を変更する前に<a target="_blank" rel="noopener noreferrer" href="%s">ドキュメント</a>を読んでください。
|
||||||
require_db_desc=Forgejoには、MySQL、PostgreSQL、MSSQL、SQLite3、またはTiDB(MySQL プロトコル) が必要です。
|
require_db_desc=Forgejoには、MySQL、PostgreSQL、SQLite3、またはTiDB(MySQL プロトコル) が必要です。
|
||||||
db_title=データベース設定
|
db_title=データベース設定
|
||||||
db_type=データベースのタイプ
|
db_type=データベースのタイプ
|
||||||
host=ホスト
|
host=ホスト
|
||||||
|
|
|
@ -197,7 +197,7 @@ license_desc=Iegūsti <a target="_blank" rel="noopener noreferrer" href="https:/
|
||||||
install=Instalācija
|
install=Instalācija
|
||||||
title=Sākotnējā konfigurācija
|
title=Sākotnējā konfigurācija
|
||||||
docker_helper=Ja Forgejo ir uzstādīts Docker konteinerī, izlasiet <a target="_blank" rel="noopener noreferrer" href="%s">vadlīninas</a> pirms maināt iestatījumus.
|
docker_helper=Ja Forgejo ir uzstādīts Docker konteinerī, izlasiet <a target="_blank" rel="noopener noreferrer" href="%s">vadlīninas</a> pirms maināt iestatījumus.
|
||||||
require_db_desc=Forgejo nepieciešams MySQL, PostgreSQL, MSSQL, SQLite3 vai TiDB (izmantojot MySQL protokolu).
|
require_db_desc=Forgejo nepieciešams MySQL, PostgreSQL, SQLite3 vai TiDB (izmantojot MySQL protokolu).
|
||||||
db_title=Datu bāzes iestatījumi
|
db_title=Datu bāzes iestatījumi
|
||||||
db_type=Datu bāzes veids
|
db_type=Datu bāzes veids
|
||||||
host=Resursdators
|
host=Resursdators
|
||||||
|
|
|
@ -217,7 +217,7 @@ install_desc = Draai gewoon <a target="_blank" rel="noopener noreferrer" href="h
|
||||||
install=Installatie
|
install=Installatie
|
||||||
title=Initiële configuratie
|
title=Initiële configuratie
|
||||||
docker_helper=Als je gitea draait in Docker, Lees eerst de <a target="_blank" rel="noopener noreferrer" href="%s">documentatie</a> voordat je een instelling aanpast.
|
docker_helper=Als je gitea draait in Docker, Lees eerst de <a target="_blank" rel="noopener noreferrer" href="%s">documentatie</a> voordat je een instelling aanpast.
|
||||||
require_db_desc=Forgejo vereist MySQL, PostgreSQL, MSSQL, SQLite3 of TiDB (MySQL protocol).
|
require_db_desc=Forgejo vereist MySQL, PostgreSQL, SQLite3 of TiDB (MySQL protocol).
|
||||||
db_title=Database-instellingen
|
db_title=Database-instellingen
|
||||||
db_type=Database-type
|
db_type=Database-type
|
||||||
host=Server
|
host=Server
|
||||||
|
@ -3323,7 +3323,6 @@ dashboard.sync_repo_branches = Synchroniseren gemiste branches van git data naar
|
||||||
monitor.processes_count = %d Processen
|
monitor.processes_count = %d Processen
|
||||||
monitor.process.children = Kinderen
|
monitor.process.children = Kinderen
|
||||||
self_check.database_inconsistent_collation_columns = Database gebruikt collatie %s, maar deze kolommen gebruiken onjuiste collaties. Dit kan onverwachte problemen veroorzaken.
|
self_check.database_inconsistent_collation_columns = Database gebruikt collatie %s, maar deze kolommen gebruiken onjuiste collaties. Dit kan onverwachte problemen veroorzaken.
|
||||||
self_check.database_fix_mssql = Voor MSSQL gebruikers kan je het probleem alleen oplossen door "ALTER ... COLLATE ..." SQL's handmatig op te lossen.
|
|
||||||
monitor.stacktrace = Stacktrace
|
monitor.stacktrace = Stacktrace
|
||||||
monitor.download_diagnosis_report = Diagnoserapport downloaden
|
monitor.download_diagnosis_report = Diagnoserapport downloaden
|
||||||
self_check.database_collation_case_insensitive = Database gebruikt collatie %s, wat een ongevoelige collatie is. Hoewel Forgejo ermee kan werken, kunnen er enkele zeldzame gevallen zijn die niet werken zoals verwacht.
|
self_check.database_collation_case_insensitive = Database gebruikt collatie %s, wat een ongevoelige collatie is. Hoewel Forgejo ermee kan werken, kunnen er enkele zeldzame gevallen zijn die niet werken zoals verwacht.
|
||||||
|
|
|
@ -160,7 +160,7 @@ license_desc=Pobierz na <a target="_blank" rel="noopener noreferrer" href="https
|
||||||
install=Instalacja
|
install=Instalacja
|
||||||
title=Wstępna konfiguracja
|
title=Wstępna konfiguracja
|
||||||
docker_helper=Jeśli używasz Forgejo za pomocą Docker'a, przeczytaj <a target="_blank" rel="noopener noreferrer" href="%s">dokumentację</a> przed wprowadzeniem jakichkolwiek zmian.
|
docker_helper=Jeśli używasz Forgejo za pomocą Docker'a, przeczytaj <a target="_blank" rel="noopener noreferrer" href="%s">dokumentację</a> przed wprowadzeniem jakichkolwiek zmian.
|
||||||
require_db_desc=Forgejo wymaga MySQL, PostgreSQL, MSSQL, SQLite3 lub TiDB (protokół MySQL).
|
require_db_desc=Forgejo wymaga MySQL, PostgreSQL, SQLite3 lub TiDB (protokół MySQL).
|
||||||
db_title=Ustawienia bazy danych
|
db_title=Ustawienia bazy danych
|
||||||
db_type=Typ bazy danych
|
db_type=Typ bazy danych
|
||||||
host=Serwer
|
host=Serwer
|
||||||
|
|
|
@ -205,7 +205,7 @@ install_desc = Apenas <a target="_blank" rel="noopener noreferrer" href="https:/
|
||||||
install=Instalação
|
install=Instalação
|
||||||
title=Configuração inicial
|
title=Configuração inicial
|
||||||
docker_helper=Se você está rodando o Forgejo dentro do Docker, por favor leia a <a target="_blank" rel="noopener noreferrer" href="%s">documentação</a> cuidadosamente antes de alterar qualquer coisa nesta página.
|
docker_helper=Se você está rodando o Forgejo dentro do Docker, por favor leia a <a target="_blank" rel="noopener noreferrer" href="%s">documentação</a> cuidadosamente antes de alterar qualquer coisa nesta página.
|
||||||
require_db_desc=Forgejo requer MySQL, PostgreSQL, MSSQL, SQLite3 ou TiDB (protocolo MySQL).
|
require_db_desc=Forgejo requer MySQL, PostgreSQL, SQLite3 ou TiDB (protocolo MySQL).
|
||||||
db_title=Configurações de banco de dados
|
db_title=Configurações de banco de dados
|
||||||
db_type=Tipo de banco de dados
|
db_type=Tipo de banco de dados
|
||||||
host=Servidor
|
host=Servidor
|
||||||
|
|
|
@ -198,7 +198,7 @@ license_desc=Vá buscá-lo em <a target="_blank" rel="noopener noreferrer" href=
|
||||||
install=Instalação
|
install=Instalação
|
||||||
title=Configuração inicial
|
title=Configuração inicial
|
||||||
docker_helper=Se correr o Forgejo dentro do Docker, leia a <a target="_blank" rel="noopener noreferrer" href="%s">documentação</a> antes de alterar quaisquer configurações.
|
docker_helper=Se correr o Forgejo dentro do Docker, leia a <a target="_blank" rel="noopener noreferrer" href="%s">documentação</a> antes de alterar quaisquer configurações.
|
||||||
require_db_desc=Forgejo requer MySQL, PostgreSQL, MSSQL, SQLite3 ou TiDB (protocolo MySQL).
|
require_db_desc=Forgejo requer MySQL, PostgreSQL, SQLite3 ou TiDB (protocolo MySQL).
|
||||||
db_title=Configurações da base de dados
|
db_title=Configurações da base de dados
|
||||||
db_type=Tipo de base de dados
|
db_type=Tipo de base de dados
|
||||||
host=Servidor
|
host=Servidor
|
||||||
|
@ -3256,7 +3256,6 @@ self_check.database_collation_mismatch=Supor que a base de dados usa a colação
|
||||||
self_check.database_collation_case_insensitive=A base de dados está a usar a colação %s, que é insensível à diferença entre maiúsculas e minúsculas. Embora o Gitea possa trabalhar com ela, pode haver alguns casos raros que não funcionem como esperado.
|
self_check.database_collation_case_insensitive=A base de dados está a usar a colação %s, que é insensível à diferença entre maiúsculas e minúsculas. Embora o Gitea possa trabalhar com ela, pode haver alguns casos raros que não funcionem como esperado.
|
||||||
self_check.database_inconsistent_collation_columns=A base de dados está a usar a colação %s, mas estas colunas estão a usar colações diferentes. Isso poderá causar alguns problemas inesperados.
|
self_check.database_inconsistent_collation_columns=A base de dados está a usar a colação %s, mas estas colunas estão a usar colações diferentes. Isso poderá causar alguns problemas inesperados.
|
||||||
self_check.database_fix_mysql=Para utilizadores do MySQL/MariaDB, pode usar o comando "gitea doctor convert" para resolver os problemas de colação. Também pode resolver o problema com comandos SQL "ALTER ... COLLATE ..." aplicados manualmente.
|
self_check.database_fix_mysql=Para utilizadores do MySQL/MariaDB, pode usar o comando "gitea doctor convert" para resolver os problemas de colação. Também pode resolver o problema com comandos SQL "ALTER ... COLLATE ..." aplicados manualmente.
|
||||||
self_check.database_fix_mssql=Para utilizadores do MSSQL só pode resolver o problema aplicando comandos SQL "ALTER ... COLLATE ..." manualmente, por enquanto.
|
|
||||||
|
|
||||||
[action]
|
[action]
|
||||||
create_repo=criou o repositório <a href="%s">%s</a>
|
create_repo=criou o repositório <a href="%s">%s</a>
|
||||||
|
|
|
@ -217,7 +217,7 @@ license_desc=Всё это на <a target="_blank" rel="noopener noreferrer" hre
|
||||||
install=Установка
|
install=Установка
|
||||||
title=Начальная конфигурация
|
title=Начальная конфигурация
|
||||||
docker_helper=Если вы запускаете Forgejo под Docker, пожалуйста, ознакомьтесь с <a target="_blank" rel="noopener noreferrer" href="%s">документацией</a>, прежде чем изменять любые настройки.
|
docker_helper=Если вы запускаете Forgejo под Docker, пожалуйста, ознакомьтесь с <a target="_blank" rel="noopener noreferrer" href="%s">документацией</a>, прежде чем изменять любые настройки.
|
||||||
require_db_desc=Forgejo требует MySQL, PostgreSQL, MSSQL, SQLite3 или TiDB (по протоколу MySQL).
|
require_db_desc=Forgejo требует MySQL, PostgreSQL, SQLite3 или TiDB (по протоколу MySQL).
|
||||||
db_title=Настройки базы данных
|
db_title=Настройки базы данных
|
||||||
db_type=Тип базы данных
|
db_type=Тип базы данных
|
||||||
host=Хост
|
host=Хост
|
||||||
|
@ -3349,7 +3349,6 @@ notices.delete_success=Уведомления системы были удале
|
||||||
self_check.no_problem_found = Пока проблем не обнаружено.
|
self_check.no_problem_found = Пока проблем не обнаружено.
|
||||||
auths.tip.gitea = Зарегистрируйте новое приложение OAuth2. Доступна инструкция: https://forgejo.org/docs/latest/user/oauth2-provider
|
auths.tip.gitea = Зарегистрируйте новое приложение OAuth2. Доступна инструкция: https://forgejo.org/docs/latest/user/oauth2-provider
|
||||||
auths.tips.oauth2.general.tip = При регистрации нового приложения OAuth2 ссылка обратного перенаправления должна быть:
|
auths.tips.oauth2.general.tip = При регистрации нового приложения OAuth2 ссылка обратного перенаправления должна быть:
|
||||||
self_check.database_fix_mssql = В настоящий момент пользователи MSSQL могут исправить проблемы с сопоставлением только ручным прописыванием "ALTER ... COLLATE ..." в SQL.
|
|
||||||
self_check.database_fix_mysql = Пользователи MySQL и MariaDB могут исправить проблемы с сопоставлением командой "gitea doctor convert". Также можно вручную вписать "ALTER ... COLLATE ..." в SQL.
|
self_check.database_fix_mysql = Пользователи MySQL и MariaDB могут исправить проблемы с сопоставлением командой "gitea doctor convert". Также можно вручную вписать "ALTER ... COLLATE ..." в SQL.
|
||||||
dashboard.cleanup_actions = Очистить устаревшие журналы и артефакты Действий
|
dashboard.cleanup_actions = Очистить устаревшие журналы и артефакты Действий
|
||||||
dashboard.sync_repo_branches = Синхронизировать ветки из Git в базу данных
|
dashboard.sync_repo_branches = Синхронизировать ветки из Git в базу данных
|
||||||
|
|
|
@ -196,7 +196,7 @@ license_desc=Získajte <a target="_blank" rel="noopener noreferrer" href="https:
|
||||||
install=Inštalácia
|
install=Inštalácia
|
||||||
title=Východzia konfigurácia
|
title=Východzia konfigurácia
|
||||||
docker_helper=Ak spúšťate Forgejo v Docker kontajneri, prečítajte si <a target="_blank" rel="noopener noreferrer" href="%s">dokumentáciu</a> pred zmenou akýchkoľvek nastavení.
|
docker_helper=Ak spúšťate Forgejo v Docker kontajneri, prečítajte si <a target="_blank" rel="noopener noreferrer" href="%s">dokumentáciu</a> pred zmenou akýchkoľvek nastavení.
|
||||||
require_db_desc=Forgejo vyžaduje MySQL, PostgreSQL, MSSQL, SQLite3 alebo TiDB (MySQL protokol).
|
require_db_desc=Forgejo vyžaduje MySQL, PostgreSQL, SQLite3 alebo TiDB (MySQL protokol).
|
||||||
db_title=Nastavenie databázy
|
db_title=Nastavenie databázy
|
||||||
db_type=Typ databázy
|
db_type=Typ databázy
|
||||||
host=Host
|
host=Host
|
||||||
|
|
|
@ -133,7 +133,7 @@ pull_requests = Zahteve za umik
|
||||||
|
|
||||||
[install]
|
[install]
|
||||||
reinstall_confirm_check_3 = Potrjujete, da ste popolnoma prepričani, da se ta program Forgejo izvaja s pravilno lokacijo app.ini, in da ste prepričani, da ga morate znova namestiti. Potrjujete, da se zavedate zgoraj navedenih tveganj.
|
reinstall_confirm_check_3 = Potrjujete, da ste popolnoma prepričani, da se ta program Forgejo izvaja s pravilno lokacijo app.ini, in da ste prepričani, da ga morate znova namestiti. Potrjujete, da se zavedate zgoraj navedenih tveganj.
|
||||||
require_db_desc = Forgejo zahteva MySQL, PostgreSQL, MSSQL, SQLite3 ali TiDB (protokol MySQL).
|
require_db_desc = Forgejo zahteva MySQL, PostgreSQL, SQLite3 ali TiDB (protokol MySQL).
|
||||||
password_algorithm_helper = Nastavite algoritem za stiskanje gesla. Algoritmi imajo različne zahteve in moč. Algoritem argon2 je precej varen, vendar porabi veliko pomnilnika in je lahko neprimeren za majhne sisteme.
|
password_algorithm_helper = Nastavite algoritem za stiskanje gesla. Algoritmi imajo različne zahteve in moč. Algoritem argon2 je precej varen, vendar porabi veliko pomnilnika in je lahko neprimeren za majhne sisteme.
|
||||||
reinstall_confirm_message = Ponovna namestitev z obstoječo zbirko podatkov Forgejo lahko povzroči več težav. V večini primerov morate za zagon programa Forgejo uporabiti obstoječi "app.ini". Če veste, kaj počnete, potrdite naslednje:
|
reinstall_confirm_message = Ponovna namestitev z obstoječo zbirko podatkov Forgejo lahko povzroči več težav. V večini primerov morate za zagon programa Forgejo uporabiti obstoječi "app.ini". Če veste, kaj počnete, potrdite naslednje:
|
||||||
err_admin_name_is_reserved = Administrator Uporabniško ime je neveljavno, uporabniško ime je rezervirano
|
err_admin_name_is_reserved = Administrator Uporabniško ime je neveljavno, uporabniško ime je rezervirano
|
||||||
|
|
|
@ -197,7 +197,7 @@ license_desc=Gidin ve <a target="_blank" rel="noopener noreferrer" href="https:/
|
||||||
install=Kurulum
|
install=Kurulum
|
||||||
title=Başlangıç Yapılandırması
|
title=Başlangıç Yapılandırması
|
||||||
docker_helper=Eğer Forgejo'yı Docker içerisinde çalıştırıyorsanız, lütfen herhangi bir değişiklik yapmadan önce <a target="_blank" rel="noopener noreferrer" href="%s">belgeleri</a> okuyun.
|
docker_helper=Eğer Forgejo'yı Docker içerisinde çalıştırıyorsanız, lütfen herhangi bir değişiklik yapmadan önce <a target="_blank" rel="noopener noreferrer" href="%s">belgeleri</a> okuyun.
|
||||||
require_db_desc=Forgejo MySQL, PostgreSQL, MSSQL, SQLite3 veya TiDB (MySQL protokolü) gerektirir.
|
require_db_desc=Forgejo MySQL, PostgreSQL, SQLite3 veya TiDB (MySQL protokolü) gerektirir.
|
||||||
db_title=Veritabanı Ayarları
|
db_title=Veritabanı Ayarları
|
||||||
db_type=Veritabanı Türü
|
db_type=Veritabanı Türü
|
||||||
host=Sunucu
|
host=Sunucu
|
||||||
|
|
|
@ -215,7 +215,7 @@ license_desc=所有的代码都开源在 <a target="_blank" rel="noopener norefe
|
||||||
install=安装页面
|
install=安装页面
|
||||||
title=初始配置
|
title=初始配置
|
||||||
docker_helper=如果您正在使用 Docker 容器运行 Forgejo,请务必先仔细阅读 <a target="_blank" rel="noopener noreferrer" href="%s">官方文档</a> 后再对本页面进行填写。
|
docker_helper=如果您正在使用 Docker 容器运行 Forgejo,请务必先仔细阅读 <a target="_blank" rel="noopener noreferrer" href="%s">官方文档</a> 后再对本页面进行填写。
|
||||||
require_db_desc=Forgejo 需要使用 MySQL、PostgreSQL、MSSQL、SQLite3 或 TiDB (MySQL协议) 等数据库
|
require_db_desc=Forgejo 需要使用 MySQL、PostgreSQL、SQLite3 或 TiDB (MySQL协议) 等数据库
|
||||||
db_title=数据库设置
|
db_title=数据库设置
|
||||||
db_type=数据库类型
|
db_type=数据库类型
|
||||||
host=数据库主机
|
host=数据库主机
|
||||||
|
@ -3377,14 +3377,12 @@ self_check.database_collation_mismatch = 期望数据库使用排序规则:%s
|
||||||
self_check.database_collation_case_insensitive = 数据库正在使用 %s 排序规则,这是一种不敏感的排序规则。 尽管 Forgejo 可以使用它,但在极少数情况下可能无法按照预期工作。
|
self_check.database_collation_case_insensitive = 数据库正在使用 %s 排序规则,这是一种不敏感的排序规则。 尽管 Forgejo 可以使用它,但在极少数情况下可能无法按照预期工作。
|
||||||
self_check.database_inconsistent_collation_columns = 数据库正在使用 %s 排序规则,但与这些列使用的排序规则不匹配。 这可能会导致一些意想不到的问题。
|
self_check.database_inconsistent_collation_columns = 数据库正在使用 %s 排序规则,但与这些列使用的排序规则不匹配。 这可能会导致一些意想不到的问题。
|
||||||
self_check.database_fix_mysql = 对于 MySQL/MariaDB 用户,您可以使用 "gitea doctor convert" 命令来修复排序规则问题,也可以通过SQL命令 "ALTER ... COLLATE ..." 来手动修复问题。
|
self_check.database_fix_mysql = 对于 MySQL/MariaDB 用户,您可以使用 "gitea doctor convert" 命令来修复排序规则问题,也可以通过SQL命令 "ALTER ... COLLATE ..." 来手动修复问题。
|
||||||
self_check.database_fix_mssql = 对于 MSSQL 用户,目前您只能通过SQL命令 "ALTER ... COLLATE ..." 来手动修复问题。
|
|
||||||
|
|
||||||
self_check.no_problem_found=尚未发现问题。
|
self_check.no_problem_found=尚未发现问题。
|
||||||
self_check.database_collation_mismatch=期望数据库使用的校验方式:%s
|
self_check.database_collation_mismatch=期望数据库使用的校验方式:%s
|
||||||
self_check.database_collation_case_insensitive=数据库正在使用一个校验 %s, 这是一个不敏感的校验. 虽然Gitea可以与它合作,但可能有一些罕见的情况不如预期的那样起作用。
|
self_check.database_collation_case_insensitive=数据库正在使用一个校验 %s, 这是一个不敏感的校验. 虽然Gitea可以与它合作,但可能有一些罕见的情况不如预期的那样起作用。
|
||||||
self_check.database_inconsistent_collation_columns=数据库正在使用%s的排序规则,但是这些列使用了不匹配的排序规则。这可能会造成一些意外问题。
|
self_check.database_inconsistent_collation_columns=数据库正在使用%s的排序规则,但是这些列使用了不匹配的排序规则。这可能会造成一些意外问题。
|
||||||
self_check.database_fix_mysql=对于MySQL/MariaDB用户,您可以使用“gitea doctor convert”命令来解决校验问题。 或者您也可以通过 "ALTER ... COLLATE ..." 这样的SQL 来手动解决这个问题。
|
self_check.database_fix_mysql=对于MySQL/MariaDB用户,您可以使用“gitea doctor convert”命令来解决校验问题。 或者您也可以通过 "ALTER ... COLLATE ..." 这样的SQL 来手动解决这个问题。
|
||||||
self_check.database_fix_mssql=对于MSSQL用户,您现在只能通过"ALTER ... COLLATE ..."SQLs手动解决这个问题。
|
|
||||||
auths.tips.gmail_settings = Gmail 设置:
|
auths.tips.gmail_settings = Gmail 设置:
|
||||||
auths.tip.gitlab_new = 在 https://gitlab.com/-/profile/applications 上注册新应用
|
auths.tip.gitlab_new = 在 https://gitlab.com/-/profile/applications 上注册新应用
|
||||||
config_settings = 设置
|
config_settings = 设置
|
||||||
|
|
|
@ -211,7 +211,7 @@ license_desc=取得 <a target="_blank" rel="noopener noreferrer" href="https://f
|
||||||
install=安裝頁面
|
install=安裝頁面
|
||||||
title=初始組態
|
title=初始組態
|
||||||
docker_helper=如果您在 Docker 中執行 Forgejo,請先閱讀<a target="_blank" rel="noopener noreferrer" href="%s">安裝指南</a>再來調整設定。
|
docker_helper=如果您在 Docker 中執行 Forgejo,請先閱讀<a target="_blank" rel="noopener noreferrer" href="%s">安裝指南</a>再來調整設定。
|
||||||
require_db_desc=Forgejo 需要 MySQL、PostgreSQL、SQLite3、MSSQL、TiDB (MySQL 協定) 等其中一項。
|
require_db_desc=Forgejo 需要 MySQL、PostgreSQL、SQLite3、TiDB (MySQL 協定) 等其中一項。
|
||||||
db_title=資料庫設定
|
db_title=資料庫設定
|
||||||
db_type=資料庫類型
|
db_type=資料庫類型
|
||||||
host=主機
|
host=主機
|
||||||
|
|
|
@ -654,7 +654,7 @@ func registerRoutes(m *web.Route) {
|
||||||
m.Get("/system_status", admin.SystemStatus)
|
m.Get("/system_status", admin.SystemStatus)
|
||||||
m.Post("", web.Bind(forms.AdminDashboardForm{}), admin.DashboardPost)
|
m.Post("", web.Bind(forms.AdminDashboardForm{}), admin.DashboardPost)
|
||||||
|
|
||||||
if setting.Database.Type.IsMySQL() || setting.Database.Type.IsMSSQL() {
|
if setting.Database.Type.IsMySQL() {
|
||||||
m.Get("/self_check", admin.SelfCheck)
|
m.Get("/self_check", admin.SelfCheck)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -4,7 +4,7 @@
|
||||||
<a class="{{if .PageIsAdminDashboard}}active {{end}}item" href="{{AppSubUrl}}/admin">
|
<a class="{{if .PageIsAdminDashboard}}active {{end}}item" href="{{AppSubUrl}}/admin">
|
||||||
{{ctx.Locale.Tr "admin.dashboard"}}
|
{{ctx.Locale.Tr "admin.dashboard"}}
|
||||||
</a>
|
</a>
|
||||||
{{if or .DatabaseType.IsMySQL .DatabaseType.IsMSSQL}}
|
{{if .DatabaseType.IsMySQL}}
|
||||||
<a class="{{if .PageIsAdminSelfCheck}}active {{end}}item" href="{{AppSubUrl}}/admin/self_check">
|
<a class="{{if .PageIsAdminSelfCheck}}active {{end}}item" href="{{AppSubUrl}}/admin/self_check">
|
||||||
{{ctx.Locale.Tr "admin.self_check"}}
|
{{ctx.Locale.Tr "admin.self_check"}}
|
||||||
</a>
|
</a>
|
||||||
|
|
|
@ -8,8 +8,6 @@
|
||||||
{{if .DatabaseCheckHasProblems}}
|
{{if .DatabaseCheckHasProblems}}
|
||||||
{{if .DatabaseType.IsMySQL}}
|
{{if .DatabaseType.IsMySQL}}
|
||||||
<div class="tw-p-2">{{ctx.Locale.Tr "admin.self_check.database_fix_mysql"}}</div>
|
<div class="tw-p-2">{{ctx.Locale.Tr "admin.self_check.database_fix_mysql"}}</div>
|
||||||
{{else if .DatabaseType.IsMSSQL}}
|
|
||||||
<div class="tw-p-2">{{ctx.Locale.Tr "admin.self_check.database_fix_mssql"}}</div>
|
|
||||||
{{end}}
|
{{end}}
|
||||||
{{if .DatabaseCheckCollationMismatch}}
|
{{if .DatabaseCheckCollationMismatch}}
|
||||||
<div class="ui red message">{{ctx.Locale.Tr "admin.self_check.database_collation_mismatch" .DatabaseCheckResult.ExpectedCollation}}</div>
|
<div class="ui red message">{{ctx.Locale.Tr "admin.self_check.database_collation_mismatch" .DatabaseCheckResult.ExpectedCollation}}</div>
|
||||||
|
|
|
@ -7,7 +7,6 @@ They can be run with make commands for the appropriate backends, namely:
|
||||||
make test-sqlite
|
make test-sqlite
|
||||||
make test-pgsql
|
make test-pgsql
|
||||||
make test-mysql
|
make test-mysql
|
||||||
make test-mssql
|
|
||||||
```
|
```
|
||||||
|
|
||||||
Make sure to perform a clean front-end build before running tests:
|
Make sure to perform a clean front-end build before running tests:
|
||||||
|
@ -53,16 +52,6 @@ Start tests based on the database container
|
||||||
TEST_PGSQL_HOST=localhost:5432 TEST_PGSQL_DBNAME=test TEST_PGSQL_USERNAME=postgres TEST_PGSQL_PASSWORD=postgres make test-e2e-pgsql
|
TEST_PGSQL_HOST=localhost:5432 TEST_PGSQL_DBNAME=test TEST_PGSQL_USERNAME=postgres TEST_PGSQL_PASSWORD=postgres make test-e2e-pgsql
|
||||||
```
|
```
|
||||||
|
|
||||||
## Run mssql e2e tests
|
|
||||||
Setup a mssql database inside docker
|
|
||||||
```
|
|
||||||
docker run -e "ACCEPT_EULA=Y" -e "MSSQL_PID=Standard" -e "SA_PASSWORD=MwantsaSecurePassword1" -p 1433:1433 --rm --name mssql microsoft/mssql-server-linux:latest #(just ctrl-c to stop db and clean the container)
|
|
||||||
```
|
|
||||||
Start tests based on the database container
|
|
||||||
```
|
|
||||||
TEST_MSSQL_HOST=localhost:1433 TEST_MSSQL_DBNAME=gitea_test TEST_MSSQL_USERNAME=sa TEST_MSSQL_PASSWORD=MwantsaSecurePassword1 make test-e2e-mssql
|
|
||||||
```
|
|
||||||
|
|
||||||
## Running individual tests
|
## Running individual tests
|
||||||
|
|
||||||
Example command to run `example.test.e2e.js` test file:
|
Example command to run `example.test.e2e.js` test file:
|
||||||
|
@ -75,10 +64,10 @@ For SQLite:
|
||||||
make test-e2e-sqlite#example
|
make test-e2e-sqlite#example
|
||||||
```
|
```
|
||||||
|
|
||||||
For other databases(replace `mssql` to `mysql` or `pgsql`):
|
For PostgreSQL databases(replace `mysql` to `pgsql`):
|
||||||
|
|
||||||
```
|
```
|
||||||
TEST_MSSQL_HOST=localhost:1433 TEST_MSSQL_DBNAME=test TEST_MSSQL_USERNAME=sa TEST_MSSQL_PASSWORD=MwantsaSecurePassword1 make test-e2e-mssql#example
|
TEST_MYSQL_HOST=localhost:1433 TEST_MYSQL_DBNAME=test TEST_MYSQL_USERNAME=sa TEST_MYSQL_PASSWORD=MwantsaSecurePassword1 make test-e2e-mysql#example
|
||||||
```
|
```
|
||||||
|
|
||||||
## Visual testing
|
## Visual testing
|
||||||
|
|
|
@ -6,7 +6,6 @@ appropriate backends, namely:
|
||||||
make test-sqlite
|
make test-sqlite
|
||||||
make test-pgsql
|
make test-pgsql
|
||||||
make test-mysql
|
make test-mysql
|
||||||
make test-mssql
|
|
||||||
```
|
```
|
||||||
|
|
||||||
Make sure to perform a clean build before running tests:
|
Make sure to perform a clean build before running tests:
|
||||||
|
@ -63,16 +62,6 @@ Start tests based on the database container
|
||||||
TEST_PGSQL_HOST=localhost:5432 TEST_PGSQL_DBNAME=test TEST_PGSQL_USERNAME=postgres TEST_PGSQL_PASSWORD=postgres make test-pgsql
|
TEST_PGSQL_HOST=localhost:5432 TEST_PGSQL_DBNAME=test TEST_PGSQL_USERNAME=postgres TEST_PGSQL_PASSWORD=postgres make test-pgsql
|
||||||
```
|
```
|
||||||
|
|
||||||
## Run mssql integration tests
|
|
||||||
Setup a mssql database inside docker
|
|
||||||
```
|
|
||||||
docker run -e "ACCEPT_EULA=Y" -e "MSSQL_PID=Standard" -e "SA_PASSWORD=MwantsaSecurePassword1" -p 1433:1433 --rm --name mssql microsoft/mssql-server-linux:latest #(just ctrl-c to stop db and clean the container)
|
|
||||||
```
|
|
||||||
Start tests based on the database container
|
|
||||||
```
|
|
||||||
TEST_MSSQL_HOST=localhost:1433 TEST_MSSQL_DBNAME=gitea_test TEST_MSSQL_USERNAME=sa TEST_MSSQL_PASSWORD=MwantsaSecurePassword1 make test-mssql
|
|
||||||
```
|
|
||||||
|
|
||||||
## Running individual tests
|
## Running individual tests
|
||||||
|
|
||||||
Example command to run GPG test:
|
Example command to run GPG test:
|
||||||
|
@ -83,10 +72,10 @@ For SQLite:
|
||||||
make test-sqlite#GPG
|
make test-sqlite#GPG
|
||||||
```
|
```
|
||||||
|
|
||||||
For other databases(replace `mssql` to `mysql`, or `pgsql`):
|
For other databases (replace `mysql` to `pgsql`):
|
||||||
|
|
||||||
```
|
```
|
||||||
TEST_MSSQL_HOST=localhost:1433 TEST_MSSQL_DBNAME=test TEST_MSSQL_USERNAME=sa TEST_MSSQL_PASSWORD=MwantsaSecurePassword1 make test-mssql#GPG
|
TEST_MYSQL_HOST=localhost:1433 TEST_MYSQL_DBNAME=test TEST_MYSQL_USERNAME=sa TEST_MYSQL_PASSWORD=MwantsaSecurePassword1 make test-mysql#GPG
|
||||||
```
|
```
|
||||||
|
|
||||||
## Setting timeouts for declaring long-tests and long-flushes
|
## Setting timeouts for declaring long-tests and long-flushes
|
||||||
|
|
|
@ -59,16 +59,6 @@ docker run -e "POSTGRES_DB=test" -p 5432:5432 --rm --name pgsql postgres:14 #(ju
|
||||||
TEST_PGSQL_HOST=localhost:5432 TEST_PGSQL_DBNAME=test TEST_PGSQL_USERNAME=postgres TEST_PGSQL_PASSWORD=postgres make test-pgsql
|
TEST_PGSQL_HOST=localhost:5432 TEST_PGSQL_DBNAME=test TEST_PGSQL_USERNAME=postgres TEST_PGSQL_PASSWORD=postgres make test-pgsql
|
||||||
```
|
```
|
||||||
|
|
||||||
## Run mssql integration tests
|
|
||||||
同上,首先在 docker 容器里部署一个 mssql 数据库
|
|
||||||
```
|
|
||||||
docker run -e "ACCEPT_EULA=Y" -e "MSSQL_PID=Standard" -e "SA_PASSWORD=MwantsaSecurePassword1" -p 1433:1433 --rm --name mssql microsoft/mssql-server-linux:latest #(just ctrl-c to stop db and clean the container)
|
|
||||||
```
|
|
||||||
之后便可以基于这个数据库进行集成测试
|
|
||||||
```
|
|
||||||
TEST_MSSQL_HOST=localhost:1433 TEST_MSSQL_DBNAME=gitea_test TEST_MSSQL_USERNAME=sa TEST_MSSQL_PASSWORD=MwantsaSecurePassword1 make test-mssql
|
|
||||||
```
|
|
||||||
|
|
||||||
## 如何进行自定义的集成测试
|
## 如何进行自定义的集成测试
|
||||||
|
|
||||||
下面的示例展示了怎样在集成测试中只进行 GPG 测试:
|
下面的示例展示了怎样在集成测试中只进行 GPG 测试:
|
||||||
|
@ -79,9 +69,9 @@ sqlite 数据库:
|
||||||
make test-sqlite#GPG
|
make test-sqlite#GPG
|
||||||
```
|
```
|
||||||
|
|
||||||
其它数据库(把 MSSQL 替换为 MYSQL, PGSQL):
|
其它数据库 (用 PGSQL 取代 MYSQL):
|
||||||
|
|
||||||
```
|
```
|
||||||
TEST_MSSQL_HOST=localhost:1433 TEST_MSSQL_DBNAME=test TEST_MSSQL_USERNAME=sa TEST_MSSQL_PASSWORD=MwantsaSecurePassword1 make test-mssql#GPG
|
TEST_MYSQL_HOST=localhost:1433 TEST_MYSQL_DBNAME=test TEST_MYSQL_USERNAME=sa TEST_MYSQL_PASSWORD=MwantsaSecurePassword1 make test-mysql#GPG
|
||||||
```
|
```
|
||||||
|
|
||||||
|
|
|
@ -39,7 +39,7 @@ func TestDatabaseCollationSelfCheckUI(t *testing.T) {
|
||||||
htmlDoc.AssertElement(t, "a.item[href*='/admin/self_check']", exists)
|
htmlDoc.AssertElement(t, "a.item[href*='/admin/self_check']", exists)
|
||||||
}
|
}
|
||||||
|
|
||||||
if setting.Database.Type.IsMySQL() || setting.Database.Type.IsMSSQL() {
|
if setting.Database.Type.IsMySQL() {
|
||||||
assertSelfCheckExists(true)
|
assertSelfCheckExists(true)
|
||||||
} else {
|
} else {
|
||||||
assertSelfCheckExists(false)
|
assertSelfCheckExists(false)
|
||||||
|
@ -61,10 +61,9 @@ func TestDatabaseCollation(t *testing.T) {
|
||||||
assert.EqualValues(t, 2, cnt)
|
assert.EqualValues(t, 2, cnt)
|
||||||
_, _ = x.Exec("DROP TABLE IF EXISTS test_collation_tbl")
|
_, _ = x.Exec("DROP TABLE IF EXISTS test_collation_tbl")
|
||||||
|
|
||||||
// by default, SQLite3 and PostgreSQL are using case-sensitive collations, but MySQL and MSSQL are not
|
// by default, SQLite3 and PostgreSQL are using case-sensitive collations, but MySQL is not.
|
||||||
// the following tests are only for MySQL and MSSQL
|
if !setting.Database.Type.IsMySQL() {
|
||||||
if !setting.Database.Type.IsMySQL() && !setting.Database.Type.IsMSSQL() {
|
t.Skip("only MySQL requires the case-sensitive collation check at the moment")
|
||||||
t.Skip("only MySQL and MSSQL requires the case-sensitive collation check at the moment")
|
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -86,20 +85,11 @@ func TestDatabaseCollation(t *testing.T) {
|
||||||
assert.True(t, r.CollationEquals("abc", "abc"))
|
assert.True(t, r.CollationEquals("abc", "abc"))
|
||||||
assert.True(t, r.CollationEquals("abc", "utf8mb4_abc"))
|
assert.True(t, r.CollationEquals("abc", "utf8mb4_abc"))
|
||||||
assert.False(t, r.CollationEquals("utf8mb4_general_ci", "utf8mb4_unicode_ci"))
|
assert.False(t, r.CollationEquals("utf8mb4_general_ci", "utf8mb4_unicode_ci"))
|
||||||
} else if setting.Database.Type.IsMSSQL() {
|
|
||||||
assert.True(t, r.IsCollationCaseSensitive("Latin1_General_CS_AS"))
|
|
||||||
assert.False(t, r.IsCollationCaseSensitive("Latin1_General_CI_AS"))
|
|
||||||
assert.True(t, r.CollationEquals("abc", "abc"))
|
|
||||||
assert.False(t, r.CollationEquals("Latin1_General_CS_AS", "SQL_Latin1_General_CP1_CS_AS"))
|
|
||||||
} else {
|
} else {
|
||||||
assert.Fail(t, "unexpected database type")
|
assert.Fail(t, "unexpected database type")
|
||||||
}
|
}
|
||||||
})
|
})
|
||||||
|
|
||||||
if setting.Database.Type.IsMSSQL() {
|
|
||||||
return // skip table converting tests because MSSQL doesn't have a simple solution at the moment
|
|
||||||
}
|
|
||||||
|
|
||||||
t.Run("Convert tables to utf8mb4_bin", func(t *testing.T) {
|
t.Run("Convert tables to utf8mb4_bin", func(t *testing.T) {
|
||||||
defer tests.PrintCurrentTest(t)()
|
defer tests.PrintCurrentTest(t)()
|
||||||
|
|
||||||
|
|
Binary file not shown.
Binary file not shown.
|
@ -14,7 +14,6 @@ import (
|
||||||
"path/filepath"
|
"path/filepath"
|
||||||
"regexp"
|
"regexp"
|
||||||
"sort"
|
"sort"
|
||||||
"strings"
|
|
||||||
"testing"
|
"testing"
|
||||||
|
|
||||||
"code.gitea.io/gitea/models/db"
|
"code.gitea.io/gitea/models/db"
|
||||||
|
@ -258,31 +257,6 @@ func restoreOldDB(t *testing.T, version string) bool {
|
||||||
_, err = db.Exec(data)
|
_, err = db.Exec(data)
|
||||||
assert.NoError(t, err)
|
assert.NoError(t, err)
|
||||||
db.Close()
|
db.Close()
|
||||||
|
|
||||||
case setting.Database.Type.IsMSSQL():
|
|
||||||
host, port := setting.ParseMSSQLHostPort(setting.Database.Host)
|
|
||||||
db, err := sql.Open("mssql", fmt.Sprintf("server=%s; port=%s; database=%s; user id=%s; password=%s;",
|
|
||||||
host, port, "master", setting.Database.User, setting.Database.Passwd))
|
|
||||||
assert.NoError(t, err)
|
|
||||||
defer db.Close()
|
|
||||||
|
|
||||||
_, err = db.Exec("DROP DATABASE IF EXISTS [gitea]")
|
|
||||||
assert.NoError(t, err)
|
|
||||||
|
|
||||||
statements := strings.Split(data, "\nGO\n")
|
|
||||||
for _, statement := range statements {
|
|
||||||
if len(statement) > 5 && statement[:5] == "USE [" {
|
|
||||||
dbname := statement[5 : len(statement)-1]
|
|
||||||
db.Close()
|
|
||||||
db, err = sql.Open("mssql", fmt.Sprintf("server=%s; port=%s; database=%s; user id=%s; password=%s;",
|
|
||||||
host, port, dbname, setting.Database.User, setting.Database.Passwd))
|
|
||||||
assert.NoError(t, err)
|
|
||||||
defer db.Close()
|
|
||||||
}
|
|
||||||
_, err = db.Exec(statement)
|
|
||||||
assert.NoError(t, err, "Failure whilst running: %s\nError: %v", statement, err)
|
|
||||||
}
|
|
||||||
db.Close()
|
|
||||||
}
|
}
|
||||||
return true
|
return true
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,107 +0,0 @@
|
||||||
APP_NAME = Gitea: Git with a cup of tea
|
|
||||||
RUN_MODE = prod
|
|
||||||
|
|
||||||
[database]
|
|
||||||
DB_TYPE = mssql
|
|
||||||
HOST = {{TEST_MSSQL_HOST}}
|
|
||||||
NAME = {{TEST_MSSQL_DBNAME}}
|
|
||||||
USER = {{TEST_MSSQL_USERNAME}}
|
|
||||||
PASSWD = {{TEST_MSSQL_PASSWORD}}
|
|
||||||
SSL_MODE = disable
|
|
||||||
|
|
||||||
[indexer]
|
|
||||||
REPO_INDEXER_ENABLED = true
|
|
||||||
REPO_INDEXER_PATH = tests/{{TEST_TYPE}}/gitea-{{TEST_TYPE}}-mssql/indexers/repos.bleve
|
|
||||||
|
|
||||||
[queue.issue_indexer]
|
|
||||||
TYPE = level
|
|
||||||
DATADIR = tests/{{TEST_TYPE}}/gitea-{{TEST_TYPE}}-mssql/indexers/issues.queue
|
|
||||||
|
|
||||||
[queue]
|
|
||||||
TYPE = immediate
|
|
||||||
|
|
||||||
[repository]
|
|
||||||
ROOT = {{REPO_TEST_DIR}}tests/{{TEST_TYPE}}/gitea-{{TEST_TYPE}}-mssql/gitea-repositories
|
|
||||||
|
|
||||||
[repository.local]
|
|
||||||
LOCAL_COPY_PATH = tests/{{TEST_TYPE}}/gitea-{{TEST_TYPE}}-mssql/tmp/local-repo
|
|
||||||
|
|
||||||
[repository.upload]
|
|
||||||
TEMP_PATH = tests/{{TEST_TYPE}}/gitea-{{TEST_TYPE}}-mssql/tmp/uploads
|
|
||||||
|
|
||||||
[repository.signing]
|
|
||||||
SIGNING_KEY = none
|
|
||||||
|
|
||||||
[server]
|
|
||||||
SSH_DOMAIN = localhost
|
|
||||||
HTTP_PORT = 3003
|
|
||||||
ROOT_URL = http://localhost:3003/
|
|
||||||
DISABLE_SSH = false
|
|
||||||
SSH_LISTEN_HOST = localhost
|
|
||||||
SSH_PORT = 2201
|
|
||||||
START_SSH_SERVER = true
|
|
||||||
LFS_START_SERVER = true
|
|
||||||
OFFLINE_MODE = false
|
|
||||||
LFS_JWT_SECRET = Tv_MjmZuHqpIY6GFl12ebgkRAMt4RlWt0v4EHKSXO0w
|
|
||||||
APP_DATA_PATH = tests/{{TEST_TYPE}}/gitea-{{TEST_TYPE}}-mssql/data
|
|
||||||
BUILTIN_SSH_SERVER_USER = git
|
|
||||||
SSH_TRUSTED_USER_CA_KEYS = ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABgQCb4DC1dMFnJ6pXWo7GMxTchtzmJHYzfN6sZ9FAPFR4ijMLfGki+olvOMO5Fql1/yGnGfbELQa1S6y4shSvj/5K+zUFScmEXYf3Gcr87RqilLkyk16RS+cHNB1u87xTHbETaa3nyCJeGQRpd4IQ4NKob745mwDZ7jQBH8AZEng50Oh8y8fi8skBBBzaYp1ilgvzG740L7uex6fHV62myq0SXeCa+oJUjq326FU8y+Vsa32H8A3e7tOgXZPdt2TVNltx2S9H2WO8RMi7LfaSwARNfy1zu+bfR50r6ef8Yx5YKCMz4wWb1SHU1GS800mjOjlInLQORYRNMlSwR1+vLlVDciOqFapDSbj+YOVOawR0R1aqlSKpZkt33DuOBPx9qe6CVnIi7Z+Px/KqM+OLCzlLY/RS+LbxQpDWcfTVRiP+S5qRTcE3M3UioN/e0BE/1+MpX90IGpvVkA63ILYbKEa4bM3ASL7ChTCr6xN5XT+GpVJveFKK1cfNx9ExHI4rzYE=
|
|
||||||
|
|
||||||
[attachment]
|
|
||||||
PATH = tests/{{TEST_TYPE}}/gitea-{{TEST_TYPE}}-mssql/data/attachments
|
|
||||||
|
|
||||||
[mailer]
|
|
||||||
ENABLED = true
|
|
||||||
PROTOCOL = dummy
|
|
||||||
FROM = mssql-{{TEST_TYPE}}-test@gitea.io
|
|
||||||
|
|
||||||
[service]
|
|
||||||
REGISTER_EMAIL_CONFIRM = false
|
|
||||||
REGISTER_MANUAL_CONFIRM = false
|
|
||||||
DISABLE_REGISTRATION = false
|
|
||||||
ENABLE_CAPTCHA = false
|
|
||||||
REQUIRE_SIGNIN_VIEW = false
|
|
||||||
DEFAULT_KEEP_EMAIL_PRIVATE = false
|
|
||||||
DEFAULT_ALLOW_CREATE_ORGANIZATION = true
|
|
||||||
NO_REPLY_ADDRESS = noreply.example.org
|
|
||||||
ENABLE_NOTIFY_MAIL = true
|
|
||||||
|
|
||||||
[picture]
|
|
||||||
DISABLE_GRAVATAR = false
|
|
||||||
ENABLE_FEDERATED_AVATAR = false
|
|
||||||
AVATAR_UPLOAD_PATH = tests/{{TEST_TYPE}}/gitea-{{TEST_TYPE}}-mssql/data/avatars
|
|
||||||
REPOSITORY_AVATAR_UPLOAD_PATH = tests/{{TEST_TYPE}}/gitea-{{TEST_TYPE}}-mssql/data/repo-avatars
|
|
||||||
|
|
||||||
[session]
|
|
||||||
PROVIDER = file
|
|
||||||
PROVIDER_CONFIG = tests/{{TEST_TYPE}}/gitea-{{TEST_TYPE}}-mssql/data/sessions
|
|
||||||
|
|
||||||
[log]
|
|
||||||
MODE = {{TEST_LOGGER}}
|
|
||||||
ROOT_PATH = {{REPO_TEST_DIR}}mssql-log
|
|
||||||
ENABLE_SSH_LOG = true
|
|
||||||
logger.xorm.MODE = file
|
|
||||||
|
|
||||||
[log.test]
|
|
||||||
LEVEL = Info
|
|
||||||
COLORIZE = true
|
|
||||||
|
|
||||||
[log.file]
|
|
||||||
LEVEL = Debug
|
|
||||||
|
|
||||||
[security]
|
|
||||||
PASSWORD_HASH_ALGO = argon2
|
|
||||||
DISABLE_GIT_HOOKS = false
|
|
||||||
INSTALL_LOCK = true
|
|
||||||
SECRET_KEY = 9pCviYTWSb
|
|
||||||
INTERNAL_TOKEN = eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJuYmYiOjE0OTU1NTE2MTh9.hhSVGOANkaKk3vfCd2jDOIww4pUk0xtg9JRde5UogyQ
|
|
||||||
DISABLE_QUERY_AUTH_TOKEN = true
|
|
||||||
|
|
||||||
[lfs]
|
|
||||||
PATH = tests/{{TEST_TYPE}}/gitea-{{TEST_TYPE}}-mssql/data/lfs
|
|
||||||
|
|
||||||
[packages]
|
|
||||||
ENABLED = true
|
|
||||||
|
|
||||||
[actions]
|
|
||||||
ENABLED = true
|
|
|
@ -162,18 +162,6 @@ func InitTest(requireGitea bool) {
|
||||||
log.Fatal("db.Exec: CREATE SCHEMA: %v", err)
|
log.Fatal("db.Exec: CREATE SCHEMA: %v", err)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
case setting.Database.Type.IsMSSQL():
|
|
||||||
host, port := setting.ParseMSSQLHostPort(setting.Database.Host)
|
|
||||||
db, err := sql.Open("mssql", fmt.Sprintf("server=%s; port=%s; database=%s; user id=%s; password=%s;",
|
|
||||||
host, port, "master", setting.Database.User, setting.Database.Passwd))
|
|
||||||
if err != nil {
|
|
||||||
log.Fatal("sql.Open: %v", err)
|
|
||||||
}
|
|
||||||
if _, err := db.Exec(fmt.Sprintf("If(db_id(N'%s') IS NULL) BEGIN CREATE DATABASE %s; END;", setting.Database.Name, setting.Database.Name)); err != nil {
|
|
||||||
log.Fatal("db.Exec: %v", err)
|
|
||||||
}
|
|
||||||
defer db.Close()
|
|
||||||
}
|
}
|
||||||
|
|
||||||
routers.InitWebInstalled(graceful.GetManager().HammerContext())
|
routers.InitWebInstalled(graceful.GetManager().HammerContext())
|
||||||
|
|
|
@ -19,7 +19,6 @@ function initPreInstall() {
|
||||||
const defaultDbHosts = {
|
const defaultDbHosts = {
|
||||||
mysql: '127.0.0.1:3306',
|
mysql: '127.0.0.1:3306',
|
||||||
postgres: '127.0.0.1:5432',
|
postgres: '127.0.0.1:5432',
|
||||||
mssql: '127.0.0.1:1433',
|
|
||||||
};
|
};
|
||||||
|
|
||||||
const dbHost = document.getElementById('db_host');
|
const dbHost = document.getElementById('db_host');
|
||||||
|
|
Loading…
Reference in a new issue