Hi,
2006/10/21, Moritz Lennert <mlennert@club.worldonline.be>:
[snip]
> you are right (if I understand well), adding
>
> db_CatValArray_sort (&cvarr_rgb);
>
> should solve the problem. I wonder why db_select_CatValArray sorts
> cvarr->value by category number only for data type int or double...
> (?), see
>
> 00300 if ( type == DB_C_TYPE_INT )
> 00301 qsort( (void *) cvarr->value, nrows, sizeof(dbCatVal),
> cmpcat);
> 00302 else if ( type == DB_C_TYPE_DOUBLE )
> 00303 qsort( (void *) cvarr->value, nrows, sizeof(dbCatVal),
> cmpcat);
>
Applying below patch directly to db_select_CatValArray solves the problem
for me, but I don't know if this might cause other problems, even though I
doubt it.
Any ideas ?
Moritz
Index: lib/db/dbmi_client/select.c
RCS file: /grassrepository/grass6/lib/db/dbmi_client/select.c,v
retrieving revision 1.8
diff -u -r1.8 select.c
--- lib/db/dbmi_client/select.c 14 Jul 2006 16:41:22 -0000 1.8
+++ lib/db/dbmi_client/select.c 20 Oct 2006 23:22:26 -0000
@@ -297,10 +297,7 @@
db_close_cursor(&cursor);
db_free_string ( &stmt );
- if ( type == DB_C_TYPE_INT )
- qsort( (void *) cvarr->value, nrows, sizeof(dbCatVal), cmpcat);
- else if ( type == DB_C_TYPE_DOUBLE )
- qsort( (void *) cvarr->value, nrows, sizeof(dbCatVal), cmpcat);
+ db_CatValArray_sort ( cvarr );
return (nrows);
}
in this case the array is sorted twice for datatype DB_C_TYPE_INT and
DB_C_TYPE_DOUBLE, I suggest
Index: lib/db/dbmi_client/select.c
RCS file: /home/grass/grassrepository/grass6/lib/db/dbmi_client/select.c,v
retrieving revision 1.8
diff -u -r1.8 select.c
--- lib/db/dbmi_client/select.c 14 Jul 2006 16:41:22 -0000 1.8
+++ lib/db/dbmi_client/select.c 21 Oct 2006 07:43:35 -0000
@@ -297,9 +297,8 @@
db_close_cursor(&cursor);
db_free_string ( &stmt );
- if ( type == DB_C_TYPE_INT )
- qsort( (void *) cvarr->value, nrows, sizeof(dbCatVal), cmpcat);
- else if ( type == DB_C_TYPE_DOUBLE )
+ if ( type == DB_C_TYPE_INT || type == DB_C_TYPE_DOUBLE ||
+ type == DB_C_TYPE_STRING )
qsort( (void *) cvarr->value, nrows, sizeof(dbCatVal), cmpcat);
return (nrows);
Not sure if you need to check "type" here (what about DB_C_TYPE_DATETIME)??
Best, Martin
--
Martin Landa <landa.martin@gmail.com> * http://gama.fsv.cvut.cz/~landa *