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 16612 zcmb2|=HSQ;^NC?#PR}e!P1G$j)HBsH)+-Sg8XJa$Y$f(LV`f%Qy z7Ny4J@(gz?a!um){CIb?``-OcN!7EL%h%Q3o~?fSiIwK1do|l{ZMeVh@&5m3?3RDN z=R0rhDVF({_e7+;zE|+!(~|Fh9)Hc-d$-d*j;HKV|H0D_Z=OE*ZsYxWvff}&dn2FZE`!e`u}qCAD(}i)TD-1Dqr&u{vfRC~Ja zMg5*%pCkXP^KPG~{;$|o8_8|OEyQJ-?nDLZx7*FQukiOnlbdbnnT{X&*hFUw&;9 zY0T~L^wg)@9n(_hG8kW1y8U#s$XeUevzsD+n9WSP{=a$M3fI6lmm-3v&2-tUbM5mN zZoBhFJN>3xq?zBGB)Rz)znb$dFR{~^M)RMqnLW8aansr0Yn(Pd_Den9&NaT;mHRhx zTU4QOs`Ke}0cI7`A86+v(^A}d?i0)UWhcvKpLuu0qV4UyNjH10-!c1r#47VxzQjb$ z6EDx6-|zeW^6T9?zmM#SHQTpYE2TDk!w-Y`S9T;sCWz&g7g~xPol?#|zuAo4_-ur{ zP_WWP(Ia8awoQ+`RN0R%xv|Pl)hjF{v_t0NSA$)NYpZrA7%Q#39i+D|W9pubUtcmE z+0_2I(c`8<_LeI)Gi#Gx{&X=}wr@?%CTq7e5$DnpPScuzE%E}D4C$559gEn(wXmQ6`&Qhs88N^YM#v1^*|z8_~+97~VU{bY0c@#l?C zuP^@*bKO(!^hEBi{GAcOg15S7|GRxsUiHM8{f}qIoGbouNBm6vhO5fYKi+;~=CtI@ zXAZ+hyC3o8uC0Kr2?s7iiQ;xjZiK+m}M^!>oUtV;5R2*yf`pC)KZ>D)q`#yj7 z6yLzG%)0J%{aJoCk=pq_Un3;nUrLc%oLcs5Nx+)Lo8#QGw*S!yv$*+JD)wO7$*wtB zv%dULyp;0raN`fTsoFPl-@9FIT5G-I(9(FbHR)OxdiS5();;^EPSw85=iM@CduOhf zU$ps@o{8P;8(tmf#1^K6?UR_i$>`WOtFpA6r;c^cJ^KAl(L2Grf3%`qYFEj;{&G6Z zvs++W%3YUjeXms3=q|tUD01dZU2*=`H%(&IuY1RQfA(zp>T^HVY+U;?Z|1?7@_xIR zCp_HTdAMZ;+oj5+Uj;kwiz&KB<@s!1U*wX-bH}Mi;P9;UZoNHcf})&#^b8ero25I# z+HM+Y7kFuJK6CR=;?9W2ywPdhp+!@@Cv=~gvO(}$+1yPBO_#Zse}3hE;!Tos?rf33 zYlXXa_Rf3o!sgHaLd%HsInQ3FtTeyeGV?*Yz&AeAOZyJ|D{-l9i23ozGWvGlqcwAW z`LEe_HD&)Xq3z$VC;wKmE-##ZB)w~embLOLjs>%HxA9---gG>K_q_Pk_p?M3T;?zQ zd_cP_2{w^-~v8-6sHODpCaLfAM?nV3DAKN@W`*jVIvXo#qBme0?9=}w0do|{` zu8O$S&eHox#wzsVonTF!qRJ&92U(W;W|$O2g&b{m_snpqQwV7lI_{FeQ)?4))R5i1 zFyi&mZEW57Q{59k@?Gy&-StR9$DT**po~&z!l}oqHeo?)a~?{!xN3-B6_wd=ug~%G z_NdAOf~`yW&Hhw8yP?c=+3v#!W$SjOiW$k{q%-8rIkaPLd5Sz8Nx z-LFVrle5`8z1OW+X4|S6>)ge~BJ<lRA0p(z-`Ct?xyI?68hHxMiDPvOs$1 z)8N@FBSdy?k8})-o>w8Vb>m~kOVM@_Iy<@}8aHo~xY+UST!QG8o0dHXpWbeWbJ%F# z;r6JyIaFd}a>r4Icg>FDM11&#<%WFcbNa3(Oq-n^5wkfv z%u(n2{Vw>;Ot!8MN zYiT2ONA9yi)b8|%kZkvrOj+;Ek0xwl-6ih(MtNc3fpac zX2Z5N&Fd?37v5r+l6_lDp(^k;lhfMtXoVZuXT=;68gFtPjf&Xjut|KfZsQN3wW2IB zHrp7Ow2zr-tZmQCo_a${y+PsMuY!-Sk9VKG{`ItTT|v~6{~;%5PoI?NQ~8jy`9v_= z$1jz}Y=KL8lcL;@NhHi*Z0~cNditWlJew(QA4NP5cf8wZ!gc$k$P^~NRfa!OKN)N) z{VmwcYt(Y_sHPd$wBokPLWXJZILaC5|qoKK+hUJOw+Rit_TT@RB{Ub-k$Kg2Xn1UBylPLJ7|uPYSgE ziYS<8(WB+JCUAmHssR7IFUbLpRVrq;oK8RSNU4c!_~MbnZ8}Bb&Q{0ChLr-H%_d&< zj695!tvXikWiwczl`9auQy@Vh_0lsFx$lh%thWsr4j(xsc!a%sJw5w9mF1k5b?%)crcAl+dgpxBmX$Pp6MQ4V}^9b3J)$f_Lrbh1ahibo*M~df-*@qA=bSUcrle z_x@@*d?}i@;ODzjnJxG3-;eowbc4}DpV*hGU56JhYRDsZp6RLomKz6cI9HbPDS6Xx}niMMsHSpnsx8Mb#{(>^6TRE?w_P(A`-u6 zXG*1O^Z%FfuU4Nf-y44~=HLDBeEYZ=`{VzH{rme%GlCgPd=gAqFIGtRpSm*puBxSU)TKS&ElyEE=^7_3fO;GI$z9aPxbOTju)G?7&fJ@y||Y7ZrhLFR|_;|E;7^Dy7$o9RiBM| z!#^K=)9Us7=*F0u<+F2LIP~rwKc#PA#?76tL>rZ!Y+51{2dfCY+`BNtaPb{3a z-2C!_k5kR70%vUQnc5k8Xqs+E*4oVnIb3_&MEU%}GkN(H-k*KaaHcF(-N<-)e{RB` z@cEfjPxC5$);fQVS?!p+$UptH8;hPF*{HPlW}o4b1)*m)|K4gLKR4C-nES;`ZH57l zuRV&-JnJ9m7I@7$z*0-wCFpU%#qX&K>+XE}>X57v7dLI=3=z5JjpF}J%#y9wnau9B z-C)8OeXhTtF~OudMd)hQrn7oiI_|v{@v8mCd1JEIZfAaVp*SySl?Vc5pz*R)G4hX zu58`SnJ#jVi~Fu*tT|u!BG0fjC&DGvjJLwEFmvsRx@mI{OlVZJF7%ST#Qncged*E) z)i)?kIu;tp4qk2@nVkJCl)&kAJ%f&yc_c~_nq9?vaICZ z*P9nit-3z4g*ZmU$Kt5~aa`-xNTi?4SUhNRDLu+7}!Z{pcH;YF#g^@>|zO7qLA=WOjLxg(tE zmbL3=Yo?i3t#tVVnf)Q=fqQ3F|7g7xwsZf*kO{jOB@)N0YkOW+&JRD3+tyMl(0zOB-s30s`(EGtCvmgr#tGfO=6B~#Q{SFx zdQj)=_U_s34`!@-ZNH?iuUdbp?yU>eMsA>ZojhZ4yWkf0ubYo6c+2NXP1bq;@OX~S ziT78QCRVTAv|85hwI9nH-`&2S7Mv^8mVWq2x_`ObubVaUALeLuEzPyNt|h%SlzQrFn`5W-^%}*F$Mb1LkEsbZ_$eCiZH?xebas3CID*yPW8uB+eeM?e5w}f2V`^xL3qZt6~|uf>6|6C zY@6j1Ubj>8T-auF&H1V{$BZeqL!^0i)$1trz0Vwf?0qFK;u9d+vMVAn?5&o|q^P|r zcTO-*yz(f|xMFL`!TaC6R&5rryBV?JrcXt^)Q5vxCHK7dS-+Q|cKs>tC)?JuJ6$cU z3^kp;d_`zX<;1x`#i<$xXXIXcc5hqNHYJq}of~$F3Ea6+bTs_=frq>~5ms}UA{<#? z=rSI9e^q2bLenY*lQyo+t4upou8Bxede5|`-uLov_u1@MqG6MH&E^X4YYWNEeN&scPIqfA?}ZoZ+b1tQ z^y<5mZrjI>7gHpUmGj9wOgw+(Vegt%kuxS#{!=k5-xl+4hTAunrbXAjt?IDVstvUW z+&W>V1F!RSAqS)Rjt4jrT&^)JUUvLm!@)ZrMC*c1L?8a+@hZ`F_Ofibe@xTU%Zh)W z&{q2@#`aoeh5I~%yd~R0kKUi27^)h4g{{}~YQg3=oJ&4R1WT^$KQ`%1 ztaI}hssB6XTX(p2&hB^1eR4IFs z%G!HE2nc8^3SR@|;UcGdL%9G&?${k)TSX6AjmyGtrAY4-a&g-gEOC^_rn zXS=m8q&RRw!RJE`OSf?GP58d-u0z`HO~Nm?o<1Iy^>4NN;?N0^QoUjNuaEex%6j+9 zb&bH32LakQ4wh@0UU0fMnJvob_SCs9%&Th_u$_v}Ho4H^zwEN}=b(`8+~3FE%9iSG ziBLVg^m(}D^mRYC{~`WB`oT-9}Zc_-r5m9*y%-e3G7b5dlh zV_Jt@-a5-yCUT2Ql9pYbvGnt*U4~~?P2*>8J{5X3W%ib?H43!{xUW<^GT=2`)9LIV z;{R*oo*jpa=B=#?(KBpzf8?gNZB6Wq&CPq&gUgm|TgxaU{H?I*+3Nc5GxDCEWR+UF zW)GX>{=C5OzQf-CQ_f!5w!`^t+se@MfA1#E))PN^?VgN5{OVhC&OKb)_bL46hTgxc zo#K}MT+6oUhJ@GXL#n$2~F4cesRovWoq;-<&){9m04{|xHBGc>}E2b zyWU$slT*KWYQx%h%@3QSTJ&F=x18(Y-VqkN^xC~&>vvjY9TF}RRAC6I4T$!=uKh(^mOv*@_$Go{H*B=N>ly$-A{B$y`Dy_vyVp zrvo$XGR|+f6h2>avFU%VfA_2!x>CAsDZFC&bLUOo0-wh(InFp2napjdoGy2fQ9-$} z<=Z+N!v^W?Hu{FA7gmZ^9~ zf5cR-hDYme8Rt*F{h?sXnRk(XAwiPQH&}Wah-AL_$yWQZXrt~MW7};W8_r*PURl%} zeYR`G*OluMQ~1JEE%K*nJf1FcXjZ;0n^*QPfvWsz{H@z`>?Ym~m$;dxU-vDl_G@nV zD!Bzse>(0xxcITW_R(S9(BBSvYtLQlygB>dH9>_nN=ke4QnFrGsAkUHH(Pu%r)g~R zvD^a(9J%-ZPP*5zO?TN%F&@Vd;oav0CcoaVoG^dZ`wq300#>=-H?DrM(=TNC!%qhb zoxX}Scx|u!yXA-M>MkLk(6^5oOAi$l>~ZIDzWR4YOBxM(fg5c1wQo6ANEG>)aJ!(Xd-R zlv(KZlvyr&WAp+x{>YD;ddh6dMs1#Z$xe(v7qJ~bW8wYq;j{qF-GNThHTknLx^rVW zU94UvrfM(qdT`P2-8`2iGi0<(POtf8#P)o~iSE=JlB(s5XN&BvukhJ?0Q^mA`{>$={m-SKR%c2o|Mq>^sx@nV|KH}9^S@ifUgWp=ICY;)#moqLX&&d-~)XvRlrm3`5x?+2GX zO+DEBD{)d;lD6KjeL6>{-rgsdvF6C>)0+e*A4*o-eUUf%@?AZyG|!g0dwMyyGrRIx zPE7uN?<@1{+|21MvivTW51K3snh|h%x8$x3%~F!po7$vahL}1hN&3nxtljalCT!C~ zeb2y~Z4BJK@-++(|8q%s?7ih>c~DL8q*Y*G#~%HoEudoEjZ?cu=c@4jUm|^Z*B?n9 zuM!K`{w^jh@5kRo3IF9jetW;%0K>G|F_t9wq0&vf8;w)Ke>^VfKu-}e7j?Eku-Kem+7>)Gno&v|J|_l)<(<}Cm7 z)%1RT_f@sim5FI5FMZ#=W=`g``)aR`?pKMO-`^i}!De@IYS`4~A{(z6v()!hd|rI; z$(hisnH5rrLDv74Jy>@mZS~4YA)T3;_e*{M&P)5F{x62**y+{BV$T+LblOTiz4>!q z^bekphkAK=Gwv<@-gDadE$i~2^E0M}PHIsOUYTcZ!Bn~>b@%_fw`TO-TK7F;_O|rY z!&iECUe1~PsZ;4{2*1N3bDlf$pID8Ue#Mr(fA9NhdB+6#RTo1ZoeQ~k?Edmswx8>EE%=@qJnh1?qsuq0)>1yb>B)Jy+g@qLA0IT#e7`C)nMX3x{Jq|NsYbg`2kWNkPCr??j4!`~JE8gbl!K=_ zwT`Xo7Q3*a@JjfLUDE}1t|++p?`7%NZ8+Jfam?oF`pq)}@{c?%xRA`1l9`HtyI+brV=^K&tLGELL8zE#ROCe6`c-`zW93yr1B z+BTnRR>)m;>dF@H2NI8-p0V|b{c$kx^0WnpQ?^>mb-kPNchip8<(fNFcYXNiYEXHx zbt3=!vLFFY*?5j0V!1mQ4(0C={>NlF&+f)l{>{^?P3K;ie&OSvhu>U-8LckPshE2( ztGjZ;^jRB^^(y7shf6==l}~!xVAs;G>-zQR#bbvY`k7x%a(J^MDI~r!N6Y!=0fjK)Kk8j-e_`OM>xM5O9B=;GKLkdw|9jkkEFEJ)^%AA#Ixyljrev!0h zR-24kEU6f<}ymTO2%BvTf&{M7reRcM&Ogx<)zZ61MaCU z)pP8WIeLGu>&+wkisUEk;1T^ZW73s7RoOcIdo#KF0qJC60a zR0U5eS3k8o_|wz>kHpLSk2t5fPmBIC@hNxiSCcpM|4l6sdb_#5+_TU;MgE++x_bKZ z=jqHJHm$Wd>HbVZFJ;kl(JxJ5iURG1_z+?B{+h3pb`5c;b#QxEw#y!)P{}%{vzMB5;{jO=h zPN@bmuaV2l=Du`(+UM^*jQJP;P1Y0CJ{oY#`2YEx+kLLduhJ(sp-IN-AiqDI&P@g@ya0tzB%sZ`GSk_RgC-f4{|i-gWUlmu7DkzkXf) zv$*>8>(8%${&-VC^3%G!71}8WK6AAFdENNKea6oxIRV!nzgg>`9MkCbk7?!l`9Y1x zb})U+yZ*)G@bWuO!ZD3%wHF@q%rD}WeauyINBniu{YKuo54cJW&5(c1)H|=J(XWuz z>hE2V7d+t$jF0_cSzTnxJf}3dwV-G7`wKSP*=megSLpn>nsOxme}BW4Yk#+zZcviD z|Mjc1W8k@(3bCUbLL}avJ(=d={lR0JPW#vCWu;+N+fLaT&%GFb>dm9n^kq3O_x@X< zcZ9>UyY%jrlk@(`H-67tJI!)xah$=LNB{4dd#^kx886$u?CAZNzr8J{ee$7|tGMzv z=iJ+U{*(WI?ki6}@JCEf4xD~G_f^rFU1%lX(gM;@|M( zY@hw;xO|<*ewEc{jh?FhdRVnR;#{}(Ub*R1}xXU50Ul=^Ky z9RF_c>t;GvINS8s>TB0L%3J^bR*4tBDwh1&^6cc>TY?g2{@KUATKD%K>owaqzGM1* z)GsGc_7!hvei7T@*KgG#b;>KNHk@m_Wp%CD+5TzX_q$i8?s>v>)w@o3#pYQXkM8^8 zZLz~beB#^8%`vl1m|1IC+H}Z&oqzA_r`bA_L#<`{Bkq2zKlbOd!(ab(kI(y`Kh}IX z@NQSvtl6)otrx!d=D7Ot38{;zVX*(@o&R@0XH8SKyr7rB2;ZHfuw zq+RO{Ca>H3sNQSQuhqAOK3#s$n75-b+D&zh-_89Sz8}>82EmPy;j&65ndAe^=`MoDu zVLq~EC!23YUtaAcu;aDIv1dW^QzP_hFKtPfd?ch#{g<-;f#=IVad_REYq+E5t6KEu z8@oP9-VK*P?R_qiG>}a-)dwgzAE^nd;MYOwv^;E>I?Y%rQG`)x9{rP zd-bZxvgwAoE8NQkGM`tbipR?{hqzsDyVlDx#jH+9YrjRCg8puvEuZexKN1YhP`Tuh z<8<}Ri^UV3Y^jr2wcRXxRaDof*qF_BI+;esDc4l(3xs0~7O%aw`08qt(4)yuXY~H) zd)o7rO~>R{KzB%TMzBd|*Rot)wzWkaEZtvqe?53Eb46j!SF_(vC5Mh#gsiGsw=g*P z?Uh(|gMf7ZOE*`Ai|4YZ&tBgDVP5i}sQQMvTXeO~`|Gck2kn{|Y_&r~?(1u{su^dcB>#0rTufG!JH`2r?wszq^0!HSvc1=d6-p^C`YADjM(^6C#E#8W%HtINzUrA! zpG{oqf6=)TG9`_Rd*xEr%PZ}5IAeb-RLI`&N7ftn1o^}aYw!PjH~LNAe|$gjFN+2H zqZ`*}giL$0t$cCj!C&vh+(OycC9M{`wW{-D*gCBzvz4+|H>rQRld;x*b~m%k%hfA* zz2{pT*%+~7-i5$990!7(x?W9t{b5Sqlg>R!mP?jYYU#W2op)ZoIB$hb(%R{fRu(^- z4?gAaJ;hbV&Q^H0u<`5CI{|x=gZHd_d4Jtb_PWZX6ZOJ#7tHbR+MjB=ddaW;&{_94 z?H95;x!e24r{=%5;rGukUr;P^|H)JL^9EKIxFauXpDHf4TRw&9=<(1)+nu(yU;23R z<;|Z5bXXqFJg_2j-{;-yH%wf&!SGIFsa8%(_zhpH`LXKH)0e9spZqby;>Gp6xa-pM z`V2gB#9v8qSZ1k;#fuA-G}t&bZ*%^}$$GZJZ|B2Ixs}g~MMUTLXD+rb_~gCfk9uMB z#+8wgd4iRly9A6Ft`sNhSnZi?+xjh9Q*J@pbqRh0zAL=^|6OBEl>}z)ZJNGUAlm7^ zPTp+s34cyK*#DpTeTPZNL1opG^L|wDPdcTyCfifEIPcf{bn(|us%FONhOO+mJ=Okq zV2{H2xI+Jh<*%O}ex0-TtoZfaxzohMZ;JXKoqW1P*4Xx1w)C+tXWv?#zP$gw?zYU0 zo@ttoOAmk8esr^Zs<@u!|3mFus|DT%+ue$Yul?~{PxIZkAeLgA8fJ^D%#8cd9^-YeTF7f<=6wE`amPf;F6>4Gm-6fHR;tz$Q+B`qWu<#`qt4M3{kPRht+Lgv zran0-Es2k2_I8!sG06Qo=iuGt*LCLq_@;JKcYE5!Bj>e`%v@o&=RslHRrjzN{;nS? zn(L2-*L++5K)Sdoad|`h;R3BUpGzm5=Kr+Bspd(_j@gBJvUyKaOaIjx{xKRk2(YLS}rKl58L`>*@+rq26%b-}sC>*6B$&-z?Bvv|`?_u3B&&oNeU z*zuI!X>#~i_G9<_lRv-p+1J1CX(8*8 zV>>#+-u$b5ae4pVW%A*(>+Y=oS36^AeX*|n%58s^#Q*)B@a2BoW%=e}{mpyLzPw-m z@V_m?>_WNI_FI03=YJQz@GfnC?u+{c-M7MRO}<>t%J{k|^nX>MwdmiSpLR??cY2<_ z{KbFmdjB-D4@CB|_0&ie%(zoO+p8chkm=;Xx9kVDw|D;AzKr$JvFYL5ZgIL5HR%Nx zn$*{@);PaEa`}6IE%Twr)Bm(HKGf7cxMC5@sTarZt$VQH^Jm|zgAsAs>mvRhxh^X6 ztzn<9>Wq*n4w8S5+!nQoGzD15CcSyFI8($}C@Uv6AiZn%FdPg>^B$9dDN=7d~v zoVh<UJMK0w4qv|19xSP|WF5Cf<_kHd-KP?#PiWS&(T%lO{h}%NpSo}D;p8n3 zFBsayrdq6@Y0jazd|%$dKTg|cOgMYqdS$a-&C%-c=3So6{*rg*pSULCC3%kT)Q8Zi zj4>-^CB-iWPVQcjd1cr92j=apPlU7I2UZ4Vr`&OI_f_{i_|5K(wCz(i`PJ!9x0yf6 zYyYLcOgcZT!)&`@Hj}}JFh!od2Oc`iIXbH&!F1s!rzj_8IZsINdQ`h`*-_L}k zEoQAJ9{rc$XM3KWe!TfskiDOSBVTP%3k?uSC=$^!A<%T2`! zetO)f zD5h4_jj^vJ!&K|Q##C^ck8J`z*12%;>OW<_8|IK6j9^W62F3i)q&a-o8K+Rt?p0u z*eCe^;q~ounWbx07M(f2{PxkVPd|M*x~=wGzOsFsIlq#x>%ipd$-9;_aXy(@tgPGr zy-8iYG`Xm{F*!Wp@G3PuP;HD<9UH?e$EH{?wjYzIb-#ynA|F zVQP=sePc5+wm)^AdeXLDp+T}>*5lnP`xo1P|2NCd!C3CdKHHtQbvCE?#m?Qbc~ZK} z`__$6HbduKA3#tmp|x8Gf3*Gqz~9*;Wbv(46H$GBt|3-kb-I8tQH1ci$WO$+b>%L(3Ic z!>9RMYp2PHo~+sW;CbR7$)1;QldSii-sJ!5{n4z+Ph-yLM80~jvQkre>Ey4E;<<_^ zrI?Kla0yF9#Y)$g0;Sl%8Y%@&4cc(|P}Y z{e1tqy<6YWUhLjyFZC&_w7Z@zyfgi+QO-Ixk-hu&SKCM2mA~}L&1<1s?GML@yH{(| z_Wf~Nd+xFFGvnQX#kMn!NBi-yl^g76IM_Q?tM~VZW|JMeZA_W({?MFxXTqT;Hg+?< zs+s4lV{ezY>6MZ7d6!T$?WFG%E#F@snhkc^Z#FZ&Z>QRQ`@e#D<~sJ}$`)sI`OCyN z?M_}AaJ=@1<1N|MBA?&NAAk4ewEC$JeY3ThOhx2*-X~OC^PCv4VzS*I1)leZA9ery zq+}(L;*=M^y3TxgK1 z=8sn;=YRColr`{rKc!nW<`M7yP=3)he|ecr3vZmaxe>qSZ>Ij#g&&VdOsmuSaN2&y z+t#c{3DxYkySLiD-C$&*Cwcf%Dr?rj=%K=p5DpFHk2eb z#{WB*s~;lFxAEe^Z+zRtH`%^DZDev!>hPu6taU%9`9(t9IpbxkUq3wkw&L5~RMu_Z?htKg)G}F?!{7RPwa?d0vAw%lQu#!iN+i?g zwf{cfKd)l>nfdtD34a>3&E)k%lK~>bZc~zxN6?CYTvo& z#(H+CgU09nzKc%OdA#-a?1Vp0W-+9)@9Lgx8*Mausq4Y4s;DLZul&8;-W_ir7qf3) zg8aGy+dJ*u+r`(fubO>Zb9Rn;PS~$a9^2zb#;jWAe_mbhM8Veit2VPL zM(CEbZ610{-Y*sY z*2!%!WjFKP;LT51Ebbc3*lV&}SL48{IYlMsPK$~rs6GC!=DKl5?DCg#U(Va2?$+hXpC)Lbv;k8M}xJlL&2 zciGLa|CemGJ=6b($yw(h=K(p5u%)a&W^UiUTm5+#m(gSWy7$du6NDdZIk&C5cFST_ z_Jc3e3~yg%I;O09pg(`wn{<@|71oN}PdTU0RP<}NNOdaCQ~F$|HdQpzG4E;LdAl2- zOIUwAeYx+Ovy7)>+-VcdZx<%sXlh#Xpl-5bDj+h(r*r@cM@>$g(5 z$*!rubvVa<+KVnH!`r97oDdaFIyV2$EoN;6wIdvR{%v7T3e8lkd$x9k?S|r1)*U;aR2L#|M&j- zna;r7`t9Ghe`odA-}}G#`}OYng74kOCRhB9*k^q%$btFuB!;H_6|? zJ?pslk^e>4_K5+mBdJIPY9t>oaH1-~*46u6bzQ;zZ=FEAh>bb9PSd zDLM7BNt6BCL=&dKKP``iKWux|wbEhz(rlN<7TtCWOZr~*6vxg_=yof5Hu?Ic+*Q`+ zOfQE=m&`COUm8>wJ-6WLiMV-gDKnHmtlA{I%PNtFrJ{2;%b`EL_eD#-ziQdt_}yrG zD|_Ycdl8}S8}v>+;QBcAh__0N+{67#?;f>!sJCEmkN3jFc?KzypL$*8OjkH?`i^SD zqx-Mde4kwSJ!|G7iB}tfZb`1;p2v0DU8IY*XzJ#L@6w#MZeGwKIf1Wo@!Vrp4>dRL z^=Z7JaNXSgzu8us^$8DTe1DyNdR~10!yo(V>Oa1E<@D@@ZMIAOF|H@Ye6MT&e0cV0 zfA#g-Hon#86Z;H)$4dU~>oZ|KT6i~6OX8T)s|IZc_epIVC;oYJbitv2i)-(9X6)Wz z7H@bg%E$4N+M-kuF|T>5SsiIJH%(OCJ2$kT+2`;!)xYPuSAJT!C?#r9Tg5a@W}Q%t z$fRjpq6dSP<|M6LcPAhyWP)Oyl|d5oPQEwNnYVk(c$I=y{*W`_S-nH-?4{i6ndvjl zj%?jy>2-FS%dro-!PSzt{kBed_0qMiCzm~W%cfg9rdYjpbu-Gllwhkeq5PL!!tD2} zRtX%;yWf*A<=V3*woJ2IGYi+GIceU$@5npJL{mC)()ph?2OQTOoH_69`@5Z+em#tR zwN$)j&!Z-V@;@vqnV&IDp(^{X*%5I7ghw^}4@*^HzKrY_8NIf@&69W$5IW$1iXGiD8UOOcRL z+Q+xb_v)Q#8#7K#QJl8r>Z?OZ6=tE!Ya3g$npZY)W!{=z5fJUOk6Uw!@ng1{?w!wH z@l{P*v%X9qYb`J5%vaeu5w%x6B&U1(`Zu$2zG{iU>^s%3)W)DrWc1`7stJ<G+y+U-;IiGz#H;+uJVhw8L z{m8S{LgkT-@3YfKt(K-`J!D%El_|YLkL#*miw$pD!(z|tXZo#sE^T_;k(g%_%4{rA zH+h0w3vWS-r*y}qye^9wj9q7?m4v#BDmDo)-#K(x=x5PJF6jpnF>+12%R(jxN^i0{ zSFx_yjXg>k*EJ`t7WLdHd~F(wNxk;;{VE^iV@mw$Yv4%G#Hec62!(;@iO$qY^&R>`dtQrtAD)YP@q~o*UWD zD>uLEde=heS>J0t4gR8<10Lsi-Oc?9n!lV*JE(CXw4B*a<^7S`4KEJc{4<(y-2aE) zf)sbhy-eAL*97HORZsl$J#En^(b%YILdHIU%d(%jZ?$J-JbdQWw`D16znpFO^;9DN z$!z3LY4zFh?B47t%muo;&PpGduwlkwnZ$49ocDj6$nOk0V|v5lS!xx_dy|>v;jaZ` zPs%>w*sMM`v1(%B8tL>IV(W6mcPTFBlQ}M(;t-_%#=qu*;Fj!aQQ<2sKe~F@#V?s& zj7eH|a>|S=+P3;eP5BwE;dTkGnbo3K3@*FPHm-<1);mqnooDmom9u6B`jy9CFxbB= zbKO3#i;aF^jk&9g4g{=mTeZVMX337lYp!Y)OwjYW<1xMHLa9Ns%51iX-mSiQ%d@}f zYC7^trK}LX7O=+6Z_(OwQ8lwGOpk@Qm>!5bD6lQV!Gt3mE8iG zvR?%3UU20Ks;F(7e&K}4>;MLSNB_)2f$I}v4B8jZy|Rk^_S3aV(MPYZKD6)TC;usG z8HbZ@tXiVDsJm$`d$CpU=0ro6&>)t;xFviYMG-22^F$m&A@}0htF^`?ug;nyfgrSMX9lae%kx4%$=1;qxko<$q{M5nj`BP4>)6z+aKKAsm z{vI!vQ(t{qMIAS1wkk6%6MU!5Y;(egh4aWe_2~yct>|P7m_CzH>_{@ZwM-z5SP-e z*Av|FUQIXV)VxdVJ&$kSh@Te7^78Ao{@jUr&6;jm1)aX@kJaVyykFoHo+LZzdevf< zh&C^W6FbCKoKVbfcjNpq>Bx4@r8loNx_`(wi2o?Pmuu&W32S<8NUYX5)#zZQeR-nE z1jRPBMBBZoK{;Rd#$TFM(%>92_sQ3mQVD-8b5`*yL4guSMV_uxkd-^}n?>9-WVYk$ z>krjVu06rdbMuwK?80d&aYbsT%eb;8WNdcKv^lhL7q8@#>ju8pJ*Kd8^QBFQyUf^h zOvzkMzF&)N9%-^Wj9*UR$;cSQ0szLJ&huPXh@c_5|X;v+rDvIARK zj=SnU)%=@s+MsfGnC$NMRlL2Od$)i7`cCF_pNadeZ+s;&2lg(GyIbPv6t3jGu`NS7 z<8*jSm8D_h_MSNTuQd-B?a)x?iS^4l0K>-%xiJ92Ng&VOgmYfNn>SG6zv^NV`AYGwS7L%J)CA`V=={cv9Q zjjHzN9=1`pPV6WVTc94B^w^16=IbBE-(D^|Z|eQ?^%rjlf4#F#{r`&a-Aj*cylZ`G z$*Dlb{+(NDS>kh6CG)SJzRlX|^M>++h2>#;muJYFuUIwtT486`r#kyrSAFhThCNku z30f9faytKNt=y&jCavsTRq6S5L9bM`&b4nev9fgXj=%Qo=j5_)QJ00n7eqYYwm5Dr z|I8!JdO=4@a~zfDuKVK4X*TQ1{EgBTl^st0(GSBcs{2w;Rf$z*O+8pr`y|Iy?^%az z?A}Lrt%6nwU9{WeS0fvBdCw-Bld4bI5(Lu^Kgt%lylq~Ysn2S@a#QysZ7Z)oTz5oS z{wRaaqZv0YtciB?zP)Ikz?2n@i?2s%H!hFg@|)kx=#|CVW$&*1j=mzT!f@@@?`itI z56#@3^w~H1Pj8>cD{JGP@s5`@N?pY8$*jzo&K)(5=lBwo`7J)RPS14LUOCG&(2lC0NzVxWTJ9BeEt1tJn=tH{{8+te0uoa@cjElOk!T|U&X%9m;e9e+u7GaH}0og nht`LGd$#*(o4>Ys&2*21fAuGupRujFz{CImh!X`6 diff --git a/integrations/migration-test/gitea-v1.6.4.postgres.sql.gz b/integrations/migration-test/gitea-v1.6.4.postgres.sql.gz index 8db9022d1c0f7ca4e0d860edcbedea4ba4ec2969..bd66f6ba4f7b143bf25b2bc8ed76bebed25c8dad 100644 GIT binary patch literal 17517 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ν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 diff --git a/integrations/migration-test/gitea-v1.7.0.postgres.sql.gz b/integrations/migration-test/gitea-v1.7.0.postgres.sql.gz index ed66d41b89d1c0c427f1d5f98c33d01f2d0266db..e4716c6b439480ca5238f6ac98c149b1c6a7bee6 100644 GIT binary patch literal 17831 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 W)c1VV9GnmTv+rg0wshBFW&i+Gx)wG7 literal 17659 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 Soyha~KV#aVmaK3#W(ENC0?D%g 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 {