Server QGIS che invia AGGIORNAMENTO ... DOVE NULL a Postgis in un livello WFS


9

Sto eseguendo un server Windows Server 2012.

PostgreSQL 9.3.5, 64 bit

POSTGIS 2.1.3

Server QGIS 2.6.1-2

QGIS Desktop 2.8.3 e 2.12

Sto usando un tablet Microsoft Surface Pro 4 usando QGIS Desktop 2.12 per modificare alcuni livelli memorizzati nel database Postgresql. I livelli nel tablet sono livelli WFS forniti da QGIS Server.

Quando modifica toogle dopo aver inserito alcuni dati nel layer per forzare l'invio e la memorizzazione dei dati nel server, a volte l'aggiornamento non viene eseguito nel database.

Vedo che la richiesta POST http arriva al server ok, ma a volte non riesco a vedere un commit (aggiornamento) nel database e altre volte funziona bene e fa il commit.

Nei log di QGIS Server posso vedere (ho aggiornato i dati di 3 funzionalità in QGIS Desktop):

//QGIS SERVER RECEIVED HTTP POST FROM QGIS DESKTOP

[4852][11:11:19] ********************new request*************** [4852][11:11:19] remote ip: 192.168.144.20 [4852][11:11:19] CONTENT_TYPE: text/xml [4852][11:11:19] HTTP_USER_AGENT: Mozilla/5.0 QGIS/2.8.2-Wien [4852][11:11:19] MAP:D:\OSGeo4W\apps\qgis\bin\alumbrado\alumbrado.qgs
[4852][11:11:19] REQUEST:Transaction
[4852][11:11:19] REQUEST_BODY:<Transaction xmlns="http://www.opengis.net/wfs"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" version="1.0.0"
service="WFS" xsi:schemaLocation="http://www.qgis.org/gml
http://eudala2.getxo.net/qgis/qgis_mapserv.fcgi.exe?map=D:\OSGeo4W\apps\qgis\bin\alumbrado\alumbrado.qgs&amp;SERVICE=WFS&amp;VERSION=1.0.0&amp;REQUEST=DescribeFeatureType&amp;TYPENAME=getxo_alumbrado_arquetas_registros_cajas&amp;SRSNAME=EPSG:23030"
xmlns:gml="http://www.opengis.net/gml"><Update
xmlns="http://www.opengis.net/wfs"
typeName="getxo_alumbrado_arquetas_registros_cajas"><Property
xmlns="http://www.opengis.net/wfs"><Name
xmlns="http://www.opengis.net/wfs">id_modelo</Name><Value
xmlns="http://www.opengis.net/wfs">0</Value></Property><Property
xmlns="http://www.opengis.net/wfs"><Name
xmlns="http://www.opengis.net/wfs">alumbrado</Name><Value
xmlns="http://www.opengis.net/wfs">t</Value></Property><Filter
xmlns="http://www.opengis.net/ogc"><FeatureId
xmlns="http://www.opengis.net/ogc"
fid="getxo_alumbrado_arquetas_registros_cajas.3"/></Filter></Update><Update
xmlns="http://www.opengis.net/wfs"
typeName="getxo_alumbrado_arquetas_registros_cajas"><Property
xmlns="http://www.opengis.net/wfs"><Name
xmlns="http://www.opengis.net/wfs">id_modelo</Name><Value
xmlns="http://www.opengis.net/wfs">0</Value></Property><Property
xmlns="http://www.opengis.net/wfs"><Name
xmlns="http://www.opengis.net/wfs">alumbrado</Name><Value
xmlns="http://www.opengis.net/wfs">t</Value></Property><Filter
xmlns="http://www.opengis.net/ogc"><FeatureId
xmlns="http://www.opengis.net/ogc"
fid="getxo_alumbrado_arquetas_registros_cajas.4"/></Filter></Update><Update
xmlns="http://www.opengis.net/wfs"
typeName="getxo_alumbrado_arquetas_registros_cajas"><Property
xmlns="http://www.opengis.net/wfs"><Name
xmlns="http://www.opengis.net/wfs">tipo</Name><Value
xmlns="http://www.opengis.net/wfs">A</Value></Property><Property
xmlns="http://www.opengis.net/wfs"><Name
xmlns="http://www.opengis.net/wfs">tipo_tapa</Name><Value
xmlns="http://www.opengis.net/wfs">B</Value></Property><Property
xmlns="http://www.opengis.net/wfs"><Name
xmlns="http://www.opengis.net/wfs">estado</Name><Value
xmlns="http://www.opengis.net/wfs">D</Value></Property><Property
xmlns="http://www.opengis.net/wfs"><Name
xmlns="http://www.opengis.net/wfs">p_tierra_tipo_electrodo_tierra</Name><Value
xmlns="http://www.opengis.net/wfs">O</Value></Property><Property
xmlns="http://www.opengis.net/wfs"><Name
xmlns="http://www.opengis.net/wfs">p_tierra_tipo_union_electrodo_tierra</Name><Value
xmlns="http://www.opengis.net/wfs">N</Value></Property><Property
xmlns="http://www.opengis.net/wfs"><Name
xmlns="http://www.opengis.net/wfs">p_tierra_estado_union_tierra</Name><Value
xmlns="http://www.opengis.net/wfs">D</Value></Property><Property
xmlns="http://www.opengis.net/wfs"><Name
xmlns="http://www.opengis.net/wfs">tipo_intervencion</Name><Value
xmlns="http://www.opengis.net/wfs">OTR</Value></Property><Property
xmlns="http://www.opengis.net/wfs"><Name
xmlns="http://www.opengis.net/wfs">m_codcalle</Name><Value
xmlns="http://www.opengis.net/wfs">20</Value></Property><Property
xmlns="http://www.opengis.net/wfs"><Name
xmlns="http://www.opengis.net/wfs">id_modelo</Name><Value
xmlns="http://www.opengis.net/wfs">0</Value></Property><Property
xmlns="http://www.opengis.net/wfs"><Name
xmlns="http://www.opengis.net/wfs">alumbrado</Name><Value
xmlns="http://www.opengis.net/wfs">t</Value></Property><Filter
xmlns="http://www.opengis.net/ogc"><FeatureId
xmlns="http://www.opengis.net/ogc"
fid="getxo_alumbrado_arquetas_registros_cajas.5"/></Filter></Update></Transaction>
[4852][11:11:19] SERVICE:WFS
[4852][11:11:19] SRSNAME:EPSG:23030
[4852][11:11:19] VERSION:1.0.0
[4852][11:11:22] Request finished in 2977 ms

