// if (!canEdit('Events')) { $view = "error"; return; } $selectName = "filterName"; $newSelectName = "new" . ucfirst($selectName); foreach (dbFetchAll("select * from Filters order by Name") as $row) { $filterNames[$row['Name']] = $row['Name']; if ($_REQUEST['filterName'] == $row['Name']) { $filterData = $row; } } $focusWindow = true; $filter = $_REQUEST['filter']; parseFilter($filter); xhtmlHeaders(__FILE__, translate('SaveFilter')); ?> <body> <div id="page"> <div id="header"> <h2><?php echo translate('SaveFilter'); ?> </h2> </div> <div id="content"> <form name="contentForm" id="contentForm" method="post" action="<?php echo $_SERVER['PHP_SELF']; ?> ">
} if (!empty($_REQUEST['execute'])) { executeFilter($tempFilterName); } $countSql = 'SELECT count(E.Id) AS EventCount FROM Monitors AS M INNER JOIN Events AS E ON (M.Id = E.MonitorId) WHERE'; $eventsSql = 'SELECT E.Id,E.MonitorId,M.Name AS MonitorName,M.DefaultScale,E.Name,E.Width,E.Height,E.Cause,E.Notes,E.StartTime,E.Length,E.Frames,E.AlarmFrames,E.TotScore,E.AvgScore,E.MaxScore,E.Archived FROM Monitors AS M INNER JOIN Events AS E on (M.Id = E.MonitorId) WHERE'; if ($user['MonitorIds']) { $user_monitor_ids = ' M.Id in (' . $user['MonitorIds'] . ')'; $countSql .= $user_monitor_ids; $eventsSql .= $user_monitor_ids; } else { $countSql .= " 1"; $eventsSql .= " 1"; } parseSort(); parseFilter($_REQUEST['filter']); $filterQuery = $_REQUEST['filter']['query']; if ($_REQUEST['filter']['sql']) { $countSql .= $_REQUEST['filter']['sql']; $eventsSql .= $_REQUEST['filter']['sql']; } $eventsSql .= " ORDER BY {$sortColumn} {$sortOrder}"; if (isset($_REQUEST['page'])) { $page = validInt($_REQUEST['page']); } else { $page = 0; } if (isset($_REQUEST['limit'])) { $limit = validInt($_REQUEST['limit']); } else { $limit = 0;
function getNearEvents() { global $user, $sortColumn, $sortOrder; $eventId = $_REQUEST['id']; $event = dbFetchOne('select * from Events where Id = ?', NULL, array($eventId)); parseFilter($_REQUEST['filter']); parseSort(); if ($user['MonitorIds']) { $midSql = " and MonitorId in (" . join(",", preg_split('/["\'\\s]*,["\'\\s]*/', $user['MonitorIds'])) . ")"; } else { $midSql = ''; } $sql = "select E.* from Events as E inner join Monitors as M on E.MonitorId = M.Id where {$sortColumn} " . ($sortOrder == 'asc' ? '<=' : '>=') . " '" . $event[$_REQUEST['sort_field']] . "'" . $_REQUEST['filter']['sql'] . $midSql . " order by {$sortColumn} " . ($sortOrder == 'asc' ? 'desc' : 'asc'); $result = dbQuery($sql); while ($id = dbFetchNext($result, 'Id')) { if ($id == $eventId) { $prevEvent = dbFetchNext($result); break; } } $sql = "select E.* from Events as E inner join Monitors as M on E.MonitorId = M.Id where {$sortColumn} " . ($sortOrder == 'asc' ? '>=' : '<=') . " '" . $event[$_REQUEST['sort_field']] . "'" . $_REQUEST['filter']['sql'] . $midSql . " order by {$sortColumn} {$sortOrder}"; $result = dbQuery($sql); while ($id = dbFetchNext($result, 'Id')) { if ($id == $eventId) { $nextEvent = dbFetchNext($result); break; } } $result = array('EventId' => $eventId); $result['PrevEventId'] = empty($prevEvent) ? 0 : $prevEvent['Id']; $result['NextEventId'] = empty($nextEvent) ? 0 : $nextEvent['Id']; $result['PrevEventDefVideoPath'] = empty($prevEvent) ? 0 : getEventDefaultVideoPath($prevEvent); $result['NextEventDefVideoPath'] = empty($nextEvent) ? 0 : getEventDefaultVideoPath($nextEvent); return $result; }
function parseFilter($filter, $table, $operator = "=") { global $postgisObject; global $postgisschema; global $srs; $table = dropAllNameSpaces($table); //die($table); $st = \app\inc\Model::explodeTableName($table); if (!$st['schema']) { $st['schema'] = $postgisschema; } $primeryKey = $postgisObject->getPrimeryKey($st['schema'] . "." . $st['table']); $serializer_options = array('indent' => ' '); $Serializer =& new XML_Serializer($serializer_options); if (!is_array($filter[0]) && isset($filter) && !(isset($filter['And']) or isset($filter['Or']) or isset($filter['Not']))) { $filter = array(0 => $filter); } $sridOfTable = $postgisObject->getGeometryColumns($table, "srid"); $i = 0; foreach ($filter as $key => $arr) { if ($key == "And" || $key == "Or") { $BoolOperator = $key; } if (isset($arr['Not'])) { //$where[] = parseFilter($arr['Not'],$table,"<>"); } if (isset($arr['And']) || isset($arr['Or'])) { // Recursive call $where[] = parseFilter($arr, $table); } // PropertyIsEqualTo $arr['PropertyIsEqualTo'] = addDiminsionOnArray($arr['PropertyIsEqualTo']); if (is_array($arr['PropertyIsEqualTo'])) { foreach ($arr['PropertyIsEqualTo'] as $value) { $where[] = $value['PropertyName'] . "=" . $postgisObject->quote($value['Literal']); } } // PropertyIsNotEqualTo $arr['PropertyIsNotEqualTo'] = addDiminsionOnArray($arr['PropertyIsNotEqualTo']); if (is_array($arr['PropertyIsNotEqualTo'])) { foreach ($arr['PropertyIsNotEqualTo'] as $value) { $where[] = $value['PropertyName'] . "<>'" . $value['Literal'] . "'"; } } // PropertyIsLessThan $arr['PropertyIsLessThan'] = addDiminsionOnArray($arr['PropertyIsLessThan']); if (is_array($arr['PropertyIsLessThan'])) { foreach ($arr['PropertyIsLessThan'] as $value) { $where[] = $value['PropertyName'] . "<'" . $value['Literal'] . "'"; } } // PropertyIsGreaterThan $arr['PropertyIsGreaterThan'] = addDiminsionOnArray($arr['PropertyIsGreaterThan']); if (is_array($arr['PropertyIsGreaterThan'])) { foreach ($arr['PropertyIsGreaterThan'] as $value) { $where[] = $value['PropertyName'] . ">'" . $value['Literal'] . "'"; } } // PropertyIsLessThanOrEqualTo $arr['PropertyIsLessThanOrEqualTo'] = addDiminsionOnArray($arr['PropertyIsLessThanOrEqualTo']); if (is_array($arr['PropertyIsLessThanOrEqualTo'])) { foreach ($arr['PropertyIsLessThanOrEqualTo'] as $value) { $where[] = $value['PropertyName'] . "<='" . $value['Literal'] . "'"; } } //PropertyIsGreaterThanOrEqualTo $arr['PropertyIsGreaterThanOrEqualTo'] = addDiminsionOnArray($arr['PropertyIsGreaterThanOrEqualTo']); if (is_array($arr['PropertyIsGreaterThanOrEqualTo'])) { foreach ($arr['PropertyIsGreaterThanOrEqualTo'] as $value) { $where[] = $value['PropertyName'] . ">='" . $value['Literal'] . "'"; } } //PropertyIsLike $arr['PropertyIsLike'] = addDiminsionOnArray($arr['PropertyIsLike']); if (is_array($arr['PropertyIsLike'])) { foreach ($arr['PropertyIsLike'] as $value) { $where[] = $value['PropertyName'] . " LIKE '%" . $value['Literal'] . "%'"; } } //PropertyIsBetween $arr['PropertyIsBetween'] = addDiminsionOnArray($arr['PropertyIsBetween']); if (is_array($arr['PropertyIsBetween'])) { foreach ($arr['PropertyIsBetween'] as $value) { if ($value['LowerBoundary']) { $w[] = $value['PropertyName'] . " > '" . $value['LowerBoundary']['Literal'] . "'"; } if ($value['UpperBoundary']) { $w[] = $value['PropertyName'] . " < '" . $value['UpperBoundary']['Literal'] . "'"; } } $where[] = implode(" AND ", $w); } // FeatureID if (!is_array($arr['FeatureId'][0]) && isset($arr['FeatureId'])) { $arr['FeatureId'] = array(0 => $arr['FeatureId']); } if (is_array($arr['FeatureId'])) { foreach ($arr['FeatureId'] as $value) { $value['fid'] = preg_replace("/{$table}\\./", "", $value['fid']); // remove table name $where[] = "{$primeryKey['attname']}=" . $value['fid']; } } // GmlObjectId $arr['GmlObjectId'] = addDiminsionOnArray($arr['GmlObjectId']); if (is_array($arr['GmlObjectId'])) { foreach ($arr['GmlObjectId'] as $value) { $value['id'] = preg_replace("/{$table}\\./", "", $value['id']); // remove table name $where[] = "{$primeryKey['attname']}=" . $value['id']; } } //Intersects $arr['Intersects'] = addDiminsionOnArray($arr['Intersects']); if (is_array($arr['Intersects'])) { foreach ($arr['Intersects'] as $value) { $status = $Serializer->serialize($value); $gmlCon = new gmlConverter(); //logfile::write($Serializer->getSerializedData()."\n\n"); $wktArr = $gmlCon->gmlToWKT($Serializer->getSerializedData(), array()); $sridOfFilter = $wktArr[1][0]; if (!$sridOfFilter) { $sridOfFilter = $srs; } // If no filter on BBOX we think it must be same as the requested srs if (!$sridOfFilter) { $sridOfFilter = $sridOfTable; } // If still no filter on BBOX we set it to native srs $where[] = "ST_Intersects" . "(public.ST_Transform(public.ST_GeometryFromText('" . $wktArr[0][0] . "'," . $sridOfFilter . "),{$sridOfTable})," . $value['PropertyName'] . ")"; unset($gmlCon); unset($wktArr); } } //BBox if ($arr['BBOX']) { if (is_array($arr['BBOX']['Box']['coordinates'])) { $arr['BBOX']['Box']['coordinates']['_content'] = str_replace(" ", ",", $arr['BBOX']['Box']['coordinates']['_content']); $coordsArr = explode(",", $arr['BBOX']['Box']['coordinates']['_content']); } else { $arr['BBOX']['Box']['coordinates'] = str_replace(" ", ",", $arr['BBOX']['Box']['coordinates']); $coordsArr = explode(",", $arr['BBOX']['Box']['coordinates']); } if (is_array($arr['BBOX']['Box'])) { $sridOfFilter = gmlConverter::parseEpsgCode($arr['BBOX']['Box']['srsName']); $axisOrder = gmlConverter::getAxisOrderFromEpsg($arr['BBOX']['Box']['srsName']); if (!$sridOfFilter) { $sridOfFilter = $srs; } // If no filter on BBOX we think it must be same as the requested srs if (!$sridOfFilter) { $sridOfFilter = $sridOfTable; } // If still no filter on BBOX we set it to native srs } if (is_array($arr['BBOX']['Envelope'])) { $coordsArr = array_merge(explode(" ", $arr['BBOX']['Envelope']['lowerCorner']), explode(" ", $arr['BBOX']['Envelope']['upperCorner'])); ob_start(); print_r($arr['BBOX']['Envelope']); print_r($coordsArr); $data = ob_get_clean(); //logfile::write($data); $sridOfFilter = gmlConverter::parseEpsgCode($arr['BBOX']['Envelope']['srsName']); $axisOrder = gmlConverter::getAxisOrderFromEpsg($arr['BBOX']['Envelope']['srsName']); if (!$sridOfFilter) { $sridOfFilter = $srs; } // If no filter on BBOX we think it must be same as the requested srs if (!$sridOfFilter) { $sridOfFilter = $sridOfTable; } // If still no filter on BBOX we set it to native srs } if ($axisOrder == "longitude") { $where[] = "ST_Intersects" . "(public.ST_Transform(public.ST_GeometryFromText('POLYGON((" . $coordsArr[0] . " " . $coordsArr[1] . "," . $coordsArr[0] . " " . $coordsArr[3] . "," . $coordsArr[2] . " " . $coordsArr[3] . "," . $coordsArr[2] . " " . $coordsArr[1] . "," . $coordsArr[0] . " " . $coordsArr[1] . "))'," . $sridOfFilter . "),{$sridOfTable})," . "\"" . ($arr['BBOX']['PropertyName'] ?: $postgisObject->getGeometryColumns($table, "f_geometry_column")) . "\")"; } else { $where[] = "ST_Intersects" . "(public.ST_Transform(public.ST_GeometryFromText('POLYGON((" . $coordsArr[1] . " " . $coordsArr[0] . "," . $coordsArr[3] . " " . $coordsArr[0] . "," . $coordsArr[3] . " " . $coordsArr[2] . "," . $coordsArr[1] . " " . $coordsArr[2] . "," . $coordsArr[1] . " " . $coordsArr[0] . "))'," . $sridOfFilter . "),{$sridOfTable})," . "\"" . ($arr['BBOX']['PropertyName'] ?: $postgisObject->getGeometryColumns($table, "f_geometry_column")) . "\")"; } /*$where[] = "public.ST_Transform(public.ST_GeometryFromText('POLYGON((".$coordsArr[0]." ".$coordsArr[1].",".$coordsArr[0]." ".$coordsArr[3].",".$coordsArr[2]." ".$coordsArr[3].",".$coordsArr[2]." ".$coordsArr[1].",".$coordsArr[0]." ".$coordsArr[1]."))'," .$sridOfFilter ."),$sridOfTable) && ".$arr['BBOX']['PropertyName'];*/ } // End of filter parsing $i++; } ob_start(); print_r($where); ob_get_clean(); if (!$BoolOperator) { $BoolOperator = "OR"; } return "(" . implode(" " . $BoolOperator . " ", $where) . ")"; }
/** * * * @param unknown $arr * @return unknown */ function parseFilter($filter, $table, $operator = "=") { global $postgisObject; global $postgisschema; //global $forUseInSpatialFilter; global $srs; $st = postgis::explodeTableName($table); if (!$st['schema']) { $st['schema'] = $postgisschema; } $primeryKey = $postgisObject->getPrimeryKey($st['schema'] . "." . $st['table']); $serializer_options = array('indent' => ' '); $Serializer =& new XML_Serializer($serializer_options); if (!is_array($filter[0]) && isset($filter) && !(isset($filter['And']) or isset($filter['Or']) or isset($filter['Not']))) { $filter = array(0 => $filter); } $sridOfTable = $postgisObject->getGeometryColumns($table, "srid"); $i = 0; foreach ($filter as $key => $arr) { if ($key == "And" || $key == "Or") { $BoolOperator = $key; } if (isset($arr['Not'])) { //$where[] = parseFilter($arr['Not'],$table,"<>"); } if (isset($arr['And']) || isset($arr['Or'])) { // Recursive call $where[] = parseFilter($arr, $table); } // PropertyIsEqualTo $arr['PropertyIsEqualTo'] = addDiminsionOnArray($arr['PropertyIsEqualTo']); if (is_array($arr['PropertyIsEqualTo'])) { foreach ($arr['PropertyIsEqualTo'] as $value) { $where[] = $value['PropertyName'] . "=" . $postgisObject->quote($value['Literal']); } } // PropertyIsNotEqualTo $arr['PropertyIsNotEqualTo'] = addDiminsionOnArray($arr['PropertyIsNotEqualTo']); if (is_array($arr['PropertyIsNotEqualTo'])) { foreach ($arr['PropertyIsNotEqualTo'] as $value) { $where[] = $value['PropertyName'] . "<>'" . $value['Literal'] . "'"; } } // FeatureID if (!is_array($arr['FeatureId'][0]) && isset($arr['FeatureId'])) { $arr['FeatureId'] = array(0 => $arr['FeatureId']); } if (is_array($arr['FeatureId'])) { foreach ($arr['FeatureId'] as $value) { $value['fid'] = preg_replace("/{$table}\\./", "", $value['fid']); // remove table name $where[] = "{$primeryKey['attname']}=" . $value['fid']; } } // GmlObjectId $arr['GmlObjectId'] = addDiminsionOnArray($arr['GmlObjectId']); if (is_array($arr['GmlObjectId'])) { foreach ($arr['GmlObjectId'] as $value) { $value['id'] = preg_replace("/{$table}\\./", "", $value['id']); // remove table name $where[] = "{$primeryKey['attname']}=" . $value['id']; } } //Intersects $arr['Intersects'] = addDiminsionOnArray($arr['Intersects']); if (is_array($arr['Intersects'])) { foreach ($arr['Intersects'] as $value) { $status = $Serializer->serialize($value); $gmlCon = new gmlConverter(); //logfile::write($Serializer->getSerializedData()."\n\n"); $wktArr = $gmlCon->gmlToWKT($Serializer->getSerializedData(), array()); $sridOfFilter = $wktArr[1][0]; if (!$sridOfFilter) { $sridOfFilter = $srs; } // If no filter on BBOX we think it must be same as the requested srs if (!$sridOfFilter) { $sridOfFilter = $sridOfTable; } // If still no filter on BBOX we set it to native srs $where[] = "intersects" . "(public.transform(public.GeometryFromText('" . $wktArr[0][0] . "'," . $sridOfFilter . "),{$sridOfTable})," . $value['PropertyName'] . ")"; unset($gmlCon); unset($wktArr); } } //BBox if ($arr['BBOX']) { if (is_array($arr['BBOX']['Box']['coordinates'])) { $arr['BBOX']['Box']['coordinates']['_content'] = str_replace(" ", ",", $arr['BBOX']['Box']['coordinates']['_content']); $coordsArr = explode(",", $arr['BBOX']['Box']['coordinates']['_content']); } else { $arr['BBOX']['Box']['coordinates'] = str_replace(" ", ",", $arr['BBOX']['Box']['coordinates']); $coordsArr = explode(",", $arr['BBOX']['Box']['coordinates']); } $sridOfFilter = gmlConverter::parseEpsgCode($arr['BBOX']['Box']['srsName']); if (!$sridOfFilter) { $sridOfFilter = $srs; } // If no filter on BBOX we think it must be same as the requested srs if (!$sridOfFilter) { $sridOfFilter = $sridOfTable; } // If still no filter on BBOX we set it to native srs /* $coordsArr[0] = floor($coordsArr[0]/1000)*1000; $coordsArr[1] = floor($coordsArr[1]/1000)*1000; $coordsArr[2] = ceil($coordsArr[2]/1000)*1000; $coordsArr[3] = ceil($coordsArr[3]/1000)*1000; */ $where[] = "intersects" . "(public.transform(public.GeometryFromText('POLYGON((" . $coordsArr[0] . " " . $coordsArr[1] . "," . $coordsArr[0] . " " . $coordsArr[3] . "," . $coordsArr[2] . " " . $coordsArr[3] . "," . $coordsArr[2] . " " . $coordsArr[1] . "," . $coordsArr[0] . " " . $coordsArr[1] . "))'," . $sridOfFilter . "),{$sridOfTable})," . $arr['BBOX']['PropertyName'] . ")"; } // End of filter parsing $i++; } if (!$BoolOperator) { $BoolOperator = "OR"; } return "(" . implode(" " . $BoolOperator . " ", $where) . ")"; }
function parseTreeToQuery($tree) { $filter = parseTreeToFilter($tree); parseFilter($filter, false, '&'); return $filter['query']; }
function doParse($arr) { global $postgisObject; global $user; global $version; global $postgisschema; global $parts; $serializer_options = array('indent' => ' '); $Serializer =& new XML_Serializer($serializer_options); foreach ($arr as $key => $featureMember) { if ($key == "Insert") { if (!is_array($featureMember[0]) && isset($featureMember)) { $featureMember = array(0 => $featureMember); } foreach ($featureMember as $hey) { foreach ($hey as $typeName => $feature) { if (is_array($feature)) { // Skip handles foreach ($feature as $field => $value) { $fields[] = $field; if (is_array($value)) { // Must be geom if array // We serialize the geometry back to XML for parsing $status = $Serializer->serialize($value); logfile::write("GML " . $Serializer->getSerializedData() . "\n\n"); $gmlCon = new gmlConverter(); $wktArr = $gmlCon->gmlToWKT($Serializer->getSerializedData(), array()); $values[] = array("{$field}" => $wktArr[0][0], "srid" => $wktArr[1][0]); unset($gmlCon); unset($wktArr); //logfile::write($Serializer->getSerializedData()."\n\n"); } else { $values[] = pg_escape_string($value); } } $forSql['tables'][] = $typeName; $forSql['fields'][] = $fields; $forSql['values'][] = $values; $fields = array(); $values = array(); $field = ""; $value = ""; // Start HTTP basic authentication //if(!$_SESSION["oauth_token"]) { $auth = $postgisObject->getGeometryColumns($postgisschema . "." . $typeName, "authentication"); if ($auth == "Write" or $auth == "Read/write") { include '../inc/http_basic_authen.php'; } // } // End HTTP basic authentication } } } } if ($key == "Update") { if (!is_array($featureMember[0]) && isset($featureMember)) { $featureMember = array(0 => $featureMember); } $fid = 0; foreach ($featureMember as $hey) { $the_geom = $postgisObject->getGeometryColumns($postgisschema . "." . $hey['typeName'], "f_geometry_column"); if (!is_array($hey['Property'][0]) && isset($hey['Property'])) { $hey['Property'] = array(0 => $hey['Property']); } foreach ($hey['Property'] as $pair) { $fields[$fid][] = $pair['Name']; if ($pair['Name'] == $the_geom) { // We serialize the geometry back to XML for parsing $status = $Serializer->serialize($pair['Value']); logfile::write($Serializer->getSerializedData() . "\n\n"); $gmlCon = new gmlConverter(); $wktArr = $gmlCon->gmlToWKT($Serializer->getSerializedData(), array()); $values[$fid][] = array("{$pair['Name']}" => current($wktArr[0]), "srid" => current($wktArr[1])); unset($gmlCon); unset($wktArr); } else { $values[$fid][] = $pair['Value']; } } $forSql2['tables'][$fid] = $hey['typeName']; $forSql2['fields'] = $fields; $forSql2['values'] = $values; $forSql2['wheres'][$fid] = parseFilter($hey['Filter'], $hey['typeName']); $fid++; // Start HTTP basic authentication //if(!$_SESSION["oauth_token"]) { $auth = $postgisObject->getGeometryColumns($postgisschema . "." . $hey['typeName'], "authentication"); if ($auth == "Write" or $auth == "Read/write") { include '../inc/http_basic_authen.php'; } // } // End HTTP basic authentication } $pair = array(); $values = array(); $fields = array(); } if ($key == "Delete") { if (!is_array($featureMember[0]) && isset($featureMember)) { $featureMember = array(0 => $featureMember); } foreach ($featureMember as $hey) { $forSql3['tables'][] = $hey['typeName']; $forSql3['wheres'][] = parseFilter($hey['Filter'], $hey['typeName']); // Start HTTP basic authentication //if(!$_SESSION["oauth_token"]) { $auth = $postgisObject->getGeometryColumns($postgisschema . "." . $hey['typeName'], "authentication"); if ($auth == "Write" or $auth == "Read/write") { include '../inc/http_basic_authen.php'; } // } // End HTTP basic authentication } } } echo '<wfs:WFS_TransactionResponse version="1.0.0" service="WFS" xmlns:wfs="http://www.opengis.net/wfs" xmlns:ogc="http://www.opengis.net/ogc">'; // First we loop through inserts if (sizeof($forSql['tables']) > 0) { for ($i = 0; $i < sizeof($forSql['tables']); $i++) { if ($postgisObject->getGeometryColumns($postgisschema . "." . $forSql['tables'][$i], "editable")) { $the_geom = $postgisObject->getGeometryColumns($postgisschema . "." . $forSql['tables'][$i], "f_geometry_column"); $primeryKey = $postgisObject->getPrimeryKey($postgisschema . "." . $forSql['tables'][$i]); //$metaData = $postgisObject -> getMetaData($forSql['tables'][$i]); $sql = "INSERT into {$postgisschema}.{$forSql['tables'][$i]} ("; foreach ($forSql['fields'][$i] as $field) { $fields[] = "\"" . $field . "\""; } $sql .= implode(",", $fields); unset($fields); $sql .= ") VALUES("; foreach ($forSql['values'][$i] as $key => $value) { if (is_array($value)) { fb($forSql['fields'][$i][$key]); $values[] = "public.ST_Transform(public.ST_GeometryFromText('" . current($value) . "'," . next($value) . ")," . $postgisObject->getGeometryColumns($postgisschema . "." . $forSql['tables'][$i], "srid") . ")"; } elseif (!$value) { $values[] = "NULL"; } else { $values[] = $postgisObject->quote($value); } } $sql .= implode(",", $values); unset($values); $sql .= ") RETURNING {$primeryKey['attname']} as gid,public.ST_AsText(public.ST_Centroid({$the_geom})) as {$the_geom};"; // The query will return the new key $sqls['insert'][] = $sql; } else { $notEditable[$forSql['tables'][0]] = true; } } } // Second we loop through updates if (sizeof($forSql2['tables']) > 0) { for ($i = 0; $i < sizeof($forSql2['tables']); $i++) { //$metaData = $postgisObject -> getMetaData($forSql2['tables'][$i]); if ($postgisObject->getGeometryColumns($postgisschema . "." . $forSql2['tables'][$i], "editable")) { $the_geom = $postgisObject->getGeometryColumns($postgisschema . "." . $forSql2['tables'][$i], "f_geometry_column"); $primeryKey = $postgisObject->getPrimeryKey($postgisschema . "." . $forSql2['tables'][$i]); $sql = "UPDATE {$postgisschema}.{$forSql2['tables'][$i]} SET "; foreach ($forSql2['fields'][$i] as $key => $field) { if (is_array($forSql2['values'][$i][$key])) { // is geometry fb($forSql2['fields'][$i][$key]); $value = "public.ST_Transform(public.ST_GeometryFromText('" . current($forSql2['values'][$i][$key]) . "'," . next($forSql2['values'][$i][$key]) . ")," . $postgisObject->getGeometryColumns($postgisschema . "." . $forSql2['tables'][$i], "srid") . ")"; } elseif (!$forSql2['values'][$i][$key]) { $value = "NULL"; } else { $value = $postgisObject->quote($forSql2['values'][$i][$key]); // We need to escape the string } if (!is_array($forSql2['values'][$i][$key])) { // is not geometry. Adding "" around field names $pairs[] = "\"" . $field . "\"=" . $value; } else { $pairs[] = $field . "=" . $value; } } $sql .= implode(",", $pairs); $sql .= " WHERE {$forSql2['wheres'][$i]} RETURNING {$primeryKey['attname']} as gid,public.ST_AsText(public.ST_Centroid({$the_geom})) as {$the_geom};"; unset($pairs); $sqls['update'][] = $sql; } else { $notEditable[$forSql2['tables'][0]] = true; } } } // Third we loop through deletes if (sizeof($forSql3['tables']) > 0) { for ($i = 0; $i < sizeof($forSql3['tables']); $i++) { if ($postgisObject->getGeometryColumns($postgisschema . "." . $forSql3['tables'][$i], "editable")) { $sqls['delete'][] = "DELETE FROM {$postgisschema}.{$forSql3['tables'][$i]} WHERE {$forSql3['wheres'][$i]};\n\n"; } else { $notEditable[$forSql3['tables'][0]] = true; } } } // We start sql BEGIN block $postgisObject->connect("PDO"); $postgisObject->begin(); // We fire the sqls if (isset($sqls)) { foreach ($sqls as $operation => $sql) { foreach ($sql as $singleSql) { if ($operation == "insert" || $operation == "update") { $results[$operation][] = $postgisObject->execQuery($singleSql, "PDO", "select"); // Returning PDOStatement object } else { $results[$operation] += $postgisObject->execQuery($singleSql, "PDO", "transaction"); // Returning interger } logfile::write("Sqls fired\n"); logfile::write("{$singleSql}\n"); } } } // If a layer is not editable, PDOerror is set. if (sizeof($notEditable) > 0) { $postgisObject->PDOerror[0] = "Layer not editable"; } // WFS message echo '<wfs:Message>'; echo '</wfs:Message>'; // TransactionResult if (sizeof($postgisObject->PDOerror) == 0) { echo '<wfs:TransactionResult><wfs:Status><wfs:SUCCESS/></wfs:Status></wfs:TransactionResult>'; $postgisObject->commit(); } else { echo '<wfs:TransactionResult><wfs:Status><wfs:FAILURE/></wfs:Status></wfs:TransactionResult>'; logfile::write("Error in\n"); foreach ($postgisObject->PDOerror as $str) { logfile::write("{$str}\n"); } logfile::write("ROLLBACK\n"); $postgisObject->rollback(); $results['insert'] = NULL; // Was object $results['update'] = NULL; // Was object $results['delete'] = 0; makeExceptionReport($postgisObject->PDOerror); // This output a exception and kills the script } // InsertResult if (sizeof($results['insert']) > 0) { reset($forSql['tables']); echo '<wfs:InsertResults handle="mygeocloud-WFS-default-handle">'; foreach ($results['insert'] as $res) { echo '<ogc:FeatureId fid="'; echo current($forSql['tables']) . "."; $row = $postgisObject->fetchRow($res); echo $row['gid']; echo '"/>'; //$version->set(current($forSql['tables']),"insert",$row[$postgisObject->getGeometryColumns(current($forSql['tables']), "f_geometry_column")]); next($forSql['tables']); } echo '</wfs:InsertResults>'; } // UpdateResult if (sizeof($results['update']) > 0) { reset($forSql2['tables']); echo '<wfs:UpdateResult>'; foreach ($results['update'] as $res) { echo '<ogc:FeatureId fid="'; echo current($forSql2['tables']) . "."; $row = $postgisObject->fetchRow($res); echo $row['gid']; echo '" />'; //$version->set(current($forSql2['tables']),"update",$row[$postgisObject->getGeometryColumns(current($forSql['tables']), "f_geometry_column")]); next($forSql2['tables']); } echo '</wfs:UpdateResult>'; } // TransactionSummary echo '<wfs:TransactionSummary>'; if (isset($results)) { foreach ($results as $operation => $result) { if ($operation == "insert") { echo "<wfs:totalInserted>" . sizeof($result) . "</wfs:totalInserted>"; } if ($operation == "update") { echo "<wfs:totalUpdated>" . sizeof($result) . "</wfs:totalUpdated>"; } if ($operation == "delete") { echo "<wfs:totalDeleted>" . $result . "</wfs:totalDeleted>"; } } } echo '</wfs:TransactionSummary>'; echo '</wfs:WFS_TransactionResponse>'; $postgisObject->free($result); }
?> "> <input type="button" value="<?php echo translate('Refresh'); ?> " onclick="location.reload(true);"/> <?php echo makePopupButton('?view=monitor', 'zmMonitor0', 'monitor', translate('AddNewMonitor'), canEdit('Monitors') && !$user['MonitorIds']); ?> <?php echo makePopupButton('?view=filter&filter[terms][0][attr]=DateTime&filter[terms][0][op]=%3c&filter[terms][0][val]=now', 'zmFilter', 'filter', translate('Filters'), canView('Events')); ?> </td> <?php for ($i = 0; $i < count($eventCounts); $i++) { parseFilter($eventCounts[$i]['filter']); ?> <td class="colEvents"><?php echo makePopupLink('?view=' . $eventsView . '&page=1' . $eventCounts[$i]['filter']['query'], $eventsWindow, $eventsView, $eventCounts[$i]['total'], canView('Events')); ?> </td> <?php } ?> <td class="colZones"><?php echo $zoneCount; ?> </td> <td class="colRightButtons" colspan="<?php echo canEdit('Monitors') ? 2 : 1; ?>
function doParse($arr) { global $postgisObject; global $user; global $postgisschema; global $layerObj; global $parentUser; global $transaction; global $db; $serializer_options = array('indent' => ' '); // We start sql BEGIN block $postgisObject->connect("PDO"); $postgisObject->begin(); $Serializer = new XML_Serializer($serializer_options); $workflowData = array(); foreach ($arr as $key => $featureMember) { if ($key == "Insert") { if (!is_array($featureMember[0]) && isset($featureMember)) { $featureMember = array(0 => $featureMember); } foreach ($featureMember as $hey) { foreach ($hey as $typeName => $feature) { $typeName = dropAllNameSpaces($typeName); if (is_array($feature)) { // Skip handles // Remove ns from properties foreach ($feature as $field => $value) { $split = explode(":", $field); if ($split[1]) { $feature[dropAllNameSpaces($field)] = $value; unset($feature[$field]); } } // Check if table is versioned or has workflow. Add fields when clients doesn't send unaltered fields. $tableObj = new table($postgisschema . "." . $typeName); if (!array_key_exists("gc2_version_user", $feature) && $tableObj->versioning) { $feature["gc2_version_user"] = null; } if (!array_key_exists("gc2_status", $feature) && $tableObj->workflow) { $feature["gc2_status"] = null; } if (!array_key_exists("gc2_workflow", $feature) && $tableObj->workflow) { $feature["gc2_workflow"] = null; } foreach ($feature as $field => $value) { $fields[] = $field; $roleObj = $layerObj->getRole($postgisschema, $typeName, $user); $role = $roleObj["data"][$user]; if ($tableObj->workflow && ($role == "none" && $parentUser == false)) { makeExceptionReport("You don't have a role in the workflow of '{$typeName}'"); } if (is_array($value)) { // Must be geom if array // We serialize the geometry back to XML for parsing $Serializer->serialize($value); $gmlCon = new gmlConverter(); $wktArr = $gmlCon->gmlToWKT($Serializer->getSerializedData(), array()); $values[] = array("{$field}" => $wktArr[0][0], "srid" => $wktArr[1][0]); unset($gmlCon); unset($wktArr); //Log::write($Serializer->getSerializedData()."\n\n"); } elseif ($field == "gc2_version_user") { $values[] = $user; } elseif ($field == "gc2_status") { switch ($role) { case "author": $values[] = 1; break; case "reviewer": $values[] = 2; break; case "publisher": $values[] = 3; break; default: $values[] = 3; break; } } elseif ($field == "gc2_workflow") { switch ($role) { case "author": $values[] = "hstore('author', '{$user}')"; break; case "reviewer": $values[] = "hstore('reviewer', '{$user}')"; break; case "publisher": $values[] = "hstore('publisher', '{$user}')"; break; default: $values[] = "''"; break; } } else { $values[] = pg_escape_string($value); } } $forSql['tables'][] = $typeName; $forSql['fields'][] = $fields; $forSql['values'][] = $values; $fields = array(); $values = array(); //TODO check //$field = ""; //$value = ""; // Start HTTP basic authentication $auth = $postgisObject->getGeometryColumns($postgisschema . "." . $typeName, "authentication"); if ($auth == "Write" or $auth == "Read/write") { $HTTP_FORM_VARS["TYPENAME"] = $typeName; include 'inc/http_basic_authen.php'; } // End HTTP basic authentication } } } } if ($key == "Update") { if (!is_array($featureMember[0]) && isset($featureMember)) { $featureMember = array(0 => $featureMember); } $fid = 0; foreach ($featureMember as $hey) { $hey["typeName"] = dropAllNameSpaces($hey["typeName"]); if (!is_array($hey['Property'][0]) && isset($hey['Property'])) { $hey['Property'] = array(0 => $hey['Property']); } // Check if table is versioned or has workflow. Add fields when clients doesn't send unaltered fields. $tableObj = new table($postgisschema . "." . $hey["typeName"]); foreach ($hey["Property"] as $v) { if ($v["Name"] == "gc2_version_user") { $gc2_version_user_flag = true; } if ($v["Name"] == "gc2_version_start_date") { $gc2_version_start_date_flag = true; } if ($v["Name"] == "gc2_status") { $gc2_status_flag = true; } if ($v["Name"] == "gc2_workflow") { $gc2_workflow_flag = true; } } if (!$gc2_version_user_flag && $tableObj->versioning) { $hey["Property"][] = array("Name" => "gc2_version_user", "Value" => null); } if (!$gc2_version_start_date_flag && $tableObj->versioning) { $hey["Property"][] = array("Name" => "gc2_version_start_date", "Value" => null); } if (!$gc2_status_flag && $tableObj->workflow) { $hey["Property"][] = array("Name" => "gc2_status", "Value" => null); } if (!$gc2_workflow_flag && $tableObj->workflow) { $hey["Property"][] = array("Name" => "gc2_workflow", "Value" => null); } //makeExceptionReport(print_r($hey, true)); foreach ($hey['Property'] as $pair) { $fields[$fid][] = $pair['Name']; $roleObj = $layerObj->getRole($postgisschema, $hey['typeName'], $user); $role = $roleObj["data"][$user]; if ($tableObj->workflow && ($role == "none" && $parentUser == false)) { makeExceptionReport("You don't have a role in the workflow of '{$hey['typeName']}'"); } if (is_array($pair['Value'])) { // Must be geom if array // We serialize the geometry back to XML for parsing $Serializer->serialize($pair['Value']); Log::write($Serializer->getSerializedData() . "\n\n"); $gmlCon = new gmlConverter(); $wktArr = $gmlCon->gmlToWKT($Serializer->getSerializedData(), array()); $values[$fid][] = array("{$pair['Name']}" => current($wktArr[0]), "srid" => current($wktArr[1])); unset($gmlCon); unset($wktArr); } else { $values[$fid][] = $pair['Value']; } } $forSql2['tables'][$fid] = $hey['typeName']; $forSql2['fields'] = $fields; $forSql2['values'] = $values; $forSql2['wheres'][$fid] = parseFilter($hey['Filter'], $hey['typeName']); $fid++; // Start HTTP basic authentication $auth = $postgisObject->getGeometryColumns($postgisschema . "." . $hey['typeName'], "authentication"); if ($auth == "Write" or $auth == "Read/write") { $HTTP_FORM_VARS["TYPENAME"] = $hey['typeName']; include 'inc/http_basic_authen.php'; } // End HTTP basic authentication } $pair = array(); $values = array(); $fields = array(); } if ($key == "Delete") { if (!is_array($featureMember[0]) && isset($featureMember)) { $featureMember = array(0 => $featureMember); } foreach ($featureMember as $hey) { $hey['typeName'] = dropAllNameSpaces($hey['typeName']); $forSql3['tables'][] = $hey['typeName']; $forSql3['wheres'][] = parseFilter($hey['Filter'], $hey['typeName']); $roleObj = $layerObj->getRole($postgisschema, $hey['typeName'], $user); $role = $roleObj["data"][$user]; $tableObj = new table($postgisschema . "." . $hey["typeName"]); if ($tableObj->workflow && ($role == "none" && $parentUser == false)) { makeExceptionReport("You don't have a role in the workflow of '{$hey['typeName']}'"); } // Start HTTP basic authentication $auth = $postgisObject->getGeometryColumns($postgisschema . "." . $hey['typeName'], "authentication"); if ($auth == "Write" or $auth == "Read/write") { $HTTP_FORM_VARS["TYPENAME"] = $hey['typeName']; include 'inc/http_basic_authen.php'; } // End HTTP basic authentication } } } echo '<wfs:WFS_TransactionResponse version="1.0.0" xmlns:wfs="http://www.opengis.net/wfs" xmlns:ogc="http://www.opengis.net/ogc" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.opengis.net/wfs http://schemas.opengis.net/wfs/1.0.0/WFS-transaction.xsd">'; // First we loop through inserts if (sizeof($forSql['tables']) > 0) { for ($i = 0; $i < sizeof($forSql['tables']); $i++) { if ($postgisObject->getGeometryColumns($postgisschema . "." . $forSql['tables'][$i], "editable")) { \app\controllers\Tilecache::bust($postgisschema . "." . $forSql['tables'][$i]); $gc2_workflow_flag = false; $roleObj = $layerObj->getRole($postgisschema, $forSql['tables'][$i], $user); $primeryKey = $postgisObject->getPrimeryKey($postgisschema . "." . $forSql['tables'][$i]); $sql = "INSERT INTO {$postgisschema}.{$forSql['tables'][$i]} ("; foreach ($forSql['fields'][$i] as $key => $field) { if ($field != "gc2_version_uuid" && $field != "gc2_version_start_date" && $field != "gc2_version_gid") { $fields[] = "\"" . $field . "\""; } } $sql .= implode(",", $fields); unset($fields); $sql .= ") VALUES("; foreach ($forSql['values'][$i] as $key => $value) { if ($forSql['fields'][$i][$key] != "gc2_version_uuid" && $forSql['fields'][$i][$key] != "gc2_version_start_date" && $forSql['fields'][$i][$key] != "gc2_version_gid") { if (is_array($value)) { $values[] = "public.ST_Transform(public.ST_GeometryFromText('" . current($value) . "'," . next($value) . ")," . $postgisObject->getGeometryColumns($postgisschema . "." . $forSql['tables'][$i], "srid") . ")"; } elseif (!$value) { $values[] = "NULL"; } elseif ($forSql['fields'][$i][$key] == "gc2_workflow") { // Don't quote a hstore $values[] = $value; $gc2_workflow_flag = true; } else { $values[] = $postgisObject->quote($value); } } } $sql .= implode(",", $values); unset($values); $sql .= ") RETURNING {$primeryKey['attname']} as gid"; // The query will return the new key if ($gc2_workflow_flag) { $sql .= ",gc2_version_gid,gc2_status,gc2_workflow," . \app\inc\PgHStore::toPg($roleObj["data"]) . " as roles"; $gc2_workflow_flag = false; } $sqls['insert'][] = $sql; } else { $notEditable[$forSql['tables'][0]] = true; } } } // Second we loop through updates if (sizeof($forSql2['tables']) > 0) { for ($i = 0; $i < sizeof($forSql2['tables']); $i++) { if ($postgisObject->getGeometryColumns($postgisschema . "." . $forSql2['tables'][$i], "editable")) { \app\controllers\Tilecache::bust($postgisschema . "." . $forSql2['tables'][$i]); $primeryKey = $postgisObject->getPrimeryKey($postgisschema . "." . $forSql2['tables'][$i]); $tableObj = new table($postgisschema . "." . $forSql2['tables'][$i]); if ($tableObj->versioning) { // Get original feature $query = "SELECT * FROM {$postgisschema}.{$forSql2['tables'][$i]} WHERE {$forSql2['wheres'][$i]}"; $res = $postgisObject->execQuery($query); $originalFeature = $postgisObject->fetchRow($res); // Check if feature is ended if ($originalFeature["gc2_version_end_date"]) { makeExceptionReport("You can't change the history!"); } // Clone original feature for ended version $intoArr = array(); $selectArr = array(); foreach ($originalFeature as $k => $v) { if ($k != $primeryKey['attname']) { if ($k == "gc2_version_end_date") { $intoArr[] = $k; $selectArr[] = "now()"; } else { $intoArr[] = $selectArr[] = $k; } } } $sql = "INSERT INTO {$postgisschema}.{$forSql2['tables'][$i]}("; $sql .= implode(",", $intoArr); $sql .= ")"; $sql .= " SELECT "; $sql .= implode(",", $selectArr); $sql .= " FROM {$postgisschema}.{$forSql2['tables'][$i]}"; $sql .= " WHERE {$forSql2['wheres'][$i]}"; //makeExceptionReport($sql); $postgisObject->execQuery($sql); } $sql = "UPDATE {$postgisschema}.{$forSql2['tables'][$i]} SET "; $roleObj = $layerObj->getRole($postgisschema, $forSql2['tables'][$i], $user); $role = $roleObj["data"][$user]; foreach ($forSql2['fields'][$i] as $key => $field) { if (is_array($forSql2['values'][$i][$key])) { // is geometry $value = "public.ST_Transform(public.ST_GeometryFromText('" . current($forSql2['values'][$i][$key]) . "'," . next($forSql2['values'][$i][$key]) . ")," . $postgisObject->getGeometryColumns($postgisschema . "." . $forSql2['tables'][$i], "srid") . ")"; } elseif ($field == "gc2_version_user") { $value = $postgisObject->quote($user); } elseif ($field == "gc2_status") { switch ($role) { case "author": if ($originalFeature[$field] > 1) { makeExceptionReport("This feature has been " . ($originalFeature[$field] == 2 ? "reviewed" : "published") . ", so an author can't edit it."); } $value = 1; break; case "reviewer": if ($originalFeature[$field] > 2) { makeExceptionReport("This feature has been published, so a reviewer can't edit it."); } $value = 2; break; case "publisher": $value = 3; break; default: $value = $originalFeature[$field]; break; } } elseif ($field == "gc2_workflow") { switch ($role) { case "author": $value = "'{$originalFeature[$field]}'::hstore || hstore('author', '{$user}')"; break; case "reviewer": $value = "'{$originalFeature[$field]}'::hstore || hstore('reviewer', '{$user}')"; break; case "publisher": $value = "'{$originalFeature[$field]}'::hstore || hstore('publisher', '{$user}')"; break; default: $value = "'{$originalFeature[$field]}'::hstore"; break; } } elseif ($field == "gc2_version_start_date") { $value = "now()"; } elseif (!$forSql2['values'][$i][$key]) { $value = "NULL"; } else { $value = $postgisObject->quote($forSql2['values'][$i][$key]); // We need to escape the string } $pairs[] = "\"" . $field . "\" =" . $value; } $sql .= implode(",", $pairs); $sql .= " WHERE {$forSql2['wheres'][$i]} RETURNING {$primeryKey['attname']} as gid"; if ($tableObj->workflow) { $sql .= ",gc2_version_gid,gc2_status,gc2_workflow," . \app\inc\PgHStore::toPg($roleObj["data"]) . " as roles"; } //makeExceptionReport($sql); unset($pairs); $sqls['update'][] = $sql; } else { $notEditable[$forSql2['tables'][0]] = true; } } } // Third we loop through deletes if (sizeof($forSql3['tables']) > 0) { for ($i = 0; $i < sizeof($forSql3['tables']); $i++) { if ($postgisObject->getGeometryColumns($postgisschema . "." . $forSql3['tables'][$i], "editable")) { \app\controllers\Tilecache::bust($postgisschema . "." . $forSql3['tables'][$i]); $primeryKey = $postgisObject->getPrimeryKey($postgisschema . "." . $forSql3['tables'][$i]); $tableObj = new table($postgisschema . "." . $forSql3['tables'][$i]); if ($tableObj->versioning) { // Check if its history $res = $postgisObject->execQuery("SELECT gc2_version_end_date FROM {$postgisschema}.{$forSql3['tables'][$i]} WHERE {$forSql3['wheres'][$i]}", "PDO", "select"); $checkRow = $postgisObject->fetchRow($res); if ($checkRow["gc2_version_end_date"]) { makeExceptionReport("You can't change the history!"); } // Update old record start $sql = "UPDATE {$postgisschema}.{$forSql3['tables'][$i]} SET gc2_version_end_date = now(), gc2_version_user='******'"; if ($tableObj->workflow) { // get original feature from feature $query = "SELECT * FROM {$postgisschema}.{$forSql3['tables'][$i]} WHERE {$forSql3['wheres'][$i]}"; $resStatus = $postgisObject->execQuery($query); $originalFeature = $postgisObject->fetchRow($resStatus); $status = $originalFeature["gc2_status"]; // Get role $roleObj = $layerObj->getRole($postgisschema, $forSql3['tables'][$i], $user); $role = $roleObj["data"][$user]; switch ($role) { case "author": if ($status > 1) { makeExceptionReport("This feature has been " . ($status == 2 ? "reviewed" : "published") . ", so an author can't delete it."); } $value = 1; break; case "reviewer": if ($status > 2) { makeExceptionReport("This feature has been published so a reviewer can't delete it."); } $value = 2; break; case "publisher": $value = 3; break; default: $value = $status; break; } $sql .= ", gc2_status = {$value}"; } // Update workflow if ($tableObj->workflow) { $workflow = $originalFeature["gc2_workflow"]; switch ($role) { case "author": $value = "'{$workflow}'::hstore || hstore('author', '{$user}')"; break; case "reviewer": $value = "'{$workflow}'::hstore || hstore('reviewer', '{$user}')"; break; case "publisher": $value = "'{$workflow}'::hstore || hstore('publisher', '{$user}')"; break; default: $value = "'{$workflow}'::hstore"; break; } $sql .= ", gc2_workflow = {$value}"; } $sql .= " WHERE {$forSql3['wheres'][$i]} RETURNING {$primeryKey['attname']} as gid"; if ($tableObj->workflow) { $sql .= ",gc2_version_gid,gc2_status,gc2_workflow," . \app\inc\PgHStore::toPg($roleObj["data"]) . " as roles"; } $sqls['delete'][] = $sql; // Update old record end } else { $sqls['delete'][] = "DELETE FROM {$postgisschema}.{$forSql3['tables'][$i]} WHERE {$forSql3['wheres'][$i]} RETURNING {$primeryKey['attname']} as gid"; } } else { $notEditable[$forSql3['tables'][0]] = true; } } } // We fire the sqls if (isset($sqls)) { foreach ($sqls as $operation => $sql) { foreach ($sql as $singleSql) { $results[$operation][] = $postgisObject->execQuery($singleSql, "PDO", "select"); // Returning PDOStatement object Log::write("Sqls fired\n"); Log::write("{$singleSql}\n"); } } } // If a layer is not editable, PDOerror is set. if (sizeof($notEditable) > 0) { $postgisObject->PDOerror[0] = "Layer not editable"; } // WFS message echo '<wfs:Message>'; echo '</wfs:Message>'; // TransactionResult if (sizeof($postgisObject->PDOerror) == 0) { echo '<wfs:TransactionResult handle="mygeocloud-WFS-default-handle"><wfs:Status><wfs:SUCCESS/></wfs:Status></wfs:TransactionResult>'; } else { echo '<wfs:TransactionResult handle="mygeocloud-WFS-default-handle"><wfs:Status><wfs:FAILURE/></wfs:Status></wfs:TransactionResult>'; Log::write("Error in\n"); foreach ($postgisObject->PDOerror as $str) { Log::write("{$str}\n"); } Log::write("ROLLBACK\n"); $postgisObject->rollback(); $results['insert'] = NULL; // Was object $results['update'] = NULL; // Was object $results['delete'] = 0; makeExceptionReport($postgisObject->PDOerror); // This output a exception and kills the script } // InsertResult if (sizeof($results['insert']) > 0) { if (isset($forSql['tables'])) { reset($forSql['tables']); } echo '<wfs:InsertResult>'; foreach ($results['insert'] as $res) { echo '<ogc:FeatureId fid="'; if (isset($forSql['tables'])) { echo current($forSql['tables']) . "."; } $row = $postgisObject->fetchRow($res); echo $row['gid']; echo '"/>'; if (isset($row["gc2_workflow"])) { $workflowData[] = array("schema" => $postgisschema, "table" => current($forSql['tables']), "gid" => $row['gid'], "user" => $user, "status" => $row['gc2_status'], "workflow" => $row['gc2_workflow'], "roles" => $row['roles'], "version_gid" => $row['gc2_version_gid'], "operation" => "insert"); } if (isset($forSql['tables'])) { next($forSql['tables']); } } echo '</wfs:InsertResult>'; } // UpdateResult if (sizeof($results['update']) > 0) { if (isset($forSql2['tables'])) { reset($forSql2['tables']); } echo '<wfs:UpdateResult>'; foreach ($results['update'] as $res) { echo '<ogc:FeatureId fid="'; if (isset($forSql2['tables'])) { echo current($forSql2['tables']) . "."; } $row = $postgisObject->fetchRow($res); echo $row['gid']; echo '" />'; if (isset($row["gc2_workflow"])) { $workflowData[] = array("schema" => $postgisschema, "table" => current($forSql2['tables']), "gid" => $row['gid'], "user" => $user, "status" => $row['gc2_status'], "workflow" => $row['gc2_workflow'], "roles" => $row['roles'], "version_gid" => $row['gc2_version_gid'], "operation" => "update"); } if (isset($forSql2['tables'])) { next($forSql2['tables']); } } echo '</wfs:UpdateResult>'; } // deleteResult if (sizeof($results['delete']) > 0) { if (isset($forSql3['tables'])) { reset($forSql3['tables']); } foreach ($results['delete'] as $res) { $row = $postgisObject->fetchRow($res); if (isset($row["gc2_workflow"])) { $workflowData[] = array("schema" => $postgisschema, "table" => current($forSql3['tables']), "gid" => $row['gid'], "user" => $user, "status" => $row['gc2_status'], "workflow" => $row['gc2_workflow'], "roles" => $row['roles'], "version_gid" => $row['gc2_version_gid'], "operation" => "delete"); } if (isset($forSql2['tables'])) { next($forSql2['tables']); } } } // TransactionSummary echo '<wfs:TransactionSummary>'; if (isset($results)) { foreach ($results as $operation => $result) { if ($operation == "insert") { echo "<wfs:totalInserted>" . sizeof($result) . "</wfs:totalInserted>"; } if ($operation == "update") { echo "<wfs:totalUpdated>" . sizeof($result) . "</wfs:totalUpdated>"; } if ($operation == "delete") { echo "<wfs:totalDeleted>" . sizeof($result) . "</wfs:totalDeleted>"; } } } echo '</wfs:TransactionSummary>'; echo '</wfs:WFS_TransactionResponse>'; if (sizeof($workflowData) > 0) { $sqls = array(); foreach ($workflowData as $w) { $sql = "INSERT INTO settings.workflow (f_schema_name,f_table_name,gid,status,gc2_user,roles,workflow,version_gid,operation)"; $sql .= " VALUES('{$w["schema"]}','{$w["table"]}',{$w["gid"]},{$w["status"]},'{$w["user"]}','{$w["roles"]}'::hstore,'{$w["workflow"]}'::hstore,{$w["version_gid"]},'{$w["operation"]}')"; $sqls[] = $sql; } // We fire the sqls foreach ($sqls as $sql) { $postgisObject->execQuery($sql, "PDO", "transaction"); } if (sizeof($postgisObject->PDOerror) > 0) { makeExceptionReport($postgisObject->PDOerror); // This output a exception and kills the script } } //makeExceptionReport(print_r($sqls, true)); $postgisObject->commit(); $postgisObject->free($result); }
if (isset($_REQUEST["sld_form_element_id"]) && isset($_REQUEST["sld_objects_rule_id"])) { $first_load = 1; $sld_form_element_id = $_REQUEST["sld_form_element_id"]; $_SESSION["sld_form_element_id"] = $sld_form_element_id; $sld_objects_rule_id = $_REQUEST["sld_objects_rule_id"]; $_SESSION["sld_objects_rule_id"] = $sld_objects_rule_id; $filter = $sld_objects[$sld_objects_rule_id]->filter; $_SESSION["sld_filter"] = $filter; } else { $first_load = 0; $sld_form_element_id = $_SESSION["sld_form_element_id"]; $sld_objects_rule_id = $_SESSION["sld_objects_rule_id"]; $filter = $_SESSION["sld_filter"]; } //Parse the Filter Expression $filterObj = parseFilter($filter); if ($filterObj == "") { //$filterObj = new Filter(); } //Function handling if (isset($_REQUEST["function"])) { $function = $_REQUEST["function"]; //Handle the requested functions if ($function == "addoperation") { if (isset($_REQUEST["id"]) && isset($_REQUEST["operation"])) { $operation = $_REQUEST["operation"]; switch (strtoupper($operation)) { case "OR": $_SESSION["sld_filter_objects"][$_REQUEST["id"]]->operations[] = new BinaryLogicOp("Or"); break; case "AND":
<?php } if ($cycleCount > 1) { ?> <td><?php echo makeLink("?view=montage", translate('Montage'), $running && canView('Stream')); ?> </td> <?php } else { ?> <td> </td> <?php } for ($i = 0; $i < count($eventCounts); $i++) { parseFilter($eventCounts[$i]['filter'], false, '&'); ?> <td class="colEvents"><?php echo makeLink("?view=events&page=1" . $eventCounts[$i]['filter']['query'], $eventCounts[$i]['total'], canView('Events')); ?> </td> <?php } ?> </tr> </table> </div> </div> </body> </html>
return; } $midSql = ''; if ($user['MonitorIds']) { $midSql = " and MonitorId in (" . join(",", preg_split('/["\'\\s]*,["\'\\s]*/', $user['MonitorIds'])) . ")"; } $sql = 'select E.*,M.Name as MonitorName,M.Width,M.Height from Events as E inner join Monitors as M on E.MonitorId = M.Id where E.Id = ?' . $midSql; $event = dbFetchOne($sql, NULL, array($_REQUEST['eid'])); if (!empty($_REQUEST['fid'])) { $frame = dbFetchOne('SELECT * FROM Frames WHERE EventID = ? AND FrameId = ?', NULL, array($_REQUEST['eid'], $_REQUEST['fid'])); } elseif (isset($_REQUEST['fid'])) { $frame = dbFetchOne('SELECT * FROM Frames WHERE EventID = ? AND Score = ?', NULL, array($_REQUEST['eid'], $event['MaxScore'])); $_REQUEST['fid'] = $frame['FrameId']; } parseSort(true, '&'); parseFilter($_REQUEST['filter'], true, '&'); $filterQuery = $_REQUEST['filter']['query']; if ($sortOrder == 'asc') { $sql = "select E.* from Events as E inner join Monitors as M on E.MonitorId = M.Id where {$sortColumn} <= ?" . $_REQUEST['filter']['sql'] . $midSql . " order by {$sortColumn} desc"; } else { $sql = "select E.* from Events as E inner join Monitors as M on E.MonitorId = M.Id where {$sortColumn} >= ?" . $_REQUEST['filter']['sql'] . $midSql . " order by {$sortColumn} asc"; } $result = dbQuery($sql, array($event[$_REQUEST['sort_field']])); while ($row = dbFetchNext($result)) { if ($row['Id'] == $_REQUEST['eid']) { $prevEvent = dbFetchNext($result); break; } } $sql = "select E.* from Events as E inner join Monitors as M on E.MonitorId = M.Id where {$sortColumn} " . ($sortOrder == 'asc' ? '>=' : '<=') . ' ?' . $_REQUEST['filter']['sql'] . $midSql . " order by {$sortColumn} {$sortOrder}"; $result = dbQuery($sql, array($event[$_REQUEST['sort_field']]));
function wfs_server() { // Manually tested this piece of code in order to check the requests. // Code based on a similar idea but build in Java header('Content-Type:text/xml; charset=UTF-8', TRUE); header('Connection:close', TRUE); //$userFromUri = "mhoegh"; // for testing logfile::write($userFromUri . "\n\n"); // We connect to the users db $postgisdb = $userFromUri; $srs = $srsFromUri; $postgisschema = $schemaFromUri; $postgisObject = new postgis(); //$user = new users($userFromUri); //$version = new version($user); $geometryColumnsObj = new GeometryColumns(); function microtime_float() { list($utime, $time) = explode(" ", microtime()); return (double) $utime + (double) $time; } $startTime = microtime_float(); //ini_set("display_errors", "On"); $thePath = "http://" . $_SERVER['SERVER_NAME'] . $_SERVER['REDIRECT_URL']; //$thePath= "http://".$_SERVER['SERVER_NAME'].$_SERVER['PHP_SELF']; $server = "http://" . $_SERVER['SERVER_NAME']; $BBox = null; //end added $currentTable = null; $currentTag = null; $gen = array(); $gen[0] = ""; $level = 0; $depth = 0; $tables = array(); $fields = array(); $wheres = array(); $limits = array(); logfile::write("\nRequest\n\n"); logfile::write($HTTP_RAW_POST_DATA . "\n\n"); $unserializer_options = array('parseAttributes' => TRUE, 'typeHints' => FALSE); $unserializer = new XML_Unserializer($unserializer_options); /*$HTTP_RAW_POST_DATA = '<?xml version="1.0" encoding="utf-8"?><wfs:Transaction service="WFS" version="1.0.0" xmlns="http://www.opengis.net/wfs" xmlns:mrhg="http://twitter/mrhg" xmlns:ogc="http://www.opengis.net/ogc" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"><wfs:Insert idgen="GenerateNew"><mrhg:hej><the_geom><gml:MultiPolygon srsName="urn:x-ogc:def:crs:EPSG:6.9:4326"><gml:polygonMember><gml:Polygon><gml:exterior><gml:LinearRing><gml:coordinates>5.0657329559,-41.1107215881 8.4824724197,-39.3435783386 4.3241734505,-34.6001853943 5.0657329559,-41.1107215881 </gml:coordinates></gml:LinearRing></gml:exterior></gml:Polygon></gml:polygonMember></gml:MultiPolygon></the_geom></mrhg:hej></wfs:Insert></wfs:Transaction>';*/ /*$HTTP_RAW_POST_DATA = '<?xml version="1.0"?><DescribeFeatureType version="1.1.0" service="WFS" xmlns="http://www.opengis.net/wfs" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.opengis.net/wfs http://schemas.opengis.net/wfs/1.1.0/wfs.xsd"> <TypeName>california_coastline</TypeName></DescribeFeatureType>'; */ // Post method is used if ($HTTP_RAW_POST_DATA) { //$forUseInSpatialFilter = $HTTP_RAW_POST_DATA; // We store a unaltered version of the raw request $HTTP_RAW_POST_DATA = dropNameSpace($HTTP_RAW_POST_DATA); logfile::write($HTTP_RAW_POST_DATA . "\n\n"); $status = $unserializer->unserialize($HTTP_RAW_POST_DATA); $arr = $unserializer->getUnserializedData(); $request = $unserializer->getRootName(); //print_r($arr); switch ($request) { case "GetFeature": if (!is_array($arr['Query'][0])) { $arr['Query'] = array(0 => $arr['Query']); } for ($i = 0; $i < sizeof($arr['Query']); $i++) { if (!is_array($arr['Query'][$i]['PropertyName'])) { $arr['Query'][$i]['PropertyName'] = array(0 => $arr['Query'][$i]['PropertyName']); } } $HTTP_FORM_VARS["REQUEST"] = "GetFeature"; foreach ($arr['Query'] as $queries) { $HTTP_FORM_VARS["TYPENAME"] .= $queries['typeName'] . ","; if ($queries['PropertyName'][0]) { foreach ($queries['PropertyName'] as $PropertyNames) { // We check if typeName is prefix and add it if its not if (strpos($PropertyNames, ".")) { $HTTP_FORM_VARS["PROPERTYNAME"] .= $PropertyNames . ","; } else { $HTTP_FORM_VARS["PROPERTYNAME"] .= $queries['typeName'] . "." . $PropertyNames . ","; } } } if (is_array($queries['Filter']) && $arr['version'] == "1.0.0") { @($checkXml = simplexml_load_string($queries['Filter'])); if ($checkXml === FALSE) { makeExceptionReport("Filter is not valid"); } $wheres[$queries['typeName']] = parseFilter($queries['Filter'], $queries['typeName']); } } $HTTP_FORM_VARS["TYPENAME"] = dropLastChrs($HTTP_FORM_VARS["TYPENAME"], 1); $HTTP_FORM_VARS["PROPERTYNAME"] = dropLastChrs($HTTP_FORM_VARS["PROPERTYNAME"], 1); break; case "DescribeFeatureType": $HTTP_FORM_VARS["REQUEST"] = "DescribeFeatureType"; $HTTP_FORM_VARS["TYPENAME"] = $arr['TypeName']; //if (!$HTTP_FORM_VARS["TYPENAME"]) $HTTP_FORM_VARS["TYPENAME"] = $arr['typeName']; break; case "GetCapabilities": $HTTP_FORM_VARS["REQUEST"] = "GetCapabilities"; break; case "Transaction": $HTTP_FORM_VARS["REQUEST"] = "Transaction"; if (isset($arr["Insert"])) { $transactionType = "Insert"; } if ($arr["Update"]) { $transactionType = "update"; } if ($arr["Delete"]) { $transactionType = "Delete"; } break; } } else { if (sizeof($_GET) > 0) { logfile::write($_SERVER['QUERY_STRING'] . "\n\n"); $HTTP_FORM_VARS = $_GET; $HTTP_FORM_VARS = array_change_key_case($HTTP_FORM_VARS, CASE_UPPER); // Make keys case insensative $HTTP_FORM_VARS["TYPENAME"] = dropNameSpace($HTTP_FORM_VARS["TYPENAME"]); // We remove name space, so $where will get key without it. if ($HTTP_FORM_VARS['FILTER']) { @($checkXml = simplexml_load_string($HTTP_FORM_VARS['FILTER'])); if ($checkXml === FALSE) { makeExceptionReport("Filter is not valid"); } //$forUseInSpatialFilter = $HTTP_FORM_VARS['FILTER']; $status = $unserializer->unserialize(dropNameSpace($HTTP_FORM_VARS['FILTER'])); $arr = $unserializer->getUnserializedData(); $wheres[$HTTP_FORM_VARS['TYPENAME']] = parseFilter($arr, $HTTP_FORM_VARS['TYPENAME']); } } else { $HTTP_FORM_VARS = array(""); } } //HTTP_FORM_VARS is set in script if POST is used $HTTP_FORM_VARS = array_change_key_case($HTTP_FORM_VARS, CASE_UPPER); // Make keys case $HTTP_FORM_VARS["TYPENAME"] = dropNameSpace($HTTP_FORM_VARS["TYPENAME"]); $tables = explode(",", $HTTP_FORM_VARS["TYPENAME"]); $properties = explode(",", dropNameSpace($HTTP_FORM_VARS["PROPERTYNAME"])); $featureids = explode(",", $HTTP_FORM_VARS["FEATUREID"]); $bbox = explode(",", $HTTP_FORM_VARS["BBOX"]); // Start HTTP basic authentication //if(!$_SESSION["oauth_token"]) { $auth = $postgisObject->getGeometryColumns($postgisschema . "." . $HTTP_FORM_VARS["TYPENAME"], "authentication"); //} // End HTTP basic authentication print "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n"; ob_start(); if (!empty($properties[0])) { foreach ($properties as $property) { $__u = explode(".", $property); // Is it "/" for get method? // We first check if typeName is namespace if ($__u[1]) { foreach ($tables as $table) { if ($table == $__u[0]) { $fields[$table] .= $__u[1] . ","; } } } else { foreach ($tables as $table) { $fields[$table] .= $property . ","; } } } } if (!empty($featureids[0])) { foreach ($featureids as $featureid) { $__u = explode(".", $featureid); foreach ($tables as $table) { $primeryKey = $postgisObject->getPrimeryKey($postgisschema . "." . $table); if ($table == $__u[0]) { $wheresArr[$table][] = "{$primeryKey['attname']}={$__u[1]}"; } $wheres[$table] = implode(" OR ", $wheresArr[$table]); } } } //get the request switch (strtoupper($HTTP_FORM_VARS["REQUEST"])) { case "GETCAPABILITIES": getCapabilities($postgisObject); break; case "GETFEATURE": if (!$gmlFeatureCollection) { $gmlFeatureCollection = "wfs:FeatureCollection"; } print "<" . $gmlFeatureCollection . "\n"; print "xmlns=\"http://www.opengis.net/wfs\"\n"; print "xmlns:wfs=\"http://www.opengis.net/wfs\"\n"; print "xmlns:gml=\"http://www.opengis.net/gml\"\n"; print "xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\"\n"; print "xmlns:{$gmlNameSpace}=\"{$gmlNameSpaceUri}\"\n"; if ($gmlSchemaLocation) { print "xsi:schemaLocation=\"{$gmlSchemaLocation}\""; } else { //print "xsi:schemaLocation=\"{$gmlNameSpaceUri} {$thePath}?REQUEST=DescribeFeatureType&TYPENAME=".$HTTP_FORM_VARS["TYPENAME"]." http://www.opengis.net/wfs ".str_replace("server.php","",$thePath)."schemas/wfs/1.0.0/WFS-basic.xsd\""; print "xsi:schemaLocation=\"{$gmlNameSpaceUri} {$thePath}?REQUEST=DescribeFeatureType&TYPENAME=" . $HTTP_FORM_VARS["TYPENAME"] . " http://www.opengis.net/wfs http://wfs.plansystem.dk:80/geoserver/schemas/wfs/1.0.0/WFS-basic.xsd\""; } print ">\n"; doQuery("Select"); print "</" . $gmlFeatureCollection . ">"; break; case "DESCRIBEFEATURETYPE": getXSD($postgisObject); break; case "TRANSACTION": doParse($arr); break; default: makeExceptionReport("Don't know that request"); break; } }