Estoy ejecutando un servidor Windows Server 2012.
PostgreSQL 9.3.5, 64 bits
POSTGIS 2.1.3
QGIS Server 2.6.1-2
QGIS Desktop 2.8.3 y 2.12
Estoy usando una tableta Microsoft Surface Pro 4 con QGIS Desktop 2.12 para editar algunas capas almacenadas en la base de datos Postgresql. Las capas en la tableta son capas WFS servidas por QGIS Server.
Cuando edito en Google después de insertar algunos datos en la capa para forzar que los datos se envíen y almacenen en el servidor, a veces la actualización no se realiza en la Base de datos.
Puedo ver que la solicitud POST http llega bien al servidor, pero a veces no puedo ver un commit (actualización) en la base de datos y otras veces funciona bien y hace el commit.
En los registros del servidor QGIS puedo ver (actualicé los datos de 3 características en 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, cuando miro los registros de PostgreSQL puedo ver que la actualización tiene una cláusula WHERE NULL, que no actualiza nada ...
//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
Puedo ver en los datos POST que QGIS Server sabe qué característica necesita actualizarse usando el número interno "fid". Mi capa, por otro lado, tiene el campo "id" como clave principal. En algún lugar, cuando hace el mapeo del QID interno de QGIS al id de mi capa, se pierde y agrega WHERE nulo a la consulta en lugar de agregar where id = 1510.
Lo curioso es que han estado trabajando durante 40 días y solo tuvieron este problema una vez, pero desde la semana pasada han tenido este problema todos los días ... Desde entonces, a veces funciona y otras no. Vuelvo a enviar la solicitud HTTP POST del cliente y el proxy Fiddles y la misma publicación HTTP a veces funciona y otras no.
Lo probé en QGIS Desktop 2.8, 2.10 y 2.12 y sucede en todos ellos (QGIS Server es 2.6.1, creo). También lo probé con diferentes capas con el mismo resultado.
No sé si hay un error o hay algún tipo de configuración en la capa que no estoy haciendo correctamente en el servidor ...
ACTUALIZACIÓN 03/03/2016
Actualicé a QGIS Server y QGIS Desktop a 2.12.3 ambos y el problema continúa.
Después de muchos días de pruebas, finalmente encontré cuándo ocurre el problema. Sucede cuando guardo las ediciones de la capa en QGIS (a través de WFS-T) y al mismo tiempo otro usuario está cargando un mapa de Lizmap . Lizmap también usa qgis-server.
Parece que al cargar un mapa, Lizmap hace que el servidor esté ocupado y cuando se recibe una solicitud de actualización WFS-T, QGIS Server no es capaz de construir la consulta ACTUALIZAR SQL correctamente. Ejemplo:
Si hay una carga de Lizmap en el momento en que se recibe la publicación WFS-T, la consulta PostgreSQL generada en qgis-server es:
2016-03-03 11:47:30 CET LOG: 00000: sentencia: UPDATE "public"."getxo_alumbrado_tendido_canalizacion" SET "diametro"='22' WHERE NULL
Por otro lado, si qgis-server no está sirviendo datos a un Lizmap de carga cuando llega el WFS-T, la consulta PostgreSQL generada es:
2016-03-03 11:46:21 CET LOG: 00000: sentencia: UPDATE "public"."getxo_alumbrado_tendido_canalizacion" SET "diametro"='111' WHERE "id"::text='1'
Tenga en cuenta la diferencia en la cláusula where. El primero no hace nada. El segundo funciona bien.
No sé si puedo ajustar Apache o cualquier archivo de configuración para qgis-server para solucionar este problema.
Traté de darle mucho más hardware al servidor (4 núcleos y 16 GB de RAM) sin cambios.
Estoy haciendo todas las actualizaciones de software usando OSGEO4W. Ia leyó en alguna parte que los paquetes de Apache y PHP no se han actualizado durante años. Intentaré actualizarlos manualmente y verificar que la versión de apache o php no sea la causa del problema.
ACTUALIZACIÓN 16/03/2016
Actualicé los paquetes de Apache y PHP y el problema continúa. Después de varias pruebas, descubrí que si guardo los cambios de edición (a través de WFS) mientras estoy cargando un mapa de Lizmap, el guardado falla, pero otras veces siguen fallando aunque no hay carga de Lizmap (en un volumen más bajo). Es un problema en QGIS Server (qgis_mapserv.fcgi.exe).
Respuestas:
Finalmente, Matthias Kuhn , uno de los desarrolladores de QGIS me dio la clave.
La cláusula WHERE se crea comprobando el tipo de la clave primaria de la tabla. Se debe ser un número entero y en algunos de mis cuadros vi que era el tipo numérico (8,0).
Esas tablas y claves principales fueron creadas por una aplicación de terceros hace algún tiempo.
Cambié el tipo a Integer y todas las pruebas que he realizado desde entonces han funcionado (he realizado más de 100 pruebas de edición a través de WFS, suficiente en mi opinión para concluir que el problema se ha resuelto)
fuente