Ok, quando guardo nei log di PostgreSQL vedo che l'aggiornamento ha una clausola WHERE NULL, che non aggiorna nulla ..

//POSTGRESQL UPDATE QUERIES
2016-01-29 11:11:22 CET LOG:  00000: sentencia: UPDATE "public"."getxo_alumbrado_arquetas_registros_cajas" SET "id_modelo"=0,"alumbrado"='t' WHERE NULL
2016-01-29 11:11:22 CET UBICACIÓN:  exec_simple_query, src\backend\tcop\postgres.c:890
2016-01-29 11:11:22 CET LOG:  00000: sentencia: UPDATE "public"."getxo_alumbrado_arquetas_registros_cajas" SET "id_modelo"=0,"alumbrado"='t' WHERE NULL
2016-01-29 11:11:22 CET UBICACIÓN:  exec_simple_query, src\backend\tcop\postgres.c:890
2016-01-29 11:11:22 CET LOG:  00000: sentencia: UPDATE "public"."getxo_alumbrado_arquetas_registros_cajas" SET "tipo"='A',"tipo_tapa"='B',"estado"='D',"p_tierra_tipo_electrodo_tierra"='O',"p_tierra_tipo_union_electrodo_tierra"='N',"p_tierra_estado_union_tierra"='D',"tipo_intervencion"='OTR',"m_codcalle"='20',"id_modelo"=0,"alumbrado"='t'
WHERE NULL

Nei dati POST vedo che il server QGIS sa quale funzione deve essere aggiornata usando il numero "fid" interno. Il mio livello, d'altra parte, ha il campo "id" come chiave primaria. Da qualche parte quando esegue il mapping da QGIS fid interno all'ID del mio livello si perde e aggiunge WHERE null alla query invece di aggiungere dove id = 1510.

