generate.c 7.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237
  1. #include <stdlib.h>
  2. #include <string.h>
  3. #include <grass/gis.h>
  4. #include <grass/dbmi.h>
  5. #include <grass/form.h>
  6. /* Generate form in HTML/TXT format.
  7. * Pointer to resulting string is stored to 'form'. This string must be freed by application.
  8. *
  9. * returns: -1 error
  10. * 0 success
  11. */
  12. int
  13. F_generate (char *drvname, char *dbname, char *tblname, char *key, int keyval,
  14. char *frmname, char *frmmapset,
  15. int edit_mode, int format,
  16. char **form)
  17. {
  18. int col, ncols, ctype, sqltype, more;
  19. char buf[5000], buf1[100], *colname;
  20. dbString sql, html, str;
  21. dbDriver *driver;
  22. dbHandle handle;
  23. dbCursor cursor;
  24. dbTable *table;
  25. dbColumn *column;
  26. dbValue *value;
  27. int i = 0;
  28. /* see /usr/lib/tcl8.4/encoding/ */
  29. static char *encoding_list[] = {
  30. "utf-8",
  31. "ascii",
  32. "iso8859-1",
  33. "iso8859-2",
  34. "iso8859-15",
  35. "iso2022-jp",
  36. "koi8-r",
  37. "euc-jp",
  38. NULL
  39. };
  40. char *enc_env;
  41. G__read_env();
  42. enc_env = G__getenv("GRASS_DB_ENCODING");
  43. /* TODO: support 'format' (txt, html), currently html only */
  44. G_debug ( 2, "F_generate(): drvname = '%s', dbname = '%s'\n tblname = '%s', key = '%s', keyval = %d\n"
  45. " form = '%s', form_mapset = '%s'\n edit_mode = %d",
  46. drvname, dbname, tblname, key, keyval, frmname, frmmapset, edit_mode);
  47. db_init_string (&sql);
  48. db_init_string (&html); /* here is the result stored */
  49. db_init_string (&str);
  50. G_debug ( 2, "Open driver" );
  51. driver = db_start_driver(drvname);
  52. if (driver == NULL) {
  53. G_warning ("Cannot open driver\n");
  54. sprintf ( buf, "Cannot open driver '%s'<BR>", drvname );
  55. *form = G_store (buf);
  56. return -1;
  57. }
  58. G_debug ( 2, "Driver opened" );
  59. db_init_handle (&handle);
  60. db_set_handle (&handle, dbname, NULL);
  61. G_debug ( 2, "Open database" );
  62. if (db_open_database(driver, &handle) != DB_OK){
  63. G_warning ("Cannot open database\n");
  64. db_shutdown_driver(driver);
  65. sprintf ( buf, "Cannot open database '%s' by driver '%s'<BR>", dbname, drvname);
  66. *form = G_store (buf);
  67. return -1;
  68. }
  69. G_debug ( 2, "Database opened" );
  70. /* TODO: test if table exist first, but this should be tested by application befor
  71. * F_generate() is called, because it may be correct (connection defined in DB
  72. * but table does not exist) */
  73. sprintf (buf, "select * from %s where %s = %d", tblname, key, keyval);
  74. G_debug ( 2, "%s", buf);
  75. db_set_string (&sql, buf);
  76. if ( db_open_select_cursor(driver, &sql, &cursor, DB_SEQUENTIAL) != DB_OK) {
  77. G_warning ("Cannot open select cursor\n");
  78. db_close_database(driver);
  79. db_shutdown_driver(driver);
  80. sprintf ( buf, "Cannot open select cursor:<BR>'%s'<BR>on database '%s' by driver '%s'<BR>",
  81. db_get_string(&sql), dbname, drvname);
  82. *form = G_store (buf);
  83. return -1;
  84. }
  85. G_debug ( 2, "Select Cursor opened" );
  86. table = db_get_cursor_table (&cursor);
  87. if ( db_fetch (&cursor, DB_NEXT, &more ) != DB_OK ) {
  88. G_warning ("Cannot fetch next record\n");
  89. db_close_cursor(&cursor);
  90. db_close_database(driver);
  91. db_shutdown_driver(driver);
  92. *form = G_store ("Cannot fetch next record");
  93. return -1;
  94. }
  95. if ( !more ) {
  96. G_warning ( "No database record" );
  97. if ( format == F_HTML ) {
  98. *form = G_store ("No record selected.<BR>");
  99. } else {
  100. *form = G_store ("No record selected.");
  101. }
  102. } else {
  103. ncols = db_get_table_number_of_columns (table);
  104. /* Start form */
  105. if ( format == F_HTML ) {
  106. if ( edit_mode == F_EDIT ) {
  107. db_append_string (&html, "<FORM>");
  108. sprintf (buf, "<INPUT type=hidden name=%s value=\"%s\">", F_DRIVER_FNAME, drvname );
  109. db_append_string (&html, buf);
  110. /* Note: because html_library.tcl failes to parse
  111. * <INPUT name=abc value='dbname=xxx'> and returnes
  112. * name="xxx" value="dbname=xxx" order of value and name parameters is changed */
  113. sprintf (buf, "<INPUT type=hidden value=\"%s\" name=%s>", dbname, F_DATABASE_FNAME );
  114. db_append_string (&html, buf);
  115. sprintf (buf, "<INPUT type=hidden name=%s value=\"%s\">", F_TABLE_FNAME, tblname );
  116. db_append_string (&html, buf);
  117. sprintf (buf, "<INPUT type=hidden name=%s value=\"%s\">", F_KEY_FNAME, key );
  118. db_append_string (&html, buf);
  119. }
  120. for( col = 0; col < ncols; col++) {
  121. column = db_get_table_column(table, col);
  122. sqltype = db_get_column_sqltype (column);
  123. ctype = db_sqltype_to_Ctype(sqltype);
  124. value = db_get_column_value(column);
  125. db_convert_value_to_string( value, sqltype, &str);
  126. colname = db_get_column_name (column);
  127. G_debug ( 2, "%s: %s", colname, db_get_string (&str) );
  128. if ( edit_mode == F_VIEW ) {
  129. sprintf (buf, "<B>%s : </B> %s <BR>", colname, db_get_string(&str) );
  130. db_append_string (&html, buf);
  131. } else {
  132. sprintf (buf, "<B>%s : </B>", colname );
  133. db_append_string (&html, buf);
  134. if ( G_strcasecmp (colname,key) == 0 ) {
  135. sprintf (buf, "%s<BR> <INPUT type=hidden name=%s value=\"%s\">",
  136. db_get_string(&str), colname, db_get_string(&str) );
  137. } else {
  138. switch ( ctype ) {
  139. case DB_C_TYPE_INT:
  140. sprintf (buf1, "20" );
  141. break;
  142. case DB_C_TYPE_DOUBLE:
  143. sprintf (buf1, "30" );
  144. break;
  145. case DB_C_TYPE_STRING:
  146. sprintf (buf1, "%d", db_get_column_length (column) );
  147. break;
  148. case DB_C_TYPE_DATETIME:
  149. sprintf (buf1, "20" );
  150. break;
  151. }
  152. sprintf (buf, "<INPUT type=text size=%s name=%s value=\"%s\"><BR>",
  153. buf1, colname, db_get_string(&str) );
  154. }
  155. db_append_string (&html, buf);
  156. }
  157. }
  158. if ( edit_mode == F_EDIT ) {
  159. sprintf(buf, "<HR> Assume data encoding as:<BR><BR><SELECT NAME=%s SIZE=4><HR><BR>",
  160. F_ENCODING);
  161. db_append_string(&html, buf);
  162. i = 0;
  163. while (encoding_list[i] != NULL) {
  164. if (G_strcasecmp(encoding_list[i], enc_env) == 0)
  165. sprintf(buf, "<OPTION VALUE=\"%s\" SELECTED>%s",
  166. encoding_list[i], encoding_list[i]);
  167. else
  168. sprintf(buf, "<OPTION VALUE=\"%s\">%s", encoding_list[i],
  169. encoding_list[i]);
  170. ++i;
  171. db_append_string(&html, buf);
  172. }
  173. sprintf(buf, "</SELECT>");
  174. db_append_string(&html, buf);
  175. }
  176. /* Close form */
  177. if ( edit_mode == F_EDIT ) {
  178. db_append_string (&html, "</FORM>");
  179. }
  180. } else { /* F_TXT */
  181. for( col = 0; col < ncols; col++) {
  182. column = db_get_table_column(table, col);
  183. sqltype = db_get_column_sqltype (column);
  184. ctype = db_sqltype_to_Ctype(sqltype);
  185. value = db_get_column_value(column);
  186. db_convert_value_to_string( value, sqltype, &str);
  187. colname = db_get_column_name (column);
  188. G_debug ( 2, "%s: %s", colname, db_get_string (&str) );
  189. sprintf (buf, "%s : %s\n", colname, db_get_string(&str) );
  190. db_append_string (&html, buf);
  191. }
  192. }
  193. }
  194. G_debug ( 2, "FORM STRING:\n%s\n", db_get_string(&html) );
  195. db_close_cursor(&cursor);
  196. db_close_database(driver);
  197. db_shutdown_driver(driver);
  198. *form = G_store ( db_get_string(&html) );
  199. db_free_string (&sql);
  200. db_free_string (&html);
  201. db_free_string (&str);
  202. return 0;
  203. }