Korzystam z serwera Windows Server 2012.
PostgreSQL 9.3.5, 64-bitowy
POSTGIS 2.1.3
QGIS Server 2.6.1-2
QGIS Desktop 2.8.3 i 2.12
Korzystam z tabletu Microsoft Surface Pro 4 za pomocą QGIS Desktop 2.12 do edycji niektórych warstw przechowywanych w bazie danych Postgresql. Warstwy na tablecie to warstwy WFS obsługiwane przez serwer QGIS.
Podczas edytowania w Google po wstawieniu niektórych danych w warstwie w celu wymuszenia przesłania danych i zapisania ich na serwerze czasami aktualizacja nie jest wykonywana w bazie danych.
Widzę, że żądanie HTTP POST dociera do serwera ok, ale czasami nie widzę zatwierdzenia (aktualizacji) w bazie danych, a innym razem działa poprawnie i wykonuje zatwierdzenie.
W dziennikach QGIS Server widzę (zaktualizowałem dane 3 funkcji w 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, kiedy przeglądam dzienniki PostgreSQL, widzę, że aktualizacja ma klauzulę WHERE NULL, która niczego nie aktualizuje ..
//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
Widzę w danych POST, że QGIS Server wie, która funkcja wymaga aktualizacji przy użyciu wewnętrznego numeru „fid”. Z drugiej strony moja warstwa ma pole „id” jako klucz podstawowy. Gdzieś, kiedy wykonuje mapowanie z wewnętrznego identyfikatora QGIS na identyfikator mojej warstwy, gubi się i dodaje GDZIE null do zapytania zamiast dodawać gdzie id = 1510.
Zabawne jest to, że pracują od 40 dni i hej dostali ten problem tylko raz, ale od zeszłego tygodnia mieli ten problem codziennie ... Od tego czasu czasami działa, a czasem nie. Ponownie wysyłam żądanie POST http od klienta korzystającego z serwera proxy Fiddles i ten sam post HTTP czasami działa, a innym razem nie.
Przetestowałem to w QGIS Desktop 2.8, 2.10 i 2.12 i zdarza się we wszystkich (QGIS Server to 2.6.1). Przetestowałem to również na różnych warstwach z tym samym wynikiem.
Nie wiem, czy jest jakiś błąd lub konfiguracja warstwy, której nie wykonuję poprawnie na serwerze ...
AKTUALIZACJA 03.03.2016
Zaktualizowałem zarówno QGIS Server, jak i QGIS Desktop do wersji 2.12.3 i problem nadal występuje.
Po wielu dniach testów w końcu odkryłem, kiedy pojawia się problem. Zdarza się to, gdy zapisuję zmiany warstwy w QGIS (przez WFS-T), a jednocześnie inny użytkownik ładuje Mapę Lizmap . Lizmap używa również qgis-server.
Wygląda na to, że podczas ładowania mapy Lizmap powoduje, że serwer jest zajęty, a po otrzymaniu żądania aktualizacji WFS-T serwer QGIS nie jest w stanie poprawnie zbudować zapytania SQL UPDATE. Przykład:
Jeśli ładowanie Lizmap odbywa się w momencie odebrania postu WFS-T, zapytanie PostgreSQL wygenerowane na serwerze qgis-server to:
2016-03-03 11:47:30 CET LOG: 00000: sentencia: UPDATE "public"."getxo_alumbrado_tendido_canalizacion" SET "diametro"='22' WHERE NULL
Z drugiej strony, jeśli qgis-server nie podaje danych ładującej się Lizmapie po przybyciu WFS-T, wygenerowane zapytanie PostgreSQL to:
2016-03-03 11:46:21 CET LOG: 00000: sentencia: UPDATE "public"."getxo_alumbrado_tendido_canalizacion" SET "diametro"='111' WHERE "id"::text='1'
Zwróć uwagę na różnicę w klauzuli where. Ten pierwszy nic nie robi. Drugi działa dobrze.
Nie wiem, czy mogę dostroić Apache lub jakiekolwiek pliki konfiguracyjne dla qgis-server, aby rozwiązać ten problem.
Próbowałem podać serwerowi znacznie więcej sprzętu (4 rdzenie i 16 GB pamięci RAM) bez chnage.
Wszystkie aktualizacje oprogramowania wykonuję przy użyciu OSGEO4W. Czytałem gdzieś, że pakiety Apache i PHP nie były aktualizowane od lat. Spróbuję zaktualizować je ręcznie i sprawdzę, czy wersja apache lub php nie jest przyczyną problemu.
AKTUALIZACJA 16.03.2016
Zaktualizowałem pakiety Apache i PHP i problem nadal występuje. Po kilku testach odkryłem, że jeśli zapiszę zmiany edycji (przez WFS) podczas ładowania mapy Lizmap, zapisywanie nie powiedzie się, ale w niektórych przypadkach nadal się nie udaje, chociaż nie ładuje się Lizmap (na niższym wolumenie). Jest to problem w QGIS Server (qgis_mapserv.fcgi.exe).