generate.c 7.0 KB

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