main.c 4.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141
  1. /****************************************************************************
  2. *
  3. * MODULE: db.describe
  4. * AUTHOR(S): Radim Blazek <radim.blazek gmail.com> (original contributor)
  5. * Glynn Clements <glynn gclements.plus.com>,
  6. * Markus Neteler <neteler itc.it>,
  7. * Stephan Holl
  8. * PURPOSE: Displays table information
  9. * COPYRIGHT: (C) 2002-2008 by the GRASS Development Team
  10. *
  11. * This program is free software under the GNU General Public
  12. * License (>=v2). Read the file COPYING that comes with GRASS
  13. * for details.
  14. *
  15. *****************************************************************************/
  16. #include <stdlib.h>
  17. #include <string.h>
  18. #include <grass/gis.h>
  19. #include <grass/dbmi.h>
  20. #include <grass/glocale.h>
  21. #include "local_proto.h"
  22. struct
  23. {
  24. char *driver, *database, *table;
  25. int printcolnames;
  26. } parms;
  27. /* function prototypes */
  28. static void parse_command_line(int, char **);
  29. int main(int argc, char **argv)
  30. {
  31. dbDriver *driver;
  32. dbHandle handle;
  33. dbTable *table;
  34. dbString table_name;
  35. int col, ncols, nrows;
  36. dbColumn *column;
  37. char buf[1024];
  38. dbString stmt;
  39. parse_command_line(argc, argv);
  40. if (!db_table_exists(parms.driver, parms.database, parms.table)) {
  41. G_warning(_("Table <%s> not found in database <%s> using driver <%s>"),
  42. parms.table, parms.database, parms.driver);
  43. exit(EXIT_FAILURE);
  44. }
  45. driver = db_start_driver(parms.driver);
  46. if (driver == NULL)
  47. G_fatal_error(_("Unable to start driver <%s>"), parms.driver);
  48. db_init_handle(&handle);
  49. db_set_handle(&handle, parms.database, NULL);
  50. if (db_open_database(driver, &handle) != DB_OK)
  51. G_fatal_error(_("Unable to open database <%s>"), parms.database);
  52. db_init_string(&table_name);
  53. db_set_string(&table_name, parms.table);
  54. if (db_describe_table(driver, &table_name, &table) != DB_OK)
  55. G_fatal_error(_("Unable to describe table <%s>"), db_get_string(&table_name));
  56. if (!parms.printcolnames)
  57. print_table_definition(driver, table);
  58. else {
  59. ncols = db_get_table_number_of_columns(table);
  60. db_init_string(&stmt);
  61. sprintf(buf, "select * from %s", db_get_table_name(table));
  62. db_set_string(&stmt, buf);
  63. nrows = db_get_table_number_of_rows(driver, &stmt);
  64. fprintf(stdout, "ncols: %d\n", ncols);
  65. fprintf(stdout, "nrows: %d\n", nrows);
  66. for (col = 0; col < ncols; col++) {
  67. column = db_get_table_column(table, col);
  68. fprintf(stdout, "Column %d: %s:%s:%d\n", (col + 1),
  69. db_get_column_name(column),
  70. db_sqltype_name(db_get_column_sqltype(column)),
  71. db_get_column_length(column));
  72. }
  73. }
  74. db_close_database(driver);
  75. db_shutdown_driver(driver);
  76. exit(EXIT_SUCCESS);
  77. }
  78. static void parse_command_line(int argc, char **argv)
  79. {
  80. struct Option *driver, *database, *table;
  81. struct Flag *cols, *tdesc;
  82. struct GModule *module;
  83. const char *drv, *db;
  84. /* Initialize the GIS calls */
  85. G_gisinit(argv[0]);
  86. cols = G_define_flag();
  87. cols->key = 'c';
  88. cols->description = _("Print column names only instead "
  89. "of full column descriptions");
  90. tdesc = G_define_flag();
  91. tdesc->key = 't';
  92. tdesc->description = _("Print table structure");
  93. table = G_define_standard_option(G_OPT_DB_TABLE);
  94. table->required = YES;
  95. driver = G_define_standard_option(G_OPT_DB_DRIVER);
  96. driver->options = db_list_drivers();
  97. if ((drv = db_get_default_driver_name()))
  98. driver->answer = (char *) drv;
  99. database = G_define_standard_option(G_OPT_DB_DATABASE);
  100. if ((db = db_get_default_database_name()))
  101. database->answer = (char *) db;
  102. /* Set description */
  103. module = G_define_module();
  104. G_add_keyword(_("database"));
  105. G_add_keyword(_("attribute table"));
  106. module->description = _("Describes a table in detail.");
  107. if (G_parser(argc, argv))
  108. exit(EXIT_FAILURE);
  109. parms.driver = driver->answer;
  110. parms.database = database->answer;
  111. parms.table = table->answer;
  112. parms.printcolnames = cols->answer;
  113. }