@@ -202,6 +202,7 @@ typedef struct ms_MSSQL2008_layer_info_t {
202
202
char * user_srid ; /* zero length = calculate, non-zero means using this value! */
203
203
char * index_name ; /* hopefully this isn't necessary - but if the optimizer ain't cuttin' it... */
204
204
char * sort_spec ; /* the sort by specification which should be applied to the generated select statement */
205
+ SQLSMALLINT * itemtypes ; /* storing the sql field types for further reference */
205
206
206
207
msODBCconn * conn ; /* Connection to db */
207
208
msGeometryParserInfo gpi ; /* struct for the geometry parser */
@@ -603,7 +604,7 @@ static int executeSQL(msODBCconn *conn, const char * sql)
603
604
}
604
605
605
606
/* Get columns name from query results */
606
- static int columnName (msODBCconn * conn , int index , char * buffer , int bufferLength , layerObj * layer , char pass_field_def )
607
+ static int columnName (msODBCconn * conn , int index , char * buffer , int bufferLength , layerObj * layer , char pass_field_def , SQLSMALLINT * itemType )
607
608
{
608
609
SQLRETURN rc ;
609
610
@@ -613,6 +614,7 @@ static int columnName(msODBCconn *conn, int index, char *buffer, int bufferLengt
613
614
SQLULEN columnSize ;
614
615
SQLSMALLINT decimalDigits ;
615
616
SQLSMALLINT nullable ;
617
+ msMSSQL2008LayerInfo * layerinfo = getMSSQL2008LayerInfo (layer );
616
618
617
619
rc = SQLDescribeCol (
618
620
conn -> hstmt ,
@@ -631,6 +633,8 @@ static int columnName(msODBCconn *conn, int index, char *buffer, int bufferLengt
631
633
else
632
634
strlcpy (buffer , (const char * )columnName , SQL_COLUMN_NAME_MAX_LENGTH + 1 );
633
635
636
+ * itemType = dataType ;
637
+
634
638
if (pass_field_def ) {
635
639
char md_item_name [256 ];
636
640
char gml_width [32 ], gml_precision [32 ];
@@ -748,6 +752,7 @@ int msMSSQL2008LayerOpen(layerObj *layer)
748
752
layerinfo -> index_name = NULL ;
749
753
layerinfo -> sort_spec = NULL ;
750
754
layerinfo -> conn = NULL ;
755
+ layerinfo -> itemtypes = NULL ;
751
756
752
757
layerinfo -> conn = (msODBCconn * ) msConnPoolRequest (layer );
753
758
@@ -976,11 +981,19 @@ static int prepare_database(layerObj *layer, rectObj rect, char **query_string)
976
981
char buffer [10000 ] = "" ;
977
982
978
983
for (t = 0 ; t < layer -> numitems ; t ++ ) {
979
- #ifdef USE_ICONV
984
+ if (layerinfo -> itemtypes && (layerinfo -> itemtypes [t ] == SQL_BINARY || layerinfo -> itemtypes [t ] == SQL_VARBINARY )) {
985
+ #ifdef USE_ICONV
986
+ snprintf (buffer + strlen (buffer ), sizeof (buffer ) - strlen (buffer ), "convert(nvarchar(max), convert(varbinary(max),[%s]),2)," , layer -> items [t ]);
987
+ #else
988
+ snprintf (buffer + strlen (buffer ), sizeof (buffer ) - strlen (buffer ), "convert(varchar(max), convert(varbinary(max),[%s]),2)," , layer -> items [t ]);
989
+ #endif
990
+ } else {
991
+ #ifdef USE_ICONV
980
992
snprintf (buffer + strlen (buffer ), sizeof (buffer ) - strlen (buffer ), "convert(nvarchar(max), [%s])," , layer -> items [t ]);
981
993
#else
982
994
snprintf (buffer + strlen (buffer ), sizeof (buffer ) - strlen (buffer ), "convert(varchar(max), [%s])," , layer -> items [t ]);
983
995
#endif
996
+ }
984
997
}
985
998
986
999
if (layerinfo -> geometry_format == MSSQLGEOMETRY_NATIVE )
@@ -1202,6 +1215,11 @@ int msMSSQL2008LayerClose(layerObj *layer)
1202
1215
layerinfo -> geom_table = NULL ;
1203
1216
}
1204
1217
1218
+ if (layerinfo -> itemtypes ) {
1219
+ msFree (layerinfo -> itemtypes );
1220
+ layerinfo -> itemtypes = NULL ;
1221
+ }
1222
+
1205
1223
setMSSQL2008LayerInfo (layer , NULL );
1206
1224
msFree (layerinfo );
1207
1225
}
@@ -2035,6 +2053,7 @@ int msMSSQL2008LayerGetItems(layerObj *layer)
2035
2053
layer -> numitems = cols - 1 ; /* dont include the geometry column */
2036
2054
2037
2055
layer -> items = msSmallMalloc (sizeof (char * ) * (layer -> numitems + 1 )); /* +1 in case there is a problem finding goeometry column */
2056
+ layerinfo -> itemtypes = msSmallMalloc (sizeof (SQLSMALLINT ) * (layer -> numitems + 1 ));
2038
2057
/* it will return an error if there is no geometry column found, */
2039
2058
/* so this isnt a problem */
2040
2059
@@ -2048,13 +2067,15 @@ int msMSSQL2008LayerGetItems(layerObj *layer)
2048
2067
2049
2068
for (t = 0 ; t < cols ; t ++ ) {
2050
2069
char colBuff [256 ];
2070
+ SQLSMALLINT itemType ;
2051
2071
2052
- columnName (layerinfo -> conn , t + 1 , colBuff , sizeof (colBuff ), layer , pass_field_def );
2072
+ columnName (layerinfo -> conn , t + 1 , colBuff , sizeof (colBuff ), layer , pass_field_def , & itemType );
2053
2073
2054
2074
if (strcmp (colBuff , layerinfo -> geom_column ) != 0 ) {
2055
2075
/* this isnt the geometry column */
2056
2076
layer -> items [item_num ] = (char * ) msSmallMalloc (strlen (colBuff ) + 1 );
2057
2077
strcpy (layer -> items [item_num ], colBuff );
2078
+ layerinfo -> itemtypes [item_num ] = itemType ;
2058
2079
item_num ++ ;
2059
2080
} else {
2060
2081
found_geom = 1 ;
0 commit comments