From 4b6471c957b12eec723472b05c5a7173834e3683 Mon Sep 17 00:00:00 2001 From: David Robertson Date: Fri, 3 Feb 2023 17:08:00 +0000 Subject: [PATCH 01/11] Make it easier to use DataGrip w/ Synapse's schema --- pyproject.toml | 5 +++- synapse/storage/schema/latest_dump/README.md | 28 ++++++++++++++++++ synapse/storage/schema/latest_dump/common.sql | 1 + .../latest_dump/datagrip-aware-of-schema.png | Bin 0 -> 31017 bytes synapse/storage/schema/latest_dump/main.sql | 1 + .../schema/latest_dump/schema_version.sql | 1 + synapse/storage/schema/latest_dump/state.sql | 1 + 7 files changed, 36 insertions(+), 1 deletion(-) create mode 100644 synapse/storage/schema/latest_dump/README.md create mode 120000 synapse/storage/schema/latest_dump/common.sql create mode 100644 synapse/storage/schema/latest_dump/datagrip-aware-of-schema.png create mode 120000 synapse/storage/schema/latest_dump/main.sql create mode 120000 synapse/storage/schema/latest_dump/schema_version.sql create mode 120000 synapse/storage/schema/latest_dump/state.sql diff --git a/pyproject.toml b/pyproject.toml index 8f7ced99a2ca..4e57f68d98ce 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -124,7 +124,10 @@ include = [ { path = "rust/src/**", format = "sdist" }, ] exclude = [ - { path = "synapse/*.so", format = "sdist"} + { path = "synapse/*.so", format = "sdist" }, + # This contains dev-only symlinks to the latest schema dumps. We don't want people + # to use it when installing. + { path = "synapse/storage/schema/latest_schema" }, ] build = "build_rust.py" diff --git a/synapse/storage/schema/latest_dump/README.md b/synapse/storage/schema/latest_dump/README.md new file mode 100644 index 000000000000..dc24e5562df6 --- /dev/null +++ b/synapse/storage/schema/latest_dump/README.md @@ -0,0 +1,28 @@ +# Schema symlinks + +This directory contains symlinks to the latest dump of the postgres full schema. This is useful to have, as it allows IDEs to understand our schema and provide autocomplete, linters, inspections, etc. + +I (dmr) use the DataGrip functionality in IntelliJ's paid-for products. It seems to only consider files called `*.sql` when defining a schema from DDL; `*.sql.postgres` wasn't detected for me. + +## Example +![](datagrip-aware-of-schema.png) + +## Caveats + +- Doesn't include temporary tables created ad-hoc by Synapse. +- Postgres only. IDEs will likely be confused by SQLite-specific queries. +- Will not include migrations created after the latest schema dump. +- Symlinks might confuse checkouts on Windows systems. + +## Instructions + +### Jetbrains IDEs with DataGrip plugin + +- View -> Tool Windows -> Database +- `+` Icon -> DDL Data Source +- Pick a name, e.g. `Synapse schema dump` +- Under sources, click `+`. +- Add an entry with Path pointing to this directory, and dialect set to PostgreSQL. +- OK, and OK. +- IDE should now be aware of the schema. +- Try control-clicking on a table name in a bit of SQL e.g. in `_get_forgotten_rooms_for_user_txn`. \ No newline at end of file diff --git a/synapse/storage/schema/latest_dump/common.sql b/synapse/storage/schema/latest_dump/common.sql new file mode 120000 index 000000000000..3afd686b9cb1 --- /dev/null +++ b/synapse/storage/schema/latest_dump/common.sql @@ -0,0 +1 @@ +../common/full_schemas/72/full.sql.postgres \ No newline at end of file diff --git a/synapse/storage/schema/latest_dump/datagrip-aware-of-schema.png b/synapse/storage/schema/latest_dump/datagrip-aware-of-schema.png new file mode 100644 index 0000000000000000000000000000000000000000..2bbc641126b68ca0ada6b6f09eb4572fec735e91 GIT binary patch literal 31017 zcma&NWk6e9(>7YASaC^lcM0xLio3f8cXur%cz{CD;>FzwPH}fD6e;fRenRi(dF^|@ zbIz}1XRYkL*37J#Yv!6ArYJA*9uW`m#fum3r6fg_U%YrV_~OM&N%&W=Uug3v%wZp| zoj*yb!o$P=UQzf1yZqoHrs<+$Z|33-ax#5kZf9?6%IIwDWNK>XY+>(m^tw$DHi_p$jzrbc*7SwAlO+j|jYQnkh=di$%0|M%$;-jR%fd<`A*Y(+ktX`$g-5WI zsIaQX{K3PP3ck+r5yGet+g9pb9fhJhJxNv7S5f&-p(GR(Xag@}SbiDC_VbtrVgiui z2F+sgtzs0Lm zp*-_3`tWU7=gLBp+@jkp2^##HR{;e%s&s7|E05$P$bYXt13v>l{vCP=dI9?U_bd1% z_~omBkC{h|aNp?$3@0;5{xxeGKcZ*Ve5+qMNoYBlGH-K=yM;-_4iOCwtw)a%Ik;j# ziPmtTDUqbe&Eop}$X9RYK3rVEQ=H&5;8;d3eI{yTWF%^nj`ZR3OloaYN88#IVR^^r zC~tem3JO(rz#TmjpWQ2)&NxzgGAFTAUgGb1jGQ4AJeZtLP`lUh=VuCfLDKI=dtRJF8X*B5zOq(6E8d3tO^r_il01)3;iU4}ou+mup~PRpXV&vplY;ad)YK*6*s3F@#@! z(J^e8Q62*dJC?Q-mbSFa*-n^HvM^~!iu)$dTU7E1*vZ86hoLWaj%@hEZmH!n6}ht4 z)^YH>+7ctc9cGxC!_)cwTZey>&eZ7>_$-&3Qa`3tjrw9EGCj|U<1NuN%^P>!QRM*RTt@wnV8BQ{`?)gwgR#QKkGL3DA)o}0K;-cL&yX;0$-TBPW>uev6dwO9_8 z0U@EHpxoK)6>6Z*C|RqnnH65jIU;AExN(JO_dFdXv#vy{wvDZoot@>uwvD|l)zms2 zb&7aiOFU8(ak%a_1>>K*ypoF>vP6@HjKo>yJ)_e@jR5r7Q#0C$DPZ(Z$;keG z-;06*?yTN<`hb zXzafU?h~4JrKrZCF;4{vj6*=+KA22?z*FA__aF)qDhzAUo5Kl;13E)Dyt*|<*VO!t zJA{=CHYS&vjY ze|ItLrwO04+;P7FzR2W+QWi~Jxvr0<#}1yd*?C=&ZjK?C{3}kSd`2!ax zCuY{G=4?>zh4k}>zv9{f0u3F)Ip)|Inp(S4N6GP*RK2dRxkw;qy(9A z8Da$)D|RtJ#h}XWGHHeTT^2}ArkF+6nNOh)O}PeSOD5ibfG8#uV-Fxs({YVs45-vA zPulfdfM289>CJxpR{eUO!Hz7g9Y=2{w#ylreDji&2#j9FFOr}Gx!{?(JAnfW%P>_M z=!KxyrG?c#ym<-oX*u4)XtKu^&+Ey;mhfRB+eA;pCW9mqZ$bf(>4X;!Regepct27ywkR!EnJZf3an@)0_K< zNl!4Go-l(0mD1B*Yp6jX7v){qb?&>ng*yMl3N@()7(VR-1 zWUQ?tdVdVdAW?zhez`3j(lng!F_W%^*b8s#2F;8w$d?of+RtIeRu`8>cIjVTsz>Ka zJ63DOMsOSx9x!UmPV_dvKJXHx9i=Cwl(4q7vAb*}blv?yC((75Yu7Y!=E`ZWL& zElfVpV)SYzcH)ph^J<28QZoaZTn?MPw|1I=ayja z0pQK|F%?LiU)EoWWQRn%ckq5*0Syff200c_jp2Eae;QJ4rD&HMVsGLzQWiiz%If_kQpfRBLx9h|^^{pZgCA4y;# z{r?lpkiZu6cRBz2{EinL@QnWhz~ECj?&yV*fDNop(T-U5_d|Cn!%ooC492%9ok z{IgG^P9JKZZhG5a2B@A=M1Fr+rj^Eij96kO9e5Hym>%`>U)+9}c-{m04oU4)-l!3V zy%ZA+n+)OSz67JI0!j!}igRfwW7-YJc53V|rO8Mj1`y!kc;9R~6$P#~b6agH-TiE{ z!881VSraBGb3(d!^7s72cEy~HyuD6DFNl^rn5}@jV_$g<3MeYEc23BfIAqy?gHnAv zY%<=P6042Mo2jD;VPd{$))Qexv?@v8+%zliEWoJT!FBg&$rH7&YiiN=cJL`O&Q1>E z)iJjA_KxV)&6P!2<{tA9t5Z*#awj`yk1wV@wh-OwV}GBXa2XYKiKEdX4Ib~<_}09K zcVTLk-FOC|Y))G8vm2WN*DsGf?1)fiGcayno3B zqyCjlj&S(uGh3hX4(qD#DW zS+B+ci`uC^jGe;V%SM8GDpD&4Z)00|C$h*Wgn@(7gjY$y&;NlgO7f zW5v+?!fGw^$ER>Y0y`LoUnunrf6AxYQjU)R)eR~B8Y)Ek7NYk;0W01(&A5j?YpNr0 zH~GBFV=JP>ld6nHz&F_GjW&>UT_g7pZ_S*NkhocxUq>&x6aR<>(HuOp0#>Sj*_AYD3 zuef7rshp$?dY&XDsv6pkO98gB;~smW)7^-Kc&W(NLek1|TRTshIk@8BziG+BF>?2h zJxeWOD|+fjaPVpk@LeAD4?xcVO>OPW1{DabNY$C)r&0_2>X*gwl_&h%l9n4apc*UqI=^qd&fotJ5fN^d4(NNYtkv~|~x7aij`0On`nPj7BoEDjwIvk;9V^y1S2 z7XWePF*4|wI|^eAefdevc7JZE>J0=R1ooyviWlVZDjZ&=n)qNd-pznuDo76foH)Xz zzacxvws;8m*W#zX$&A(~_5cSy37!Qpa)q-%G*4k0_)UQvz9*^nSUCf&Uu1S9gTM?? z&)UD>RAEstu^j-*P;C+Y1?%qAK_*rN+Kye_)5w)G#?al<2KGE%^V&JcoQ0+l$tLb! z(DJnQ7qocR{6Yu}Hl3}VA7oAHl4bs`Wn>q2ZZrHx!=t%p0gFl?fV|L!6Cb;kQcV`5 zr6(s0Cp}bN-4$Pk^HlL(Ob})pt)3frZ=?GS4SnKkVR-F*hG6BZ!F@|hTgQ~CT#ocV zu7Ir54;D(_FPzk0vB(i59p!T`d&IM;Jr<5|xp)kLh1F0y6BLjyz^PEXlHvBw6DLJ2 zorCVgSrEk-z~5N}4W5GlD8PZtV63%>;GY`$CIsD7l zacriKw9k9r2Ma5qb|xyEUw}(8dM57ibX4dcLk7L2=olhxZ9NVLrI}`yLKvZnvy?qP z!EH=K=by5hf))8lKOJb13FI}ey;+BVm-V4 zm$!3bj|DFS+hs?%YI*y*>oe`u&X4by{=o{{=GZJw!h*hTHH~s~q==vY7DfKETmnN3 zFJM>#Rz&$*EcsvY$j5)7mw^A}Z~uW_{sAT~@4z|mtlVM8frWo>b>7nTC)~+NR2MF; zOMw!PYFravfGYm$+c;Qd<}+}0*%PstApTYJkt~`TANzgA~pP2F3Ab0j&7%XgG zy6K=tUmir^lRYXtv_evJ6YCY>IyAIWY$z>1M?XJ-eB`~2RiRu)H^tJfj@fK~l8|pp z14uz!K{C^Sa_tq!r%5C~VO|Fr5erZ4d6VeOS^p>azyy0HWak$zM&7d4jvKjqEhNx+ z#tN~%$HbbQPnnYyQ2Odxi~fpd?wZ4yu&p#t zu;KH@{t;7I#+EUUfO8xZn9CtYl*XFeFKLJ{P{Ihq1#`k+6l(bFLhUX?cshR9IeCN-Z`pWpb_&as%5F0zVtZQKT7GkY@wzaZZ16fINp zHUk@Affp*uli>Vs;ZzicAG+TUM@^`DQFOq&F4FFaY~L%wvb}Po>5JSFRP=$6o_;nc z9yWYU(O;|Z`-BCjBZauM@Z+CwoeX43pH+##!wa9>HZfnfDY|?&8H-r@XctbFN&@*W zx%-j>ayBRZ_%eCIiolQ0^1ixHJPRi5=?Tgh*r1%mhVS^&;C=?GH7lha>x3>6^Cct# z`fZ<<_%A|%@REJMS+2Xy10zoD9EK=PL(gjJW>%l+n7iTByt8u zOEKXdYf}Ho?MrPL%l_>AxGwLk_i6plV9O{4@BJZgfSUWk0gS$j1TzH_zk*X@Hjtw3 zGJYZ|GZsmKsAUN`6q!jqMrxYcMQdc64X*Ms)F?|FfUw;QH*ckP^+D@c7>j-qryvt@n9 zH?Q;Qkg@@bC>>}~NN3*E#2<(*_gLr!Tm4t`2E@|rW{Nn8Of2dI?g&b7q>d77lT^(pVz%!3wtM>=VS1dTsf7wwYA;G0nD`Y;G2=GTECE(^!%K)lVG%Zm7|8ccu1Sh}0so&RT#tZ-70NGViAxCmJe{uH%u2|kxBSC61WE_koNFF; z7l%B|MMm3=%vsh_*;w^Dp%MT{&X*_xON>aSZ`1RWO7n6ZD@*@uqUVYd@3uq?10XHtFtG5IBWGbp&>hR*1!#Ad2|$|;BDCB zc!-Pb+WvS?d(&LlNN`B`7jr2GrWma)Gkw1$o?GLs<1nR<@BYIi#D|K7%S$>xFQ32p z??wXKs{0+6KmhQs9X)eB;Fr(F_P^T^7@fES{_!*B&r+g&2?gS3Q5inhTb@nuS!y2v ze@)@_GkNs9cjW(ZJ8tbW*1@8)vp@iP43=47>G06nd=N&SAK9gJ#^vNw8G^akJC83}b>1BVo}s0n3b1MC%#a z&XGl>?o0H(K@tBm{qQGdqAA*jYPIBY78}{Q?@rfQHzHa*T)KKgEsnQ7VQ%-s3u|6s z@Y?VH9-?b4coChzW)4F!BlV&;*5wjWbS(Ox0qI3rw6D}zE%h^<--`f9*JgLWy2F)d z4oQDAM8*56fj2aZdDdrv^ZK-k;LJC|InkOeBay*SCDOr%5_C*=x0w-{XkMAs|Ey0E zNJa<{Pp;1_tj%3vxC75gtN*3ZFGi&Cy%16e+R2S36g!#m*nfS?5H+0HcUBY)jy}9K zdApl={+A{n$Ep|WPSRdU5eAYbsDq~}*zR|x3g0jDgX%ag zDCdw{k+TPS6ra$+T-wRLeDct0CJTf@E55Ua{ZN}2*a+b`Gk}TL^e&<{W**Ce_1OU6 z*UZTvx*WIt!CuZ<$@es&q;4G^7Gim4w9!OJpdp3tEuLie!a`bQ$$)aU zR&hG%RjF`%yqTs!3W8mSFTnk@pf5SiyFr(+vSkZP#usL1ozeOZ-`+@BinXjI!jp^W zH3=3>h6fR(*DRPV0UCHf4oKcnI9>y>ng5oORW5Z#u6ov<`Z_9CmDYg)^$K~g&|;r= z{&Msg8K!vXwId}2-8PJwN(0nlV6XA#K|rY2M9X!xaaDE0K= zuT9?kp<4E2ysj+GwBH~KNSxSOS7r3+2EaiJt~?&I!ja^j-Q8=@eVn({go$P}f~QJk z?win+1~|+xtxpp>U;4o4WPbbz899;Ci$NNY`|Q0K*uq;VcD7am1V}0mDZ@}f*E2fXH5f)MVp;t)OSy>JA&!jq zaNu?UgOG8QSAdjq?QpZFC1LOjd{_NAll2w~wbw`$iEsXf3%@F@*f@rL zM}brP8*l8Xpr_6ttDBWo=Pu3sm%c~BkB8!J))hV=U2~}~mk?Q= zEs;Y?1eEAxVCdY}v=2_qVataNaFmXg^;ObMmX;m0EQ(u&lX~+q9cn)$BKr*G&r=iC z_?$U~j1t1LrvDl~^0nM(MxSm_c5kKNCUR9vwWdSo6qeOFDqF%}^oEXB?q+{yZCY(G zYyIKB9S4eO6S@|CLpy5d33#LNl?OAzUnTute9Qmof?l-$+dsn!%m4CKlK;bL{g)v6 zkMoO~Zyu`Jy@zkx>6h2AL_AgDQPh1t8L(Txzb2TQc-474m|GguH~|kP1)@L%1n_oC zFyJ#6{M4PnYIVFSet1}KpZ(rW2;WzD>zQnGyVb=~1y@bbpT#23(&B9{j!bKUe3CoV zZR*ESpL^#a%w1J2Z){|>c`|oD;iB%w`CRFI(epC6^JnZUYn@JG9*=5E_SR)a7t_c& zb-Fs8^YB)3!ivF{OB`4^!a0q%@llrv6k2CStup^f_c|yram)8quin4$>w%T*&Klrl z-5+s3wy#IoTgK5PeZ*!ADNkpd`aTVoJDnmb16NWR%oB3Hzm^V|u|6@sf*pa6w^K7S zB=+w$W0KfxW`WxwNYmvx|t_g&ZWuBW}E$Elv6_!S7Z9uIfc zB9QzPBCvMv6?{m1pC zFY4`4!9aDH`=CvFE;5c-U_!X2uHf?#u!@NmmzC||+78=`XEw@}suV`5(&<@^1+&Cv^{s8+;$zdjAmsO>QOO5$g(Of*Eh8bMc{?mB%|Mr##{eD&ZZ<{ph~b2urnV%UeLpEL*yNl%$+T?Mrn=JDAj712TleixQ|8|{h;E$l!WOx9GDU+h)Y6EkhR)h$!M1dlCj z{R=1;`sC`bozyyyM>-;)#iRQCyHkj7L2KXMjLq&GX!Ff+bEn{055>dX-YM>Yc?|4Y zD?L{n4vq)Eb-GuxEf(2~@PN+Up#lrsiyp3=9J?b46|Z*)1bH5fx2~fPHq2%U-A^-~Am3c~BJIxwccR^RU%Di1}qbtCry0s(TUR7=M~oufa^rF0G_^SY zv}I|>k}Mzl^&1&xo8Y9qbptIK$|HE-0v8@yv1O5!&){K5E|&dkdt_qEDN>{{8YR76 zmX-IbwaS}}`Vza9PI4J>0{Fnu3CkFmi`>`t#IYC~y?p_ySMp}M?FfxZ8oTv5=Vk>F z*x8+9qrYaOog-A3H7EQ;=GSO;?c&$bc+N<2qf$MZ> z=W4C_Z>U>pi9OZS9YDLG>Iy=0TWOOX0 z?Lc_-i;xaywea8~X|mxl8iYV@;v*d6eI{3&uqR_Me{SL{O3dWzG?Y1;>KButpJ%` zHmARW2=g=#PX+<4)A>CWMm0ER@@)(Px#+zIdN7HzYujOcIwtFVAMr@p_V~jQ8-`I( z8;S9X>0Ya3om-f^6=3c-rj)&VPTj^9hNydh{^<^TQ-Ez0Dq&+|% zdB&KG67>gTo>7vv5!kJ<=`j_vfBBG+bS2z!i~Uh=<-Q=AyzP#|zN? z{l9?E$HcGNp?;N_H}_3Y6cIY#Ct*IFU2jAaa}BAX?scz-KMsD%y+#lIi&9bMp_KVY zt`SxS+(+YH5B?LPWl*%R=%rnC_Q&h1#J#7Kk(#sYts2#bJGF*$tKOl%$f>0fB``aV zpp`RSO9k?}(I1*e(>PJOiaMz?Ue@`G27ycF2ZM-^&e$uz(9`A`l+H-b!B=~nh-0H% z6p$nCV8}ttH2|@c$t-=`Ty(*GXI+lj73)O}n z{U(i*mG&v6giulUUxv9dOWA-)V+h(f{7&;s5gXUV}$DWg59Hh+2FlRdtR{Kjp1gbF;S3SMB?NiPn?EecdBBxZFG@F<9ke13J(Li@h|6 z>#KOs;RAK4N!PAtK(cT%Ah0a;&`p9HqdP|-YmiOzNWqqg&;Kk9co3*_M#z(Du|QICP}%9BHu zwqN~omL~P+*SWmdXZJpVxp|Hk*)5>-x{bT&$zLe>@gU+9TSfZM%NRWi<{RedljGYb zSE$Vos)}}sZ)xVVkIYefPn}1uPiNmIUPk(hSW4^dw0Wy#UTg?c-CYawY5BZ-nLO?J zG#9q>bk%+Tp)T+*Dj&k%Nc1?<2Kwl7&lW!uEpIej1s zKJwCg6oAyD_1vV#jOuv56KR>fiq%Dg9gT`#r>tk&lie+-_}=9bAqx%b`jBH|z=Iwm z>Wl&x%94DvXCREdkc5eiDsi4SA(~6yf6ns(1hUlB!E#FwRb2Hv^$b~%S-l#kSKyg# zgXU&eT3>+sMz6c|W5;&>Nt@fIc#$2r&EvmQqt3d`;0=)7=jB)UdF*!YY>T9A<37qM z*lBHD54u}>3;S{A;XF0x`}}Sjefjs)!Oq>(Cc>cWTl8faWpy>(B)B8Wn_3tI{fp+F z!Svs09|_<7_q_f;^YteRaKIacBjK3eSUISTca0LHG#}8Wh{vLtQh}`-D}VWlF_F)i zkDs5v!U|XaT>Pz!k!+KGRP_I6=*52w{m*${1-HdJCcqr=T3S+LA`6kH0k^L&-oeNc z@JTjCuy|lIjVSO<&wf*OSBU@VouhrPmk=R183hq zlO0g4A93bD?w#DwPg}o~*qgN6zSA$ni&5Y-$$QaXUmgE$cXU+6U%4vc-McgeGk(6w z%NgB$d~8%I8$TP%xa{#@{|xIS?S#b|eKt2;zN+lHnY@YsAjt!eBNL5>Ug8(cM5%6F&q)&bRKk#(_Es}K+F&E;BC^)4N*fYURF~voOt-#*RvS~1F)4| zl?u@)EFTh#=b!xoqy&MMOIjaZfCJ1Vzh4&b&zmqI$uJHaE|jyIWPb#F6{IYt|Ej>Q)B9LY%`3At%XSWHm-Cewx_kBD)IOwHu zG2Jw3zlAc$_F}!_tUt%MEW6|ju|>$I;OxQ+y@Z$EHy<+^%CiazbN%YFKlVpCEZkU* z9zx9B2P{_KnI^_7gV-3N_-1ciqvpe5t#OQ#7arb)h1Ql<#!EZbVKur`q@LE5;Y=^PP^dFWXzt%9%Zon159s9n zJpN#Kr*4(owm9Yu!FCQT^4a&|4Y)(ctVLc6S|jBb@sc)330_?(CAa&b#0zC!aM!De zHx9h4Rr;+eBNg`4nAu^~Dej%TXq~hVWxP=Rkh5R!2GF!@9}}SVp_k(n8j@q8bag%Qc6^N4by|03B>QA94miWi>#;$3d|y`M;Uim4 zZBL{R+88j5SMLHRGt#+|R4tZ>nZ=9v(AF<=C;N&jJf zj{(Xls@V&SSM#}dq-q#aZet-x2WkeDm5%cD`lot37bM`P1JeaZ6l8}E`S+)(*}52w zQ&6h_SFOG`{E#Z2b<|$ui)36D73tzxI66AElhc*LA=ka=!Bg^cwCgo90ai*er-&GL zZ1}6@kOEj9`Be&O;wNSB%+lK{G_A+-O)SzjjbLhImhnL82Z4g~AMZ?QRgt3U=_i3$ z-K3{!u^SAuc=*#h6F+D&a>^Nq z)dQT*t`251Mq5}4P&NEnQ$_ehJj22UqBI0}iA1LO8^;-uRQ&zUPa8IF19Np6OXxc< zBc-lpl59-@(0-AT9SUq!22@pbq?0=u+P0B;Hz5T;9YN^X?rdCswW7LmOn<##&cIpx zmKbkyri&snGeKFsXWv57u+iF+d6voP<8eYS&QY!dSRzM7DP3MSks#Z#Rv^Tt2EOAL zUWp>6r(wTKaO6imw2Vu{_5nnqa$2$G^;Z$12|Y}Nlh72H+wt8+{PtyEGX@c%Dk*xK z9?cuB%1%r*z!e*o_+O!P5HI#Mk#umQ`rAvub>o6hxDtg*6I{i0Z| zd8SS9q0%vOpAOf(am%OoK=UW;@D=LlIDVj-0`R) zkgxEPowXj1HnCXz%PBf(ReHV0IHKbY2BT{{ZYvwV4iV7NCx4jv?KHu9497y#+B{NY zh<$q+ZL%2&Q7zI8xW0DxZ4hA_I`E3X0*Pbk%sj+zV17F^<$eeCig#(O+0in8D}LsG zzm-w%V+VcATrjcIrdwV**q+YG$#rm~2AS{xm`}rw&m_b<6JL`Rmm0WA-*3gM@$zL3 zh=}B{@doER``IIX4<1S{u`rWT6!Yzjm0NEszqv6se!NQqbpAZDcmk;H>^pdZ_!DEU z;YAn{Y7f<>ah*QHLWX1@psxheazKL0RML;-l;qtU8`;DQP{|hA2Pv@YcNt^AXat(z zhxB%_*h-`h&0%5I*ccE!D|H*72A)vpp5f<(KEW_&@(JJBeH0#HIn$P6NN+Uo%VhKu zFC+zBTzAlX9-jo6(hY%%#yfPrF_Y-ihpE>qr3dGkbe~XT@(le-jOoy+I?P6RlJq`2 z68)%++9v(=YEzg|MW@e4=kSOW@BPqRCef;~*qe?qJoQCff$ga^Rs+;D}c2^*x5yQ#otEnOi{+|a55c}YEHaNqKFCjc&o*l_@Thl3nRdtI0+ zHaSvug+fUTh2O86K}uclbPk-#{Ij*67lJ0Rjmiq+S+!!1!R@ORV>+}Mcde(i$(Lp@ zxF30sHjv;Jsk=+M-g8T-lNr)SmrQsrP^=`Q(|+ICe{V>A-`~A3VjRoJT%8-mLq_)K z+?LK$21APPZW;Sc3M^ylH?9O9DA>NM=K?g=5cp1%-WWq94%$TnX#t*uI zFPa{K_@_-!eL>Au-vj7y;PPn8eEAxzC~)^vJo<}#BKx5m8hGUnAPNBBi}?LGZ8*5a zB!S3#Ym8HN^s(x$W3Ftyk5;{wiuggG9A2DoH!#Si1&GklwAcJVGb}bbiLR&6D*;$) zhjYi#;?_Xu+;89vuCzec4-C;nAm7x&&| zC#j9oY$rLm6DY7(~@gF_$th&uWRs5&>^4yoXu$r5gpS|ziY zpvI&Q5ZD`z^e2OOLQ55gkyWSR!#p39Wfo&K(xrR0%y2KbovS@PHpglfstS9*vsP_w zZWeD57a)E+aex?&)%vg7Aqmd}ck=i7{7BS$Ce3mHP5`{RwzCsSsN zL&m?Aqi3?1GY-$t;n-*ms>kvRDJE7n@vKHCPvok&iL{!eV}E(97_KY+cuF62xSVU0 z@g!(g;x!0S(yY9f)JqLVkJyo(ejUk!agGlGWqyb?Gh#-F4$Pum*T*nM*{2LR?<{P@ zxETynHH1%yYCb1P;i34juzdv_xr$v+B=JxBY7@unHw1R9q&6Br_bL~4c2+>hC_clXe#hEAQZ|7sRK+Mg5@^tgm*AvYU^#=4N{ zpsm*u@MNl%R1&FO@~KEhe>SI8<&b$esR)qtu;HFAGk;S-&Xzj?LS=-WKk9xS!5~?t zp`z0cJ$Tm5ZllHE=fgHYY7eusdG7M_(wzZj~)nTo3TZ>oQ zP2u6dOq13&3~acyUHB6|G9=WZAw;*DtEtg9AO21!4g)d`uXUN7UimC+`LPE57K8L+ zxY@~}U5m#7#(k=0#&JX74G??p!@1+p8}-hu}z-aX6V&&>PINe~N4o9TiGQ@WBdqBVp}>fp)+UdD zJPa_Y1|6(N!kt|hP}ryN;_voh+_aGXGhO5!3LGK*yAR~nwWv^BNjl8uKO%txmLW0! z8h9jy10LhNmwE{!&5z(fIlzanCon(^YrgUAFw8Gze|u9%uub0XNDcY(5`qQeysw$i z#RsNA&%1|QV+Q}^240?96jV!-d``z8K<&r`z}|A8e(n))4*(vgu&e@~J2S*nqbQl( znKL4xxReq%*rc3C;*WMcPB+3~p%rEVUYp{NF61z_DC_ucwk>D3y*o|f=A-C9Gu0}x!%|a2T5B_zbqgfC&zBBQdU)s{y`+yTffmZh4$p=-@;4|lv zVq&5x%5RSK{}c&hLmi&^Cd1K(cM+po=`G0wuI4iElF}1``p>Nj*Bv^}Or*q$e{>i+ zGQX4kRR9r4H-+ZLF~JB{-QWhdCr&f^c$oBul2N%We;LB52&WrE>0hm9(}_tkBEMZ|n?jw|KCkIpRh!rQrZk__?_ONtEj*-$W_4JDCE+HWZL zxfuuzB>7LRdL#+!w_`RF0*l7!NPyMI7Rfb3EutQj%)dTn*ouMcegT}>SL->GC39NJ zDaXX1p&=Pt7VK;?+_Xnt+aJ>d^un9CU(qX1xTF7On6Ms&CT<9e9di-@gueZ|F<7wnWY0>A7(u-!HyAo!0-hfrP5B|c1#<8 zA2ruX8wc6w6ay2_=Pbr{#8-C`%1GnPIP4k3y)4Kq6X`yOXe!q1ORl z`^<|Xw|)b+=V!M`Hb~l}KxYg5h{rpPGv7g`5919=>z5}BRnJ3nkW|X-XU@Kz% z!N-JyDG+`wCF$R_KdC4JOy7e~kpY#6Wv>JrvZ$PzB&2aJ>xpiLMed1uo~xD;yuv~A zthX*Z)A^+jv*fSca>2fy%>7%XErD4}KlL#dv?%k?$sRWcTUzh5v+PaC7(f+o!@u`3 ztE0B<6ZmVrM|tP(+#v~p6<7xF8+$Y|h?;r$_yoKvdCvOO^Z+M11NW<|KltCm4l}`9 z5XCE)kMs##KF69tRcPTR^ew<_w|T{V2#ez}6r?P)yd8bTJDR?}&1~a4td_+^)}?X+ z&dl-(Zg+BGptdBvlRy1Cu~0Oa5~3slQV6YKv3tLzp6hR`Qh*&(weBFxV||R{MG{CV z9RXIlP#Hb)p`r}Knz#K`@ZRY&{r&TAgWH0%0?ebKiAOm)9GNsUoJ-e#ny&Kk;O~J^0hvY6&b_XlxbmaV`5D@7YwcWB`x~E3TMrjtDadj%?+Yxe`q7?lx;X z3*FqGRu7B0B#`8aWYS#h8fxwB_BO`*PabE^vtuFy5$HWL$KFw5LUw85FL&0mEhY5- ze0*Crm!01-&67woFve4Pdp><~Qk)jw&*@9_p`hp}UEAO7cyqXYvbNt%#1XzDa{xak zq-AdD9p)ahenu)`o90fnnmRYpuq|dj6v{EKtAf_IyEN2!cyh57LQP$sQI5>bJ~#IM znW=aV3PK-1Gy{BGBW{hwRpkP;*1XV>^h>MwxHMn+jn1^mjm;maHe#HQ`5nRIiSGs% zFTSsKRL$olC-xSXn$ESh-W)V#m#%Q?l$PZ+(_GWs1h;Qdk5Z@X(WzqBjyy(YU-iP? zmY&aEpUc;8ORu@^HALKJlV}pq-ssM9E^dTI>B~aD7pYp=rcK&1bYhMc?=158agLjG zof)4;2?=;s&lmMa1psG8qo71wGinJ5YC7-g4Ai~@`5YDQjo?k|JqQ<4_ zEOS01>eFJYU)6-_?okS~k?zwFGZwFT)K!SwO~80uW7dNt82v#B(FU^|RUE%BCd}t| z*Gf0EF92=tdZm~}raku_i#sps_X zNF6VInb=^d|NXAZNIdG|znjbMog+c23(LITGdka#ZIMM5TOI2b^$J6yfN{02nU~WD ziJMRN{#@@Lc>TWc;{w>Z_>RhN>AfA;Mj%hfUe}>QxeD2L_j1ln!_@8Enj*gT z!Q|%iK<~qvAE_ z^S@N{5wMb4Ozd%TIh|9=UjLh^fbf^V+`;tbAA#J*@rde;&Db$;<$~^d23CbU!Ag#k zEhohg6J)g~XtGnvTZyJ4liNa8qTd?ed$Aug&VKH+=hsb1qZC(LmQD!KLMq$bqM#9) z+pyiE)>)+Zu1kg--VAGH{f}oS&WcP4csV)U`sDq#Et-kbz&o(b{w*P4oyNNy4t_Pc zT|AkejZ#`9S?YdX+9G&nzejUCltD1!HE`yHcnXvFK__*7uTJ1dQO82+g0ihhn)nA$ zhIx$X{q%1Qq_oX}i7M&IhoA@OmLBW0urV(pi`R*b>&1qdhUXi!X)M9;T&dlnH}fXgwT# z1#TC^b}jt8zTR$5*EX&{26fYM&mHWWg_@iloV;qF9E-pC?wkZF9BbzJYMnitF3q3{ z3j47%97`GV3w%_5xGw(YS-q-&lSGQs+9mYWd{G7cHcdi8Jx{_ZN)$mtf zdHSM+ZlAul{ibtgztk$=*>Yvl+6mR+C?620si{`530l-AaMI9Y_{mU(Y}+R2dzKRd zm_4mFb$FH*12Ba^tcIL_J!Yrda7=O?1}w%(#n?k zeOo2DE9cm$~tsUpTaCxy5jQxDeWtuqUzeVRg{)g7`hu|P^4jKBqXJC04Wiq8&r@E zX%Hy^LApD1=o}j9?rs3*I z2dD3Q8>vIqhbxg+0?@wrBwK3(K0QI?!P4IJmO>S4l7k}Xa{4VUuOhEO^2@N=GKMWt zfq)zSHNc$lsL}3flB7q$ovd9+?Gy2MCOjI$WD+0`$yZnJkbOStSz|nRY+BZG&Gj7X zO~-2nHNrMXwzfxnHhFI}$}>7Ar-GUJWuoM>)Ef%#?JE*04^-jT%R5%x6{P##3zgFj zonKizAU!G*5e3-{r-U?uztJ(4i%ZR1DoCf;2-5C3!NFBVtlZ)z|=x-q?vaIGeHTT zc2?hVnOHoaIFyXIva_2?kFkr6S>9R3C45^mrO@S=1CQ7J?NKjeMilg$JW_ImXT}V^ zf(V*-5%T&J)2wb)zu6SV!-5=p@$)6Y{$Q^InI^^!R4=##Px_n0l1LSN)ci2j=#=BW zB$0X=m7|swwUB0*cWL^Jo(3c2KmhwAc=R^KYgebr%mf^O45WL`%syi>v8WJ(2BT4Fp@XCw%;t zVN&C|%gk*5HpOWz%5#(C^(~BVDSIl#Cw8Y!qE%d|qJh#uVC;7_?5nNi zn7w8+t6GOyh~!42=9`SR;dg$&RxqPo8=XLGZ!x(dn3hmS-+nE^QmOlRKq%nV#ld3Sryigt zx4;pycpqH4Cw_K~=1Yg8GryE~j~nRYVT&>#_R9JmA%vsdZgbnr<^YY$lNw?=BuLsv zv)lK0D9pEN$Ydt1fu3d%!=bS=t1^6f@kU@^;G?BQI!g2@nE^k>HN|s=<}~We>!?eu z?|Ap^y2X}`FwMa;?~-_WN5rEQ)`77n!ysnSKY>(fj#_DP`*GlIEo98ZiYp%wF#G`= z-og&u0_}#4x|3K3WhL^-v`7&&VVs^9pLHyHM`fJhem-hL*#E$Ie(_mvsHTR z5A;~rs6H}(LHAp=!r$}jP5Ak@{>3&Hy!Rc`ws_C1d(3lYt%Q+-78%_F7Q0J1??IXQAlq`d^}jXP3Li$DfePVkg*I zSuHo^xZRv{(&o090v4ttT_}H7SIzu}v5g+?msjIWu1CwAo4E3C9Qt%DUj<>6xbYsi zJd5*4Q4$%o6uYudBRx>Ba$8;tAU$w@P}mKr?=VLb$ZPXcS!NYhdd9ux{&aCX*|~iA z-?}|0SvQrRV~qeml9_JS&h(ljC3@FsQku zschvi>Vb7Ge)uFccIEqc+L!XZQA=9V*{4+spCXGq>?skW9~Tz95+5!1M&Ay0^T^V(C8m1Agvh{^~=jbK| z0V!)G3Yf5;`l>;m!{yqzcknvgYwD#*C8o17nx)c8yswF_O{A)oZ-Mz55J<9I)8jCse zlD)7ZI&2a7Y$=g3lhPhO0#x2AD@)0u$LPPwKcp2S8_Tq$PmX@H)-M10g8AWnEB^9G zl7^t1)Ym&)3O8a6a>=OWFG2ePC=ghB%^97Cj>_&CP(e~2E5zL>H>L?-;;2gGl?J#_ zX)T9Khkg50t25-!7-gJxWRV*?B@O!WcA1-f?K`@k$M0#VJV1yAWTE1>Nz(9`$P^gM z!I=BgQjh1+ee;ST#YN!)yxBsNi{T?G?Hhru@_ntDacdf=$In$&2$WQ(`ip1u8TaEI zTBjr>ObS1@cFlDTXEayT0@Jmsd^r{_cdldocvsJmCDWn;NZbF)oNdOK|A?rBe^&5% z#jz?|`cczxipZd$>`SdFzQc{PbRkw~*2HEW;J3N)?X0C@*cEIBgG za09+S*#run!9l^-906X|a5!sEX}dLYnNYltdDdS14qN z`1&>X(QPUEO&%SUTm=Z%fBG^NpJV?mo?2AUPQnFmA$XXqwRQ`Pl-t>a1$Y~?`K z-g32maJchHH6pL{ERn$5pYQp)6@M|q#(s!>A+=dJpQ%Sn=hG@OAhM`Wj#>{r)L;m) zZo-q@rv_$qNl?mQyQwn?QlYYyfTOAX!l}I2Dau0b3mw>mtZ$r6IBRk)bzG?S^h7tvqU zz}F9{I=A+@ZXGqvmYO|tgsUa$f5C}8glWJ8 z-jC@>7zAEJ&zASi(qef%FQeJ~4VjYCADW+WRW>Dm8DYi_5Rmv(CSK6Z#~oF;ID8om)aHpQ~)O%ek`%@8KW712Q@088|QFxaD(g zk|3T96Ke5H@mLOTsBE?)bPq34XgE{C_=EVO2;fWI$vbkb%Y7?bTSvz`3oVQ71&{gt zWt5Z@0oJsD09B8Wu!!LJ`iT6V1!nNOgU#%VO*-5Vgwd$!o&z7*eK3IR|E}Sh*IO(6 zp%!Sv?Jw4IZ>#6Chb+<={+yYANi|kZ&|7b;O*A=M(S^)Iwwj-Ulh<%tN1o2mu8`m+ zV-Gw0l(_Z*>v_-tv>ZWkV976N zNrDlqreZX)!jrlHwHoiW)b7sVU0*&@SapIli!%ph=$DwK>&MHkp*yStBR}Hw4v*%` z>8|C>9l+4jht?gWj5vxBt5Z_+U)Cr^goVAhv^X-bn}#)6-Yyow!_D>VX#+;41(}$V z^s@$;1^9zG&9t)(QYpg|9XyxI9PAaAguc+B!lO(r_xFYx(!b=t!$^sLKP+VD>W(z6 zZ_XcME`3sp=mE&;#o-h{Rg59RH5PnNCPsaBwk_fe1ThXAE_@6--#9O3)xIr%tjiXA_PDUU`__0(cAqxLL6;K)167HP2k zOa~Wm@O0)@;mpQtLLTSWez+Xsb+Gx?6chKnDEX_9TTYym7%08z1?3UDmTlly8HX16 zP4K%M0TICz8)eBz>PWL1CyV3r0hayMhUJql^}x4#Fi$r`n@d&>xL5(8TNqaqL0J#vS1v&FPJpf6+yjBxxxlYJa zc6z%lG#K=8UKE0RE**;o}))i&C~hpZVlouby;v+7wAklXxfjMKV8L(o% zNd90RSz_Cjn_mo~N{z?(E9gKrH^obigO3)L%d_=9mPt8VilvBCkDYGqaF&mCWN8mR zg}0RT_F-m;e&6+~9r(^TFRJ0>bFrK${|VyK^_-*3L$^u{^wG1uC2wfRH!MB8@?@Z( zc_<^6CyZI|jDx_RdQ1pO09n&X9aDW{?>0%ns(s{VC%sfzR`Aw!aqh@8TT_NzFED}H zo1aw&^6B{U2TmIO;?BjGSBj!@v7@=2}A)Ns`sO}n|ob5Gn-=A?8h1^B@=R|N2#J|vw-x=?XEz30a>rvaCj zwnCFWUY?$3_9h6ix76a?CLpv)wl|zOxTh&S$6A=B;@OO^syMc&cCdMvcV5iPFO4HE z)FwRw0yxLo1$NHpPwMWUF(%nj;8>NVOv8$L#ahR^5 zOg;54`MY>iuE+{+_w4cE0U@exVIpM?v+2!c{RwBQ-#B#$qG+(+q+a`g)a$`V?Efyv zjI2UsH*ArMHufbltqN@olLR$7x{7P4KR|SbTiwS;ZzhK5`#;qF9KQ@o6v-R+vyMZo zXUc_;YnrgQ)I9qWMn=A;iUTwEVf_9#a7vgc2|-v znVH}Se?5A8a_Y%epQ|%qsAtz-<{g#a1=S&SDZmBkw|zM$BS3}ZRYIF}e;!iEt8fW^ z0FilbNnu*lf&HdG0t!S%?m4v zijil({61hLL~N3vJrB}m`6u|30pS*OIC}q1N%=>4h`jd@p-qJXUCQmB{b~^gW`(_o zG`=)5t)K_z!OY!Wb`U<+D3A)zrNuGA6JE$1Phx@zPMFr18Q1syWP+*5JF@vANPjQ~ zF|pWKXzf0UewWjX0V{SP!i+k|C7zIfT4V1KF_P4aYnVAjFQ$4E8fK;N{TFS1&@<>e zhrBrHBb^WLd-2gRyLSacUYjERhlumtGU1_H?D`n0Rj$-M=cvpcV;vG~#!v+_^M@wt z(ae8$dT(vm3l7oQn$HnWmh?H=aF33B9O!nFJ7jPVeueUMh~vq|_|40&^70;xhdZxI z8wBiY(j8=@op*=S7d0RFet$J+KS0QIFd8($5IIJ_Aj~{-fpE7ggt<4(6jHYt*(=1U zYf{FCHpk_(w;wN?ibw?fR}+AbFM-Hyn9xuzHCn9#@bbhCFEzF)?^B^B&P0V9qgMn@ZIfCX-YDl^s-IvZNh#@}; zFr%Pg#6CKDlf|C?h^&GROKKGbgO>)ImV!&3+E{8w&9@C)P22NURIyx3r{6G%?DJ5L zhLLi<)7f2dt~I-8GXH?_?*sgU~VUDMn1 z5{=%AU?Dw75o&joaKJ@$e)DG{L7=*3fMZoAekik?VeS#JN!v&zua|Hz6ZtLP`>nU} z3mMj(3R)k2RqQ2?&TcmTrV&i~#wt&i`wdQ8vw>Mt`TF{1EF@xjG01^UL)C2;x+*Dr z4}>INtsd*4)Q}a>BilKOOs}C!@@XSZjMF zWE@ZZ@qx%NJBA<;Y_H(@tT&hl?Rbq5@XHXwR80pIc|86DMq%9`|5vsX7EcsJsIqHP zaAcTOHi_DgV}D#7>Xa|PTdbJi9{$|}=k||e`24zi$sWi>)x8A$mLY!gUCTKUoXLZ7 z(wCs}B)&8DBNrP&kM5+wPk}a8)>KuA0+FjqAKghm$UgsY5U@nK{XuVvUn;oE_NYvi zUaN@2t?*=bns0ZVpVs;|BOJgL*g#*QWnjeFshHT*G&V}T`%tU!^9%Fe!Pe&|UQ;pP zYEO+)ki#%-YUomeTs?Yo)r@#{EZ!yu=F9KLPt^MbLf^~-MZleN_fM#KuRh1LtlD!H zHNS|;eY?^NAffxea|nUNZmItLL*P~Pe<+<8n8eQEqBW`$^33a;GiS|~y<4gMka3P! z9UivMrh0D^jL4OL7WB?e`#7!YRa*@{R5^L1-&ZPgWBD`r?Y7J!kjp_zXnA&0){l@~1XC9Fy?LE2n%BLsC+M3Af7r zNn!4~W5*w5(xmg%aHY;F*HmjqA~dHB<5-7x+sm67&DkLh$tD1G3i12rEZI{`&+{0p zx`$t@o@}`=d6elWuL=4o9Cdtb$R&t$i>?m+t&0NTwHAoEZv^ESV@xJF>yp1uy-}7P z!r*-`C*REH=^4iR@*eGg9nD~=0X&7Zqdzn9dob*ZQaXG0lw+!ckRy%*ohwfH)d!$z zd2mkL6d;CEiwcAu%X>`3P0@CQFurSwa0$BHx_a}aJd8zSct?zb$dWf*l1M@!fcEaejh%a)Ua#h z^=pmZ)OSVLAOp!HzE>U`Hqb2GYw%tuaWH|^^y{l-<4s#&(@nXl|K1>O|N6!YHD1ia zjWZ~)#uSRpn)t%nZy$NqDf+TdkGhk^r`V}__^Xm*+xhn(O*j)-w|!aGCnsE99L>qD zPV=4qc|K_Vb_B`tcx^iIVOXniuWzq8%1G&62C-a;knZ|dFRvgl=5|>CoN206?o)Zo zXw#)TWDw*p$r??};PWmM^!h0VKMyr}D8t;eLnOOAJu!|>@w9!AZI5VF($!S!dT;b{ z?7_@Sgp(O9sP6GC-`meAL=rn5Q<7Yz9{?PBLPEC7Wso~@lg2+S6In~ z!;iVlKW`_uekA+;T{(mA=kkHi@566^fk!B^#l%Eh%u1n*z6I2FRopoi5|UdRr$PB@ z&XhXOt@y&K+Ca7~GTza;F{K>8;So?7194JqmhKHZXOo}PUblCI74`5q0Ho9`z=Pe# zu34Ml$65(R66?WfOD<;LYMMditL951*$KPicC0K|Q369EN8IS9wo(_vmr0sX<@G-W z0039*7H>%Icrg2Gv6r2L6)|7;_rgR!kCMTnTSk)>6e*OeqF*Zjmv{&%s&hZu%F@eJTsSb~QQqSAo3O5*#b+sdRILI3(t zzzF8IBu*!se1L`Fed)NaGIn-o(FWeT`u)b}dL|Ir9D?+|s(WNVFF|*aOm^Aa>u&kt z^m55x`Iq54qwcIm18oi6<||W0&Uk-$Cfd7!r9+0?s1%wsuCLmGB<&UDkq5|70;D+< zkL7`~4rv{VHwaZnJ}xI-p(-?u=GNo;n?%v54y)D=$)&U=CpQ?p(rUQpPVuMiDG3sp zMfu=;|MKwlCE*Vri4DVOgl6Vk13kd@p~jxQT&v^tI{mSm(qK67mNxQv)my5VpxJhv>$u4TQZ3 zL<%>)Zon63@%G8%{$zjlKgz@N$9)PEq30&sux15913%*{fL3`~fK09&s3&G{=i?SO z=`&4B>m>(^4?|(k$?qe){pNjd=q_gfD|8Pa{2AhgT~?k9xXsbHqBZ+mIAhHqKEc_ zOT-ewr!ul$KZ{H?$eRq5D{?oZP#{!Jdjuyplq8!h5A3HW$=+q_8?ajE+?A}Ga zcKz$J`*9^e)i)PbSB$fWjJtm`xqk2-&H`yxM&C9W0QO!ByFI-$!(?zFHbAHbP9zNM z-Tyk}rXj#ZQN9`YYqUo}6Uv4H{C8uM`ftU#yQX^nw>RPmUYpW;fVzCUPu`97V`JT) z1f(d02ddl~`*qXs!8!!>gQ%VQ-sNM@S*aGRn^+ESO@=nqf*R#L%KczsRmlk85Ca6# zduU(p*c=;GC5xaR5lXZ@?nCz_rN&z`tF;e#FzW@md&3(C1kUr+ivs3%oZpKY;u1oC z)6xPT-+Tet0Jk}H1a<)4hQKb~Mfx=)K6>>x*M8@zxP>?R-=!XsqXk+y(sgoC#h=SoXj zc{aay4;{r3OMH1G!hpRHZq@480e?Q=R&)IPOFl?+j#QTZhr5h3&V_I;y*u|juV1JI zAK+EmsxrUZPF2Et2NoCsa*H6Uq%`I7=Ftf}ueY$=NM9T`(6@s1;v{^Yb~{))i=dc7 z8_HT6gY5ad_FfRV6Zwtgy!bLx2EXIp~JUiCX*K>$P>BHaTI*lfoa3lSgDVZQUeijhO8-c2cH4BkND)DaY5u48X` zy+0-K5Dho`@VJZ$F`=^y7fK!%rra$Hq6<%OIIyC63y1jBm0oP6%Or1Y`s55|2S>Co z5P>e7iB7#|-R;1xv&^EN6e-m<`x4n-)&JY;zKl;nBm%qa1~_M8lP_@%rDQ>;Yna^= z+HYiy%jbUr{ipZ=UK=itzgWg1eCh@CdO;(CKvv?jhq6 zNZN&=8I%##r-I*03;{@V=~d1?i2-?+J5o!>usqvbtTc;FRFV=D}Z(Eut+*I`x% z6Tn&V+qbI88-`rb9O5YO%4dk8d^g)5fPzckZmy0kTk%VZfu<~)Kk$fBr(pt?eO45x z8Ut6z?vt;Z-(+ae7ro+9AC6}P$O*JJ?q6)2g#3688`5pZn*P!PURP^ng3WS2*3;bw zJ%jpnDs^y$dYo!?byX&|Z!(dg*_t!DziJ%6|Hny^o@NQ*yUXP-7OB*A7zXW?)PkWm zJ}JqR?e6dOqijZ}pwtvIzjN=dG(dgRgr$|lyyYbFuT9bnr?Nm%!@$SzjqFI%Cwb<& z-TAPBnAQ~WYM-SY?B{=utN+*{EugL(=e;quFD>MB?cVCp<|g>bK?r7-JMI{2c}rKc zEtfw&D+E|-K@wOxgxA2&ZioweA;i3(HE6)!_r`m)E#d{p@%%DzHTreu3vuy#&A8~? z8UsIj`Z9xMWbA91QaLQ2kwjwns*N{ZxOt8CHYH@66CaZ+RmS6Q@+5ewU#Mn_Dctr$ zdx|#Xd)W?I1%~?^BGZ78jheU(%@{^PF6Jvg{z{77nxcnBMCk1_8 z@1lmquIjIWSM3NaP6<@8c6N(SGzpn}8gWq4nKG@WG)JlEM<5fk6|6Nu7(r+0mc%6A zaK|HYA3Hk7_=3g`C7c>#&NBsOwJ?0Oen-ve29(S_1_vE}8~Qj3J?ol3aE}46c7Lu^ ztWRK5`X)t!1Nf~1$_{$ylnHv5M@j*?_c;GmsW<@&$B)vt7ddK+n+?ithan@D#1I++ zXmNKE&n#zz?z4|$IPU_5sj)aktn2wak^PJe7xG<4EDMAs)t}m~l3Oot$b|v5FJXtm z?D^!E8Og1hsXVDoTb8d5*XH}!6cDBn3EIz{1ui;1Qy!rwGZ)$>3Qo9QzFytCL~gy; znY$*V)1Tz?D7V|QasE~|-$jW@DsPsYf@=xC5WAFwFP zT`02H?{4i{lf%Piw7kjgiorD>iDwftI-i@78R0bP)6U+F#@zCwPZ7xJiEip$ktg+* z0aP2Fmh}f8f>xQD3%;02a|2KWFuw&fNr%jlOk*8G3yL7_=(w7%QW?|k-aCQfDV$*p z>aP#AX=daJ1jqq@+dohV*a=7t{r|bA1I+@D@76aLeQ{H2v7=xp8ZKgkZIQUIn3PUB zDMV{fThcJa9(YFhh5gbO<=`PjfNn*iWA)Rt)M5iJ`z^AjBHN;x?q~DuQ(`ysGNfj0 zAueb&@=(DQ0Q?fQ<`0HsnDB=l8lK+rd(7G!TmSx_jF{% z7J{(O1BlN9=+d{^J%-SGU-=@ZfjZw>d) zwq^MEz|hs;mYpkC4XwfSu9nz0>)$M9Gh)|%^Kh=>yhy@F4QscZ$}86>PQVrr)SPKF zOphM0nIP;3xA`ZH!|K{IXXVpoFKEcDCxnmkJQ{SFu!B9liwZdgZ?DaI5D%Y^6Pi0z&R zIsd0L0x-NPg?e(1`ap&HF~|RyQkAgF=NZ1IXUi9fylwcsYde%hXqcY;JYT75X~0sb zcg!&re^HaLfM3gBy-|D@0 zwsRy>L`9y)pHRVthu`hJ6EK8aq!$$&U-b+nPA~3@B!RM|^5HZGvieuEX+jeC()M!R zcVX2s(T-CXFmzq``rv3Maq|O={>57#9b=|Y2q}SF$Lr{>dn-)B&1i(Nq$^|(g?+sv z`Z8Te6Ui_So=`w}Isdb{H1mAGv*$2>rq0nMx-LOr-9tSJ(G-Lhg?Drc2qp zv<#}x?QG2=q7klU;`^=VmS(z$L1TQ{H{r*h_###RXw9?`&TPcM$Vfa%G$U+-hZn#~ zszW|#5~?@3H@Zj10aMnBBg%8-wt_Ktk?C~G$!L!s-=pCzF_N6s2xw6Rg)aGJJFnO( zF6|mDmHD10`JVs!s;uDsqxPelYUgLJT^dkB9nLsL49bX8`VRi022Of+O8t?Z<-+P4 zKm2B=%mEUNp#Q`-10=Mkb3+C0T+zBBjl~10?Tis(f597UWVxwR*)CPmgL!;9Q<3JF zYhGqJcoWksbl(<=0*$nmXm?rqjfklfx&dAeyOg(w#5VIS>(D&LK zC&ppT9&3!Qt$-Yc{y2a-6jYeOS(I)Lh_>3YT5D<=w~2RzG}5L5xk7j3W@Y?`>#By; z33|7>Mm$wxuX$PEy7ZydVNk!K)gbZ1iLOn~NZALsBWblbXt%5I7?T?zfpt(9>((!N zRuSu_p(q0oanc8w+`seN1)f1ul?bD{WQcj|dEaS03TihvF#-K)zx8Y6J@R~t*NHlfmsXnP;B$z(Tqgy{W2@h5M+$Z_~ z2}Sq)mNGP$kHR^IEe?A+!%E^(_*#t7>IPLzGM2z!pHs7QGPL)~05G&|(wNK6PkPO!FxXHmUshi7_;% z&TaYZ1COt>3dtye877ve&d|sF zWMz!x2Zl_zBpp#X&f-i1!Q;c^I2xt;fYSAd-j32x>AD9nqoosrov+O9_ii!wP9#lq zY(fWHd0!L7)ANDF8>xMd@Wc#2v>4`-@TD4p7TA32#IAzr!=% zdBcuoR?>v=#8>-kFBDIg$`}fEiBo`4rvE&Y7}}C&F#n+aMcOk0lG2NjON!2*AV<_i zk8r480pPAT`Ey2(pUfY8`vTd~Vv~y7=9;GPM{+8z6#7Sctam19WJA4=@S526xcW2t z6C7P0943>UCq>t&N8c+I|7!hm4cFx~IIg+?>>*PHs|PovdGxZ4&&zo}C_S`gR|W*# z;OF?D*8i-6HxDRP-1IKw(l_%*6@@*GNH0R~=j2DeYckg(dtuYbI2rfu{=D7f{U2}s ze}KtN8t2xM|2CljK$bt<|2m1AobLa+TkWRb{xw?r-pFE$9F-@q Qj`1B?DMiUbaifp_2WeIh0ssI2 literal 0 HcmV?d00001 diff --git a/synapse/storage/schema/latest_dump/main.sql b/synapse/storage/schema/latest_dump/main.sql new file mode 120000 index 000000000000..cf4d6349f133 --- /dev/null +++ b/synapse/storage/schema/latest_dump/main.sql @@ -0,0 +1 @@ +../main/full_schemas/72/full.sql.postgres \ No newline at end of file diff --git a/synapse/storage/schema/latest_dump/schema_version.sql b/synapse/storage/schema/latest_dump/schema_version.sql new file mode 120000 index 000000000000..0d4121f20bab --- /dev/null +++ b/synapse/storage/schema/latest_dump/schema_version.sql @@ -0,0 +1 @@ +../common/schema_version.sql \ No newline at end of file diff --git a/synapse/storage/schema/latest_dump/state.sql b/synapse/storage/schema/latest_dump/state.sql new file mode 120000 index 000000000000..4ff67efd33e8 --- /dev/null +++ b/synapse/storage/schema/latest_dump/state.sql @@ -0,0 +1 @@ +../state/full_schemas/72/full.sql.postgres \ No newline at end of file From 4035d526cc56bc52c0d4e46c911d510c8b6615b3 Mon Sep 17 00:00:00 2001 From: David Robertson Date: Wed, 15 Feb 2023 12:02:21 +0000 Subject: [PATCH 02/11] Move into contrib --- .../latest_dump => contrib/datagrip}/README.md | 0 contrib/datagrip/common.sql | 1 + .../datagrip}/datagrip-aware-of-schema.png | Bin contrib/datagrip/main.sql | 1 + contrib/datagrip/schema_version.sql | 1 + contrib/datagrip/state.sql | 1 + synapse/storage/schema/latest_dump/common.sql | 1 - synapse/storage/schema/latest_dump/main.sql | 1 - .../storage/schema/latest_dump/schema_version.sql | 1 - synapse/storage/schema/latest_dump/state.sql | 1 - 10 files changed, 4 insertions(+), 4 deletions(-) rename {synapse/storage/schema/latest_dump => contrib/datagrip}/README.md (100%) create mode 120000 contrib/datagrip/common.sql rename {synapse/storage/schema/latest_dump => contrib/datagrip}/datagrip-aware-of-schema.png (100%) create mode 120000 contrib/datagrip/main.sql create mode 120000 contrib/datagrip/schema_version.sql create mode 120000 contrib/datagrip/state.sql delete mode 120000 synapse/storage/schema/latest_dump/common.sql delete mode 120000 synapse/storage/schema/latest_dump/main.sql delete mode 120000 synapse/storage/schema/latest_dump/schema_version.sql delete mode 120000 synapse/storage/schema/latest_dump/state.sql diff --git a/synapse/storage/schema/latest_dump/README.md b/contrib/datagrip/README.md similarity index 100% rename from synapse/storage/schema/latest_dump/README.md rename to contrib/datagrip/README.md diff --git a/contrib/datagrip/common.sql b/contrib/datagrip/common.sql new file mode 120000 index 000000000000..28c5aa8a1b8b --- /dev/null +++ b/contrib/datagrip/common.sql @@ -0,0 +1 @@ +../../synapse/storage/schema/common/full_schemas/72/full.sql.postgres \ No newline at end of file diff --git a/synapse/storage/schema/latest_dump/datagrip-aware-of-schema.png b/contrib/datagrip/datagrip-aware-of-schema.png similarity index 100% rename from synapse/storage/schema/latest_dump/datagrip-aware-of-schema.png rename to contrib/datagrip/datagrip-aware-of-schema.png diff --git a/contrib/datagrip/main.sql b/contrib/datagrip/main.sql new file mode 120000 index 000000000000..eec0a2fb6dc3 --- /dev/null +++ b/contrib/datagrip/main.sql @@ -0,0 +1 @@ +../../synapse/storage/schema/main/full_schemas/72/full.sql.postgres \ No newline at end of file diff --git a/contrib/datagrip/schema_version.sql b/contrib/datagrip/schema_version.sql new file mode 120000 index 000000000000..e1b0985d7473 --- /dev/null +++ b/contrib/datagrip/schema_version.sql @@ -0,0 +1 @@ +../../synapse/storage/schema/common/schema_version.sql \ No newline at end of file diff --git a/contrib/datagrip/state.sql b/contrib/datagrip/state.sql new file mode 120000 index 000000000000..4de4fbbdf7f0 --- /dev/null +++ b/contrib/datagrip/state.sql @@ -0,0 +1 @@ +../../synapse/storage/schema/state/full_schemas/72/full.sql.postgres \ No newline at end of file diff --git a/synapse/storage/schema/latest_dump/common.sql b/synapse/storage/schema/latest_dump/common.sql deleted file mode 120000 index 3afd686b9cb1..000000000000 --- a/synapse/storage/schema/latest_dump/common.sql +++ /dev/null @@ -1 +0,0 @@ -../common/full_schemas/72/full.sql.postgres \ No newline at end of file diff --git a/synapse/storage/schema/latest_dump/main.sql b/synapse/storage/schema/latest_dump/main.sql deleted file mode 120000 index cf4d6349f133..000000000000 --- a/synapse/storage/schema/latest_dump/main.sql +++ /dev/null @@ -1 +0,0 @@ -../main/full_schemas/72/full.sql.postgres \ No newline at end of file diff --git a/synapse/storage/schema/latest_dump/schema_version.sql b/synapse/storage/schema/latest_dump/schema_version.sql deleted file mode 120000 index 0d4121f20bab..000000000000 --- a/synapse/storage/schema/latest_dump/schema_version.sql +++ /dev/null @@ -1 +0,0 @@ -../common/schema_version.sql \ No newline at end of file diff --git a/synapse/storage/schema/latest_dump/state.sql b/synapse/storage/schema/latest_dump/state.sql deleted file mode 120000 index 4ff67efd33e8..000000000000 --- a/synapse/storage/schema/latest_dump/state.sql +++ /dev/null @@ -1 +0,0 @@ -../state/full_schemas/72/full.sql.postgres \ No newline at end of file From 6c3eb690d42b055a75ba5b868169eaad2215f292 Mon Sep 17 00:00:00 2001 From: David Robertson Date: Wed, 15 Feb 2023 12:09:00 +0000 Subject: [PATCH 03/11] Further reduce img size with `pngquant --speed 1` --- contrib/datagrip/datagrip-aware-of-schema.png | Bin 31017 -> 13610 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/contrib/datagrip/datagrip-aware-of-schema.png b/contrib/datagrip/datagrip-aware-of-schema.png index 2bbc641126b68ca0ada6b6f09eb4572fec735e91..653642da9130d192dcec00eff13cc2698f311601 100644 GIT binary patch literal 13610 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 Ef05{9b^rhX literal 31017 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 Qj`1B?DMiUbaifp_2WeIh0ssI2 From f8d845aa0dc28bdc5783ea11763947f8bcc65a22 Mon Sep 17 00:00:00 2001 From: David Robertson Date: Wed, 15 Feb 2023 12:30:31 +0000 Subject: [PATCH 04/11] Update symlinks in schema dump script --- scripts-dev/make_full_schema.sh | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) diff --git a/scripts-dev/make_full_schema.sh b/scripts-dev/make_full_schema.sh index e2bc1640bb2a..575ca2428a97 100755 --- a/scripts-dev/make_full_schema.sh +++ b/scripts-dev/make_full_schema.sh @@ -19,7 +19,8 @@ usage() { echo "-c" echo " CI mode. Prints every command that the script runs." echo "-o " - echo " Directory to output full schema files to." + echo " Directory to output full schema files to. You probably want to use" + echo " '-o synapse/storage/schema'" echo "-n " echo " Schema number for the new snapshot. Used to set the location of files within " echo " the output directory, mimicking that of synapse/storage/schemas." @@ -293,4 +294,12 @@ pg_dump --format=plain --data-only --inserts --no-tablespaces --no-acl --no-owne pg_dump --format=plain --schema-only --no-tablespaces --no-acl --no-owner "$POSTGRES_STATE_DB_NAME" | cleanup_pg_schema > "$OUTPUT_DIR/state/full_schemas/$SCHEMA_NUMBER/full.sql.postgres" pg_dump --format=plain --data-only --inserts --no-tablespaces --no-acl --no-owner "$POSTGRES_STATE_DB_NAME" | cleanup_pg_schema >> "$OUTPUT_DIR/state/full_schemas/$SCHEMA_NUMBER/full.sql.postgres" +if [ "$OUTPUT_DIR" == *synapse/storage/schema ]; then + echo "Updating contrib/datagrip symlinks..." + ln -sf "synapse/storage/schema/common/full_schemas/$SCHEMA_NUMBER/full.sql.postgres" "contrib/datagrip/common.sql" + ln -sf "synapse/storage/schema/main/full_schemas/$SCHEMA_NUMBER/full.sql.postgres" "contrib/datagrip/main.sql" + ln -sf "synapse/storage/schema/state/full_schemas/$SCHEMA_NUMBER/full.sql.postgres" "contrib/datagrip/state.sql" +else + echo "Not updating contrib/datagrip symlinks (unknown output directory)" +fi echo "Done! Files dumped to: $OUTPUT_DIR" From c31b24c2afe1d5c46ba5e78ad572a0b205381aca Mon Sep 17 00:00:00 2001 From: David Robertson Date: Wed, 15 Feb 2023 12:30:41 +0000 Subject: [PATCH 05/11] Remind myself how to use schema dump script --- scripts-dev/make_full_schema.sh | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/scripts-dev/make_full_schema.sh b/scripts-dev/make_full_schema.sh index 575ca2428a97..e48bef5945ee 100755 --- a/scripts-dev/make_full_schema.sh +++ b/scripts-dev/make_full_schema.sh @@ -28,6 +28,11 @@ usage() { echo "-h" echo " Display this help text." echo "" + echo "" + echo "You probably want to invoke this with something like" + echo " docker run --rm -e POSTGRES_PASSWORD=postgres -e POSTGRES_USER=postgres -e POSTGRES_DB=synapse -p 5432:5432 postgres:11-alpine" + echo " echo postgres | scripts-dev/make_full_schema.sh -p postgres -n MY_SCHEMA_NUMBER -o synapse/storage/schema" + echo "" echo " NB: make sure to run this against the *oldest* supported version of postgres," echo " or else pg_dump might output non-backwards-compatible syntax." } From 7cc5052b18d291709d9aca9926b6b3b7b1679d07 Mon Sep 17 00:00:00 2001 From: David Robertson Date: Wed, 15 Feb 2023 12:39:25 +0000 Subject: [PATCH 06/11] Explicitly call `poetry run` because not everyone uses direnv :( --- scripts-dev/make_full_schema.sh | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/scripts-dev/make_full_schema.sh b/scripts-dev/make_full_schema.sh index e48bef5945ee..7d5edb8dac4a 100755 --- a/scripts-dev/make_full_schema.sh +++ b/scripts-dev/make_full_schema.sh @@ -195,7 +195,7 @@ python -m synapse.app.homeserver --generate-keys -c "$SQLITE_CONFIG" # Make sure the SQLite3 database is using the latest schema and has no pending background update. echo "Running db background jobs..." -synapse/_scripts/update_synapse_database.py --database-config "$SQLITE_CONFIG" --run-background-updates +poetry run python synapse/_scripts/update_synapse_database.py --database-config "$SQLITE_CONFIG" --run-background-updates # Create the PostgreSQL database. echo "Creating postgres databases..." @@ -204,7 +204,7 @@ createdb --lc-collate=C --lc-ctype=C --template=template0 "$POSTGRES_MAIN_DB_NAM createdb --lc-collate=C --lc-ctype=C --template=template0 "$POSTGRES_STATE_DB_NAME" echo "Running db background jobs..." -synapse/_scripts/update_synapse_database.py --database-config "$POSTGRES_CONFIG" --run-background-updates +poetry run python synapse/_scripts/update_synapse_database.py --database-config "$POSTGRES_CONFIG" --run-background-updates echo "Dropping unwanted db tables..." From 71781ebd64367f7d7cb6801faaeba2176155f670 Mon Sep 17 00:00:00 2001 From: David Robertson Date: Wed, 15 Feb 2023 12:41:35 +0000 Subject: [PATCH 07/11] Changelog --- changelog.d/14982.misc | 1 + 1 file changed, 1 insertion(+) create mode 100644 changelog.d/14982.misc diff --git a/changelog.d/14982.misc b/changelog.d/14982.misc new file mode 100644 index 000000000000..9aaa7ce264ed --- /dev/null +++ b/changelog.d/14982.misc @@ -0,0 +1 @@ +Add a schema dump symlinks inside `contrib`, to make it easier for IDEs to interrogate Synapse's database schema. From cc356268fdc8fee04a4c0724a9bc354f894bc190 Mon Sep 17 00:00:00 2001 From: David Robertson Date: Wed, 15 Feb 2023 12:53:55 +0000 Subject: [PATCH 08/11] Fix bash string suffix test --- scripts-dev/make_full_schema.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/scripts-dev/make_full_schema.sh b/scripts-dev/make_full_schema.sh index 7d5edb8dac4a..3f7e9de1542d 100755 --- a/scripts-dev/make_full_schema.sh +++ b/scripts-dev/make_full_schema.sh @@ -299,7 +299,7 @@ pg_dump --format=plain --data-only --inserts --no-tablespaces --no-acl --no-owne pg_dump --format=plain --schema-only --no-tablespaces --no-acl --no-owner "$POSTGRES_STATE_DB_NAME" | cleanup_pg_schema > "$OUTPUT_DIR/state/full_schemas/$SCHEMA_NUMBER/full.sql.postgres" pg_dump --format=plain --data-only --inserts --no-tablespaces --no-acl --no-owner "$POSTGRES_STATE_DB_NAME" | cleanup_pg_schema >> "$OUTPUT_DIR/state/full_schemas/$SCHEMA_NUMBER/full.sql.postgres" -if [ "$OUTPUT_DIR" == *synapse/storage/schema ]; then +if [[ "$OUTPUT_DIR" == *synapse/storage/schema ]]; then echo "Updating contrib/datagrip symlinks..." ln -sf "synapse/storage/schema/common/full_schemas/$SCHEMA_NUMBER/full.sql.postgres" "contrib/datagrip/common.sql" ln -sf "synapse/storage/schema/main/full_schemas/$SCHEMA_NUMBER/full.sql.postgres" "contrib/datagrip/main.sql" From d383945e465c8abcd51fe38dedd6372683a3d989 Mon Sep 17 00:00:00 2001 From: David Robertson Date: Wed, 15 Feb 2023 12:59:16 +0000 Subject: [PATCH 09/11] Fix symlink generation --- scripts-dev/make_full_schema.sh | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/scripts-dev/make_full_schema.sh b/scripts-dev/make_full_schema.sh index 3f7e9de1542d..473f54772a8a 100755 --- a/scripts-dev/make_full_schema.sh +++ b/scripts-dev/make_full_schema.sh @@ -301,9 +301,9 @@ pg_dump --format=plain --data-only --inserts --no-tablespaces --no-acl --no-owne if [[ "$OUTPUT_DIR" == *synapse/storage/schema ]]; then echo "Updating contrib/datagrip symlinks..." - ln -sf "synapse/storage/schema/common/full_schemas/$SCHEMA_NUMBER/full.sql.postgres" "contrib/datagrip/common.sql" - ln -sf "synapse/storage/schema/main/full_schemas/$SCHEMA_NUMBER/full.sql.postgres" "contrib/datagrip/main.sql" - ln -sf "synapse/storage/schema/state/full_schemas/$SCHEMA_NUMBER/full.sql.postgres" "contrib/datagrip/state.sql" + ln -sf "../../synapse/storage/schema/common/full_schemas/$SCHEMA_NUMBER/full.sql.postgres" "contrib/datagrip/common.sql" + ln -sf "../../synapse/storage/schema/main/full_schemas/$SCHEMA_NUMBER/full.sql.postgres" "contrib/datagrip/main.sql" + ln -sf "../../synapse/storage/schema/state/full_schemas/$SCHEMA_NUMBER/full.sql.postgres" "contrib/datagrip/state.sql" else echo "Not updating contrib/datagrip symlinks (unknown output directory)" fi From a2c6c65007d951f6a991a8f6978af9e007b7811c Mon Sep 17 00:00:00 2001 From: David Robertson Date: Wed, 15 Feb 2023 13:07:17 +0000 Subject: [PATCH 10/11] Revert pyproject changes --- pyproject.toml | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/pyproject.toml b/pyproject.toml index 4e57f68d98ce..8f7ced99a2ca 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -124,10 +124,7 @@ include = [ { path = "rust/src/**", format = "sdist" }, ] exclude = [ - { path = "synapse/*.so", format = "sdist" }, - # This contains dev-only symlinks to the latest schema dumps. We don't want people - # to use it when installing. - { path = "synapse/storage/schema/latest_schema" }, + { path = "synapse/*.so", format = "sdist"} ] build = "build_rust.py" From 1f1b5b068a3f7259fc05210e61ed2e825b30f0fa Mon Sep 17 00:00:00 2001 From: David Robertson Date: Wed, 15 Feb 2023 13:15:14 +0000 Subject: [PATCH 11/11] Tweak README phrasing --- contrib/datagrip/README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/contrib/datagrip/README.md b/contrib/datagrip/README.md index dc24e5562df6..bbe4f3a5a323 100644 --- a/contrib/datagrip/README.md +++ b/contrib/datagrip/README.md @@ -2,7 +2,7 @@ This directory contains symlinks to the latest dump of the postgres full schema. This is useful to have, as it allows IDEs to understand our schema and provide autocomplete, linters, inspections, etc. -I (dmr) use the DataGrip functionality in IntelliJ's paid-for products. It seems to only consider files called `*.sql` when defining a schema from DDL; `*.sql.postgres` wasn't detected for me. +In particular, the DataGrip functionality in IntelliJ's products seems to only consider files called `*.sql` when defining a schema from DDL; `*.sql.postgres` will be ignored. To get around this we symlink those files to ones ending in `.sql`. We've chosen to ignore the `.sql.sqlite` schema dumps here, as they're not intended for production use (and are much quicker to test against). ## Example ![](datagrip-aware-of-schema.png)