table.c 1.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263
  1. #include <grass/vector.h>
  2. #include <grass/dbmi.h>
  3. #include <grass/glocale.h>
  4. /* Check columns
  5. 1) FID column - must be integer
  6. @todo check for unique values
  7. 2) Geometry column
  8. calls G_fatal_error() on error
  9. */
  10. void check_columns(const struct Map_info *Map, const char *layer,
  11. const char *fid_column, const char *geom_column)
  12. {
  13. struct field_info *fi;
  14. dbDriver *driver;
  15. dbTable *table;
  16. dbColumn *column;
  17. dbString stmt;
  18. fi = Vect_get_field2(Map, layer);
  19. if (!fi) {
  20. G_verbose_message(_("No database connection for layer <%s>"), layer);
  21. return;
  22. }
  23. /* open connection */
  24. driver = db_start_driver_open_database(fi->driver, fi->database);
  25. if (!driver)
  26. G_fatal_error(_("Unable to open database <%s> by driver <%s>"),
  27. fi->database, fi->driver);
  28. db_set_error_handler_driver(driver);
  29. db_init_string(&stmt);
  30. db_set_string(&stmt, fi->table);
  31. if (db_describe_table(driver, &stmt, &table) != DB_OK) {
  32. G_fatal_error(_("Unable to describe table <%s>"), fi->table);
  33. }
  34. /* check for fid column in attribute table */
  35. column = db_get_table_column_by_name(table, fid_column);
  36. if (column) {
  37. int ctype;
  38. ctype = db_sqltype_to_Ctype(db_get_column_sqltype(column));
  39. if (ctype != DB_C_TYPE_INT)
  40. G_fatal_error(_("Invalid FID column (%s). FID column must be integer. "
  41. "Please specify different FID column by 'options=\"FID=<name>\"'."),
  42. fid_column);
  43. }
  44. /* check if geometry column already exists in the attribute table */
  45. if (db_get_table_column_by_name(table, geom_column))
  46. G_fatal_error(_("Column (%s) already exists in the table. "
  47. "Please specify different geometry column by 'options=\"GEOMETRY_NAME=<name>\"'."),
  48. geom_column);
  49. db_close_database_shutdown_driver(driver);
  50. }