Lors de migration de vos serveur de bases de données PostgreSQL vers une version 8.3, un problème survient avec les versions de MapServer mises à disposition dans MS4W. Pour une couche de type PostGIS, vous obtenez en effet une message d'erreur du type :
Warning: [MapServer Error]: prepare_database(): Error declaring cursor: ERROR: current transaction is aborted, commands ignored until end of transaction block With query string: DECLARE mycursor BINARY CURSOR FOR SELECT asbinary(force_collection(force_2d(wkb_geometry)),'NDR'),OID::text from septolis_departements_l93 WHERE wkb_geometry && setSRID('BOX3D(-109363.162923348 5996601,1450962.16291935 7163567)'::BOX3D, find_srid('','septolis_departements_l93','wkb_geometry') ) in D:\MapJaxDist\ms4w\apps\mapjax\interface\gestion\update\index.php on line 297
Warning: [MapServer Error]: msPOSTGISLayerRetrievePGVersion(): Error executing POSTGIS statement (msPOSTGISLayerRetrievePGVersion():select substring(version() from 12 for (position('on' in version()) - 13)) in D:\MapJaxDist\ms4w\apps\mapjax\interface\gestion\update\index.php on line 297
Fatal error: Call to a member function saveImage() on a non-object in D:\MapJaxDist\ms4w\apps\mapjax\interface\gestion\update\index.php on line 298
La partie importante de ces messages d'erreur mentionne l'erreur MapServer dans la fonction msPOSTGISLayerRetrievePGVersion
. La requête utilisée pour récupérer le numéro de version de PostgreSQL ne fonctionne pas. Si on regarde de plus prêt, rien de très compliqué ici, on utilise la chaine retournée par la fontion version()
de PostgreSQL.
Dans notre cas, la fonction version()
renvoit : PostgreSQL 8.3.7, compiled by Visual C++ build 1400
. Ainsi il n'est pas possible d'utiliser la position de la chaîne 'on' dans ce résultat étant donnée qu'elle n'y est pas.
La solution la plus simple est d'utiliser le script SQL ci-dessous qui se contente de renommer la fonction version()
intiallement présente dans PostgreSQL en initial_version_func
puis de déclarer une fonction version qui renvoie une chaîne correcte pour ce cas d'utilisation :
ALTER FUNCTION version() RENAME TO initial_version_func;
; Définition de la nouvelle fonction version
CREATE OR REPLACE FUNCTION version() RETURNS VARCHAR AS
$$
DECLARE
vers text;
rec record;
BEGIN
FOR rec in EXECUTE $q$ SELECT 'PostgreSQL 8.3.7 on win32, compiled Visual C++ build 1400' as version$q$
LOOP
RETURN rec.version;
END LOOP;
RETURN '';
END
$$ LANGUAGE plpgsql;
Le problème est ainsi corrigé.
Il est à noté que, grâce aux corrections de Paul Ramsey, cette erreur ne devrait plus être présente dans les versions de MapServer sorties depuis le 11 avril 08 (cf. changeset 8003 [1]).