main.c 6.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228
  1. /****************************************************************************
  2. *
  3. * MODULE: db.execute
  4. * AUTHOR(S): Radim Blazek <radim.blazek gmail.com> (original contributor)
  5. * Huidae Cho <grass4u gmail.com>
  6. * Glynn Clements <glynn gclements.plus.com>
  7. * Hamish Bowman <hamish_b yahoo.com>
  8. * Markus Neteler <neteler itc.it>
  9. * Stephan Holl
  10. * Martin Landa <landa.martin gmail.com>
  11. * PURPOSE: process one non-select sql statement
  12. * COPYRIGHT: (C) 2002-2011 by the GRASS Development Team
  13. *
  14. * This program is free software under the GNU General
  15. * Public License (>=v2). Read the file COPYING that
  16. * comes with GRASS for details.
  17. *
  18. *****************************************************************************/
  19. #include <stdlib.h>
  20. #include <string.h>
  21. #include <errno.h>
  22. #include <grass/gis.h>
  23. #include <grass/dbmi.h>
  24. #include <grass/glocale.h>
  25. struct
  26. {
  27. const char *driver, *database, *schema, *sql, *input;
  28. int i;
  29. } parms;
  30. /* function prototypes */
  31. static void parse_command_line(int, char **);
  32. static int get_stmt(FILE *, dbString *);
  33. static int stmt_is_empty(dbString *);
  34. static void error_handler(void *);
  35. int main(int argc, char **argv)
  36. {
  37. dbString stmt;
  38. dbDriver *driver;
  39. dbHandle handle;
  40. int ret;
  41. FILE *fd;
  42. int error;
  43. error = 0;
  44. parse_command_line(argc, argv);
  45. /* read from file or stdin ? */
  46. if (parms.input && strcmp(parms.input, "-") != 0) {
  47. fd = fopen(parms.input, "r");
  48. if (fd == NULL) {
  49. G_fatal_error(_("Unable to open file <%s>: %s"),
  50. parms.input, strerror(errno));
  51. }
  52. }
  53. else {
  54. fd = stdin;
  55. }
  56. /* open DB connection */
  57. db_init_string(&stmt);
  58. driver = db_start_driver(parms.driver);
  59. if (driver == NULL) {
  60. G_fatal_error(_("Unable to start driver <%s>"), parms.driver);
  61. }
  62. db_init_handle(&handle);
  63. db_set_handle(&handle, parms.database, parms.schema);
  64. if (db_open_database(driver, &handle) != DB_OK)
  65. G_fatal_error(_("Unable to open database <%s>"), parms.database);
  66. G_add_error_handler(error_handler, driver);
  67. if (parms.sql) {
  68. /* parms.sql */
  69. db_set_string(&stmt, parms.sql);
  70. ret = db_execute_immediate(driver, &stmt);
  71. if (ret != DB_OK) {
  72. if (parms.i) { /* ignore SQL errors */
  73. G_warning(_("Error while executing: '%s'"),
  74. db_get_string(&stmt));
  75. error++;
  76. }
  77. else {
  78. G_fatal_error(_("Error while executing: '%s'"),
  79. db_get_string(&stmt));
  80. }
  81. }
  82. }
  83. else { /* parms.input */
  84. while (get_stmt(fd, &stmt)) {
  85. if (stmt_is_empty(&stmt))
  86. continue;
  87. G_debug(3, "sql: %s", db_get_string(&stmt));
  88. ret = db_execute_immediate(driver, &stmt);
  89. if (ret != DB_OK) {
  90. if (parms.i) { /* ignore SQL errors */
  91. G_warning(_("Error while executing: '%s'"),
  92. db_get_string(&stmt));
  93. error++;
  94. }
  95. else {
  96. G_fatal_error(_("Error while executing: '%s'"),
  97. db_get_string(&stmt));
  98. }
  99. }
  100. }
  101. }
  102. db_close_database(driver);
  103. db_shutdown_driver(driver);
  104. exit(error ? EXIT_FAILURE : EXIT_SUCCESS);
  105. }
  106. static void parse_command_line(int argc, char **argv)
  107. {
  108. struct Option *driver, *database, *schema, *sql, *input;
  109. struct Flag *i;
  110. struct GModule *module;
  111. const char *drv, *db, *schema_name;
  112. /* Initialize the GIS calls */
  113. G_gisinit(argv[0]);
  114. /* Set description */
  115. module = G_define_module();
  116. G_add_keyword(_("database"));
  117. G_add_keyword(_("attribute table"));
  118. G_add_keyword(_("SQL"));
  119. module->label = _("Executes any SQL statement.");
  120. module->description = _("For SELECT statements use 'db.select'.");
  121. sql = G_define_standard_option(G_OPT_DB_SQL);
  122. sql->label = _("SQL statement");
  123. sql->description = _("Example: update rybniky set kapri = 'hodne' where kapri = 'malo'");
  124. sql->guisection = _("SQL");
  125. input = G_define_standard_option(G_OPT_F_INPUT);
  126. input->required = NO;
  127. input->label = _("Name of file containing SQL statement(s)");
  128. input->description = _("'-' for standard input");
  129. input->guisection = _("SQL");
  130. driver = G_define_standard_option(G_OPT_DB_DRIVER);
  131. driver->options = db_list_drivers();
  132. driver->guisection = _("Connection");
  133. if ((drv = db_get_default_driver_name()))
  134. driver->answer = (char *) drv;
  135. database = G_define_standard_option(G_OPT_DB_DATABASE);
  136. database->guisection = _("Connection");
  137. if ((db = db_get_default_database_name()))
  138. database->answer = (char *) db;
  139. schema = G_define_standard_option(G_OPT_DB_SCHEMA);
  140. schema->guisection = _("Connection");
  141. if ((schema_name = db_get_default_schema_name()))
  142. schema->answer = (char *) schema_name;
  143. i = G_define_flag();
  144. i->key = 'i';
  145. i->description = _("Ignore SQL errors and continue");
  146. i->guisection = _("Errors");
  147. if (G_parser(argc, argv))
  148. exit(EXIT_SUCCESS);
  149. if (!sql->answer && !input->answer) {
  150. G_fatal_error(_("You must provide <%s> or <%s> option"),
  151. sql->key, input->key);
  152. }
  153. parms.driver = driver->answer;
  154. parms.database = database->answer;
  155. parms.schema = schema->answer;
  156. parms.sql = sql->answer;
  157. parms.input = input->answer;
  158. parms.i = i->answer ? TRUE : FALSE;
  159. }
  160. int get_stmt(FILE * fd, dbString * stmt)
  161. {
  162. char buf[DB_SQL_MAX], buf2[DB_SQL_MAX];
  163. size_t len;
  164. db_zero_string(stmt);
  165. if (G_getl2(buf, sizeof(buf), fd) == 0)
  166. return 0;
  167. strcpy(buf2, buf);
  168. G_chop(buf2);
  169. len = strlen(buf2);
  170. if (buf2[len - 1] == ';') { /* end of statement */
  171. buf2[len - 1] = 0; /* truncate ';' */
  172. }
  173. db_set_string(stmt, buf2);
  174. return 1;
  175. }
  176. int stmt_is_empty(dbString * stmt)
  177. {
  178. char dummy[2];
  179. return (sscanf(db_get_string(stmt), "%1s", dummy) != 1);
  180. }
  181. void error_handler(void *p)
  182. {
  183. dbDriver *driver = (dbDriver *) p;
  184. db_close_database(driver);
  185. db_shutdown_driver(driver);
  186. }