describe.c 5.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218
  1. #include <grass/dbmi.h>
  2. #include <grass/datetime.h>
  3. #include "odbc.h"
  4. #include "globals.h"
  5. #include "proto.h"
  6. #include <stdio.h>
  7. int set_column_type(dbColumn * column, int otype);
  8. int db__driver_describe_table(table_name, table)
  9. dbString *table_name;
  10. dbTable **table;
  11. {
  12. char *name = NULL;
  13. SQLINTEGER err;
  14. SQLRETURN ret;
  15. cursor *c;
  16. char s[100];
  17. char msg[OD_MSG];
  18. /* allocate cursor */
  19. c = alloc_cursor();
  20. if (c == NULL)
  21. return DB_FAILED;
  22. name = db_get_string(table_name);
  23. SQLSetStmtAttr(c->stmt, SQL_MAX_ROWS, (SQLPOINTER *) 1, 0);
  24. sprintf(s, "select * from %s", name);
  25. ret = SQLExecDirect(c->stmt, s, SQL_NTS);
  26. if ((ret != SQL_SUCCESS) && (ret != SQL_SUCCESS_WITH_INFO)) {
  27. SQLGetDiagRec(SQL_HANDLE_STMT, c->stmt, 1, NULL, &err, msg,
  28. sizeof(msg), NULL);
  29. db_d_append_error("SQLExecDirect():\n%s\n%s (%d)\n", s, msg,
  30. (int)err);
  31. db_d_report_error();
  32. return DB_FAILED;
  33. }
  34. describe_table(c->stmt, table);
  35. free_cursor(c);
  36. /* set the table name */
  37. db_set_table_name(*table, name);
  38. /* set the table description */
  39. db_set_table_description(*table, "");
  40. /*
  41. db_set_table_delete_priv_granted (*table);
  42. db_set_table_delete_priv_not_granted (*table);
  43. db_set_table_insert_priv_granted (*table);
  44. db_set_table_insert_priv_not_granted (*table);
  45. */
  46. return DB_OK;
  47. }
  48. int describe_table(stmt, table)
  49. SQLHSTMT stmt;
  50. dbTable **table;
  51. {
  52. dbColumn *column;
  53. int col;
  54. SQLLEN intval;
  55. SQLUSMALLINT ncols;
  56. SQLRETURN ret;
  57. SQLCHAR charval[100];
  58. /* get the number of colummns */
  59. ret = SQLNumResultCols(stmt, &ncols);
  60. if ((ret != SQL_SUCCESS) && (ret != SQL_SUCCESS_WITH_INFO)) {
  61. db_d_append_error("SQLNumResultCols()");
  62. db_d_report_error();
  63. return DB_FAILED;
  64. }
  65. /* allocate a table structure to correspond to our system descriptor */
  66. if (!(*table = db_alloc_table(ncols))) {
  67. return DB_FAILED;
  68. }
  69. /* Get col names and attributes */
  70. for (col = 0; col < ncols; col++) {
  71. column = db_get_table_column(*table, col);
  72. SQLColAttribute(stmt, col + 1, SQL_COLUMN_NAME, charval,
  73. sizeof(charval), NULL, NULL);
  74. db_set_column_name(column, charval);
  75. /* label(title) is not description, but I did not found better attribute and it can say something about column */
  76. SQLColAttribute(stmt, col + 1, SQL_COLUMN_LABEL, charval,
  77. sizeof(charval), NULL, NULL);
  78. db_set_column_description(column, charval);
  79. SQLColAttribute(stmt, col + 1, SQL_COLUMN_LENGTH, NULL, 0, NULL,
  80. &intval);
  81. db_set_column_length(column, intval);
  82. SQLColAttribute(stmt, col + 1, SQL_COLUMN_PRECISION, NULL, 0, NULL,
  83. &intval);
  84. db_set_column_precision(column, intval);
  85. SQLColAttribute(stmt, col + 1, SQL_COLUMN_SCALE, NULL, 0, NULL,
  86. &intval);
  87. db_set_column_scale(column, intval);
  88. SQLColAttribute(stmt, col + 1, SQL_COLUMN_NULLABLE, NULL, 0, NULL,
  89. &intval);
  90. if (intval == SQL_NULLABLE)
  91. db_set_column_null_allowed(column);
  92. else
  93. db_unset_column_null_allowed(column);
  94. /*
  95. db_set_column_select_priv_not_granted (column);
  96. db_set_column_select_priv_not_granted (column);
  97. db_set_column_update_priv_granted (column);
  98. db_set_column_update_priv_not_granted (column);
  99. */
  100. /* because set_column_type() uses other attributes (length, precision,...) must be called at the end */
  101. SQLColAttribute(stmt, col + 1, SQL_COLUMN_TYPE, NULL, 0, NULL,
  102. &intval);
  103. set_column_type(column, intval);
  104. db_set_column_host_type(column, intval);
  105. /* set default value after we recognized type */
  106. /*
  107. db_set_column_has_defined_default_value(column);
  108. db_set_column_has_undefined_default_value(column);
  109. db_set_column_use_default_value(column);
  110. db_unset_column_use_default_value(column);
  111. */
  112. /* and set column.defaultValue */
  113. }
  114. return DB_OK;
  115. }
  116. int set_column_type(column, otype)
  117. dbColumn *column;
  118. int otype;
  119. {
  120. int dbtype;
  121. /* determine the DBMI datatype from ODBC type */
  122. switch (otype) {
  123. /* numbers */
  124. case SQL_INTEGER:
  125. dbtype = DB_SQL_TYPE_INTEGER;
  126. break;
  127. case SQL_SMALLINT:
  128. dbtype = DB_SQL_TYPE_SMALLINT;
  129. break;
  130. case SQL_REAL:
  131. dbtype = DB_SQL_TYPE_REAL;
  132. break;
  133. case SQL_DOUBLE:
  134. dbtype = DB_SQL_TYPE_DOUBLE_PRECISION;
  135. break;
  136. case SQL_FLOAT:
  137. if (db_get_column_precision(column) == 24)
  138. dbtype = DB_SQL_TYPE_REAL;
  139. else
  140. dbtype = DB_SQL_TYPE_DOUBLE_PRECISION; /* precision == 53 */
  141. break;
  142. case SQL_DECIMAL:
  143. dbtype = DB_SQL_TYPE_DECIMAL;
  144. break;
  145. case SQL_NUMERIC:
  146. dbtype = DB_SQL_TYPE_NUMERIC;
  147. break;
  148. /* strings */
  149. case SQL_CHAR:
  150. dbtype = DB_SQL_TYPE_CHARACTER;
  151. break;
  152. case SQL_VARCHAR:
  153. dbtype = DB_SQL_TYPE_CHARACTER;
  154. break;
  155. case SQL_LONGVARCHAR:
  156. dbtype = DB_SQL_TYPE_CHARACTER;
  157. break;
  158. /* date & time */
  159. case SQL_DATE:
  160. dbtype = DB_SQL_TYPE_DATE;
  161. break;
  162. case SQL_TYPE_DATE:
  163. dbtype = DB_SQL_TYPE_DATE;
  164. break;
  165. case SQL_TIME:
  166. dbtype = DB_SQL_TYPE_TIME;
  167. break;
  168. case SQL_TYPE_TIME:
  169. dbtype = DB_SQL_TYPE_TIME;
  170. break;
  171. case SQL_TIMESTAMP:
  172. dbtype = DB_SQL_TYPE_TIMESTAMP;
  173. break;
  174. case SQL_TYPE_TIMESTAMP:
  175. dbtype = DB_SQL_TYPE_TIMESTAMP;
  176. break;
  177. default:
  178. dbtype = DB_SQL_TYPE_UNKNOWN;
  179. break;
  180. }
  181. db_set_column_sqltype(column, dbtype);
  182. return DB_OK;
  183. }