From d38c010569731a2e818c23451cf1bd8b1eb4e02d Mon Sep 17 00:00:00 2001 From: Tom Kralidis Date: Fri, 13 Sep 2013 23:39:21 -0400 Subject: [PATCH] make default model in pycsw.admin.setup_db more robust (#179) --- pycsw/admin.py | 114 ++++++++++++------------ tests/suites/apiso/data/data.db | Bin 211968 -> 210944 bytes tests/suites/cite/data/records.db | Bin 83968 -> 82944 bytes tests/suites/harvesting/data/records.db | Bin 67584 -> 66560 bytes tests/suites/manager/data/records.db | Bin 67584 -> 66560 bytes 5 files changed, 57 insertions(+), 57 deletions(-) diff --git a/pycsw/admin.py b/pycsw/admin.py index c0107664d..399ae53df 100644 --- a/pycsw/admin.py +++ b/pycsw/admin.py @@ -68,9 +68,9 @@ def setup_db(database, table, home, create_sfsql_tables=True, create_plpythonu_f srs = Table( 'spatial_ref_sys', mdata, Column('srid', Integer, nullable=False, primary_key=True), - Column('auth_name', String(256)), + Column('auth_name', Text), Column('auth_srid', Integer), - Column('srtext', String(2048)) + Column('srtext', Text) ) srs.create() @@ -80,14 +80,14 @@ def setup_db(database, table, home, create_sfsql_tables=True, create_plpythonu_f LOGGER.info('Creating table geometry_columns') geom = Table( 'geometry_columns', mdata, - Column('f_table_catalog', String(256), nullable=False), - Column('f_table_schema', String(256), nullable=False), - Column('f_table_name', String(256), nullable=False), - Column('f_geometry_column', String(256), nullable=False), + Column('f_table_catalog', Text, nullable=False), + Column('f_table_schema', Text, nullable=False), + Column('f_table_name', Text, nullable=False), + Column('f_geometry_column', Text, nullable=False), Column('geometry_type', Integer), Column('coord_dimension', Integer), Column('srid', Integer, nullable=False), - Column('geometry_format', String(5), nullable=False), + Column('geometry_format', Text, nullable=False), ) geom.create() @@ -103,80 +103,80 @@ def setup_db(database, table, home, create_sfsql_tables=True, create_plpythonu_f records = Table( table, mdata, # core; nothing happens without these - Column('identifier', String(256), primary_key=True), - Column('typename', String(32), + Column('identifier', Text, primary_key=True), + Column('typename', Text, default='csw:Record', nullable=False, index=True), - Column('schema', String(256), + Column('schema', Text, default='http://www.opengis.net/cat/csw/2.0.2', nullable=False, index=True), - Column('mdsource', String(256), default='local', nullable=False, + Column('mdsource', Text, default='local', nullable=False, index=True), - Column('insert_date', String(20), nullable=False, index=True), + Column('insert_date', Text, nullable=False, index=True), Column('xml', Text, nullable=False), Column('anytext', Text, nullable=False), - Column('language', String(32), index=True), + Column('language', Text, index=True), # identification - Column('type', String(128), index=True), - Column('title', String(2048), index=True), - Column('title_alternate', String(2048), index=True), - Column('abstract', String(2048), index=True), - Column('keywords', String(2048), index=True), - Column('keywordstype', String(256), index=True), - Column('parentidentifier', String(256), index=True), - Column('relation', String(256), index=True), - Column('time_begin', String(20), index=True), - Column('time_end', String(20), index=True), - Column('topicategory', String(32), index=True), - Column('resourcelanguage', String(32), index=True), + Column('type', Text, index=True), + Column('title', Text, index=True), + Column('title_alternate', Text, index=True), + Column('abstract', Text, index=True), + Column('keywords', Text, index=True), + Column('keywordstype', Text, index=True), + Column('parentidentifier', Text, index=True), + Column('relation', Text, index=True), + Column('time_begin', Text, index=True), + Column('time_end', Text, index=True), + Column('topicategory', Text, index=True), + Column('resourcelanguage', Text, index=True), # attribution - Column('creator', String(256), index=True), - Column('publisher', String(256), index=True), - Column('contributor', String(256), index=True), - Column('organization', String(256), index=True), + Column('creator', Text, index=True), + Column('publisher', Text, index=True), + Column('contributor', Text, index=True), + Column('organization', Text, index=True), # security - Column('securityconstraints', String(256), index=True), - Column('accessconstraints', String(256), index=True), - Column('otherconstraints', String(256), index=True), + Column('securityconstraints', Text, index=True), + Column('accessconstraints', Text, index=True), + Column('otherconstraints', Text, index=True), # date - Column('date', String(20), index=True), - Column('date_revision', String(20), index=True), - Column('date_creation', String(20), index=True), - Column('date_publication', String(20), index=True), - Column('date_modified', String(20), index=True), + Column('date', Text, index=True), + Column('date_revision', Text, index=True), + Column('date_creation', Text, index=True), + Column('date_publication', Text, index=True), + Column('date_modified', Text, index=True), - Column('format', String(128), index=True), - Column('source', String(1024), index=True), + Column('format', Text, index=True), + Column('source', Text, index=True), # geospatial - Column('crs', String(256), index=True), - Column('geodescode', String(256), index=True), + Column('crs', Text, index=True), + Column('geodescode', Text, index=True), Column('denominator', Integer, index=True), Column('distancevalue', Integer, index=True), - Column('distanceuom', String(8), index=True), + Column('distanceuom', Text, index=True), Column('wkt_geometry', Text), # service - Column('servicetype', String(32), index=True), - Column('servicetypeversion', String(32), index=True), - Column('operation', String(512), index=True), - Column('couplingtype', String(8), index=True), - Column('operateson', String(2048), index=True), - Column('operatesonidentifier', String(512), index=True), - Column('operatesoname', String(512), index=True), + Column('servicetype', Text, index=True), + Column('servicetypeversion', Text, index=True), + Column('operation', Text, index=True), + Column('couplingtype', Text, index=True), + Column('operateson', Text, index=True), + Column('operatesonidentifier', Text, index=True), + Column('operatesoname', Text, index=True), # additional - Column('degree', String(8), index=True), - Column('classification', String(32), index=True), - Column('conditionapplyingtoaccessanduse', String(256), index=True), - Column('lineage', String(32), index=True), - Column('responsiblepartyrole', String(32), index=True), - Column('specificationtitle', String(32), index=True), - Column('specificationdate', String(20), index=True), - Column('specificationdatetype', String(20), index=True), + Column('degree', Text, index=True), + Column('classification', Text, index=True), + Column('conditionapplyingtoaccessanduse', Text, index=True), + Column('lineage', Text, index=True), + Column('responsiblepartyrole', Text, index=True), + Column('specificationtitle', Text, index=True), + Column('specificationdate', Text, index=True), + Column('specificationdatetype', Text, index=True), # distribution # links: format "name,description,protocol,url[^,,,[^,,,]]" diff --git a/tests/suites/apiso/data/data.db b/tests/suites/apiso/data/data.db index 4fc44665b9b652c45874f436b6322e999b0e51c3..53d0ecbe5a02d592432aeb8e1da2db16fb5f116b 100644 GIT binary patch delta 8831 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

xsoBB^L8q$KskoLi6Rd(;4#8BYx<` z$XeA^HFE94P{^5k4EsyV!#G>Rb0J#(xe=y<^o~DvS177Taq0qTg#qiOq7Nz1JtMO7 zO=tL3vptKOoMLR{l&62OQtnhDT8rm z0Ei~db6aV?>KALix~1kE&Riv&&$iTDYN7cWU(F{fnm^Y{^XJ>pyjaovMGsk)ak~R+ z+a$}EJY?xYCd-#^N|t|UlPqgx?R;diT$kM|+hQ^mdB}1hzS0s-Sqj_7Na0H{Mf>)L z6y`>ZYv~P$$ǓHHpWObwNOng;hswa>Jgq1K!AQr0r`sW-|sNi8UTFEH9Rcr0J8 zSiZ4M%Qtx}U!z$5>P;MHlNBJ@UI zLRX6`5Es`!-$3Z^-HOoP_Yit0zu@)%pf#aK(Q2P|rx|4M7in)S-3Y(tvg`LQV{o4b xgYo><5%#xv9Un_s2%Z_8TS_Pj4Mz|1f{l|BD`)`#b1xaXdG z&pqdNe&^hGTy`;d*`?qI{E8U zH9Vk##ph&_`g-}gXm$=&|{98 z9=D+4g=p4<=8mVk(w=A$3WFtp+_%Smh zE2qPeHtz#h8!eSaa!F;kQ<2|!c;xsXm-|Mh@ad6>yFz*=K6S34G4yLRcY)uJdF?cJj1wwx?6RT|9>*#TYQm**79;p$Y^*LE%KT%pof zZ8LU_c5G;<(cA5`n1{Pbg{Nv0rnt`N!XBAz)K_;c;#}Hhv|9;9rivP)Rc~`FwpnW2 z=I{osw%E0nQ^#&K8ag-b2}WKM-29c5k;0E^Q-eb&RS-TM@UQmi`s#;}JsciU9b`5Lf;p&Q@RZE#h8yyWzC4A0+ z5uG5Ct?g8m;Upj4>=9MB33kIgW39du{ay>yR(2*r7oWJTU^3hL8f}hp&tPzjo78ET zGkR{ZaAlgqGE*7zQ$p+nceBaIYD0`6Of@Rbvsq(8y7FM*edPuo%?%< z+$?e7lu#%qNza)=-n1EOdd^LUsn%FtVXQWFqfeQd>L~)U$Y}PW9f!p#r;oAPVq4tl z{;tGO*r!Hsu3peX;wU`W1CLt?D*kC|f9-^5P?^k?MsAB6j5U6Ivo$8b#eaNm!ayF| zJOr!!`PzM2K6GEN0GrVu`zwe~DAe&e`-1qM^}1xG7_qG?_fp4>vG>?J?9c2q_A1-O zwzI8N{8lhtzs8U6h@PCLW-5RV)y-E@-NrVv9i)0shw2MkZtAZ33wMoEc9k1G6{~_2M}@Wb;UY=LuWe7j(q4R;bufe}YdvV~k4u8N^-L5`-4_Mn zPA_I+SqLv~i{y{gh4Qu`I{rr804(dR45cQ9LWH86ni#;#5+kuRlt-Nz41E>l>1Tce z_y0m4UWNPrt5rv<*vITiwvH`hbJ&;cC|ks=Y&3Ou2iRV=gI&+^2&H`(ANyS&o}d0~ zRv^R06WkW%0JK3@r!MK{JSO{mWT6}=16Wn8^*uQ*Ku(+9%uF8drl|txdl4@!|50_ zMesd&*MLq&<+}VNT+o+05{E&51*N+ahYil}=dVqP2BS<rxp45q)&%}cUZ1Nc zovR4PuUEw*D*TRp!9HaB*^8`&t!7KuJT{%clg?sTAfCb_t>Nltu=U-n7`V0%O98Vb zzQ$B*awzr0e)Ukg3fm8>u3-7M_!%B1+c#nBk>Rl&wp%UK^%qu6q#Fg5U#IP1D!LAR zN>yPy;a0HOERV&pFsc%E%a%mYI>3G2+)9KDLwc z15`pqKbJvI7pCF(2phy6r&Op%gN|F0lKBmFI=(e&Fd^BJq@@h-=X(p(u97!ULF2ik zARad)3YSC^i)Zk4HXYx2CJRer_*=G8tcq3m|5Sb-UTp8r!wLoym+FDk_rm#Wy zBOb$6T#Y82gmLf#ybn~()hnQN+sdKHx2;S_aRz6DjFE$c?tN?vdzO9AzGi=CpHMGw zgzYB8KfyLobRCRuoPArmKSPLE@#~`c8ID&p_+1jl34s=P*R%2op92IBY?Y$1ygL=^ zqgXECKQlWmBPT60cUor7=&TW=vvY3^^CbxNCFt!-5aLS^9L4H;-o2MEl^|b&Kwp9Y zUjmIRsPF0Q{=QWFdzksmi1utB2pNjJxjhogQ>daRL8dZrqB&_0<+j^PDFXk`?bMg67-yH*MRuB> zn@Q)4Vtm3!FXr@O(Lk+<-fnc2xL@yJ+^ZrwI!2prC2m+j6f~E%8_5z_7+%KH#1DJP z;6`k1yEheh+r1GkgMZfSuH%JmQ5xr40d8&^$e*(f zK-18UZf!^e|7#m{YeSN-B$dz?$q$_khFk?<-<*xYvNWZf6%GmIgW7fL@&kDNkVsrK zjP6QWekviHFKLgb-x;_do!?(LjK9~e293LZOSlLX1VKU+35}qJXH(>*9ISX6w zF0BTBvQ+EZ@~JCjyXW2Et)gyQUPa;|SK%w{efBJVN!D@p8Cm@R*<8YgGaVth9b3rS z`Pll4=DEQ;KQ2yDuSbpxz ze5}bKx*ZB*Nf68bVND3g)o8~=LqiCkb2gINx85*L(UDuPuL=ePE*P%SP9(XG*X8x) zW9<{ zcQwq^Eoait|2y>tD!n$nU6~|>$DhDzzFaFjuzXlaLXaVQxsKm0muk~CRx8K6ki z&mfb#Y!PJ3L0P$2Qjdh6SimhKM^$83RT;#ZIdGjc5j!%Om z2D7A_0&oWtU(AL8aUlxE%GTT}(%**V;_YB866O%pNf*l?g28NQ>=D?9A~*uS5xWd< zBP-Jz#9F`@XxRcl$Y|>Xn zFbAZ$f$#{*E7-+^X@sYa45vd1nm4`^x6{PI_X*%3``}xk9H_etmv>OsGgu(nG70Wq z&VWAMQcX_#p#XP?hMn+=pp5@odhu;2M9snu;_J-&qZ(N3ipI$vqH(8pG?sLaMja9r zos_BQE{|yZ?n=>E>Ws#DIU4oe(fB`^iW;PiHUhpV0PKRvM#WioOD&V3obva594#IU zgc%|n7%>k`MP zrKx@KV1PG}?pE^yEKn?t!7<`gEY9g^#(f7^K*x+eaXrrPTSf=E-{qAQFR!fn*G@u!|KVqw{;<306wrJ* zpu)rSMmN)&x|=>zHhsO9>CHY&pDUZb(aD z--Se(Ph{t28!|E~oRql?pYQ|}(SDQ&U5N?m9S2xQ2WA{Ad&G?TPi@J;;)hzePPE+T zHAAT%e-xSbqi5lfC4L(SZ%;W-zDhp%(>_nW$$9dJ1J4Nv) zI8mB%3}0rjOVoXd{iOjP`j6dQ=4vk6ycvC8cScw0>yJqFwcUf!U%L{czwTu807i`dhBu>!vOo0L^}H$G zh-9ANb2TqveymJ@;TbnAqJJtFXJp9p+MQl~OP;Gt33xrW@4 MRZawEu$`KJ15SWBYXATM diff --git a/tests/suites/cite/data/records.db b/tests/suites/cite/data/records.db index 44c592965920eb625948ae8dcb37c7f839a4c789..37bb127caf2417cfa3a528985c5037c4a6763e3e 100644 GIT binary patch delta 5847 zcmdT|3vg8B6~6y}HtZt_NyuX#dF(<$9)wNy5m2Z=1VpR}Pl;?2jhoHQvSqWI-rXQE zRPvyX)Q$#EA=nx12vQqjs~Cm)=wpUbv}l1uTOB);fj(fWwiJ_0hfb&G-pytcLma@V zLo=H@d(Y$l&wtK$9{;v?$F)Bi*KJN&E5!b8p|7f4Hm7lR9DSPx=VaC*xB|m)2|k9u z!nytwjSn)Nr9>|*q(_dK9_e~|=#uE6iF;WUuVHKY6B5qA{M9-l-L0j^UDN2XQeN~< zl}t=vy#j3J-(B6{!e!Y`kZ# zMW+q>!hW&N?GKAmz#SGX_l(lr^`Wrj_Jqd>o5j`#gHl6i5+U5$98trw+3DM(`jY5( zhke1on0VONB-Yi7Uf<_PVxS==6KwW*$O>;zY8@j=Vkp=md1$?Wx5e#^ndp&3cQ`1G z2{yOX`<=efCNW0x1Os8oSKl&TEGT*10pCM0>u^2(iWdbl;gKWlqT34Y!;=77I}g#&3<3N zI~Hx(%!nApClXV9EW=nHT|LHgH^pMsAbKS+_UiGwLm@gO1wHB*Wcs{{=pwYEI6mZr zg=Pwkuih^ESF-qVx$a^k=-0sajm@K5*z zF2H#>10TYBa1wq4$0#=s04_R_go6cz832Mdku>6j`vu{Cmc&=V1Mmc-%wGZEBcNa)cVX!h9VYa-Lhr^S4nOPZ6NCY zF+G_R@@x{D+=^Ew(3={@p$boC86$gN&RU)oJ(jaXV; zH0t5jh=&K^1$Z9z!69gcV}S5y_<%g@0^IsoS3%UfI$@?jpH|@?Yy*3p8+a4{1gnKmjD@P$qPzWD6 zbeQBcaE}%*o-SmG3h`{$G_(z5@md|)%o+G_M-ra18S#f5IedLQKK0owTwyojd!HHj zngl$PlYy&G$FpQSJ#57A>2&T(#3v5wNlk;_>Wyb9%9_vi=JUqsSTSV4ZG$?^sHrm) zrEP<`+@FMNH|p`+KpIO`h{=Nm*9XTu*+L{ze(e19W72XD0S`?fHJapQGEBnfLZ5kzl9?g#F%&2IraO7}*x`Nm~XBxiZGGX$d3SV++ zFvB$?KHAla{27YOo5N|CUTwt3hctL;*urb|a$?0P^8mJ2=i=L^b8c#|R|?b(&J(zg z!C|UcdtoO$1e*!+m4rDfV8yZnC5bRo>j^!$aGg?xzB;%qmTT!TO1(E=2W*FxunZPM zC3UNvWLu7$4?n+taE^l-3IZ|{lh{SRmLCQy>?NqRL5GSe*@zQ)jf}Nhc@-gpDsiNV zjFvaE0+uT_s>CLx68~@lAn+oGyMZ7VSYGM(aNkj|o8Oq|GEbMFd@Rn>v;lz+0 zogGHJGE~BSIZ9nEcc!vDWnsUQYN{DiM~YC@X~a1r@%X@qF#;r>F2D!yB0K{3QFg@h zbNn^l&AogvPp9d3i1nwi{wo90X}+XAXfu=tv~2-`{lt?E9@5NbD6DWFR&}z$NvJiE1jT?*IKB=&c<%a zi-0+Y*UnT%nQe|FR-ok0HirgZaAa`TEQH=XJlPKo@*Wh3pfK32lEYO9iX;=&qK)(dR9qUu+Ts;g+WV z@z9hL#h+GKB(Mv-o*$*^zL$jwj(q~*MMd|pTdCp|W9pC*lb9QjyQBzXGXK) zHia!`#gjFoBhOa>2H{oZ=FWq{C1IF{!6>}S-hpm*KTjj~?e2f&dw0V1mn)SVn8O;j zSd}<_ys-Cl|=Uo0;s)oA^a?_MWX8+OK;F3$j&v%Gv8| cZO@~ delta 6046 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 delta 2858 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