From 95961d098da553a335c9c44dc6a9827b83e7fc99 Mon Sep 17 00:00:00 2001 From: Sarah Hoffmann Date: Sun, 12 Jun 2016 14:34:57 +0200 Subject: [PATCH] introduce chksql function for website code and move other fail functions The default error screen now reports the full SQL even when not in debug mode as this message is often more helpful than our custom error message. --- lib/db.php | 9 ++--- lib/lib.php | 39 -------------------- lib/website.php | 83 +++++++++++++++++++++++++++++++++++++++++++ website/deletable.php | 11 +++--- website/details.php | 21 ++++------- website/hierarchy.php | 14 ++++---- website/polygons.php | 11 ++++-- website/reverse.php | 2 +- website/search.php | 2 +- 9 files changed, 115 insertions(+), 77 deletions(-) diff --git a/lib/db.php b/lib/db.php index cc84bf9b..822acc37 100644 --- a/lib/db.php +++ b/lib/db.php @@ -4,13 +4,8 @@ function &getDB($bNew = false, $bPersistent = false) { // Get the database object - $oDB = DB::connect(CONST_Database_DSN.($bNew?'?new_link=true':''), $bPersistent); - if (PEAR::IsError($oDB)) - { - var_dump(CONST_Database_DSN); - var_Dump($oDB); - fail($oDB->getMessage()); - } + $oDB = chksql(DB::connect(CONST_Database_DSN.($bNew?'?new_link=true':''), $bPersistent), + "Failed to establish database connection"); $oDB->setFetchMode(DB_FETCHMODE_ASSOC); $oDB->query("SET DateStyle TO 'sql,european'"); $oDB->query("SET client_encoding TO 'utf-8'"); diff --git a/lib/lib.php b/lib/lib.php index fc393685..9f017fc4 100644 --- a/lib/lib.php +++ b/lib/lib.php @@ -1,44 +1,5 @@

Internal Server Error

"; - echo '

Nominatim has encountered an internal error while processing your request. This is most likely because of a bug in the software.

'; - echo "

Details: ".$sError,"

"; - echo '

Feel free to report the bug in the OSM bug database. Please include the error message above and the URL you used.

'; - if (CONST_Debug) - { - echo "

Debugging Information


"; - if ($sSQL) - { - echo "

SQL query

".$sSQL.""; - } - if ($vDumpVar) - { - echo "

Result

"; - var_dump($vDumpVar); - echo ""; - } - } - echo "\n\n"; - exit; - } - - - function userError($sError) - { - header('HTTP/1.0 400 Bad Request'); - header('Content-type: text/html; charset=utf-8'); - echo "

Bad Request

"; - echo '

Nominatim has encountered an error with your request.

'; - echo "

Details: ".$sError,"

"; - echo '

If you feel this error is incorrect feel free to report the bug in the OSM bug database. Please include the error message above and the URL you used.

'; - echo "\n\n"; - exit; - } - function fail($sError, $sUserError = false) { if (!$sUserError) $sUserError = $sError; diff --git a/lib/website.php b/lib/website.php index cf228f38..22ec08f1 100644 --- a/lib/website.php +++ b/lib/website.php @@ -1,5 +1,88 @@ getMessage(); + + echo << + Internal Server Error + +

Internal Server Error

+

Nominatim has encountered an internal error while accessing the database. + This may happen because the database is broken or because of a bug in + the software. If you think it is a bug, feel free to report + it over on + Github. Please include the URL that caused the problem and the + complete error details below.

+

Message: $sMsg

+

SQL Error: $sSqlError

+

Details:

+INTERNALFAIL;
+
+		if (CONST_Debug)
+		{
+			var_dump($oSql);
+		}
+		else
+		{
+			echo "
\n".$oSql->getUserInfo()."
"; + } + + echo "

"; + exit; + } + + function failInternalError($sError, $sSQL = false, $vDumpVar = false) + { + header('HTTP/1.0 500 Internal Server Error'); + header('Content-type: text/html; charset=utf-8'); + echo "

Internal Server Error

"; + echo '

Nominatim has encountered an internal error while processing your request. This is most likely because of a bug in the software.

'; + echo "

Details: ".$sError,"

"; + echo '

Feel free to file an issue on Github. Please include the error message above and the URL you used.

'; + if (CONST_Debug) + { + echo "

Debugging Information


"; + if ($sSQL) + { + echo "

SQL query

".$sSQL.""; + } + if ($vDumpVar) + { + echo "

Result

"; + var_dump($vDumpVar); + echo ""; + } + } + echo "\n\n"; + exit; + } + + + function userError($sError) + { + header('HTTP/1.0 400 Bad Request'); + header('Content-type: text/html; charset=utf-8'); + echo "

Bad Request

"; + echo '

Nominatim has encountered an error with your request.

'; + echo "

Details: ".$sError,"

"; + echo '

If you feel this error is incorrect feel file an issue on Github. Please include the error message above and the URL you used.

'; + echo "\n\n"; + exit; + } + + /*************************************************************************** * * Functions for parsing URL parameters diff --git a/website/deletable.php b/website/deletable.php index 6521e774..95a2ec00 100755 --- a/website/deletable.php +++ b/website/deletable.php @@ -10,13 +10,14 @@ $oDB =& getDB(); $sSQL = "select placex.place_id, calculated_country_code as country_code, name->'name' as name, i.* from placex, import_polygon_delete i where placex.osm_id = i.osm_id and placex.osm_type = i.osm_type and placex.class = i.class and placex.type = i.type"; - $aPolygons = $oDB->getAll($sSQL); - if (PEAR::isError($aPolygons)) + $aPolygons = chksql($oDB->getAll($sSQL), + "Could not get list of deleted OSM elements."); + + if (CONST_DEBUG) { - failInternalError("Could not get list of deleted OSM elements.", $sSQL, $aPolygons); + var_dump($aPolygons); + exit; } - -//var_dump($aPolygons); ?> diff --git a/website/details.php b/website/details.php index b3c9591b..495db2b4 100755 --- a/website/details.php +++ b/website/details.php @@ -27,13 +27,13 @@ $iOsmId = getParamInt('osmid', -1); if ($sOsmType && $iOsmId > 0) { - $sPlaceId = $oDB->getOne("select place_id from placex where osm_type = '".$sOsmType."' and osm_id = ".$iOsmId." order by type = 'postcode' asc"); + $sPlaceId = chksql($oDB->getOne("select place_id from placex where osm_type = '".$sOsmType."' and osm_id = ".$iOsmId." order by type = 'postcode' asc")); // Be nice about our error messages for broken geometry if (!$sPlaceId) { - $aPointDetails = $oDB->getRow("select osm_type, osm_id, errormessage, class, type, get_name_by_language(name,$sLanguagePrefArraySQL) as localname, ST_AsText(prevgeometry) as prevgeom, ST_AsText(newgeometry) as newgeom from import_polygon_error where osm_type = '".$sOsmType."' and osm_id = ".$iOsmId." order by updated desc limit 1"); + $aPointDetails = chksql($oDB->getRow("select osm_type, osm_id, errormessage, class, type, get_name_by_language(name,$sLanguagePrefArraySQL) as localname, ST_AsText(prevgeometry) as prevgeom, ST_AsText(newgeometry) as newgeom from import_polygon_error where osm_type = '".$sOsmType."' and osm_id = ".$iOsmId." order by updated desc limit 1")); if (!PEAR::isError($aPointDetails) && $aPointDetails) { if (preg_match('/\[(-?\d+\.\d+) (-?\d+\.\d+)\]/', $aPointDetails['errormessage'], $aMatches)) { @@ -58,22 +58,18 @@ if (CONST_Use_US_Tiger_Data) { - $iParentPlaceID = $oDB->getOne('select parent_place_id from location_property_tiger where place_id = '.$iPlaceID); + $iParentPlaceID = chksql($oDB->getOne('select parent_place_id from location_property_tiger where place_id = '.$iPlaceID)); if ($iParentPlaceID) $iPlaceID = $iParentPlaceID; } if (CONST_Use_Aux_Location_data) { - $iParentPlaceID = $oDB->getOne('select parent_place_id from location_property_aux where place_id = '.$iPlaceID); + $iParentPlaceID = chksql($oDB->getOne('select parent_place_id from location_property_aux where place_id = '.$iPlaceID)); if ($iParentPlaceID) $iPlaceID = $iParentPlaceID; } $hLog = logStart($oDB, 'details', $_SERVER['QUERY_STRING'], $aLangPrefOrder); - // Make sure the point we are reporting on is fully indexed - //$sSQL = "UPDATE placex set indexed = true where indexed = false and place_id = $iPlaceID"; - //$oDB->query($sSQL); - // Get the details for this point $sSQL = "select place_id, osm_type, osm_id, class, type, name, admin_level, housenumber, street, isin, postcode, calculated_country_code as country_code, importance, wikipedia,"; $sSQL .= " to_char(indexed_date, 'YYYY-MM-DD HH24:MI') as indexed_date, parent_place_id, rank_address, rank_search, get_searchrank_label(rank_search) as rank_search_label, get_name_by_language(name,$sLanguagePrefArraySQL) as localname, "; @@ -83,11 +79,8 @@ $sSQL .= " case when importance = 0 OR importance IS NULL then 0.75-(rank_search::float/40) else importance end as calculated_importance, "; $sSQL .= " ST_AsText(CASE WHEN ST_NPoints(geometry) > 5000 THEN ST_SimplifyPreserveTopology(geometry, 0.0001) ELSE geometry END) as outlinestring"; $sSQL .= " from placex where place_id = $iPlaceID"; - $aPointDetails = $oDB->getRow($sSQL); - if (PEAR::IsError($aPointDetails)) - { - failInternalError("Could not get details of place object.", $sSQL, $aPointDetails); - } + $aPointDetails = chksql($oDB->getRow($sSQL), + "Could not get details of place object."); $aPointDetails['localname'] = $aPointDetails['localname']?$aPointDetails['localname']:$aPointDetails['housenumber']; $aClassType = getClassTypesWithImportance(); @@ -169,7 +162,7 @@ if ($sOutputFormat=='html') { - $sDataDate = $oDB->getOne("select TO_CHAR(lastimportdate - '2 minutes'::interval,'YYYY/MM/DD HH24:MI')||' GMT' from import_status limit 1"); + $sDataDate = chksql($oDB->getOne("select TO_CHAR(lastimportdate - '2 minutes'::interval,'YYYY/MM/DD HH24:MI')||' GMT' from import_status limit 1")); $sTileURL = CONST_Map_Tile_URL; $sTileAttribution = CONST_Map_Tile_Attribution; } diff --git a/website/hierarchy.php b/website/hierarchy.php index 7740abbc..b14422fa 100755 --- a/website/hierarchy.php +++ b/website/hierarchy.php @@ -20,13 +20,13 @@ $iOsmId = getParamInt('osmid', -1); if ($sOsmType && $iOsmId > 0) { - $sPlaceId = $oDB->getOne("select place_id from placex where osm_type = '".$sOsmType."' and osm_id = ".$iOsmId." order by type = 'postcode' asc"); + $sPlaceId = chksql($oDB->getOne("select place_id from placex where osm_type = '".$sOsmType."' and osm_id = ".$iOsmId." order by type = 'postcode' asc")); // Be nice about our error messages for broken geometry if (!$sPlaceId) { - $aPointDetails = $oDB->getRow("select osm_type, osm_id, errormessage, class, type, get_name_by_language(name,$sLanguagePrefArraySQL) as localname, ST_AsText(prevgeometry) as prevgeom, ST_AsText(newgeometry) as newgeom from import_polygon_error where osm_type = '".$sOsmType."' and osm_id = ".$iOsmId." order by updated desc limit 1"); - if (!PEAR::isError($aPointDetails) && $aPointDetails) { + $aPointDetails = chksql($oDB->getRow("select osm_type, osm_id, errormessage, class, type, get_name_by_language(name,$sLanguagePrefArraySQL) as localname, ST_AsText(prevgeometry) as prevgeom, ST_AsText(newgeometry) as newgeom from import_polygon_error where osm_type = '".$sOsmType."' and osm_id = ".$iOsmId." order by updated desc limit 1")); + if ($aPointDetails) { if (preg_match('/\[(-?\d+\.\d+) (-?\d+\.\d+)\]/', $aPointDetails['errormessage'], $aMatches)) { $aPointDetails['error_x'] = $aMatches[1]; @@ -44,13 +44,13 @@ if (CONST_Use_US_Tiger_Data) { - $iParentPlaceID = $oDB->getOne('select parent_place_id from location_property_tiger where place_id = '.$iPlaceID); + $iParentPlaceID = chksql($oDB->getOne('select parent_place_id from location_property_tiger where place_id = '.$iPlaceID)); if ($iParentPlaceID) $iPlaceID = $iParentPlaceID; } if (CONST_Use_Aux_Location_data) { - $iParentPlaceID = $oDB->getOne('select parent_place_id from location_property_aux where place_id = '.$iPlaceID); + $iParentPlaceID = chksql($oDB->getOne('select parent_place_id from location_property_aux where place_id = '.$iPlaceID)); if ($iParentPlaceID) $iPlaceID = $iParentPlaceID; } @@ -90,14 +90,14 @@ exit; } - $aRelatedPlaceIDs = $oDB->getCol($sSQL = "select place_id from placex where linked_place_id = $iPlaceID or place_id = $iPlaceID"); + $aRelatedPlaceIDs = chksql($oDB->getCol($sSQL = "select place_id from placex where linked_place_id = $iPlaceID or place_id = $iPlaceID")); $sSQL = "select obj.place_id, osm_type, osm_id, class, type, housenumber, admin_level, rank_address, ST_GeometryType(geometry) in ('ST_Polygon','ST_MultiPolygon') as isarea, st_area(geometry) as area, "; $sSQL .= " get_name_by_language(name,$sLanguagePrefArraySQL) as localname, length(name::text) as namelength "; $sSQL .= " from (select placex.place_id, osm_type, osm_id, class, type, housenumber, admin_level, rank_address, rank_search, geometry, name from placex "; $sSQL .= " where parent_place_id in (".join(',',$aRelatedPlaceIDs).") and name is not null order by rank_address asc,rank_search asc limit 500) as obj"; $sSQL .= " order by rank_address asc,rank_search asc,localname,class, type,housenumber"; - $aParentOfLines = $oDB->getAll($sSQL); + $aParentOfLines = chksql($oDB->getAll($sSQL)); if (sizeof($aParentOfLines)) { diff --git a/website/polygons.php b/website/polygons.php index bb350e6c..b855214a 100755 --- a/website/polygons.php +++ b/website/polygons.php @@ -12,7 +12,7 @@ $bReduced = getParamBool('reduced', false); $sClass = getParamString('class', false); - $iTotalBroken = (int) $oDB->getOne('select count(*) from import_polygon_error'); + $iTotalBroken = (int) chksql($oDB->getOne('select count(*) from import_polygon_error')); $aPolygons = array(); while($iTotalBroken && !sizeof($aPolygons)) @@ -26,9 +26,14 @@ if ($bReduced) $sSQL .= " and errormessage like 'Area reduced%'"; if ($sClass) $sSQL .= " and class = '".pg_escape_string($sClass)."'"; $sSQL .= " order by updated desc limit 1000"; - $aPolygons = $oDB->getAll($sSQL); + $aPolygons = chksql($oDB->getAll($sSQL)); + } + + if (CONST_Debug) + { + var_dump($aPolygons); + exit; } -//var_dump($aPolygons); ?> diff --git a/website/reverse.php b/website/reverse.php index c6c7305f..17b8a2ca 100755 --- a/website/reverse.php +++ b/website/reverse.php @@ -119,7 +119,7 @@ if ($sOutputFormat=='html') { - $sDataDate = $oDB->getOne("select TO_CHAR(lastimportdate - '2 minutes'::interval,'YYYY/MM/DD HH24:MI')||' GMT' from import_status limit 1"); + $sDataDate = chksql($oDB->getOne("select TO_CHAR(lastimportdate - '2 minutes'::interval,'YYYY/MM/DD HH24:MI')||' GMT' from import_status limit 1")); $sTileURL = CONST_Map_Tile_URL; $sTileAttribution = CONST_Map_Tile_Attribution; } diff --git a/website/search.php b/website/search.php index 3c85c8f7..4baf3ef5 100755 --- a/website/search.php +++ b/website/search.php @@ -109,7 +109,7 @@ if ($sOutputFormat=='html') { - $sDataDate = $oDB->getOne("select TO_CHAR(lastimportdate - '2 minutes'::interval,'YYYY/MM/DD HH24:MI')||' GMT' from import_status limit 1"); + $sDataDate = chksql($oDB->getOne("select TO_CHAR(lastimportdate - '2 minutes'::interval,'YYYY/MM/DD HH24:MI')||' GMT' from import_status limit 1")); } logEnd($oDB, $hLog, sizeof($aSearchResults)); -- 2.39.5