fetch.c 4.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195
  1. /*!
  2. \file db/drivers/fetch.c
  3. \brief Low level OGR SQL driver
  4. (C) 2004-2009 by the GRASS Development Team
  5. This program is free software under the GNU General Public License
  6. (>=v2). Read the file COPYING that comes with GRASS for details.
  7. \author Radim Blazek
  8. \author Some updates by Martin Landa <landa.martin gmail.com>
  9. */
  10. #include <stdlib.h>
  11. #include <string.h>
  12. #include <grass/gis.h>
  13. #include <grass/dbmi.h>
  14. #include <grass/glocale.h>
  15. #include <ogr_api.h>
  16. #include "globals.h"
  17. #include "proto.h"
  18. /*!
  19. \brief Fetch record
  20. \param cn pointer to dbCursor
  21. \param position position indicator (DB_NEXT, DB_FIRST, DB_LAST, etc)
  22. \param[out] more 0 for no record fetched otherwise 1
  23. \return DB_OK on success
  24. \return DB_FAILED on error
  25. */
  26. int db__driver_fetch(dbCursor * cn, int position, int *more)
  27. {
  28. int i, col;
  29. int ogrType, sqlType;
  30. dbToken token;
  31. dbTable *table;
  32. dbColumn *column;
  33. dbValue *value;
  34. cursor *c;
  35. G_debug(3, "db_driver_fetch()");
  36. /* get cursor token */
  37. token = db_get_cursor_token(cn);
  38. /* get the cursor by its token */
  39. if (!(c = (cursor *) db_find_token(token))) {
  40. db_d_append_error(_("Cursor not found"));
  41. db_d_report_error();
  42. return DB_FAILED;
  43. }
  44. /* fetch on position */
  45. switch (position) {
  46. case DB_NEXT:
  47. G_debug(4, "DB_NEXT:");
  48. if (c->hFeature)
  49. OGR_F_Destroy(c->hFeature);
  50. c->hFeature = OGR_L_GetNextFeature(c->hLayer);
  51. break;
  52. case DB_CURRENT:
  53. break;
  54. case DB_PREVIOUS:
  55. db_d_append_error(_("DB_PREVIOUS not supported"));
  56. db_d_report_error();
  57. return DB_FAILED;
  58. break;
  59. case DB_FIRST:
  60. OGR_L_ResetReading(c->hLayer);
  61. if (c->hFeature)
  62. OGR_F_Destroy(c->hFeature);
  63. c->hFeature = OGR_L_GetNextFeature(c->hLayer);
  64. break;
  65. case DB_LAST:
  66. db_d_append_error(_("DB_LAST not supported"));
  67. db_d_report_error();
  68. return DB_FAILED;
  69. break;
  70. };
  71. if (c->hFeature == NULL) {
  72. *more = 0;
  73. return DB_OK;
  74. }
  75. *more = 1;
  76. /* get the data out of the descriptor into the table */
  77. table = db_get_cursor_table(cn);
  78. /* check fid column */
  79. if (strlen(OGR_L_GetFIDColumn(c->hLayer)) > 0) {
  80. column = db_get_table_column(table, 0);
  81. ogrType = db_get_column_host_type(column);
  82. sqlType = db_get_column_sqltype(column);
  83. value = db_get_column_value(column);
  84. value->i = OGR_F_GetFID(c->hFeature);
  85. G_debug(3, "fidcol '%s': ogrType %d, sqlType %d: val = %d",
  86. db_get_column_name(column), ogrType, sqlType, value->i);
  87. col = 0;
  88. }
  89. else {
  90. col = -1;
  91. }
  92. /* loop attributes */
  93. for (i = 0; i < c->ncols; i++) {
  94. if (!(c->cols[i])) {
  95. continue;
  96. } /* unknown type */
  97. col++;
  98. column = db_get_table_column(table, col);
  99. ogrType = db_get_column_host_type(column);
  100. sqlType = db_get_column_sqltype(column);
  101. value = db_get_column_value(column);
  102. db_zero_string(&value->s);
  103. /* Is null? */
  104. if (OGR_F_IsFieldSet(c->hFeature, i)) {
  105. value->isNull = 0;
  106. }
  107. else {
  108. value->isNull = 1;
  109. continue;
  110. }
  111. G_debug(3, "col %d, ogrType %d, sqlType %d: val = '%s'",
  112. col, ogrType, sqlType, OGR_F_GetFieldAsString(c->hFeature,
  113. i));
  114. switch (ogrType) {
  115. case OFTInteger:
  116. value->i = OGR_F_GetFieldAsInteger(c->hFeature, i);
  117. break;
  118. case OFTReal:
  119. value->d = OGR_F_GetFieldAsDouble(c->hFeature, i);
  120. break;
  121. case OFTString:
  122. case OFTDate:
  123. case OFTTime:
  124. case OFTDateTime:
  125. db_set_string(&(value->s),
  126. (char *)OGR_F_GetFieldAsString(c->hFeature, i));
  127. break;
  128. default:
  129. G_warning(_("Unknown type"));
  130. break;
  131. }
  132. }
  133. G_debug(4, "Row fetched");
  134. return DB_OK;
  135. }
  136. /*
  137. \brief Get number of rows (i.e. features) in open cursor
  138. \param cn pointer to dbCursor
  139. \return number of rows
  140. \return DB_FAILED on error
  141. */
  142. int db__driver_get_num_rows(dbCursor * cn)
  143. {
  144. cursor *c;
  145. dbToken token;
  146. G_debug(3, "db_driver_get_num_rows()");
  147. /* get cursor token */
  148. token = db_get_cursor_token(cn);
  149. /* get the cursor by its token */
  150. if (!(c = (cursor *) db_find_token(token))) {
  151. db_d_append_error(_("Cursor not found"));
  152. db_d_report_error();
  153. return DB_FAILED;
  154. }
  155. return (OGR_L_GetFeatureCount(c->hLayer, 1));
  156. }