123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254 |
- #include <stdlib.h>
- #include <string.h>
- #include <grass/gis.h>
- #include <grass/dbmi.h>
- #include <grass/form.h>
- /* Generate form in HTML/TXT format.
- * Pointer to resulting string is stored to 'form'. This string must be freed by application.
- *
- * returns: -1 error
- * 0 success
- */
- int
- F_generate(char *drvname, char *dbname, char *tblname, char *key, int keyval,
- char *frmname, char *frmmapset,
- int edit_mode, int format, char **form)
- {
- int col, ncols, ctype, sqltype, more;
- char buf[5000], buf1[100];
- const char *colname;
- dbString sql, html, str;
- dbDriver *driver;
- dbHandle handle;
- dbCursor cursor;
- dbTable *table;
- dbColumn *column;
- dbValue *value;
- int i = 0;
- /* see /usr/lib/tcl8.4/encoding/ */
- static char *encoding_list[] = {
- "utf-8",
- "ascii",
- "iso8859-1",
- "iso8859-2",
- "iso8859-15",
- "iso2022-jp",
- "koi8-r",
- "euc-jp",
- NULL
- };
- const char *enc_env;
- G__read_env();
- enc_env = G__getenv("GRASS_DB_ENCODING");
- /* TODO: support 'format' (txt, html), currently html only */
- G_debug(2,
- "F_generate(): drvname = '%s', dbname = '%s'\n tblname = '%s', key = '%s', keyval = %d\n"
- " form = '%s', form_mapset = '%s'\n edit_mode = %d",
- drvname, dbname, tblname, key, keyval, frmname, frmmapset,
- edit_mode);
- db_init_string(&sql);
- db_init_string(&html); /* here is the result stored */
- db_init_string(&str);
- G_debug(2, "Open driver");
- driver = db_start_driver(drvname);
- if (driver == NULL) {
- G_warning("Cannot open driver\n");
- sprintf(buf, "Cannot open driver '%s'<BR>", drvname);
- *form = G_store(buf);
- return -1;
- }
- G_debug(2, "Driver opened");
- db_init_handle(&handle);
- db_set_handle(&handle, dbname, NULL);
- G_debug(2, "Open database");
- if (db_open_database(driver, &handle) != DB_OK) {
- G_warning("Cannot open database\n");
- db_shutdown_driver(driver);
- sprintf(buf, "Cannot open database '%s' by driver '%s'<BR>", dbname,
- drvname);
- *form = G_store(buf);
- return -1;
- }
- G_debug(2, "Database opened");
- /* TODO: test if table exist first, but this should be tested by application befor
- * F_generate() is called, because it may be correct (connection defined in DB
- * but table does not exist) */
- sprintf(buf, "select * from %s where %s = %d", tblname, key, keyval);
- G_debug(2, "%s", buf);
- db_set_string(&sql, buf);
- if (db_open_select_cursor(driver, &sql, &cursor, DB_SEQUENTIAL) != DB_OK) {
- G_warning("Cannot open select cursor\n");
- db_close_database(driver);
- db_shutdown_driver(driver);
- sprintf(buf,
- "Cannot open select cursor:<BR>'%s'<BR>on database '%s' by driver '%s'<BR>",
- db_get_string(&sql), dbname, drvname);
- *form = G_store(buf);
- return -1;
- }
- G_debug(2, "Select Cursor opened");
- table = db_get_cursor_table(&cursor);
- if (db_fetch(&cursor, DB_NEXT, &more) != DB_OK) {
- G_warning("Cannot fetch next record\n");
- db_close_cursor(&cursor);
- db_close_database(driver);
- db_shutdown_driver(driver);
- *form = G_store("Cannot fetch next record");
- return -1;
- }
- if (!more) {
- G_warning("No database record");
- if (format == F_HTML) {
- *form = G_store("No record selected.<BR>");
- }
- else {
- *form = G_store("No record selected.");
- }
- }
- else {
- ncols = db_get_table_number_of_columns(table);
- /* Start form */
- if (format == F_HTML) {
- if (edit_mode == F_EDIT) {
- db_append_string(&html, "<FORM>");
- sprintf(buf, "<INPUT type=hidden name=%s value=\"%s\">",
- F_DRIVER_FNAME, drvname);
- db_append_string(&html, buf);
- /* Note: because html_library.tcl failes to parse
- * <INPUT name=abc value='dbname=xxx'> and returnes
- * name="xxx" value="dbname=xxx" order of value and name parameters is changed */
- sprintf(buf, "<INPUT type=hidden value=\"%s\" name=%s>",
- dbname, F_DATABASE_FNAME);
- db_append_string(&html, buf);
- sprintf(buf, "<INPUT type=hidden name=%s value=\"%s\">",
- F_TABLE_FNAME, tblname);
- db_append_string(&html, buf);
- sprintf(buf, "<INPUT type=hidden name=%s value=\"%s\">",
- F_KEY_FNAME, key);
- db_append_string(&html, buf);
- }
- for (col = 0; col < ncols; col++) {
- column = db_get_table_column(table, col);
- sqltype = db_get_column_sqltype(column);
- ctype = db_sqltype_to_Ctype(sqltype);
- value = db_get_column_value(column);
- db_convert_value_to_string(value, sqltype, &str);
- colname = db_get_column_name(column);
- G_debug(2, "%s: %s", colname, db_get_string(&str));
- if (edit_mode == F_VIEW) {
- sprintf(buf, "<B>%s : </B> %s <BR>", colname,
- db_get_string(&str));
- db_append_string(&html, buf);
- }
- else {
- sprintf(buf, "<B>%s : </B>", colname);
- db_append_string(&html, buf);
- if (G_strcasecmp(colname, key) == 0) {
- sprintf(buf,
- "%s<BR> <INPUT type=hidden name=%s value=\"%s\">",
- db_get_string(&str), colname,
- db_get_string(&str));
- }
- else {
- switch (ctype) {
- case DB_C_TYPE_INT:
- sprintf(buf1, "20");
- break;
- case DB_C_TYPE_DOUBLE:
- sprintf(buf1, "30");
- break;
- case DB_C_TYPE_STRING:
- sprintf(buf1, "%d", db_get_column_length(column));
- break;
- case DB_C_TYPE_DATETIME:
- sprintf(buf1, "20");
- break;
- }
- sprintf(buf,
- "<INPUT type=text size=%s name=%s value=\"%s\"><BR>",
- buf1, colname, db_get_string(&str));
- }
- db_append_string(&html, buf);
- }
- }
- if (edit_mode == F_EDIT) {
- sprintf(buf,
- "<HR> Assume data encoding as:<BR><BR><SELECT NAME=%s SIZE=4><HR><BR>",
- F_ENCODING);
- db_append_string(&html, buf);
- i = 0;
- while (encoding_list[i] != NULL) {
- if (G_strcasecmp(encoding_list[i], enc_env) == 0)
- sprintf(buf, "<OPTION VALUE=\"%s\" SELECTED>%s",
- encoding_list[i], encoding_list[i]);
- else
- sprintf(buf, "<OPTION VALUE=\"%s\">%s",
- encoding_list[i], encoding_list[i]);
- ++i;
- db_append_string(&html, buf);
- }
- sprintf(buf, "</SELECT>");
- db_append_string(&html, buf);
- }
- /* Close form */
- if (edit_mode == F_EDIT) {
- db_append_string(&html, "</FORM>");
- }
- }
- else { /* F_TXT */
- for (col = 0; col < ncols; col++) {
- column = db_get_table_column(table, col);
- sqltype = db_get_column_sqltype(column);
- ctype = db_sqltype_to_Ctype(sqltype);
- value = db_get_column_value(column);
- db_convert_value_to_string(value, sqltype, &str);
- colname = db_get_column_name(column);
- G_debug(2, "%s: %s", colname, db_get_string(&str));
- sprintf(buf, "%s : %s\n", colname, db_get_string(&str));
- db_append_string(&html, buf);
- }
- }
- }
- G_debug(2, "FORM STRING:\n%s\n", db_get_string(&html));
- db_close_cursor(&cursor);
- db_close_database(driver);
- db_shutdown_driver(driver);
- *form = G_store(db_get_string(&html));
- db_free_string(&sql);
- db_free_string(&html);
- db_free_string(&str);
- return 0;
- }
|