La cosa divertente è che hanno lavorato per 40 giorni e hanno avuto questo problema solo una volta, ma dalla scorsa settimana hanno avuto questo problema ogni giorno ... Da allora a volte funziona e a volte no. Rispedisco la richiesta POST http dal client ysing proxy Fiddles e lo stesso post HTTP a volte funziona e altre volte no.

L'ho provato in QGIS Desktop 2.8, 2.10 e 2.12 e succede in tutti loro (credo che il server QGIS sia 2.6.1). L'ho anche testato con diversi strati con lo stesso risultato.

Non so se c'è un bug o c'è qualche tipo di configurazione nel layer che non sto facendo correttamente nel server ...


AGGIORNAMENTO 03/03/2016

Ho aggiornato a QGIS Server e QGIS Desktop a 2.12.3 entrambi e il problema persiste.

Dopo molti giorni di test ho finalmente scoperto quando si verifica il problema. Accade quando salvo le modifiche del layer in QGIS (tramite WFS-T) e allo stesso tempo una Lizmap Map viene caricata da un altro utente. Lizmap utilizza anche qgis-server.

Sembra che quando si carica una mappa, Lizmap rende occupato il server e quando viene ricevuta una richiesta di aggiornamento WFS-T, il server QGIS non è in grado di costruire correttamente la query SQL UPDATE. Esempio:

Se è presente un caricamento Lizmap al momento della ricezione del post WFS-T, la query PostgreSQL generata nel server qgis è:

2016-03-03 11:47:30 CET LOG:  00000: sentencia: UPDATE "public"."getxo_alumbrado_tendido_canalizacion" SET "diametro"='22' WHERE NULL

D'altra parte, se qgis-server non sta fornendo dati a una Lizmap in caricamento quando arriva WFS-T, la query PostgreSQL generata è:

2016-03-03 11:46:21 CET LOG:  00000: sentencia: UPDATE "public"."getxo_alumbrado_tendido_canalizacion" SET "diametro"='111' WHERE "id"::text='1' 

Nota la differenza nella clausola where. Il primo non fa nulla. Il secondo funziona bene.

Non so se posso mettere a punto Apache o qualsiasi file di configurazione per qgis-server per risolvere questo problema.

Ho provato a dare molto più hardware al server (4 core e 16 GB di RAM) senza chnage.


Sto effettuando tutti gli aggiornamenti software usando OSGEO4W. Ho letto da qualche parte che i pacchetti Apache e PHP non sono stati aggiornati per anni. Proverò ad aggiornarli manualmente e verificherò che la versione di Apache o PHP non sia la causa del problema.


AGGIORNAMENTO 16/03/2016

Ho aggiornato i pacchetti Apache e PHP e il problema persiste. Dopo diversi test ho scoperto che se si salvano le modifiche all'edizione (tramite WFS) mentre sto caricando una Lizmap Map, il salvataggio fallisce, ma altre volte continuano a fallire anche se non c'è il caricamento di Lizmap (su un volume inferiore). Si tratta di un problema nel server QGIS (qgis_mapserv.fcgi.exe).


Puoi mostrare i log del server QGIS quando funziona? Suppongo che abbiano lo stesso aspetto, ma dobbiamo confermare tale presupposto.
alexGIS

@alexGIS Sì, sono uguali. Ho scritto una risposta con la soluzione al problema. Grazie per l'aiuto!
Egidi,

Risposte:


7

Alla fine, Matthias Kuhn , uno degli sviluppatori di QGIS, mi ha dato la chiave.

La clausola WHERE viene creata controllando il tipo di chiave primaria della tabella. Esso dovrebbe essere un intero e in alcune delle mie tabelle ho visto che il tipo era numerico (8,0).

Quelle tabelle e chiavi primarie sono state create da un'app di terze parti qualche tempo fa.

Ho cambiato il tipo in Integer e tutti i test che ho fatto da allora hanno funzionato (ho fatto più di 100 test di edizione tramite WFS, abbastanza secondo me per concludere che il problema è stato risolto)

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.