[GRASS-dev] [GRASS GIS] #2627: v.out.postgis uses wrong database name or port

#2627: v.out.postgis uses wrong database name or port
-------------------------------------------+--------------------------------
Reporter: wenzeslaus | Owner: grass-dev@…
     Type: defect | Status: new
Priority: normal | Milestone: 7.1.0
Component: Default | Version: svn-trunk
Keywords: PostgreSQL, postgres, PostGIS | Platform: Unspecified
      Cpu: Unspecified |
-------------------------------------------+--------------------------------
After using `db.connect` and `db.login`:

{{{
db.connect driver=pg database="host=0.0.0.0,port=25432,dbname=gis"
db.login user=docker password=docker
}}}

v.out.postgis uses wrong database name or port (or both) and then fails to
connect to the database and then crashes or hangs.

In the following reports I used `g.gisenv set=DEBUG=5` but the behavior is
the same for no debug. Note the name of database in debug messages is once
"grass", then NULL and then "grass" plus some unknown/non-printable
character. It also seems that it calls the `read_file()` function twice.
Finally, it mentions 5432 before it ends.

Hangs:

{{{
D2/5: V1_open_new_pg(): name = busroutesall with_z = 0
D1/5: V1_open_new_pg(): conninfo='dbname=grass' table='busroutesall'
D3/5: db_get_login(): drv=[pg] db=[grass]
D3/5: read_file(): DB login file = </home/vpetras/.grass7/dblogin>
D3/5: ret = 4 : drv=[pg] db=[host=localhost,port=25432,dbname=gis]
usr=[docker] pwd=[docker]
D3/5: db_get_login(): drv=[pg] db=[(null)]
D3/5: read_file(): DB login file = </home/vpetras/.grass7/dblogin>
D3/5: ret = 4 : drv=[pg] db=[host=localhost,port=25432,dbname=gis]
usr=[docker] pwd=[docker]
D1/5: PQconnectdb(): dbname=grass user=docker password=docker
ERROR: Connection to PostgreSQL database failed. Try to set up
        username/password by db.login.
        could not connect to server: No such file or directory
        Is the server running locally and accepting
        connections on Unix domain socket
        "/var/run/postgresql/.s.PGSQL.5432"?
D1/5: Vect_close(): name = busroutesall, mapset = PERMANENT, format = 0,
level = 2, is_tmp = 0
D1/5: spatial index file closed
D1/5: close history file
D1/5: V1_close_nat(): name = busroutesall mapset= PERMANENT
D1/5: file_handler: PG_27099
D2/5: G_file_name(): path = /grassdata//nc_spm/postgis_test1/PG_27099
}}}

Aborted with "free(): invalid pointer":

{{{
D2/5: V1_open_new_pg(): name = busroutesall with_z = 0
D1/5: V1_open_new_pg(): conninfo='dbname=grass' table='busroutesall'
D3/5: db_get_login(): drv=[pg] db=[grass]
D3/5: read_file(): DB login file = </home/vpetras/.grass7/dblogin>
D3/5: ret = 4 : drv=[pg] db=[host=localhost,port=25432,dbname=gis]
usr=[docker] pwd=[docker]
D3/5: db_get_login(): drv=[pg] db=[(null)]
D3/5: read_file(): DB login file = </home/vpetras/.grass7/dblogin>
D3/5: ret = 4 : drv=[pg] db=[host=localhost,port=25432,dbname=gis]
usr=[docker] pwd=[docker]
D1/5: PQconnectdb(): dbname=grass user=docker password=docker
ERROR: Connection to PostgreSQL database failed. Try to set up
        username/password by db.login.
        could not connect to server: No such file or directory
        Is the server running locally and accepting
        connections on Unix domain socket
        "/var/run/postgresql/.s.PGSQL.5432"?
D1/5: Vect_close(): name = busroutesall, mapset = PERMANENT, format = 0,
level = 2, is_tmp = 0
D1/5: spatial index file closed
D1/5: close history file
D1/5: V1_close_nat(): name = busroutesall mapset= PERMANENT
D1/5: file_handler: PG_27257
D2/5: G_file_name(): path = /grassdata//nc_spm/postgis_test1/PG_27257
dbmi: Protocol error
* Error in `v.out.postgis': free(): invalid pointer: 0x00007f6fed3977e8 *
Aborted (core dumped)
}}}

Segmentation fault:

{{{
D2/5: V1_open_new_pg(): name = busroutesall with_z = 0
D1/5: V1_open_new_pg(): conninfo='dbname=grass' table='busroutesall'
D3/5: db_get_login(): drv=[pg] db=[grass]
D3/5: read_file(): DB login file = </home/vpetras/.grass7/dblogin>
D3/5: ret = 4 : drv=[pg] db=[host=localhost,port=25432,dbname=gis]
usr=[docker] pwd=[docker]
D3/5: db_get_login(): drv=[pg] db=[(null)]
D3/5: read_file(): DB login file = </home/vpetras/.grass7/dblogin>
D3/5: ret = 4 : drv=[pg] db=[host=localhost,port=25432,dbname=gis]
usr=[docker] pwd=[docker]
D1/5: PQconnectdb(): dbname=grass user=docker password=docker
ERROR: Connection to PostgreSQL database failed. Try to set up
        username/password by db.login.
        could not connect to server: No such file or directory
        Is the server running locally and accepting
        connections on Unix domain socket
        "/var/run/postgresql/.s.PGSQL.5432"?
D1/5: Vect_close(): name = busroutesall, mapset = PERMANENT, format = 0,
level = 2, is_tmp = 0
D1/5: spatial index file closed
D1/5: close history file
D1/5: V1_close_nat(): name = busroutesall mapset= PERMANENT
D1/5: file_handler: PG_27267
D2/5: G_file_name(): path = /grassdata//nc_spm/postgis_test1/PG_27267
dbmi: Protocol error
Segmentation fault (core dumped)
}}}

Similar applies to the case when v.out.postgis is used without `db.login`.
Sometimes in hangs, sometimes it segfaults:

{{{
v.out.postgis -l input=busroutesall output="PG:dbname=grass"
ERROR: Connection to PostgreSQL database failed. Try to set up
        username/password by db.login.
        could not connect to server: No such file or directory
        Is the server running locally and accepting
        connections on Unix domain socket
        "/var/run/postgresql/.s.PGSQL.5432"?
dbmi: Protocol error
Segmentation fault (core dumped)
}}}

Same as in #2626, I hope I'm not missing something, e.g. from manual or
messages. The special thing about my environment is that I'm using
PostgreSQL database in a Docker container from kartoza/postgis. I used
their steps to run it and psql works for me (in GRASS session):

{{{
psql -h localhost -U docker -p 25432 -l
}}}

--
Ticket URL: <http://trac.osgeo.org/grass/ticket/2627&gt;
GRASS GIS <http://grass.osgeo.org>