From ad1b6d439fe0e0875e54227e0bc23a74411f490e Mon Sep 17 00:00:00 2001 From: guillep2k <18600385+guillep2k@users.noreply.github.com> Date: Mon, 20 Jan 2020 12:45:14 -0300 Subject: [PATCH] Add support for database schema in PostgreSQL (#8819) * Add support for database schema * Require setting search_path for the db user * Add schema setting to admin/config.tmpl * Use a schema different from default for psql tests * Update postgres scripts to use custom schema * Update to xorm/core 0.7.3 and xorm/xorm c37aff9b3a * Fix migration test Co-authored-by: Antoine GIRARD Co-authored-by: Lunny Xiao --- Makefile | 2 + custom/conf/app.ini.sample | 4 + .../doc/advanced/config-cheat-sheet.en-us.md | 3 + go.mod | 4 +- go.sum | 6 +- integrations/integration_test.go | 45 +++- .../gitea-v1.5.3.postgres.sql.gz | Bin 16612 -> 16783 bytes .../gitea-v1.6.4.postgres.sql.gz | Bin 17346 -> 17517 bytes .../gitea-v1.7.0.postgres.sql.gz | Bin 17659 -> 17831 bytes integrations/migration-test/migration_test.go | 26 +++ integrations/pgsql.ini.tmpl | 1 + models/models.go | 7 +- modules/auth/user_form.go | 1 + modules/setting/database.go | 2 + options/locale/locale_en-US.ini | 3 + routers/install.go | 3 + templates/admin/config.tmpl | 2 + templates/install.tmpl | 5 + vendor/modules.txt | 4 +- vendor/xorm.io/core/.drone.yml | 120 ---------- vendor/xorm.io/core/README.md | 2 +- vendor/xorm.io/core/column.go | 4 +- vendor/xorm.io/core/index.go | 4 +- vendor/xorm.io/xorm/.drone.yml | 216 ++---------------- vendor/xorm.io/xorm/dialect_postgres.go | 6 +- vendor/xorm.io/xorm/session_insert.go | 94 +++----- vendor/xorm.io/xorm/session_update.go | 10 +- vendor/xorm.io/xorm/statement_exprparam.go | 10 +- 28 files changed, 177 insertions(+), 407 deletions(-) diff --git a/Makefile b/Makefile index fe526bb9e4..5df67948fa 100644 --- a/Makefile +++ b/Makefile @@ -79,6 +79,7 @@ TEST_PGSQL_HOST ?= pgsql:5432 TEST_PGSQL_DBNAME ?= testgitea TEST_PGSQL_USERNAME ?= postgres TEST_PGSQL_PASSWORD ?= postgres +TEST_PGSQL_SCHEMA ?= gtestschema TEST_MSSQL_HOST ?= mssql:1433 TEST_MSSQL_DBNAME ?= gitea TEST_MSSQL_USERNAME ?= sa @@ -306,6 +307,7 @@ generate-ini-pgsql: -e 's|{{TEST_PGSQL_DBNAME}}|${TEST_PGSQL_DBNAME}|g' \ -e 's|{{TEST_PGSQL_USERNAME}}|${TEST_PGSQL_USERNAME}|g' \ -e 's|{{TEST_PGSQL_PASSWORD}}|${TEST_PGSQL_PASSWORD}|g' \ + -e 's|{{TEST_PGSQL_SCHEMA}}|${TEST_PGSQL_SCHEMA}|g' \ integrations/pgsql.ini.tmpl > integrations/pgsql.ini .PHONY: test-pgsql diff --git a/custom/conf/app.ini.sample b/custom/conf/app.ini.sample index 971a99e264..f0829f37b3 100644 --- a/custom/conf/app.ini.sample +++ b/custom/conf/app.ini.sample @@ -336,6 +336,10 @@ NAME = gitea USER = root ; Use PASSWD = `your password` for quoting if you use special characters in the password. PASSWD = +; For Postgres, schema to use if different from "public". The schema must exist beforehand, +; the user must have creation privileges on it, and the user search path must be set +; to the look into the schema first. e.g.:ALTER USER user SET SEARCH_PATH = schema_name,"$user",public; +SCHEMA = ; For Postgres, either "disable" (default), "require", or "verify-full" ; For MySQL, either "false" (default), "true", or "skip-verify" SSL_MODE = disable diff --git a/docs/content/doc/advanced/config-cheat-sheet.en-us.md b/docs/content/doc/advanced/config-cheat-sheet.en-us.md index d63eaf8e46..1c03fce3d0 100644 --- a/docs/content/doc/advanced/config-cheat-sheet.en-us.md +++ b/docs/content/doc/advanced/config-cheat-sheet.en-us.md @@ -209,6 +209,9 @@ Values containing `#` or `;` must be quoted using `` ` `` or `"""`. - `NAME`: **gitea**: Database name. - `USER`: **root**: Database username. - `PASSWD`: **\**: Database user password. Use \`your password\` for quoting if you use special characters in the password. +- `SCHEMA`: **\**: For PostgreSQL only, schema to use if different from "public". The schema must exist beforehand, + the user must have creation privileges on it, and the user search path must be set to the look into the schema first + (e.g. `ALTER USER user SET SEARCH_PATH = schema_name,"$user",public;`). - `SSL_MODE`: **disable**: For PostgreSQL and MySQL only. - `CHARSET`: **utf8**: For MySQL only, either "utf8" or "utf8mb4", default is "utf8". NOTICE: for "utf8mb4" you must use MySQL InnoDB > 5.6. Gitea is unable to check this. - `PATH`: **data/gitea.db**: For SQLite3 only, the database file path. diff --git a/go.mod b/go.mod index 171a47036b..943eb2a792 100644 --- a/go.mod +++ b/go.mod @@ -112,6 +112,6 @@ require ( mvdan.cc/xurls/v2 v2.1.0 strk.kbt.io/projects/go/libravatar v0.0.0-20191008002943-06d1c002b251 xorm.io/builder v0.3.6 - xorm.io/core v0.7.2 - xorm.io/xorm v0.8.1 + xorm.io/core v0.7.3 + xorm.io/xorm v0.8.2-0.20200120024500-c37aff9b3a4a ) diff --git a/go.sum b/go.sum index 6363ce75b7..6f9548acf4 100644 --- a/go.sum +++ b/go.sum @@ -760,7 +760,9 @@ xorm.io/builder v0.3.6 h1:ha28mQ2M+TFx96Hxo+iq6tQgnkC9IZkM6D8w9sKHHF8= xorm.io/builder v0.3.6/go.mod h1:LEFAPISnRzG+zxaxj2vPicRwz67BdhFreKg8yv8/TgU= xorm.io/core v0.7.2 h1:mEO22A2Z7a3fPaZMk6gKL/jMD80iiyNwRrX5HOv3XLw= xorm.io/core v0.7.2/go.mod h1:jJfd0UAEzZ4t87nbQYtVjmqpIODugN6PD2D9E+dJvdM= +xorm.io/core v0.7.3 h1:W8ws1PlrnkS1CZU1YWaYLMQcQilwAmQXU0BJDJon+H0= +xorm.io/core v0.7.3/go.mod h1:jJfd0UAEzZ4t87nbQYtVjmqpIODugN6PD2D9E+dJvdM= xorm.io/xorm v0.8.0 h1:iALxgJrX8O00f8Jk22GbZwPmxJNgssV5Mv4uc2HL9PM= xorm.io/xorm v0.8.0/go.mod h1:ZkJLEYLoVyg7amJK/5r779bHyzs2AU8f8VMiP6BM7uY= -xorm.io/xorm v0.8.1 h1:4f2KXuQxVdaX3RdI3Fw81NzMiSpZeyCZt8m3sEVeIkQ= -xorm.io/xorm v0.8.1/go.mod h1:ZkJLEYLoVyg7amJK/5r779bHyzs2AU8f8VMiP6BM7uY= +xorm.io/xorm v0.8.2-0.20200120024500-c37aff9b3a4a h1:hzGd080rlkZ5a7v6Tr3x8PJJnWPfKxGMMl92c8DNcww= +xorm.io/xorm v0.8.2-0.20200120024500-c37aff9b3a4a/go.mod h1:ZkJLEYLoVyg7amJK/5r779bHyzs2AU8f8VMiP6BM7uY= diff --git a/integrations/integration_test.go b/integrations/integration_test.go index bf363f3b4d..138d751859 100644 --- a/integrations/integration_test.go +++ b/integrations/integration_test.go @@ -153,18 +153,53 @@ func initIntegrationTest() { if err != nil { log.Fatalf("sql.Open: %v", err) } - rows, err := db.Query(fmt.Sprintf("SELECT 1 FROM pg_database WHERE datname = '%s'", setting.Database.Name)) + dbrows, err := db.Query(fmt.Sprintf("SELECT 1 FROM pg_database WHERE datname = '%s'", setting.Database.Name)) if err != nil { log.Fatalf("db.Query: %v", err) } - defer rows.Close() + defer dbrows.Close() - if rows.Next() { + if !dbrows.Next() { + if _, err = db.Exec(fmt.Sprintf("CREATE DATABASE %s", setting.Database.Name)); err != nil { + log.Fatalf("db.Exec: CREATE DATABASE: %v", err) + } + } + // Check if we need to setup a specific schema + if len(setting.Database.Schema) == 0 { break } - if _, err = db.Exec(fmt.Sprintf("CREATE DATABASE %s", setting.Database.Name)); err != nil { - log.Fatalf("db.Exec: %v", err) + db.Close() + + db, err = sql.Open("postgres", fmt.Sprintf("postgres://%s:%s@%s/%s?sslmode=%s", + setting.Database.User, setting.Database.Passwd, setting.Database.Host, setting.Database.Name, setting.Database.SSLMode)) + // This is a different db object; requires a different Close() + defer db.Close() + if err != nil { + log.Fatalf("sql.Open: %v", err) } + schrows, err := db.Query(fmt.Sprintf("SELECT 1 FROM information_schema.schemata WHERE schema_name = '%s'", setting.Database.Schema)) + if err != nil { + log.Fatalf("db.Query: %v", err) + } + defer schrows.Close() + + if !schrows.Next() { + // Create and setup a DB schema + if _, err = db.Exec(fmt.Sprintf("CREATE SCHEMA %s", setting.Database.Schema)); err != nil { + log.Fatalf("db.Exec: CREATE SCHEMA: %v", err) + } + } + + // Make the user's default search path the created schema; this will affect new connections + if _, err = db.Exec(fmt.Sprintf(`ALTER USER "%s" SET search_path = %s`, setting.Database.User, setting.Database.Schema)); err != nil { + log.Fatalf("db.Exec: ALTER USER SET search_path: %v", err) + } + + // Make the current connection's search the created schema + if _, err = db.Exec(fmt.Sprintf(`SET search_path = %s`, setting.Database.Schema)); err != nil { + log.Fatalf("db.Exec: ALTER USER SET search_path: %v", err) + } + case setting.Database.UseMSSQL: 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;", diff --git a/integrations/migration-test/gitea-v1.5.3.postgres.sql.gz b/integrations/migration-test/gitea-v1.5.3.postgres.sql.gz index 2fcad82111cf00a0fe6368e0bd714c9d5114c043..2380f8dd7fc8550a977291a5b74d4ef8f5ea67f0 100644 GIT binary patch literal 16783 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 literal 17659 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

@&D(Ah&L}LjN48)VFsUGZJN9H^DFeG@e9ku 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 diff --git a/integrations/migration-test/migration_test.go b/integrations/migration-test/migration_test.go index c274d482da..6cdfbf7d7d 100644 --- a/integrations/migration-test/migration_test.go +++ b/integrations/migration-test/migration_test.go @@ -168,6 +168,32 @@ func restoreOldDB(t *testing.T, version string) bool { assert.NoError(t, err) db.Close() + // Check if we need to setup a specific schema + if len(setting.Database.Schema) != 0 { + db, err = sql.Open("postgres", fmt.Sprintf("postgres://%s:%s@%s/%s?sslmode=%s", + setting.Database.User, setting.Database.Passwd, setting.Database.Host, setting.Database.Name, setting.Database.SSLMode)) + if !assert.NoError(t, err) { + return false + } + schrows, err := db.Query(fmt.Sprintf("SELECT 1 FROM information_schema.schemata WHERE schema_name = '%s'", setting.Database.Schema)) + if !assert.NoError(t, err) || !assert.NotEmpty(t, schrows) { + return false + } + + if !schrows.Next() { + // Create and setup a DB schema + _, err = db.Exec(fmt.Sprintf("CREATE SCHEMA %s", setting.Database.Schema)) + assert.NoError(t, err) + } + schrows.Close() + + // Make the user's default search path the created schema; this will affect new connections + _, err = db.Exec(fmt.Sprintf(`ALTER USER "%s" SET search_path = %s`, setting.Database.User, setting.Database.Schema)) + assert.NoError(t, err) + + db.Close() + } + db, err = sql.Open("postgres", fmt.Sprintf("postgres://%s:%s@%s/%s?sslmode=%s", setting.Database.User, setting.Database.Passwd, setting.Database.Host, setting.Database.Name, setting.Database.SSLMode)) assert.NoError(t, err) diff --git a/integrations/pgsql.ini.tmpl b/integrations/pgsql.ini.tmpl index 6265e0d98e..f337d98fb4 100644 --- a/integrations/pgsql.ini.tmpl +++ b/integrations/pgsql.ini.tmpl @@ -7,6 +7,7 @@ HOST = {{TEST_PGSQL_HOST}} NAME = {{TEST_PGSQL_DBNAME}} USER = {{TEST_PGSQL_USERNAME}} PASSWD = {{TEST_PGSQL_PASSWORD}} +SCHEMA = {{TEST_PGSQL_SCHEMA}} SSL_MODE = disable [indexer] diff --git a/models/models.go b/models/models.go index 9eb174e200..74680d847a 100644 --- a/models/models.go +++ b/models/models.go @@ -128,7 +128,12 @@ func getEngine() (*xorm.Engine, error) { return nil, err } - return xorm.NewEngine(setting.Database.Type, connStr) + engine, err := xorm.NewEngine(setting.Database.Type, connStr) + if err != nil { + return nil, err + } + engine.SetSchema(setting.Database.Schema) + return engine, nil } // NewTestEngine sets a new test xorm.Engine diff --git a/modules/auth/user_form.go b/modules/auth/user_form.go index 8ceb961d24..228e17dce5 100644 --- a/modules/auth/user_form.go +++ b/modules/auth/user_form.go @@ -25,6 +25,7 @@ type InstallForm struct { SSLMode string Charset string `binding:"Required;In(utf8,utf8mb4)"` DbPath string + DbSchema string AppName string `binding:"Required" locale:"install.app_name"` RepoRootPath string `binding:"Required"` diff --git a/modules/setting/database.go b/modules/setting/database.go index 8c49ba3c5a..911ac90a05 100644 --- a/modules/setting/database.go +++ b/modules/setting/database.go @@ -30,6 +30,7 @@ var ( Name string User string Passwd string + Schema string SSLMode string Path string LogSQL bool @@ -75,6 +76,7 @@ func InitDBConfig() { if len(Database.Passwd) == 0 { Database.Passwd = sec.Key("PASSWD").String() } + Database.Schema = sec.Key("SCHEMA").String() Database.SSLMode = sec.Key("SSL_MODE").MustString("disable") Database.Charset = sec.Key("CHARSET").In("utf8", []string{"utf8", "utf8mb4"}) Database.Path = sec.Key("PATH").MustString(filepath.Join(AppDataPath, "gitea.db")) diff --git a/options/locale/locale_en-US.ini b/options/locale/locale_en-US.ini index 589506f7aa..a7d8b97d3d 100644 --- a/options/locale/locale_en-US.ini +++ b/options/locale/locale_en-US.ini @@ -102,6 +102,8 @@ user = Username password = Password db_name = Database Name db_helper = Note to MySQL users: please use the InnoDB storage engine and if you use "utf8mb4", your InnoDB version must be greater than 5.6 . +db_schema = Schema +db_schema_helper = Leave blank for database default ("public"). ssl_mode = SSL charset = Charset path = Path @@ -1953,6 +1955,7 @@ config.db_type = Type config.db_host = Host config.db_name = Name config.db_user = Username +config.db_schema = Schema config.db_ssl_mode = SSL config.db_path = Path diff --git a/routers/install.go b/routers/install.go index 7395aeee84..e18adfea15 100644 --- a/routers/install.go +++ b/routers/install.go @@ -54,6 +54,7 @@ func Install(ctx *context.Context) { form.DbPasswd = setting.Database.Passwd form.DbName = setting.Database.Name form.DbPath = setting.Database.Path + form.DbSchema = setting.Database.Schema form.Charset = setting.Database.Charset ctx.Data["CurDbOption"] = "MySQL" @@ -147,6 +148,7 @@ func InstallPost(ctx *context.Context, form auth.InstallForm) { setting.Database.User = form.DbUser setting.Database.Passwd = form.DbPasswd setting.Database.Name = form.DbName + setting.Database.Schema = form.DbSchema setting.Database.SSLMode = form.SSLMode setting.Database.Charset = form.Charset setting.Database.Path = form.DbPath @@ -267,6 +269,7 @@ func InstallPost(ctx *context.Context, form auth.InstallForm) { cfg.Section("database").Key("NAME").SetValue(setting.Database.Name) cfg.Section("database").Key("USER").SetValue(setting.Database.User) cfg.Section("database").Key("PASSWD").SetValue(setting.Database.Passwd) + cfg.Section("database").Key("SCHEMA").SetValue(setting.Database.Schema) cfg.Section("database").Key("SSL_MODE").SetValue(setting.Database.SSLMode) cfg.Section("database").Key("CHARSET").SetValue(setting.Database.Charset) cfg.Section("database").Key("PATH").SetValue(setting.Database.Path) diff --git a/templates/admin/config.tmpl b/templates/admin/config.tmpl index c2793ece9d..c6a23cd367 100644 --- a/templates/admin/config.tmpl +++ b/templates/admin/config.tmpl @@ -128,6 +128,8 @@

{{if .DbCfg.User}}{{.DbCfg.User}}{{else}}-{{end}}
{{end}} {{if eq .DbCfg.Type "postgres"}} +
{{.i18n.Tr "admin.config.db_schema"}}
+
{{if .DbCfg.Schema}}{{.DbCfg.Schema}}{{else}}-{{end}}
{{.i18n.Tr "admin.config.db_ssl_mode"}}
{{if .DbCfg.SSLMode}}{{.DbCfg.SSLMode}}{{else}}-{{end}}
{{end}} diff --git a/templates/install.tmpl b/templates/install.tmpl index f8d1ef04e4..7f7c754bbf 100644 --- a/templates/install.tmpl +++ b/templates/install.tmpl @@ -62,6 +62,11 @@ +
+ + + {{.i18n.Tr "install.db_schema_helper"}} +
diff --git a/vendor/modules.txt b/vendor/modules.txt index 2f36278d75..6b2546886f 100644 --- a/vendor/modules.txt +++ b/vendor/modules.txt @@ -613,7 +613,7 @@ mvdan.cc/xurls/v2 strk.kbt.io/projects/go/libravatar # xorm.io/builder v0.3.6 xorm.io/builder -# xorm.io/core v0.7.2 +# xorm.io/core v0.7.3 xorm.io/core -# xorm.io/xorm v0.8.1 +# xorm.io/xorm v0.8.2-0.20200120024500-c37aff9b3a4a xorm.io/xorm diff --git a/vendor/xorm.io/core/.drone.yml b/vendor/xorm.io/core/.drone.yml index 4cb2fb4ae6..3c118d4c06 100644 --- a/vendor/xorm.io/core/.drone.yml +++ b/vendor/xorm.io/core/.drone.yml @@ -1,128 +1,8 @@ ---- -kind: pipeline -name: go1.10 - -platform: - os: linux - arch: amd64 - -clone: - disable: true - -workspace: - base: /go - path: src/xorm.io/core - -steps: -- name: git - pull: default - image: plugins/git:next - settings: - depth: 50 - tags: true - -- name: test - pull: default - image: golang:1.10 - commands: - - go get github.com/stretchr/testify/assert - - go get github.com/go-xorm/sqlfiddle - - go get github.com/go-sql-driver/mysql - - go get github.com/mattn/go-sqlite3 - - go vet - - "go test -v -race -coverprofile=coverage.txt -covermode=atomic -dbConn=\"root:@tcp(mysql:3306)/core_test?charset=utf8mb4\"" - when: - event: - - push - - tag - - pull_request - -services: -- name: mysql - pull: default - image: mysql:5.7 - environment: - MYSQL_ALLOW_EMPTY_PASSWORD: yes - MYSQL_DATABASE: core_test - when: - event: - - push - - tag - - pull_request - ---- -kind: pipeline -name: go1.11 - -platform: - os: linux - arch: amd64 - -clone: - disable: true - -workspace: - base: /go - path: src/xorm.io/core - -steps: -- name: git - pull: default - image: plugins/git:next - settings: - depth: 50 - tags: true - -- name: test - pull: default - image: golang:1.11 - commands: - - go vet - - "go test -v -race -coverprofile=coverage.txt -covermode=atomic -dbConn=\"root:@tcp(mysql:3306)/core_test?charset=utf8mb4\"" - environment: - GO111MODULE: "on" - GOPROXY: https://goproxy.cn - when: - event: - - push - - tag - - pull_request - -services: -- name: mysql - pull: default - image: mysql:5.7 - environment: - MYSQL_ALLOW_EMPTY_PASSWORD: yes - MYSQL_DATABASE: core_test - when: - event: - - push - - tag - - pull_request - --- kind: pipeline name: go1.12 -platform: - os: linux - arch: amd64 - -clone: - disable: true - -workspace: - base: /go - path: src/xorm.io/core - steps: -- name: git - pull: default - image: plugins/git:next - settings: - depth: 50 - tags: true - name: test pull: default diff --git a/vendor/xorm.io/core/README.md b/vendor/xorm.io/core/README.md index c2cedcae8c..54436b6893 100644 --- a/vendor/xorm.io/core/README.md +++ b/vendor/xorm.io/core/README.md @@ -1,7 +1,7 @@ Core is a lightweight wrapper of sql.DB. [![Build Status](https://drone.gitea.com/api/badges/xorm/core/status.svg)](https://drone.gitea.com/xorm/core) -[![](http://gocover.io/_badge/xorm.io/core)](http://gocover.io/xorm.io/core) +[![Test Coverage](https://gocover.io/_badge/xorm.io/core)](https://gocover.io/xorm.io/core) [![Go Report Card](https://goreportcard.com/badge/code.gitea.io/gitea)](https://goreportcard.com/report/xorm.io/core) # Open diff --git a/vendor/xorm.io/core/column.go b/vendor/xorm.io/core/column.go index b5906a9874..8f375db594 100644 --- a/vendor/xorm.io/core/column.go +++ b/vendor/xorm.io/core/column.go @@ -37,7 +37,7 @@ type Column struct { IsDeleted bool IsCascade bool IsVersion bool - DefaultIsEmpty bool + DefaultIsEmpty bool // false means column has no default set, but not default value is empty EnumOptions map[string]int SetOptions map[string]int DisableTimeZone bool @@ -65,7 +65,7 @@ func NewColumn(name, fieldName string, sqlType SQLType, len1, len2 int, nullable IsDeleted: false, IsCascade: false, IsVersion: false, - DefaultIsEmpty: false, + DefaultIsEmpty: true, // default should be no default EnumOptions: make(map[string]int), Comment: "", } diff --git a/vendor/xorm.io/core/index.go b/vendor/xorm.io/core/index.go index 2915428f26..129b543921 100644 --- a/vendor/xorm.io/core/index.go +++ b/vendor/xorm.io/core/index.go @@ -26,8 +26,8 @@ type Index struct { func (index *Index) XName(tableName string) string { if !strings.HasPrefix(index.Name, "UQE_") && !strings.HasPrefix(index.Name, "IDX_") { - tableName = strings.Replace(tableName, `"`, "", -1) - tableName = strings.Replace(tableName, `.`, "_", -1) + tableParts := strings.Split(strings.Replace(tableName, `"`, "", -1), ".") + tableName = tableParts[len(tableParts)-1] if index.Type == UniqueType { return fmt.Sprintf("UQE_%v_%v", tableName, index.Name) } diff --git a/vendor/xorm.io/xorm/.drone.yml b/vendor/xorm.io/xorm/.drone.yml index b2198e380a..e9dae78896 100644 --- a/vendor/xorm.io/xorm/.drone.yml +++ b/vendor/xorm.io/xorm/.drone.yml @@ -1,204 +1,14 @@ --- kind: pipeline -name: go1.10-test -workspace: - base: /go - path: src/gitea.com/xorm/xorm - +name: testing steps: -- name: build +- name: test-vet pull: default - image: golang:1.10 - commands: - - go get -t -d -v - - go build -v - when: - event: - - push - - pull_request - -- name: test-sqlite - pull: default - image: golang:1.10 - depends_on: - - build - commands: - - "go test -v -race -db=\"sqlite3\" -conn_str=\"./test.db\" -coverprofile=coverage1-1.txt -covermode=atomic" - - "go test -v -race -db=\"sqlite3\" -conn_str=\"./test.db\" -cache=true -coverprofile=coverage1-2.txt -covermode=atomic" - when: - event: - - push - - pull_request - -- name: test-mysql - pull: default - image: golang:1.10 - depends_on: - - build - commands: - - "go test -v -race -db=\"mysql\" -conn_str=\"root:@tcp(mysql)/xorm_test\" -coverprofile=coverage2-1.txt -covermode=atomic" - - "go test -v -race -db=\"mysql\" -conn_str=\"root:@tcp(mysql)/xorm_test\" -cache=true -coverprofile=coverage2-2.txt -covermode=atomic" - when: - event: - - push - - pull_request - -- name: test-mysql-utf8mb4 - pull: default - image: golang:1.10 - depends_on: - - test-mysql - commands: - - "go test -v -race -db=\"mysql\" -conn_str=\"root:@tcp(mysql)/xorm_test?charset=utf8mb4\" -coverprofile=coverage2.1-1.txt -covermode=atomic" - - "go test -v -race -db=\"mysql\" -conn_str=\"root:@tcp(mysql)/xorm_test?charset=utf8mb4\" -cache=true -coverprofile=coverage2.1-2.txt -covermode=atomic" - when: - event: - - push - - pull_request - -- name: test-mymysql - pull: default - image: golang:1.10 - depends_on: - - test-mysql-utf8mb4 - commands: - - "go test -v -race -db=\"mymysql\" -conn_str=\"tcp:mysql:3306*xorm_test/root/\" -coverprofile=coverage3-1.txt -covermode=atomic" - - "go test -v -race -db=\"mymysql\" -conn_str=\"tcp:mysql:3306*xorm_test/root/\" -cache=true -coverprofile=coverage3-2.txt -covermode=atomic" - when: - event: - - push - - pull_request - -- name: test-postgres - pull: default - image: golang:1.10 - depends_on: - - build - commands: - - "go test -v -race -db=\"postgres\" -conn_str=\"postgres://postgres:@pgsql/xorm_test?sslmode=disable\" -coverprofile=coverage4-1.txt -covermode=atomic" - - "go test -v -race -db=\"postgres\" -conn_str=\"postgres://postgres:@pgsql/xorm_test?sslmode=disable\" -cache=true -coverprofile=coverage4-2.txt -covermode=atomic" - when: - event: - - push - - pull_request - -- name: test-postgres-schema - pull: default - image: golang:1.10 - depends_on: - - build - commands: - - "go test -v -race -db=\"postgres\" -conn_str=\"postgres://postgres:@pgsql/xorm_test?sslmode=disable\" -schema=xorm -coverprofile=coverage5-1.txt -covermode=atomic" - - "go test -v -race -db=\"postgres\" -conn_str=\"postgres://postgres:@pgsql/xorm_test?sslmode=disable\" -schema=xorm -cache=true -coverprofile=coverage5-2.txt -covermode=atomic" - when: - event: - - push - - pull_request - -- name: test-mssql - pull: default - image: golang:1.10 - depends_on: - - build - commands: - - "go test -v -race -db=\"mssql\" -conn_str=\"server=mssql;user id=sa;password=yourStrong(!)Password;database=xorm_test\" -coverprofile=coverage6-1.txt -covermode=atomic" - - "go test -v -race -db=\"mssql\" -conn_str=\"server=mssql;user id=sa;password=yourStrong(!)Password;database=xorm_test\" -cache=true -coverprofile=coverage6-2.txt -covermode=atomic" - when: - event: - - push - - pull_request - -- name: test-tidb - pull: default - image: golang:1.10 - depends_on: - - build - commands: - - "go test -v -race -db=\"mysql\" -conn_str=\"root:@tcp(tidb:4000)/xorm_test\" -ignore_select_update=true -coverprofile=coverage7-1.txt -covermode=atomic" - - "go test -v -race -db=\"mysql\" -conn_str=\"root:@tcp(tidb:4000)/xorm_test\" -ignore_select_update=true -cache=true -coverprofile=coverage7-2.txt -covermode=atomic" - when: - event: - - push - - pull_request - -- name: test-end - pull: default - image: golang:1.10 - depends_on: - - test-sqlite - - test-mysql - - test-mysql-utf8mb4 - - test-mymysql - - test-postgres - - test-postgres-schema - - test-mssql - - test-tidb - commands: - - echo "go1.10 build end" - when: - event: - - push - - pull_request - -services: -- name: mysql - pull: default - image: mysql:5.7 - environment: - MYSQL_ALLOW_EMPTY_PASSWORD: yes - MYSQL_DATABASE: xorm_test - when: - event: - - push - - tag - - pull_request - -- name: pgsql - pull: default - image: postgres:9.5 - environment: - POSTGRES_DB: xorm_test - POSTGRES_USER: postgres - when: - event: - - push - - tag - - pull_request - -- name: mssql - pull: default - image: microsoft/mssql-server-linux:latest - environment: - ACCEPT_EULA: Y - SA_PASSWORD: yourStrong(!)Password - MSSQL_PID: Developer - when: - event: - - push - - tag - - pull_request - -- name: tidb - pull: default - image: pingcap/tidb:v3.0.3 - when: - event: - - push - - tag - - pull_request - ---- -kind: pipeline -name: go1.13-test -steps: -- name: build - pull: default - image: golang:1.13 + image: golang:1.12 environment: GO111MODULE: "on" GOPROXY: "https://goproxy.cn" commands: - - go build -v - go vet when: event: @@ -207,7 +17,7 @@ steps: - name: test-sqlite pull: default - image: golang:1.13 + image: golang:1.12 environment: GO111MODULE: "on" GOPROXY: "https://goproxy.cn" @@ -221,7 +31,7 @@ steps: - name: test-mysql pull: default - image: golang:1.13 + image: golang:1.12 environment: GO111MODULE: "on" GOPROXY: "https://goproxy.cn" @@ -235,7 +45,7 @@ steps: - name: test-mysql-utf8mb4 pull: default - image: golang:1.13 + image: golang:1.12 depends_on: - test-mysql environment: @@ -251,7 +61,7 @@ steps: - name: test-mymysql pull: default - image: golang:1.13 + image: golang:1.12 depends_on: - test-mysql-utf8mb4 environment: @@ -267,7 +77,7 @@ steps: - name: test-postgres pull: default - image: golang:1.13 + image: golang:1.12 environment: GO111MODULE: "on" GOPROXY: "https://goproxy.cn" @@ -281,7 +91,7 @@ steps: - name: test-postgres-schema pull: default - image: golang:1.13 + image: golang:1.12 environment: GO111MODULE: "on" GOPROXY: "https://goproxy.cn" @@ -295,7 +105,7 @@ steps: - name: test-mssql pull: default - image: golang:1.13 + image: golang:1.12 environment: GO111MODULE: "on" GOPROXY: "https://goproxy.cn" @@ -309,7 +119,7 @@ steps: - name: test-tidb pull: default - image: golang:1.13 + image: golang:1.12 environment: GO111MODULE: "on" GOPROXY: "https://goproxy.cn" @@ -323,12 +133,12 @@ steps: - name: merge_coverage pull: default - image: golang:1.13 + image: golang:1.12 environment: GO111MODULE: "on" GOPROXY: "https://goproxy.cn" depends_on: - - build + - test-vet - test-sqlite - test-mysql - test-mysql-utf8mb4 diff --git a/vendor/xorm.io/xorm/dialect_postgres.go b/vendor/xorm.io/xorm/dialect_postgres.go index ccef3086b2..ac6d4fe896 100644 --- a/vendor/xorm.io/xorm/dialect_postgres.go +++ b/vendor/xorm.io/xorm/dialect_postgres.go @@ -901,7 +901,7 @@ func (db *postgres) TableCheckSql(tableName string) (string, []interface{}) { } func (db *postgres) ModifyColumnSql(tableName string, col *core.Column) string { - if len(db.Schema) == 0 { + if len(db.Schema) == 0 || strings.Contains(tableName, ".") { return fmt.Sprintf("alter table %s ALTER COLUMN %s TYPE %s", tableName, col.Name, db.SqlType(col)) } @@ -913,8 +913,8 @@ func (db *postgres) DropIndexSql(tableName string, index *core.Index) string { quote := db.Quote idxName := index.Name - tableName = strings.Replace(tableName, `"`, "", -1) - tableName = strings.Replace(tableName, `.`, "_", -1) + tableParts := strings.Split(strings.Replace(tableName, `"`, "", -1), ".") + tableName = tableParts[len(tableParts)-1] if !strings.HasPrefix(idxName, "UQE_") && !strings.HasPrefix(idxName, "IDX_") { diff --git a/vendor/xorm.io/xorm/session_insert.go b/vendor/xorm.io/xorm/session_insert.go index 1e19ce7a4e..5f8f7e1ee8 100644 --- a/vendor/xorm.io/xorm/session_insert.go +++ b/vendor/xorm.io/xorm/session_insert.go @@ -729,66 +729,7 @@ func (session *Session) insertMapInterface(m map[string]interface{}) (int64, err args = append(args, m[colName]) } - w := builder.NewWriter() - if session.statement.cond.IsValid() { - if _, err := w.WriteString(fmt.Sprintf("INSERT INTO %s (", session.engine.Quote(tableName))); err != nil { - return 0, err - } - - if err := writeStrings(w, append(columns, exprs.colNames...), "`", "`"); err != nil { - return 0, err - } - - if _, err := w.WriteString(") SELECT "); err != nil { - return 0, err - } - - if err := session.statement.writeArgs(w, args); err != nil { - return 0, err - } - - if len(exprs.args) > 0 { - if _, err := w.WriteString(","); err != nil { - return 0, err - } - if err := exprs.writeArgs(w); err != nil { - return 0, err - } - } - - if _, err := w.WriteString(fmt.Sprintf(" FROM %s WHERE ", session.engine.Quote(tableName))); err != nil { - return 0, err - } - - if err := session.statement.cond.WriteTo(w); err != nil { - return 0, err - } - } else { - qm := strings.Repeat("?,", len(columns)) - qm = qm[:len(qm)-1] - - if _, err := w.WriteString(fmt.Sprintf("INSERT INTO %s (`%s`) VALUES (%s)", session.engine.Quote(tableName), strings.Join(columns, "`,`"), qm)); err != nil { - return 0, err - } - w.Append(args...) - } - - sql := w.String() - args = w.Args() - - if err := session.cacheInsert(tableName); err != nil { - return 0, err - } - - res, err := session.exec(sql, args...) - if err != nil { - return 0, err - } - affected, err := res.RowsAffected() - if err != nil { - return 0, err - } - return affected, nil + return session.insertMap(columns, args) } func (session *Session) insertMapString(m map[string]string) (int64, error) { @@ -808,6 +749,7 @@ func (session *Session) insertMapString(m map[string]string) (int64, error) { columns = append(columns, k) } } + sort.Strings(columns) var args = make([]interface{}, 0, len(m)) @@ -815,7 +757,18 @@ func (session *Session) insertMapString(m map[string]string) (int64, error) { args = append(args, m[colName]) } + return session.insertMap(columns, args) +} + +func (session *Session) insertMap(columns []string, args []interface{}) (int64, error) { + tableName := session.statement.TableName() + if len(tableName) <= 0 { + return 0, ErrTableNotFound + } + + exprs := session.statement.exprColumns w := builder.NewWriter() + // if insert where if session.statement.cond.IsValid() { if _, err := w.WriteString(fmt.Sprintf("INSERT INTO %s (", session.engine.Quote(tableName))); err != nil { return 0, err @@ -853,10 +806,29 @@ func (session *Session) insertMapString(m map[string]string) (int64, error) { qm := strings.Repeat("?,", len(columns)) qm = qm[:len(qm)-1] - if _, err := w.WriteString(fmt.Sprintf("INSERT INTO %s (`%s`) VALUES (%s)", session.engine.Quote(tableName), strings.Join(columns, "`,`"), qm)); err != nil { + if _, err := w.WriteString(fmt.Sprintf("INSERT INTO %s (", session.engine.Quote(tableName))); err != nil { return 0, err } + + if err := writeStrings(w, append(columns, exprs.colNames...), "`", "`"); err != nil { + return 0, err + } + if _, err := w.WriteString(fmt.Sprintf(") VALUES (%s", qm)); err != nil { + return 0, err + } + w.Append(args...) + if len(exprs.args) > 0 { + if _, err := w.WriteString(","); err != nil { + return 0, err + } + if err := exprs.writeArgs(w); err != nil { + return 0, err + } + } + if _, err := w.WriteString(")"); err != nil { + return 0, err + } } sql := w.String() diff --git a/vendor/xorm.io/xorm/session_update.go b/vendor/xorm.io/xorm/session_update.go index 231163e063..47ced66d19 100644 --- a/vendor/xorm.io/xorm/session_update.go +++ b/vendor/xorm.io/xorm/session_update.go @@ -239,14 +239,20 @@ func (session *Session) Update(bean interface{}, condiBean ...interface{}) (int6 for i, colName := range exprColumns.colNames { switch tp := exprColumns.args[i].(type) { case string: - colNames = append(colNames, session.engine.Quote(colName)+" = "+tp) + if len(tp) == 0 { + tp = "''" + } + colNames = append(colNames, session.engine.Quote(colName)+"="+tp) case *builder.Builder: subQuery, subArgs, err := builder.ToSQL(tp) if err != nil { return 0, err } - colNames = append(colNames, session.engine.Quote(colName)+" = ("+subQuery+")") + colNames = append(colNames, session.engine.Quote(colName)+"=("+subQuery+")") args = append(args, subArgs...) + default: + colNames = append(colNames, session.engine.Quote(colName)+"=?") + args = append(args, exprColumns.args[i]) } } diff --git a/vendor/xorm.io/xorm/statement_exprparam.go b/vendor/xorm.io/xorm/statement_exprparam.go index 4da4f1ea12..fc62e36f1f 100644 --- a/vendor/xorm.io/xorm/statement_exprparam.go +++ b/vendor/xorm.io/xorm/statement_exprparam.go @@ -69,10 +69,18 @@ func (exprs *exprParams) writeArgs(w *builder.BytesWriter) error { if _, err := w.WriteString(")"); err != nil { return err } - default: + case string: + if arg == "" { + arg = "''" + } if _, err := w.WriteString(fmt.Sprintf("%v", arg)); err != nil { return err } + default: + if _, err := w.WriteString("?"); err != nil { + return err + } + w.Append(arg) } if i != len(exprs.args)-1 { if _, err := w.WriteString(","); err != nil {