Skip to content
Commits on Source (5)
......@@ -18,7 +18,7 @@ include(CheckCSourceCompiles)
set (MapServer_VERSION_MAJOR 7)
set (MapServer_VERSION_MINOR 2)
set (MapServer_VERSION_REVISION 0)
set (MapServer_VERSION_SUFFIX "-beta1")
set (MapServer_VERSION_SUFFIX "-beta2")
set(TARGET_VERSION_MAJOR ${MapServer_VERSION_MAJOR})
set(TARGET_VERSION_MINOR ${MapServer_VERSION_MINOR})
......
......@@ -12,6 +12,11 @@ For a complete change history, please see the Git log comments. For more
details about recent point releases, please see the online changelog at:
http://mapserver.org/development/changelog/
7.2.0-beta2 release (2018-6-13)
- Update beta1 release notes to remove reference to PHP7 support
- No other major changes, see detailed changelog for bug fixes
7.2.0-beta1 release (2018-5-9)
--------------------
......@@ -29,8 +34,6 @@ http://mapserver.org/development/changelog/
- Support C-style multi-line content types (#5362)
- PHP 7 MapScript Support Through SWIG (RFC117)
- Python 3.x support (#5561)
- Support Vendor-Specific OGC FILTER parameter in WMS requests (RFC118)
......
mapserver (7.2.0~beta2-1~exp1) experimental; urgency=medium
* New upstream beta release.
* Update symbols for other architectures.
-- Bas Couwenberg <sebastic@debian.org> Wed, 13 Jun 2018 18:15:40 +0200
mapserver (7.2.0~beta1-1~exp1) experimental; urgency=medium
* New upstream beta release.
......
This diff is collapsed.
......@@ -1683,14 +1683,29 @@ int pointLayerDrawShape(mapObj *map, imageObj *image, layerObj *layer, shapeObj
{
int l, c = shape->classindex, j, i, s;
pointObj *point;
int ret = MS_FAILURE;
#ifdef USE_PROJ
if (layer->project && layer->transform == MS_TRUE)
msProjectShape(&layer->projection, &map->projection, shape);
#endif
// Only take into account map rotation if the label and style angles are
// non-zero.
if( map->gt.rotation_angle )
{
for (l = 0; l < layer->class[c]->numlabels; l++)
if (layer->class[c]->labels[l]->angle != 0) layer->class[c]->labels[l]->angle -= map->gt.rotation_angle; /* TODO: is this right???? */
{
if( layer->class[c]->labels[l]->angle != 0 )
layer->class[c]->labels[l]->angle -= map->gt.rotation_angle;
}
for (s = 0; s < layer->class[c]->numstyles; s++)
{
if( layer->class[c]->styles[s]->angle != 0 )
layer->class[c]->styles[s]->angle -= map->gt.rotation_angle;
}
}
for (j = 0; j < shape->numlines; j++) {
for (i = 0; i < shape->line[j].numpoints; i++) {
......@@ -1707,26 +1722,44 @@ int pointLayerDrawShape(mapObj *map, imageObj *image, layerObj *layer, shapeObj
layer->class[c]->styles[s]->minscaledenom,
layer->class[c]->styles[s]->maxscaledenom))
if(UNLIKELY(MS_FAILURE == msDrawMarkerSymbol(map, image, point, layer->class[c]->styles[s], layer->scalefactor))) {
return MS_FAILURE;
goto end;
}
}
}
if(MS_DRAW_LABELS(drawmode)) {
if (layer->labelcache) {
if (msAddLabelGroup(map, image, layer, c, shape, point, -1) != MS_SUCCESS) return (MS_FAILURE);
if (msAddLabelGroup(map, image, layer, c, shape, point, -1) != MS_SUCCESS) goto end;
} else {
for (l = 0; l < layer->class[c]->numlabels; l++)
if(msGetLabelStatus(map,layer,shape,layer->class[c]->labels[l]) == MS_ON) {
char *annotext = msShapeGetLabelAnnotation(layer,shape,layer->class[c]->labels[l]);
if(UNLIKELY(MS_FAILURE == msDrawLabel(map, image, *point, annotext, layer->class[c]->labels[l], layer->scalefactor))) {
return MS_FAILURE;
goto end;
}
}
}
}
}
}
return MS_SUCCESS;
ret = MS_SUCCESS;
end:
if( map->gt.rotation_angle )
{
for (l = 0; l < layer->class[c]->numlabels; l++)
{
if( layer->class[c]->labels[l]->angle != 0 )
layer->class[c]->labels[l]->angle += map->gt.rotation_angle;
}
for (s = 0; s < layer->class[c]->numstyles; s++)
{
if( layer->class[c]->styles[s]->angle != 0 )
layer->class[c]->styles[s]->angle += map->gt.rotation_angle;
}
}
return ret;
}
int lineLayerDrawShape(mapObj *map, imageObj *image, layerObj *layer, shapeObj *shape,
......
......@@ -908,7 +908,8 @@ int msMSSQL2008LayerGetExtent(layerObj *layer, rectObj *extent)
int msMSSQL2008LayerGetNumFeatures(layerObj *layer)
{
msMSSQL2008LayerInfo *layerinfo;
char query_string_temp[10000]; /* Should be big enough */
char *query = 0;
char result_data[256];
SQLLEN retLen;
SQLRETURN rc;
......@@ -924,21 +925,28 @@ int msMSSQL2008LayerGetNumFeatures(layerObj *layer)
}
/* set up statement */
query = msStringConcatenate(query, "SELECT count(*) FROM ");
query = msStringConcatenate(query, layerinfo->geom_table);
/* adding attribute filter */
if (layer->filter.native_string) {
snprintf(query_string_temp, sizeof(query_string_temp), "SELECT count(*) from %s WHERE (%s)", layerinfo->geom_table, layer->filter.native_string);
}
else if (msLayerGetProcessingKey(layer, "NATIVE_FILTER") == NULL) {
snprintf(query_string_temp, sizeof(query_string_temp), "SELECT count(*) from %s", layerinfo->geom_table);
query = msStringConcatenate(query, " WHERE (");
query = msStringConcatenate(query, layer->filter.native_string);
query = msStringConcatenate(query, ")");
}
else {
snprintf(query_string_temp, sizeof(query_string_temp), "SELECT count(*) from %s WHERE (%s)", layerinfo->geom_table, msLayerGetProcessingKey(layer, "NATIVE_FILTER"));
else if (msLayerGetProcessingKey(layer, "NATIVE_FILTER") != NULL) {
query = msStringConcatenate(query, " WHERE (");
query = msStringConcatenate(query, msLayerGetProcessingKey(layer, "NATIVE_FILTER"));
query = msStringConcatenate(query, ")");
}
if (!executeSQL(layerinfo->conn, query_string_temp)) {
if (!executeSQL(layerinfo->conn, query)) {
msFree(query);
return -1;
}
msFree(query);
rc = SQLFetch(layerinfo->conn->hstmt);
if (rc != SQL_SUCCESS && rc != SQL_SUCCESS_WITH_INFO) {
......@@ -949,23 +957,23 @@ int msMSSQL2008LayerGetNumFeatures(layerObj *layer)
return -1;
}
rc = SQLGetData(layerinfo->conn->hstmt, 1, SQL_C_CHAR, query_string_temp, sizeof(query_string_temp), &retLen);
rc = SQLGetData(layerinfo->conn->hstmt, 1, SQL_C_CHAR, result_data, sizeof(result_data), &retLen);
if (rc == SQL_ERROR) {
msSetError(MS_QUERYERR, "Failed to get feature count", "msMSSQL2008LayerGetNumFeatures()");
return -1;
}
query_string_temp[retLen] = 0;
result_data[retLen] = 0;
return atoi(query_string_temp);
return atoi(result_data);
}
/* Prepare and execute the SQL statement for this layer */
static int prepare_database(layerObj *layer, rectObj rect, char **query_string)
{
msMSSQL2008LayerInfo *layerinfo;
char *columns_wanted = 0;
char *query = 0;
char *data_source = 0;
char *f_table_name = 0;
char *geom_table = 0;
......@@ -975,11 +983,11 @@ static int prepare_database(layerObj *layer, rectObj rect, char **query_string)
Plus SRID + comma - if SRID is a long...we'll be safe with 10 chars
*/
char box3d[40 + 10 * 22 + 11];
char query_string_temp[10000]; /* Should be big enough */
int t;
char *pos_from, *pos_ftab, *pos_space, *pos_paren;
rectObj extent;
int hasFilter = MS_FALSE;
layerinfo = getMSSQL2008LayerInfo(layer);
......@@ -1025,47 +1033,12 @@ static int prepare_database(layerObj *layer, rectObj rect, char **query_string)
}
}
if(layer->numitems == 0) {
char buffer[1000];
if (layerinfo->geometry_format == MSSQLGEOMETRY_NATIVE)
snprintf(buffer, sizeof(buffer), "[%s],convert(varchar(36), [%s])", layerinfo->geom_column, layerinfo->urid_name);
else
snprintf(buffer, sizeof(buffer), "[%s].STAsBinary(),convert(varchar(36), [%s])", layerinfo->geom_column, layerinfo->urid_name);
columns_wanted = msStrdup(buffer);
} else {
char buffer[10000] = "";
for(t = 0; t < layer->numitems; t++) {
if (layerinfo->itemtypes && (layerinfo->itemtypes[t] == SQL_BINARY || layerinfo->itemtypes[t] == SQL_VARBINARY)) {
#ifdef USE_ICONV
snprintf(buffer + strlen(buffer), sizeof(buffer) - strlen(buffer), "convert(nvarchar(max), convert(varbinary(max),[%s]),2),", layer->items[t]);
#else
snprintf(buffer + strlen(buffer), sizeof(buffer) - strlen(buffer), "convert(varchar(max), convert(varbinary(max),[%s]),2),", layer->items[t]);
#endif
} else {
#ifdef USE_ICONV
snprintf(buffer + strlen(buffer), sizeof(buffer) - strlen(buffer), "convert(nvarchar(max), [%s]),", layer->items[t]);
#else
snprintf(buffer + strlen(buffer), sizeof(buffer) - strlen(buffer), "convert(varchar(max), [%s]),", layer->items[t]);
#endif
}
}
if (layerinfo->geometry_format == MSSQLGEOMETRY_NATIVE)
snprintf(buffer + strlen(buffer), sizeof(buffer) - strlen(buffer), "[%s],convert(varchar(36), [%s])", layerinfo->geom_column, layerinfo->urid_name);
else
snprintf(buffer + strlen(buffer), sizeof(buffer) - strlen(buffer), "[%s].STAsBinary(),convert(varchar(36), [%s])", layerinfo->geom_column, layerinfo->urid_name);
columns_wanted = msStrdup(buffer);
}
if (rect.minx == rect.maxx || rect.miny == rect.maxy) {
/* create point shape for rectangles with zero area */
sprintf(box3d, "%s::STGeomFromText('POINT(%.15g %.15g)',%s)", /* %s.STSrid)", */
layerinfo->geom_column_type, rect.minx, rect.miny, layerinfo->user_srid);
} else {
}
else {
sprintf(box3d, "%s::STGeomFromText('POLYGON((%.15g %.15g,%.15g %.15g,%.15g %.15g,%.15g %.15g,%.15g %.15g))',%s)", /* %s.STSrid)", */
layerinfo->geom_column_type,
rect.minx, rect.miny,
......@@ -1083,7 +1056,8 @@ static int prepare_database(layerObj *layer, rectObj rect, char **query_string)
if (!strstr(geom_table, "!BOX!")) {
data_source = (char *)msSmallMalloc(strlen(geom_table) + 1);
strcpy(data_source, geom_table);
} else {
}
else {
char* result = NULL;
while (strstr(geom_table, "!BOX!")) {
......@@ -1107,59 +1081,111 @@ static int prepare_database(layerObj *layer, rectObj rect, char **query_string)
data_source = (char *)geom_table;
}
/* start creating the query */
query = msStringConcatenate(query, "SELECT ");
/* adding items to the select list */
for (t = 0; t < layer->numitems; t++) {
#ifdef USE_ICONV
/* no conversion applied at the database */
query = msStringConcatenate(query, "[");
query = msStringConcatenate(query, layer->items[t]);
query = msStringConcatenate(query, "],");
#else
query = msStringConcatenate(query, "convert(varchar(max), [");
query = msStringConcatenate(query, layer->items[t]);
query = msStringConcatenate(query, "]),");
#endif
}
/* adding geometry column */
query = msStringConcatenate(query, "[");
query = msStringConcatenate(query, layerinfo->geom_column);
if (layerinfo->geometry_format == MSSQLGEOMETRY_NATIVE)
query = msStringConcatenate(query, "],");
else
query = msStringConcatenate(query, "].STAsBinary(),");
/* adding id column */
query = msStringConcatenate(query, "convert(varchar(36), [");
query = msStringConcatenate(query, layerinfo->urid_name);
query = msStringConcatenate(query, "]) FROM ");
/* adding the source */
query = msStringConcatenate(query, data_source);
msFree(data_source);
msFree(f_table_name);
/* use the index hint if provided */
if (layerinfo->index_name) {
/* given the template - figure out how much to malloc and malloc it */
char *with_template = "%s WITH (INDEX(%s))";
int need_len = strlen(data_source) + strlen(with_template) + strlen(layerinfo->index_name);
char *tmp = (char*) msSmallMalloc( need_len + 1 );
sprintf( tmp, with_template, data_source, layerinfo->index_name );
msFree(data_source);
data_source = tmp;
query = msStringConcatenate(query, " WITH (INDEX(");
query = msStringConcatenate(query, layerinfo->index_name);
query = msStringConcatenate(query, "))");
}
/* test whether we should omit spatial filtering */
/* TODO: once this driver supports expression translation then filter->native_string will need to be considered here */
msMSSQL2008LayerGetExtent(layer, &extent);
if (rect.minx <= extent.minx && rect.miny <= extent.miny && rect.maxx >= extent.maxx && rect.maxy >= extent.maxy) {
/* no spatial filter used */
if ( layer->filter.native_string ) {
snprintf(query_string_temp, sizeof(query_string_temp), "SELECT %s from %s WHERE (%s)", columns_wanted, data_source, layer->filter.native_string );
}
else if(msLayerGetProcessingKey(layer, "NATIVE_FILTER") == NULL) {
snprintf(query_string_temp, sizeof(query_string_temp), "SELECT %s from %s", columns_wanted, data_source );
} else {
snprintf(query_string_temp, sizeof(query_string_temp), "SELECT %s from %s WHERE (%s)", columns_wanted, data_source, msLayerGetProcessingKey(layer, "NATIVE_FILTER"));
}
} else {
/* adding attribute filter */
if (layer->filter.native_string) {
snprintf(query_string_temp, sizeof(query_string_temp), "SELECT %s from %s WHERE (%s) and %s.STIntersects(%s) = 1 ", columns_wanted, data_source, layer->filter.native_string, layerinfo->geom_column, box3d );
}
else if(msLayerGetProcessingKey(layer, "NATIVE_FILTER") == NULL) {
snprintf(query_string_temp, sizeof(query_string_temp), "SELECT %s from %s WHERE %s.STIntersects(%s) = 1 ", columns_wanted, data_source, layerinfo->geom_column, box3d );
} else {
snprintf(query_string_temp, sizeof(query_string_temp), "SELECT %s from %s WHERE (%s) and %s.STIntersects(%s) = 1 ", columns_wanted, data_source, msLayerGetProcessingKey(layer, "NATIVE_FILTER"), layerinfo->geom_column, box3d );
query = msStringConcatenate(query, " WHERE (");
query = msStringConcatenate(query, layer->filter.native_string);
query = msStringConcatenate(query, ")");
hasFilter = MS_TRUE;
}
else if (msLayerGetProcessingKey(layer, "NATIVE_FILTER") != NULL) {
query = msStringConcatenate(query, " WHERE (");
query = msStringConcatenate(query, msLayerGetProcessingKey(layer, "NATIVE_FILTER"));
query = msStringConcatenate(query, ")");
hasFilter = MS_TRUE;
}
if (layerinfo->sort_spec) {
strcat(query_string_temp, layerinfo->sort_spec);
/* adding spatial filter */
msMSSQL2008LayerGetExtent(layer, &extent);
if (rect.minx > extent.minx || rect.miny > extent.miny ||
rect.maxx < extent.maxx || rect.maxy < extent.maxy) {
if (hasFilter == MS_FALSE)
query = msStringConcatenate(query, " WHERE ");
else
query = msStringConcatenate(query, " AND ");
query = msStringConcatenate(query, layerinfo->geom_column);
query = msStringConcatenate(query, ".STIntersects(");
query = msStringConcatenate(query, box3d);
query = msStringConcatenate(query, ") = 1 ");
}
msFree(data_source);
msFree(f_table_name);
msFree(columns_wanted);
if (layerinfo->sort_spec)
query = msStringConcatenate(query, layerinfo->sort_spec);
if (layer->debug) {
msDebug("query_string_temp:%s\n", query_string_temp);
msDebug("query:%s\n", query);
}
if (executeSQL(layerinfo->conn, query_string_temp)) {
*query_string = msStrdup(query_string_temp);
if (executeSQL(layerinfo->conn, query)) {
char pass_field_def = 0;
int t;
const char *value;
*query_string = query;
/* collect result information */
if ((value = msOWSLookupMetadata(&(layer->metadata), "G", "types")) != NULL
&& strcasecmp(value, "auto") == 0)
pass_field_def = 1;
msFree(layerinfo->itemtypes);
layerinfo->itemtypes = msSmallMalloc(sizeof(SQLSMALLINT) * (layer->numitems + 1));
for (t = 0; t < layer->numitems; t++) {
char colBuff[256];
SQLSMALLINT itemType;
columnName(layerinfo->conn, t + 1, colBuff, sizeof(colBuff), layer, pass_field_def, &itemType);
layerinfo->itemtypes[t] = itemType;
}
return MS_SUCCESS;
} else {
msSetError(MS_QUERYERR, "Error executing MSSQL2008 SQL statement: %s\n-%s\n", "msMSSQL2008LayerGetShape()", query_string_temp, layerinfo->conn->errorMessage);
}
else {
msSetError(MS_QUERYERR, "Error executing MSSQL2008 SQL statement: %s\n-%s\n", "msMSSQL2008LayerGetShape()", query, layerinfo->conn->errorMessage);
msFree(query);
return MS_FAILURE;
}
......
......@@ -315,6 +315,7 @@ int msMVTWriteTile( mapObj *map, int sendheaders ) {
int iLayer,retcode=MS_SUCCESS;
unsigned len;
void *buf;
const char *mvt_extent = msGetOutputFormatOption(map->outputformat, "EXTENT", "4096");
const char *mvt_buffer = msGetOutputFormatOption(map->outputformat, "EDGE_BUFFER", "10");
int buffer = MS_ABS(atoi(mvt_buffer));
VectorTile__Tile mvt_tile = VECTOR_TILE__TILE__INIT;
......@@ -378,8 +379,8 @@ int msMVTWriteTile( mapObj *map, int sendheaders ) {
vector_tile__tile__layer__init(mvt_layer);
mvt_layer->version = 2;
mvt_layer->name = layer->name;
mvt_buffer = msGetOutputFormatOption(map->outputformat, "EXTENT", "4096");
mvt_layer->extent = MS_ABS(atoi(mvt_buffer));
mvt_layer->extent = MS_ABS(atoi(mvt_extent));
mvt_layer->has_extent = 1;
/* -------------------------------------------------------------------- */
......
......@@ -2003,7 +2003,7 @@ char *msPostGISBuildSQLWhere(layerObj *layer, rectObj *rect, long *uid, rectObj
char *strBox = 0;
char *strSRID = 0;
size_t strBoxLength = 0;
static const char *strRectTemplate = "%s && %s";
static const char *strRectTemplate = "\"%s\" && %s";
/* We see to set the SRID on the box, but to what SRID? */
strSRID = msPostGISBuildSQLSRID(layer);
......
......@@ -1878,7 +1878,9 @@ static void msWCSPrepareNamespaces20(xmlDocPtr pDoc, xmlNodePtr psRootNode, mapO
xsi_schemaLocation = msStringConcatenate(xsi_schemaLocation, " ");
if (addInspire) {
xsi_schemaLocation = msStringConcatenate(xsi_schemaLocation, MS_INSPIRE_DLS_NAMESPACE_URI " " MS_INSPIRE_DLS_SCHEMA_LOCATION);
xsi_schemaLocation = msStringConcatenate(xsi_schemaLocation, MS_INSPIRE_DLS_NAMESPACE_URI " ");
xsi_schemaLocation = msStringConcatenate(xsi_schemaLocation, msOWSGetInspireSchemasLocation(map));
xsi_schemaLocation = msStringConcatenate(xsi_schemaLocation, MS_INSPIRE_DLS_SCHEMA_LOCATION);
}
xmlNewNsProp(psRootNode, psXsiNs, BAD_CAST "schemaLocation", BAD_CAST xsi_schemaLocation);
......