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&SERVICE=WFS&VERSION=1.0.0&REQUEST=DescribeFeatureType&TYPENAME=getxo_alumbrado_arquetas_registros_cajas&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).