From aca75cfa6e16c021882f395844780d78670652e7 Mon Sep 17 00:00:00 2001 From: Nyall Dawson Date: Sun, 8 Apr 2018 09:58:06 +1000 Subject: [PATCH] [processing][grass] Fix use of v.external with ogr layers which do not support random read These layers are not compatible with v.external, so we have to use v.in.ogr for them --- .../processing/algs/grass7/Grass7Algorithm.py | 12 +++++ .../testdata/expected/grass7/buffer_lines.dbf | Bin 0 -> 125 bytes .../testdata/expected/grass7/buffer_lines.prj | 1 + .../testdata/expected/grass7/buffer_lines.shp | Bin 0 -> 6132 bytes .../testdata/expected/grass7/buffer_lines.shx | Bin 0 -> 148 bytes .../grass7_algorithms_vector_tests.yaml | 43 ++++++++++++------ 6 files changed, 42 insertions(+), 14 deletions(-) create mode 100644 python/plugins/processing/tests/testdata/expected/grass7/buffer_lines.dbf create mode 100644 python/plugins/processing/tests/testdata/expected/grass7/buffer_lines.prj create mode 100644 python/plugins/processing/tests/testdata/expected/grass7/buffer_lines.shp create mode 100644 python/plugins/processing/tests/testdata/expected/grass7/buffer_lines.shx diff --git a/python/plugins/processing/algs/grass7/Grass7Algorithm.py b/python/plugins/processing/algs/grass7/Grass7Algorithm.py index 06545bc1529..4e65153499f 100644 --- a/python/plugins/processing/algs/grass7/Grass7Algorithm.py +++ b/python/plugins/processing/algs/grass7/Grass7Algorithm.py @@ -63,6 +63,7 @@ from qgis.core import (Qgis, QgsProcessingUtils, QgsVectorLayer) from qgis.utils import iface +from osgeo import ogr from processing.core.ProcessingConfig import ProcessingConfig @@ -786,6 +787,17 @@ class Grass7Algorithm(QgsProcessingAlgorithm): if external is None: external = ProcessingConfig.getSetting( Grass7Utils.GRASS_USE_VEXTERNAL) + + # safety check: we can only use external for ogr layers which support random read + if external: + ds = ogr.Open(layer.source()) + if ds is not None: + ogr_layer = ds.GetLayer() + if ogr_layer is None or not ogr_layer.TestCapability(ogr.OLCRandomRead): + external = False + else: + external = False + self.inputLayers.append(layer) self.setSessionProjectionFromLayer(layer) destFilename = 'vector_{}'.format(os.path.basename(getTempFilename())) diff --git a/python/plugins/processing/tests/testdata/expected/grass7/buffer_lines.dbf b/python/plugins/processing/tests/testdata/expected/grass7/buffer_lines.dbf new file mode 100644 index 0000000000000000000000000000000000000000..d8e26c3d66be247a05f380e96a77db55f31365bc GIT binary patch literal 125 tcmZQBV_|1wU|?`$-~y6pAe@0AIk5yL=m%nO!gx@cR{;hLVGISLSpWnY3ayR=S&)1(H%)OB|)8_h=cR!GdYp6!}So8V$)*7ze3f z9e)rCww;1Qh>3;rk0A+^4!;t4uUHuyY)K0V9nh9hQ_&`{8wV88#Lb@bov@)h!(<-s z-FwgXouBWVYguD5tWW%n_|L^#ENf`;U0rS8FX6rYhrXZf-=F%$=$olukUnvF`hO0x ztifOJ-^-D;J!aru$q%hZWG$Z;A^vO0-w5$*oANq?mmhpPLZ5%GgR(BZTk58`&Yf*8llfD7`64O88&t9=sxqS(-Aq_rfcWA=FC4Ep|5mp*wXl% zO_K)AJ$3SYghJO}KHj<(&w2FX|EA8bm=>g_DRpPhT*#x5Meel8#X;WZqdXe7Kc{rh ztROAhwcM%b%%cLkrn{~zNY``Af9ZASQO$uLZj9}Jvt$|eqYAB6UGGTJIxzx`px(H_J6N2zQ=^{y{(>@n=0D3yM=t#JLy9>e~N(vES%OXn=H5KbAg{j`pi5!bhmteCB>sdJ7quS(b4mmM@Q{p9v!upd32~%@FWhL zKXiPLqj=9w@2D@{&h^vQF5im!;81ZzVdLC=$@Qr?bLffN z?&&D}jYZ&ZeAV^G-}{|K;J0#S9Cmr#roZ3+?VLm2oq@B&+e@#ZGVXoB30`SK_AW z*wm`ABf6yS#!Yis{>+yqb$PYt#y|YEYjN}9-aj21wY1B-@9OB4TOtYbYPNr+xw*@G zVC=fPu1rao)}rmp9?iVuZEdZbb!0)pd@DulC2#j#b6cvGC(P<+cR%~%6PLU>?N{r! zzmPDE=COm<3NCwXn`S*9+K@1jk(G^E)t7-$;x(@C7cmZ9pU*gS{|6a|p3mIG)xKXa z4z>SY#-aEoF%HEqIFuj3q5REe93J>R!#F(lL7ek7sblgCT=?F@_u>x^`-wk*3-$mP z?Db%;_`?Gp@rMVzzyUsh1AK`;Jn$+0@W3}>4mj{0{=$0r6Z^y8I3Mu<`w%a%AMqsd z<{{o-H{uceG)laJKg6^6!$Z8oZsZF5bHj78^BBCgFVDCZNUg0sBHY`Oqc-*B*-YL* zzm-R=v#39)!>B)~)2KhFMHlSqsZbRs@Lg*~D=dkos!VpEv$v-sXJ)sjta?>*e*& z^t1$s@!9nI6*&!4Is(M_Y_*&HY^&XPkG>7-(YG;ww&D0IxlU@mSh_;F`2WI^&aE1 zD3ofX_Ik*pTc7SN4&}V=AvnsxCO_Ax}4F9N*Er^N@!;ZYY1| z)uLY?_K@d~bglXB>iI{c&RY_rF zAL_|&!4JP|5Ps0dH3@&{^FqQeY9II?@Z6VAL(q?)Hn7h+4SyRH>aO&MCKX<_0ksEp8}_2E0}txH=)FnTg-Zsy0luIs;1jw7z7c!y z2j0V9SPy?GNG4|@9K`(!I} zW8WV}|KT%s7h3J#oM-*-c>Z&t+dj{SE(t$A&yOw%KYr@`+g%cVe4amD=(f-EsY}9- z&-1HG!jI4Mtqa}udH!{w+dj|7E_B=H`QC+YD>mUr-;0judeIr(Uvx;%=UQZ|eWGJ( zzv!Ie6CG6iqLa#x=&151I_ra9(QTjYcGXw>e1|^s{1=99`#c|p(ZBdSKZeoY_#B^M z^dCOYpJDVzKF_CN^iMv|uVM68KF_yd^f5lqzhU%eKF`Nt^lv`T&tddQ%tvjQ7>BLz zC7yM?#Jlb<`Jm@ZAE)*qUSL1s3HT%*6+hw;{2*SzAL1GONE;th`c2CWG+EJU_bPQ^*^L}!1@`|JYjo6nn&DUgf!1m z?NClg^N{s3qGwFc