fetch.c 4.3 KB

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