From 150b7e44948b43434ce307e6a78794f489fc5a64 Mon Sep 17 00:00:00 2001 From: Lunny Xiao Date: Sat, 18 Jul 2020 16:17:08 +0800 Subject: [PATCH 1/4] Support use nvarchar for all varchar columns when using mssql --- custom/conf/app.example.ini | 3 ++ .../doc/advanced/config-cheat-sheet.en-us.md | 1 + .../doc/advanced/config-cheat-sheet.zh-cn.md | 1 + go.mod | 2 +- go.sum | 4 +-- models/models.go | 2 ++ modules/setting/database.go | 3 ++ vendor/modules.txt | 2 +- vendor/xorm.io/xorm/.drone.yml | 1 + vendor/xorm.io/xorm/Makefile | 4 +++ vendor/xorm.io/xorm/dialects/mssql.go | 34 +++++++++++++++++++ vendor/xorm.io/xorm/go.sum | 13 +++++-- vendor/xorm.io/xorm/interface.go | 1 + vendor/xorm.io/xorm/log/logger_context.go | 1 + vendor/xorm.io/xorm/session.go | 12 +++++-- 15 files changed, 76 insertions(+), 8 deletions(-) diff --git a/custom/conf/app.example.ini b/custom/conf/app.example.ini index d6c73fbe57c31..4beb1105f21af 100644 --- a/custom/conf/app.example.ini +++ b/custom/conf/app.example.ini @@ -378,6 +378,9 @@ SSL_MODE = disable ; For MySQL only, either "utf8" or "utf8mb4", default is "utf8mb4". ; NOTICE: for "utf8mb4" you must use MySQL InnoDB > 5.6. Gitea is unable to check this. CHARSET = utf8mb4 +; For Mssql only, either "varchar" or "nvarchar", default is "varchar" +; NOTICE: if you changed the config, you have to convert the original columns type manually +DEFAULT_VARCHAR = varchar ; For "sqlite3" and "tidb", use an absolute path when you start gitea as service PATH = data/gitea.db ; For "sqlite3" only. Query timeout 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 4fa0910b1f487..f3df2bbc73c4c 100644 --- a/docs/content/doc/advanced/config-cheat-sheet.en-us.md +++ b/docs/content/doc/advanced/config-cheat-sheet.en-us.md @@ -245,6 +245,7 @@ Values containing `#` or `;` must be quoted using `` ` `` or `"""`. - `verify-ca`: Enable TLS with verification of the database server certificate against its root certificate. - `verify-full`: Enable TLS and verify the database server name matches the given certificate in either the `Common Name` or `Subject Alternative Name` fields. - `CHARSET`: **utf8mb4**: For MySQL only, either "utf8" or "utf8mb4". NOTICE: for "utf8mb4" you must use MySQL InnoDB > 5.6. Gitea is unable to check this. +- `DEFAULT_VARCHAR`: **varchar**: For Mssql only, either "varchar" or "nvarchar"; If you changed the config, you have to convert the original columns type manually. - `PATH`: **data/gitea.db**: For SQLite3 only, the database file path. - `LOG_SQL`: **true**: Log the executed SQL. - `DB_RETRIES`: **10**: How many ORM init / DB connect attempts allowed. diff --git a/docs/content/doc/advanced/config-cheat-sheet.zh-cn.md b/docs/content/doc/advanced/config-cheat-sheet.zh-cn.md index 48cf0b4629d5c..b6a93c4eceea9 100644 --- a/docs/content/doc/advanced/config-cheat-sheet.zh-cn.md +++ b/docs/content/doc/advanced/config-cheat-sheet.zh-cn.md @@ -82,6 +82,7 @@ menu: - `PASSWD`: 数据库用户密码。 - `SSL_MODE`: MySQL 或 PostgreSQL数据库是否启用SSL模式。 - `CHARSET`: **utf8mb4**: 仅当数据库为 MySQL 时有效, 可以为 "utf8" 或 "utf8mb4"。注意:如果使用 "utf8mb4",你的 MySQL InnoDB 版本必须在 5.6 以上。 +- `DEFAULT_VARCHAR`: **varchar**: 仅当数据库为 Mssql 时有效, 可以为 "varchar" 或 "nvarchar"。如果改变了此项配置,你需要手动修改数据库中所有已创建的字段为指定的类型。 - `PATH`: Tidb 或者 SQLite3 数据文件存放路径。 - `LOG_SQL`: **true**: 显示生成的SQL,默认为真。 - `MAX_IDLE_CONNS` **0**: 最大空闲数据库连接 diff --git a/go.mod b/go.mod index aca7d2e06c93f..494ca33a1fc89 100644 --- a/go.mod +++ b/go.mod @@ -120,5 +120,5 @@ require ( mvdan.cc/xurls/v2 v2.1.0 strk.kbt.io/projects/go/libravatar v0.0.0-20191008002943-06d1c002b251 xorm.io/builder v0.3.7 - xorm.io/xorm v1.0.3 + xorm.io/xorm v1.0.4-0.20200718080127-318102c9ff87 ) diff --git a/go.sum b/go.sum index eecd43729b393..9536980172f4c 100644 --- a/go.sum +++ b/go.sum @@ -979,5 +979,5 @@ xorm.io/core v0.7.2 h1:mEO22A2Z7a3fPaZMk6gKL/jMD80iiyNwRrX5HOv3XLw= xorm.io/core v0.7.2/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 v1.0.3 h1:3dALAohvINu2mfEix5a5x5ZmSVGSljinoSGgvGbaZp0= -xorm.io/xorm v1.0.3/go.mod h1:uF9EtbhODq5kNWxMbnBEj8hRRZnlcNSz2t2N7HW/+A4= +xorm.io/xorm v1.0.4-0.20200718080127-318102c9ff87 h1:vgc2F0wjD0cyrNrSKiIdWu123wuKkPQI84DZUKvJ6ns= +xorm.io/xorm v1.0.4-0.20200718080127-318102c9ff87/go.mod h1:uF9EtbhODq5kNWxMbnBEj8hRRZnlcNSz2t2N7HW/+A4= diff --git a/models/models.go b/models/models.go index 79a549b74bd57..9e216b0fcba84 100644 --- a/models/models.go +++ b/models/models.go @@ -145,6 +145,8 @@ func getEngine() (*xorm.Engine, error) { } if setting.Database.Type == "mysql" { engine.Dialect().SetParams(map[string]string{"rowFormat": "DYNAMIC"}) + } else if setting.Database.Type == "mssql" { + engine.Dialect().SetParams(map[string]string{"DEFAULT_VARCHAR": setting.Database.DefaultVarchar}) } engine.SetSchema(setting.Database.Schema) return engine, nil diff --git a/modules/setting/database.go b/modules/setting/database.go index a0734bc67a0e6..64258abf72f1a 100644 --- a/modules/setting/database.go +++ b/modules/setting/database.go @@ -35,6 +35,7 @@ var ( Path string LogSQL bool Charset string + DefaultVarchar string Timeout int // seconds UseSQLite3 bool UseMySQL bool @@ -47,6 +48,7 @@ var ( ConnMaxLifetime time.Duration IterateBufferSize int }{ + DefaultVarchar: "varchar", Timeout: 500, } ) @@ -79,6 +81,7 @@ func InitDBConfig() { 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.DefaultVarchar = sec.Key("DEFAULT_VARCHAR").In("varchar", []string{"varchar", "nvarchar"}) Database.Path = sec.Key("PATH").MustString(filepath.Join(AppDataPath, "gitea.db")) Database.Timeout = sec.Key("SQLITE_TIMEOUT").MustInt(500) Database.MaxIdleConns = sec.Key("MAX_IDLE_CONNS").MustInt(2) diff --git a/vendor/modules.txt b/vendor/modules.txt index 0423fa60c863f..657d6f60dbfec 100644 --- a/vendor/modules.txt +++ b/vendor/modules.txt @@ -916,7 +916,7 @@ strk.kbt.io/projects/go/libravatar # xorm.io/builder v0.3.7 ## explicit xorm.io/builder -# xorm.io/xorm v1.0.3 +# xorm.io/xorm v1.0.4-0.20200718080127-318102c9ff87 ## explicit xorm.io/xorm xorm.io/xorm/caches diff --git a/vendor/xorm.io/xorm/.drone.yml b/vendor/xorm.io/xorm/.drone.yml index 7a18e0d683ea8..8cf43aa251417 100644 --- a/vendor/xorm.io/xorm/.drone.yml +++ b/vendor/xorm.io/xorm/.drone.yml @@ -164,6 +164,7 @@ steps: - make test-mssql - TEST_CACHE_ENABLE=true make test-mssql - TEST_QUOTE_POLICY=reserved make test-mssql + - TEST_MSSQL_DEFAULT_VARCHAR=NVARCHAR TEST_MSSQL_DEFAULT_CHAR=NCHAR make test-mssql when: event: - push diff --git a/vendor/xorm.io/xorm/Makefile b/vendor/xorm.io/xorm/Makefile index 4cccacd834dec..ed873883f27ca 100644 --- a/vendor/xorm.io/xorm/Makefile +++ b/vendor/xorm.io/xorm/Makefile @@ -20,6 +20,8 @@ TEST_MSSQL_HOST ?= mssql:1433 TEST_MSSQL_DBNAME ?= gitea TEST_MSSQL_USERNAME ?= sa TEST_MSSQL_PASSWORD ?= MwantsaSecurePassword1 +TEST_MSSQL_DEFAULT_VARCHAR ?= varchar +TEST_MSSQL_DEFAULT_CHAR ?= char TEST_MYSQL_HOST ?= mysql:3306 TEST_MYSQL_CHARSET ?= utf8 @@ -144,12 +146,14 @@ test-cockroach\#%: go-check test-mssql: go-check $(GO) test $(INTEGRATION_PACKAGES) -v -race -db=mssql -cache=$(TEST_CACHE_ENABLE) -quote=$(TEST_QUOTE_POLICY) \ -conn_str="server=$(TEST_MSSQL_HOST);user id=$(TEST_MSSQL_USERNAME);password=$(TEST_MSSQL_PASSWORD);database=$(TEST_MSSQL_DBNAME)" \ + -default_varchar=$(TEST_MSSQL_DEFAULT_VARCHAR) -default_char=$(TEST_MSSQL_DEFAULT_CHAR) \ -coverprofile=mssql.$(TEST_QUOTE_POLICY).$(TEST_CACHE_ENABLE).coverage.out -covermode=atomic .PNONY: test-mssql\#% test-mssql\#%: go-check $(GO) test $(INTEGRATION_PACKAGES) -v -race -run $* -db=mssql -cache=$(TEST_CACHE_ENABLE) -quote=$(TEST_QUOTE_POLICY) \ -conn_str="server=$(TEST_MSSQL_HOST);user id=$(TEST_MSSQL_USERNAME);password=$(TEST_MSSQL_PASSWORD);database=$(TEST_MSSQL_DBNAME)" \ + -default_varchar=$(TEST_MSSQL_DEFAULT_VARCHAR) -default_char=$(TEST_MSSQL_DEFAULT_CHAR) \ -coverprofile=mssql.$(TEST_QUOTE_POLICY).$(TEST_CACHE_ENABLE).coverage.out -covermode=atomic .PNONY: test-mymysql diff --git a/vendor/xorm.io/xorm/dialects/mssql.go b/vendor/xorm.io/xorm/dialects/mssql.go index f766950ca25f3..d76a8c6c11a02 100644 --- a/vendor/xorm.io/xorm/dialects/mssql.go +++ b/vendor/xorm.io/xorm/dialects/mssql.go @@ -214,6 +214,8 @@ var ( type mssql struct { Base + defaultVarchar string + defaultChar string } func (db *mssql) Init(uri *URI) error { @@ -221,6 +223,34 @@ func (db *mssql) Init(uri *URI) error { return db.Base.Init(db, uri) } +func (db *mssql) SetParams(params map[string]string) { + defaultVarchar, ok := params["DEFAULT_VARCHAR"] + if ok { + var t = strings.ToUpper(defaultVarchar) + switch t { + case "NVARCHAR", "VARCHAR": + db.defaultVarchar = defaultVarchar + default: + db.defaultVarchar = "VARCHAR" + } + } else { + db.defaultVarchar = "VARCHAR" + } + + defaultChar, ok := params["DEFAULT_CHAR"] + if ok { + var t = strings.ToUpper(defaultChar) + switch t { + case "NCHAR", "CHAR": + db.defaultChar = defaultChar + default: + db.defaultChar = "CHAR" + } + } else { + db.defaultChar = "CHAR" + } +} + func (db *mssql) SQLType(c *schemas.Column) string { var res string switch t := c.SQLType.Name; t { @@ -267,6 +297,10 @@ func (db *mssql) SQLType(c *schemas.Column) string { case schemas.BigInt: res = schemas.BigInt c.Length = 0 + case schemas.Varchar: + res = db.defaultVarchar + case schemas.Char: + res = db.defaultChar default: res = t } diff --git a/vendor/xorm.io/xorm/go.sum b/vendor/xorm.io/xorm/go.sum index 2da01eeb72ed9..844dd09493e64 100644 --- a/vendor/xorm.io/xorm/go.sum +++ b/vendor/xorm.io/xorm/go.sum @@ -1,5 +1,7 @@ gitea.com/xorm/sqlfiddle v0.0.0-20180821085327-62ce714f951a h1:lSA0F4e9A2NcQSqGqTOXqu2aRi/XEQxDCBwM8yJtE6s= gitea.com/xorm/sqlfiddle v0.0.0-20180821085327-62ce714f951a/go.mod h1:EXuID2Zs0pAQhH8yz+DNjUbjppKQzKFAn28TMYPB6IU= +github.com/PuerkitoBio/goquery v1.5.1/go.mod h1:GsLWisAFVj4WgDibEWF4pvYnkVQBpKBKeU+7zCJoLcc= +github.com/andybalholm/cascadia v1.1.0/go.mod h1:GsXiBklL0woXo1j/WYWtSYYC4ouU9PqHO0sqidkEA4Y= github.com/davecgh/go-spew v1.1.0 h1:ZDRjVQ15GmhC3fiQ8ni8+OwkZQO4DARzQgrnXU1Liz8= github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/denisenkom/go-mssqldb v0.0.0-20200428022330-06a60b6afbbc h1:VRRKCwnzqk8QCaRC4os14xoKDdbHqqlJtJA0oc1ZAjg= @@ -18,8 +20,8 @@ github.com/hpcloud/tail v1.0.0 h1:nfCOvKYfkgYP8hkirhJocXT2+zOD8yUNjXaWfTlyFKI= github.com/hpcloud/tail v1.0.0/go.mod h1:ab1qPbhIpdTxEkNHXyeSf5vhxWSCs/tWer42PpOxQnU= github.com/lib/pq v1.7.0 h1:h93mCPfUSkaul3Ka/VG8uZdmW1uMHDGxzu0NWHuJmHY= github.com/lib/pq v1.7.0/go.mod h1:AlVN5x4E4T544tWzH6hKfbfQvm3HdbOxrmggDNAPY9o= -github.com/mattn/go-sqlite3 v2.0.3+incompatible h1:gXHsfypPkaMZrKbD5209QV9jbUTJKjyR5WD3HYQSd+U= -github.com/mattn/go-sqlite3 v2.0.3+incompatible/go.mod h1:FPy6KqzDD04eiIsT53CuJW3U88zkxoIYsOqkbpncsNc= +github.com/mattn/go-sqlite3 v1.14.0 h1:mLyGNKR8+Vv9CAU7PphKa2hkEqxxhn8i32J6FPj1/QA= +github.com/mattn/go-sqlite3 v1.14.0/go.mod h1:JIl7NbARA7phWnGvh0LKTyg7S9BA+6gx71ShQilpsus= github.com/onsi/ginkgo v1.6.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= github.com/onsi/ginkgo v1.7.0 h1:WSHQ+IS43OoUrWtD1/bbclrwK8TTH5hzp+umCiuxHgs= github.com/onsi/ginkgo v1.7.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= @@ -36,16 +38,23 @@ github.com/syndtr/goleveldb v1.0.0 h1:fBdIW9lB4Iz0n9khmH8w27SJ3QEJ7+IgjPEwGSZiFd github.com/syndtr/goleveldb v1.0.0/go.mod h1:ZVVdQEZoIme9iO1Ch2Jdy24qqXrMMOU6lpPAyBWyWuQ= github.com/ziutek/mymysql v1.5.4 h1:GB0qdRGsTwQSBVYuVShFBKaXSnSnYYC2d9knnE1LHFs= github.com/ziutek/mymysql v1.5.4/go.mod h1:LMSpPZ6DbqWFxNCHW77HeMg9I646SAhApZ/wKdgO/C0= +golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= golang.org/x/crypto v0.0.0-20190325154230-a5d413f7728c h1:Vj5n4GlwjmQteupaxJ9+0FNOmBrHfq7vN4btdGoDZgI= golang.org/x/crypto v0.0.0-20190325154230-a5d413f7728c/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= +golang.org/x/net v0.0.0-20180218175443-cbe0f9307d01/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20180906233101-161cd47e91fd h1:nTDtHvHSdCn1m6ITfMRqtOd/9+7a3s8RBNOZ3eYZzJA= golang.org/x/net v0.0.0-20180906233101-161cd47e91fd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= +golang.org/x/net v0.0.0-20200202094626-16171245cfb2/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20200324143707-d3edc9973b7e h1:3G+cUijn7XD+S4eJFddp53Pv7+slrESplyjG25HgL+k= +golang.org/x/net v0.0.0-20200324143707-d3edc9973b7e/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f h1:wMNYb4v58l5UBM7MYRLPG6ZhfOqbKu7X5eyFl8ZhKvA= golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sys v0.0.0-20180909124046-d0be0721c37e h1:o3PsSEY8E4eXWkXrIP9YJALUkVZqzHJT5DOasTyn8Vs= golang.org/x/sys v0.0.0-20180909124046-d0be0721c37e/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a h1:1BGLXjeY4akVXGgbC9HugT3Jv3hCI0z56oJR5vAMgBU= golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20200323222414-85ca7c5b95cd h1:xhmwyvizuTgC2qz7ZlMluP20uW+C3Rm0FD/WLDX8884= +golang.org/x/sys v0.0.0-20200323222414-85ca7c5b95cd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/text v0.3.0 h1:g61tztE5qeGQ89tm6NTjjM9VPIm088od1l6aSorWRWg= golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405 h1:yhCVgyC4o1eVCa2tZl7eS0r+SDo693bJlVdllGtEeKM= diff --git a/vendor/xorm.io/xorm/interface.go b/vendor/xorm.io/xorm/interface.go index 6aac4ae843bb1..0fe9cbe1ed7ed 100644 --- a/vendor/xorm.io/xorm/interface.go +++ b/vendor/xorm.io/xorm/interface.go @@ -120,6 +120,7 @@ type EngineInterface interface { TableInfo(bean interface{}) (*schemas.Table, error) TableName(interface{}, ...bool) string UnMapType(reflect.Type) + EnableSessionID(bool) } var ( diff --git a/vendor/xorm.io/xorm/log/logger_context.go b/vendor/xorm.io/xorm/log/logger_context.go index 6b7252ef6498b..468025769d277 100644 --- a/vendor/xorm.io/xorm/log/logger_context.go +++ b/vendor/xorm.io/xorm/log/logger_context.go @@ -42,6 +42,7 @@ var ( // enumerate all the context keys var ( SessionIDKey = "__xorm_session_id" + SessionKey = "__xorm_session_key" SessionShowSQLKey = "__xorm_show_sql" ) diff --git a/vendor/xorm.io/xorm/session.go b/vendor/xorm.io/xorm/session.go index 761b14152f348..48b3779eff690 100644 --- a/vendor/xorm.io/xorm/session.go +++ b/vendor/xorm.io/xorm/session.go @@ -102,12 +102,12 @@ func newSessionID() string { func newSession(engine *Engine) *Session { var ctx context.Context if engine.logSessionID { - ctx = context.WithValue(engine.defaultContext, log.SessionIDKey, newSessionID()) + ctx = context.WithValue(engine.defaultContext, log.SessionIDKey, newSessionID()) } else { ctx = engine.defaultContext } - return &Session{ + session := &Session{ ctx: ctx, engine: engine, tx: nil, @@ -136,6 +136,10 @@ func newSession(engine *Engine) *Session { sessionType: engineSession, } + if engine.logSessionID { + session.ctx = context.WithValue(session.ctx, log.SessionKey, session) + } + return session } // Close release the connection from pool @@ -165,6 +169,10 @@ func (session *Session) db() *core.DB { return session.engine.db } +func (session *Session) Engine() *Engine { + return session.engine +} + func (session *Session) getQueryer() core.Queryer { if session.tx != nil { return session.tx From f4d88866efcb8680e9514dd03eca6993f93281c1 Mon Sep 17 00:00:00 2001 From: Lunny Xiao Date: Sat, 18 Jul 2020 20:27:33 +0800 Subject: [PATCH 2/4] fix lint --- modules/setting/database.go | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/modules/setting/database.go b/modules/setting/database.go index 64258abf72f1a..0cb3d52c660d2 100644 --- a/modules/setting/database.go +++ b/modules/setting/database.go @@ -35,7 +35,7 @@ var ( Path string LogSQL bool Charset string - DefaultVarchar string + DefaultVarchar string Timeout int // seconds UseSQLite3 bool UseMySQL bool @@ -49,7 +49,7 @@ var ( IterateBufferSize int }{ DefaultVarchar: "varchar", - Timeout: 500, + Timeout: 500, } ) From 1be881e12229a2a5a5fbf9559c5ce7ddf907b1ba Mon Sep 17 00:00:00 2001 From: Lunny Xiao Date: Sun, 19 Jul 2020 10:05:05 +0800 Subject: [PATCH 3/4] Change DEFAULT_VARCHAR to nvarchar --- custom/conf/app.example.ini | 4 ++-- docs/content/doc/advanced/config-cheat-sheet.en-us.md | 2 +- docs/content/doc/advanced/config-cheat-sheet.zh-cn.md | 2 +- modules/setting/database.go | 2 +- 4 files changed, 5 insertions(+), 5 deletions(-) diff --git a/custom/conf/app.example.ini b/custom/conf/app.example.ini index 4beb1105f21af..cdba87fdbea2a 100644 --- a/custom/conf/app.example.ini +++ b/custom/conf/app.example.ini @@ -378,9 +378,9 @@ SSL_MODE = disable ; For MySQL only, either "utf8" or "utf8mb4", default is "utf8mb4". ; NOTICE: for "utf8mb4" you must use MySQL InnoDB > 5.6. Gitea is unable to check this. CHARSET = utf8mb4 -; For Mssql only, either "varchar" or "nvarchar", default is "varchar" +; For Mssql only, either "varchar" or "nvarchar", default is "nvarchar" ; NOTICE: if you changed the config, you have to convert the original columns type manually -DEFAULT_VARCHAR = varchar +DEFAULT_VARCHAR = nvarchar ; For "sqlite3" and "tidb", use an absolute path when you start gitea as service PATH = data/gitea.db ; For "sqlite3" only. Query timeout 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 f3df2bbc73c4c..e621f70850e97 100644 --- a/docs/content/doc/advanced/config-cheat-sheet.en-us.md +++ b/docs/content/doc/advanced/config-cheat-sheet.en-us.md @@ -245,7 +245,7 @@ Values containing `#` or `;` must be quoted using `` ` `` or `"""`. - `verify-ca`: Enable TLS with verification of the database server certificate against its root certificate. - `verify-full`: Enable TLS and verify the database server name matches the given certificate in either the `Common Name` or `Subject Alternative Name` fields. - `CHARSET`: **utf8mb4**: For MySQL only, either "utf8" or "utf8mb4". NOTICE: for "utf8mb4" you must use MySQL InnoDB > 5.6. Gitea is unable to check this. -- `DEFAULT_VARCHAR`: **varchar**: For Mssql only, either "varchar" or "nvarchar"; If you changed the config, you have to convert the original columns type manually. +- `DEFAULT_VARCHAR`: **nvarchar**: For Mssql only, either "varchar" or "nvarchar"; If you changed the config, you have to convert the original columns type manually. - `PATH`: **data/gitea.db**: For SQLite3 only, the database file path. - `LOG_SQL`: **true**: Log the executed SQL. - `DB_RETRIES`: **10**: How many ORM init / DB connect attempts allowed. diff --git a/docs/content/doc/advanced/config-cheat-sheet.zh-cn.md b/docs/content/doc/advanced/config-cheat-sheet.zh-cn.md index b6a93c4eceea9..98ade7a144042 100644 --- a/docs/content/doc/advanced/config-cheat-sheet.zh-cn.md +++ b/docs/content/doc/advanced/config-cheat-sheet.zh-cn.md @@ -82,7 +82,7 @@ menu: - `PASSWD`: 数据库用户密码。 - `SSL_MODE`: MySQL 或 PostgreSQL数据库是否启用SSL模式。 - `CHARSET`: **utf8mb4**: 仅当数据库为 MySQL 时有效, 可以为 "utf8" 或 "utf8mb4"。注意:如果使用 "utf8mb4",你的 MySQL InnoDB 版本必须在 5.6 以上。 -- `DEFAULT_VARCHAR`: **varchar**: 仅当数据库为 Mssql 时有效, 可以为 "varchar" 或 "nvarchar"。如果改变了此项配置,你需要手动修改数据库中所有已创建的字段为指定的类型。 +- `DEFAULT_VARCHAR`: **nvarchar**: 仅当数据库为 Mssql 时有效, 可以为 "varchar" 或 "nvarchar"。如果改变了此项配置,你需要手动修改数据库中所有已创建的字段为指定的类型。 - `PATH`: Tidb 或者 SQLite3 数据文件存放路径。 - `LOG_SQL`: **true**: 显示生成的SQL,默认为真。 - `MAX_IDLE_CONNS` **0**: 最大空闲数据库连接 diff --git a/modules/setting/database.go b/modules/setting/database.go index 0cb3d52c660d2..a3ae50a52683f 100644 --- a/modules/setting/database.go +++ b/modules/setting/database.go @@ -48,7 +48,7 @@ var ( ConnMaxLifetime time.Duration IterateBufferSize int }{ - DefaultVarchar: "varchar", + DefaultVarchar: "nvarchar", Timeout: 500, } ) From 5fe2453d4c680f206def30252f25fbdf1009ab9c Mon Sep 17 00:00:00 2001 From: Lunny Xiao Date: Mon, 20 Jul 2020 12:44:06 +0800 Subject: [PATCH 4/4] Remove the config for default varchar since it's unnecessary --- custom/conf/app.example.ini | 3 --- docs/content/doc/advanced/config-cheat-sheet.en-us.md | 1 - docs/content/doc/advanced/config-cheat-sheet.zh-cn.md | 1 - models/models.go | 2 +- modules/setting/database.go | 5 +---- 5 files changed, 2 insertions(+), 10 deletions(-) diff --git a/custom/conf/app.example.ini b/custom/conf/app.example.ini index cdba87fdbea2a..d6c73fbe57c31 100644 --- a/custom/conf/app.example.ini +++ b/custom/conf/app.example.ini @@ -378,9 +378,6 @@ SSL_MODE = disable ; For MySQL only, either "utf8" or "utf8mb4", default is "utf8mb4". ; NOTICE: for "utf8mb4" you must use MySQL InnoDB > 5.6. Gitea is unable to check this. CHARSET = utf8mb4 -; For Mssql only, either "varchar" or "nvarchar", default is "nvarchar" -; NOTICE: if you changed the config, you have to convert the original columns type manually -DEFAULT_VARCHAR = nvarchar ; For "sqlite3" and "tidb", use an absolute path when you start gitea as service PATH = data/gitea.db ; For "sqlite3" only. Query timeout 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 e621f70850e97..4fa0910b1f487 100644 --- a/docs/content/doc/advanced/config-cheat-sheet.en-us.md +++ b/docs/content/doc/advanced/config-cheat-sheet.en-us.md @@ -245,7 +245,6 @@ Values containing `#` or `;` must be quoted using `` ` `` or `"""`. - `verify-ca`: Enable TLS with verification of the database server certificate against its root certificate. - `verify-full`: Enable TLS and verify the database server name matches the given certificate in either the `Common Name` or `Subject Alternative Name` fields. - `CHARSET`: **utf8mb4**: For MySQL only, either "utf8" or "utf8mb4". NOTICE: for "utf8mb4" you must use MySQL InnoDB > 5.6. Gitea is unable to check this. -- `DEFAULT_VARCHAR`: **nvarchar**: For Mssql only, either "varchar" or "nvarchar"; If you changed the config, you have to convert the original columns type manually. - `PATH`: **data/gitea.db**: For SQLite3 only, the database file path. - `LOG_SQL`: **true**: Log the executed SQL. - `DB_RETRIES`: **10**: How many ORM init / DB connect attempts allowed. diff --git a/docs/content/doc/advanced/config-cheat-sheet.zh-cn.md b/docs/content/doc/advanced/config-cheat-sheet.zh-cn.md index 98ade7a144042..48cf0b4629d5c 100644 --- a/docs/content/doc/advanced/config-cheat-sheet.zh-cn.md +++ b/docs/content/doc/advanced/config-cheat-sheet.zh-cn.md @@ -82,7 +82,6 @@ menu: - `PASSWD`: 数据库用户密码。 - `SSL_MODE`: MySQL 或 PostgreSQL数据库是否启用SSL模式。 - `CHARSET`: **utf8mb4**: 仅当数据库为 MySQL 时有效, 可以为 "utf8" 或 "utf8mb4"。注意:如果使用 "utf8mb4",你的 MySQL InnoDB 版本必须在 5.6 以上。 -- `DEFAULT_VARCHAR`: **nvarchar**: 仅当数据库为 Mssql 时有效, 可以为 "varchar" 或 "nvarchar"。如果改变了此项配置,你需要手动修改数据库中所有已创建的字段为指定的类型。 - `PATH`: Tidb 或者 SQLite3 数据文件存放路径。 - `LOG_SQL`: **true**: 显示生成的SQL,默认为真。 - `MAX_IDLE_CONNS` **0**: 最大空闲数据库连接 diff --git a/models/models.go b/models/models.go index 9e216b0fcba84..d0703be300d4f 100644 --- a/models/models.go +++ b/models/models.go @@ -146,7 +146,7 @@ func getEngine() (*xorm.Engine, error) { if setting.Database.Type == "mysql" { engine.Dialect().SetParams(map[string]string{"rowFormat": "DYNAMIC"}) } else if setting.Database.Type == "mssql" { - engine.Dialect().SetParams(map[string]string{"DEFAULT_VARCHAR": setting.Database.DefaultVarchar}) + engine.Dialect().SetParams(map[string]string{"DEFAULT_VARCHAR": "nvarchar"}) } engine.SetSchema(setting.Database.Schema) return engine, nil diff --git a/modules/setting/database.go b/modules/setting/database.go index a3ae50a52683f..a0734bc67a0e6 100644 --- a/modules/setting/database.go +++ b/modules/setting/database.go @@ -35,7 +35,6 @@ var ( Path string LogSQL bool Charset string - DefaultVarchar string Timeout int // seconds UseSQLite3 bool UseMySQL bool @@ -48,8 +47,7 @@ var ( ConnMaxLifetime time.Duration IterateBufferSize int }{ - DefaultVarchar: "nvarchar", - Timeout: 500, + Timeout: 500, } ) @@ -81,7 +79,6 @@ func InitDBConfig() { 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.DefaultVarchar = sec.Key("DEFAULT_VARCHAR").In("varchar", []string{"varchar", "nvarchar"}) Database.Path = sec.Key("PATH").MustString(filepath.Join(AppDataPath, "gitea.db")) Database.Timeout = sec.Key("SQLITE_TIMEOUT").MustInt(500) Database.MaxIdleConns = sec.Key("MAX_IDLE_CONNS").MustInt(2)