[GRASS-dev] Re: [GRASS GIS] #809: v.db.addtable consistently fails
in winGrass
GRASS GIS
trac at osgeo.org
Wed Jan 6 07:33:48 EST 2010
#809: v.db.addtable consistently fails in winGrass
------------------------------+---------------------------------------------
Reporter: JonBall | Owner: grass-dev at lists.osgeo.org
Type: defect | Status: new
Priority: critical | Milestone: 6.4.0
Component: Vector | Version: svn-releasebranch64
Resolution: | Keywords: v.db.addtable, wingrass
Platform: MSWindows Vista | Cpu: x86-64
------------------------------+---------------------------------------------
Comment (by hamish):
Hamish:
> hmm, there is still a quoting bug in v.to.db called by
> v.db.addtable:
...
> ah, here we go: Line 634 of lib/vector/Vlib/field.c scanning
> the dbln file does not like spaces in the db path string-
>
{{{
ndef = sscanf(buf, "%s %s %s %s %s", fldstr, tab, col, db, drv);
}}}
> note you have to be using layer 2 or greater to see this.
I'm guessing G_tokenize(buf, ' ') + the same approach taken by the wxGUI
for this some weeks ago and pull off db as tokens 4 to (ntok-1) and then
drv with the last of G_number_of_tokens()?
I suppose a similar thing could be done with strrchr() to chop the drv off
the string first, set strrchr() to '\0', then to get db go back and read
{{{ %[^\n] }}} to the end of the remaining line?
any recommendations from C string parsing experts?
Replying to [comment:8 mmetz]:
> I think this is a bug. v.db.addtable should always use the
> default, unparsed database connection settings because there
> is no database option in v.db.addtable.
note that layer 2 parsing is done by libvect (called by v.to.db) doing the
damage here as it scans through the layers, if the shell script does
expansion or not, it is more general & will fail with any dbln with a
space in the path. the script expansion just makes this bug be triggered
more often.
{{{
# finally we have to add cats into the attribute DB to make modules such
as v.what.rast happy:
# (creates new row for each vector line):
}}}
what you mention here is a secondary "feature" (which probably doesn't
help) who's main draw back is that it makes the vector map less portable.
> If a table already exists in layer 1 and a new table is to
> be added for another layer, v.db.addtable uses the definition
> for layer 1 as returned by v.db.connect -g which parses
> "$GISDBASE/$LOCATION_NAME/$MAPSET/dbf/". Suggested fix would be
> to always use the default unparsed database connection,
> i.e. skip the check in v.db.addtable lines 119 - 136 (grass64).
hmmm ok;
{{{
g.copy v=roads,myroads
v.db.addtable myroads layer=2 col="left integer, right integer"
dbln:
1 myroads cat $GISDBASE/$LOCATION_NAME/$MAPSET/dbf/ dbf
2 myroads_2 cat /home/hamish/grassdata/spearfish60/user1/dbf/ dbf
}}}
if a layer 1 exists* it uses the default mapset/VAR values from
db.connect, see lines 124-125 and 131-132. it only reuses (&expands) layer
1's DB path definition on line 128. A secondary question is should the new
layer prefer to use the mapset's default DB or the map's existing layer 1
DB? I don't know the answer to that, I think we just have to pick one.
Is there a command print the unexpanded version or do we just resort to
raw parsing of the dbln file to get it?
[*] (is it possible for there to be no layer 1 but do have a layer >1? if
so will that cause problems for this script?)
Hamish
--
Ticket URL: <https://trac.osgeo.org/grass/ticket/809#comment:9>
GRASS GIS <http://grass.osgeo.org>
More information about the grass-dev
mailing list