Problème avec les couches PostGIS depuis MapServer avec PostgreSQL 8.3

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]: msDrawMap(): Failed to draw layer named 'layer1'. in D:\MapJaxDist\ms4w\apps\mapjax\interface\gestion\update\index.php on line 297

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 :

; Renommage de la fonction version
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).

Posted in Le blogue de djay | Vous devez vous connecter ou vous enregistrer pour écrire des commentaires | printer friendly version | 3716 lectures

Posté par djay le 3 Juin, 2009 - 08:52.

Accéder aux archives

« Mai 2024  
Lun Mar Mer Jeu Ven Sam Dim
    1 2 3 4 5
6 7 8 9 10 11 12
13 14 15 16 17 18 19
20 21 22 23 24 25 26
27 28 29 30 31    

Ouverture de session

Qui est en ligne

Il y a actuellement 1 utilisateur et 132 invités en ligne.
Locations of visitors to this page
Drupal Top Sites - Ultimate Drupal Exposure