QGIS Server envoie UPDATE… WHERE NULL aux postgis dans une couche WFS

9

J'utilise un serveur Windows Server 2012.

PostgreSQL 9.3.5, 64 bits

POSTGIS 2.1.3

QGIS Server 2.6.1-2

QGIS Desktop 2.8.3 et 2.12

J'utilise une tablette Microsoft Surface Pro 4 à l'aide de QGIS Desktop 2.12 pour modifier certaines couches stockées dans la base de données Postgresql. Les couches de la tablette sont des couches WFS servies par QGIS Server.

Lorsque je modifie Google après avoir inséré des données dans la couche pour forcer l'envoi et le stockage des données sur le serveur, parfois la mise à jour n'est pas effectuée dans la base de données.

Je peux voir que la requête http POST arrive sur le serveur ok, mais parfois je ne peux pas voir un commit (mise à jour) dans la base de données et d'autres fois cela fonctionne bien et fait le commit.

Dans les journaux de QGIS Server, je peux voir (j'ai mis à jour les données de 3 fonctionnalités dans 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, quand je regarde dans les journaux PostgreSQL, je peux voir que la mise à jour a une clause WHERE NULL, qui ne met à jour rien ..

//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

Je peux voir dans les données POST que QGIS Server sait quelle fonctionnalité doit être mise à jour à l'aide du numéro de "fid" interne. Ma couche, d'autre part, a le champ "id" comme clé primaire. Quelque part, quand il fait le mappage de la fidélité interne QGIS à l'ID de ma couche, il se perd et ajoute WHERE null à la requête au lieu d'ajouter where id = 1510.

Le plus drôle, c'est qu'ils travaillent depuis 40 jours et qu'ils n'ont eu ce problème qu'une seule fois, mais depuis la semaine dernière ils ont eu ce problème tous les jours ... Depuis, ça marche parfois et parfois pas. Je renvoie la demande http POST du client ysing Fiddles proxy et le même post HTTP fonctionne parfois et d'autres fois non.

Je l'ai testé dans QGIS Desktop 2.8, 2.10 et 2.12 et cela arrive dans tous (QGIS Server est 2.6.1 je pense). Je l'ai également testé avec différentes couches avec le même résultat.

Je ne sais pas s'il y a un bug ou s'il y a une sorte de configuration sur la couche que je ne fais pas correctement sur le serveur ...


MISE À JOUR 03/03/2016

J'ai mis à jour QGIS Server et QGIS Desktop vers 2.12.3 à la fois et le problème persiste.

Après plusieurs jours de tests, j'ai finalement trouvé le problème. Cela se produit lorsque j'enregistre les modifications de la couche dans QGIS (via WFS-T) et en même temps qu'une carte Lizmap est chargée par un autre utilisateur. Lizmap utilise également qgis-server.

Il semble que lors du chargement d'une carte, Lizmap rend le serveur occupé et lorsqu'une demande de mise à jour WFS-T est reçue, QGIS Server n'est pas capable de générer correctement la requête SQL UPDATE.

S'il y a un chargement Lizmap au moment de la réception de la publication WFS-T, la requête PostgreSQL générée dans qgis-server est:

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

D'un autre côté, si qgis-server ne sert pas de données à un Lizmap de chargement lorsque le WFS-T arrive, la requête PostgreSQL générée est:

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

Notez la différence dans la clause where. Le premier ça ne fait rien. Le second fonctionne bien.

Je ne sais pas si je peux régler Apache ou tout fichier de configuration pour qgis-server pour résoudre ce problème.

J'ai essayé de donner beaucoup plus de matériel au serveur (4 cœurs et 16 Go de RAM) sans chnage.


Je fais toutes les mises à jour logicielles en utilisant OSGEO4W. Je lis quelque part que les packages Apache et PHP n'ont pas été mis à jour depuis des années. Je vais essayer de les mettre à jour manuellement et vérifier que la version apache ou php n'est pas la cause du problème.


MISE À JOUR 16/03/2016

J'ai mis à jour les packages Apache et PHP et le problème persiste. Après plusieurs tests, j'ai constaté que si j'enregistrais les modifications d'édition (via WFS) pendant que je chargeais une carte Lizmap, l'enregistrement échouait, mais d'autres fois continuaient à échouer bien qu'il n'y ait pas de chargement Lizmap (sur un volume inférieur). Il s'agit d'un problème dans QGIS Server (qgis_mapserv.fcgi.exe).

Egidi
la source
Pouvez-vous afficher les journaux du serveur QGIS lorsqu'il fonctionne? Je suppose qu'ils se ressemblent, mais nous devons confirmer cette hypothèse.
alexGIS
@alexGIS Oui, ce sont les mêmes. J'ai écrit une réponse avec la solution au problème. Merci de votre aide!
Egidi

Réponses:

7

Enfin, Matthias Kuhn , l'un des développeurs de QGIS m'a donné la clé.

La clause WHERE est construite en vérifiant le type de la clé primaire de la table. Ce devrait être un nombre entier et dans certains de mes tableaux, j'ai vu que le type était numérique (8,0).

Ces tables et clés primaires ont été créées par une application tierce il y a quelque temps.

J'ai changé le type en Integer et tous les tests que j'ai effectués depuis ont fonctionné (j'ai fait plus de 100 tests d'édition via WFS, assez à mon avis pour conclure que le problème a été résolu)

Egidi
la source