GRASS Programmer's Manual  6.4.2(2012)
generate.c
Go to the documentation of this file.
00001 #include <stdlib.h>
00002 #include <string.h>
00003 #include <grass/gis.h>
00004 #include <grass/dbmi.h>
00005 #include <grass/form.h>
00006 
00007 /* Escape string for use in TCL */
00008 char *escape_tcl_string(char *input)
00009 {
00010     char *escaped;
00011 
00012     escaped = G_str_replace(input, "\\", "\\\\");
00013     escaped = G_str_replace(escaped, "[", "\\[");
00014     escaped = G_str_replace(escaped, "]", "\\]");
00015     escaped = G_str_replace(escaped, "$", "\\$");
00016 
00017     return escaped;
00018 }
00019 
00020 /* Generate form in HTML/TXT format.
00021  *  Pointer to resulting string is stored to 'form'. This string must be freed by application.
00022  *
00023  *  returns: -1 error 
00024  *            0 success
00025  */
00026 int
00027 F_generate(char *drvname, char *dbname, char *tblname, char *key, int keyval,
00028            char *frmname, char *frmmapset,
00029            int edit_mode, int format, char **form)
00030 {
00031     int col, ncols, ctype, sqltype, more;
00032     char buf[5000], buf1[100];
00033     const char *colname;
00034     dbString sql, html, str;
00035     dbDriver *driver;
00036     dbHandle handle;
00037     dbCursor cursor;
00038     dbTable *table;
00039     dbColumn *column;
00040     dbValue *value;
00041 
00042     int i = 0;
00043 
00044     /* see /usr/lib/tcl8.4/encoding/ */
00045     static char *encoding_list[] = {
00046         "utf-8",
00047         "ascii",
00048         "iso8859-1",
00049         "iso8859-2",
00050         "iso8859-15",
00051         "iso2022-jp",
00052         "koi8-r",
00053         "euc-jp",
00054         NULL
00055     };
00056     char *enc_env;
00057 
00058     G__read_env();
00059     enc_env = G__getenv("GRASS_DB_ENCODING");
00060 
00061     /* TODO: support 'format' (txt, html), currently html only */
00062 
00063     G_debug(2,
00064             "F_generate(): drvname = '%s', dbname = '%s'\n      tblname = '%s', key = '%s', keyval = %d\n"
00065             "    form = '%s', form_mapset = '%s'\n      edit_mode = %d",
00066             drvname, dbname, tblname, key, keyval, frmname, frmmapset,
00067             edit_mode);
00068 
00069     db_init_string(&sql);
00070     db_init_string(&html);      /* here is the result stored */
00071     db_init_string(&str);
00072 
00073     G_debug(2, "Open driver");
00074     driver = db_start_driver(drvname);
00075     if (driver == NULL) {
00076         G_warning("Cannot open driver");
00077         sprintf(buf, "Cannot open driver '%s'<BR>",
00078                 escape_tcl_string(drvname));
00079         *form = G_store(buf);
00080         return -1;
00081     }
00082     G_debug(2, "Driver opened");
00083 
00084     db_init_handle(&handle);
00085     db_set_handle(&handle, dbname, NULL);
00086     G_debug(2, "Open database");
00087     if (db_open_database(driver, &handle) != DB_OK) {
00088         G_warning("Cannot open database");
00089         db_shutdown_driver(driver);
00090         sprintf(buf, "Cannot open database '%s' by driver '%s'<BR>",
00091                 escape_tcl_string(dbname), escape_tcl_string(drvname));
00092         *form = G_store(buf);
00093         return -1;
00094     }
00095     G_debug(2, "Database opened");
00096 
00097     /* TODO: test if table exist first, but this should be tested by application befor
00098      *        F_generate() is called, because it may be correct (connection defined in DB
00099      *        but table does not exist) */
00100 
00101     sprintf(buf, "select * from %s where %s = %d", tblname, key, keyval);
00102     G_debug(2, "%s", buf);
00103     db_set_string(&sql, buf);
00104     if (db_open_select_cursor(driver, &sql, &cursor, DB_SEQUENTIAL) != DB_OK) {
00105         G_warning("Cannot open select cursor");
00106         db_close_database(driver);
00107         db_shutdown_driver(driver);
00108         sprintf(buf,
00109                 "Cannot open select cursor:<BR>'%s'<BR>on database '%s' by driver '%s'<BR>",
00110                 escape_tcl_string(db_get_string(&sql)),
00111                 escape_tcl_string(dbname), escape_tcl_string(drvname));
00112         *form = G_store(buf);
00113         return -1;
00114     }
00115     G_debug(2, "Select Cursor opened");
00116 
00117     table = db_get_cursor_table(&cursor);
00118 
00119     if (db_fetch(&cursor, DB_NEXT, &more) != DB_OK) {
00120         G_warning("Cannot fetch next record");
00121         db_close_cursor(&cursor);
00122         db_close_database(driver);
00123         db_shutdown_driver(driver);
00124         *form = G_store("Cannot fetch next record");
00125         return -1;
00126     }
00127 
00128     if (!more) {
00129         G_warning("No database record");
00130         if (format == F_HTML) {
00131             *form = G_store("No record selected.<BR>");
00132         }
00133         else {
00134             *form = G_store("No record selected.");
00135         }
00136     }
00137     else {
00138         ncols = db_get_table_number_of_columns(table);
00139 
00140         /* Start form */
00141         if (format == F_HTML) {
00142             if (edit_mode == F_EDIT) {
00143                 db_append_string(&html, "<FORM>");
00144 
00145                 sprintf(buf, "<INPUT type=hidden name=%s value=\"%s\">",
00146                         escape_tcl_string(F_DRIVER_FNAME),
00147                         escape_tcl_string(drvname));
00148                 db_append_string(&html, buf);
00149                 /* Note: because html_library.tcl failes to parse
00150                  *  <INPUT name=abc value='dbname=xxx'> and returnes
00151                  *  name="xxx" value="dbname=xxx" order of value and name parameters is changed */
00152                 sprintf(buf, "<INPUT type=hidden value=\"%s\" name=%s>",
00153                         escape_tcl_string(dbname),
00154                         escape_tcl_string(F_DATABASE_FNAME));
00155                 db_append_string(&html, buf);
00156                 sprintf(buf, "<INPUT type=hidden name=%s value=\"%s\">",
00157                         escape_tcl_string(F_TABLE_FNAME),
00158                         escape_tcl_string(tblname));
00159                 db_append_string(&html, buf);
00160                 sprintf(buf, "<INPUT type=hidden name=%s value=\"%s\">",
00161                         escape_tcl_string(F_KEY_FNAME),
00162                         escape_tcl_string(key));
00163                 db_append_string(&html, buf);
00164 
00165             }
00166 
00167             for (col = 0; col < ncols; col++) {
00168                 column = db_get_table_column(table, col);
00169                 sqltype = db_get_column_sqltype(column);
00170                 ctype = db_sqltype_to_Ctype(sqltype);
00171                 value = db_get_column_value(column);
00172                 db_convert_value_to_string(value, sqltype, &str);
00173                 colname = db_get_column_name(column);
00174 
00175                 G_debug(2, "%s: %s", colname, db_get_string(&str));
00176 
00177                 if (edit_mode == F_VIEW) {
00178                     sprintf(buf, "<B>%s : </B> %s <BR>",
00179                             escape_tcl_string(G_strdup(colname)),
00180                             escape_tcl_string(db_get_string(&str)));
00181                     db_append_string(&html, buf);
00182                 }
00183                 else {
00184                     sprintf(buf, "<B>%s : </B>",
00185                             escape_tcl_string(G_strdup(colname)));
00186                     db_append_string(&html, buf);
00187 
00188                     if (G_strcasecmp(colname, key) == 0) {
00189                         sprintf(buf,
00190                                 "%s<BR> <INPUT type=hidden name=%s value=\"%s\">",
00191                                 escape_tcl_string(db_get_string(&str)),
00192                                 escape_tcl_string(G_strdup(colname)),
00193                                 escape_tcl_string(db_get_string(&str)));
00194                     }
00195                     else {
00196                         switch (ctype) {
00197                         case DB_C_TYPE_INT:
00198                             sprintf(buf1, "20");
00199                             break;
00200                         case DB_C_TYPE_DOUBLE:
00201                             sprintf(buf1, "30");
00202                             break;
00203                         case DB_C_TYPE_STRING:
00204                             sprintf(buf1, "%d", db_get_column_length(column));
00205                             break;
00206                         case DB_C_TYPE_DATETIME:
00207                             sprintf(buf1, "20");
00208                             break;
00209                         }
00210                         sprintf(buf,
00211                                 "<INPUT type=text size=%s name=%s value=\"%s\"><BR>",
00212                                 escape_tcl_string(buf1),
00213                                 escape_tcl_string(G_strdup(colname)),
00214                                 escape_tcl_string(db_get_string(&str)));
00215                     }
00216                     db_append_string(&html, buf);
00217                 }
00218             }
00219 
00220             if (edit_mode == F_EDIT) {
00221                 sprintf(buf,
00222                         "<HR>   Assume data encoding as:<BR><BR><SELECT NAME=%s SIZE=4><HR><BR>",
00223                         F_ENCODING);
00224                 db_append_string(&html, buf);
00225 
00226                 i = 0;
00227                 while (encoding_list[i] != NULL) {
00228 
00229                     if (G_strcasecmp(encoding_list[i], enc_env) == 0)
00230                         sprintf(buf, "<OPTION VALUE=\"%s\" SELECTED>%s",
00231                                 encoding_list[i], encoding_list[i]);
00232                     else
00233                         sprintf(buf, "<OPTION VALUE=\"%s\">%s",
00234                                 encoding_list[i], encoding_list[i]);
00235                     ++i;
00236                     db_append_string(&html, buf);
00237                 }
00238 
00239                 sprintf(buf, "</SELECT>");
00240                 db_append_string(&html, buf);
00241             }
00242 
00243             /* Close form */
00244             if (edit_mode == F_EDIT) {
00245                 db_append_string(&html, "</FORM>");
00246             }
00247         }
00248         else {                  /* F_TXT */
00249             for (col = 0; col < ncols; col++) {
00250                 column = db_get_table_column(table, col);
00251                 sqltype = db_get_column_sqltype(column);
00252                 ctype = db_sqltype_to_Ctype(sqltype);
00253                 value = db_get_column_value(column);
00254                 db_convert_value_to_string(value, sqltype, &str);
00255                 colname = db_get_column_name(column);
00256 
00257                 G_debug(2, "%s: %s", colname, db_get_string(&str));
00258 
00259                 sprintf(buf, "%s : %s\n", colname, db_get_string(&str));
00260                 db_append_string(&html, buf);
00261             }
00262         }
00263     }
00264     G_debug(2, "FORM STRING:\n%s\n", db_get_string(&html));
00265 
00266     db_close_cursor(&cursor);
00267     db_close_database(driver);
00268     db_shutdown_driver(driver);
00269 
00270     *form = G_store(db_get_string(&html));
00271 
00272     db_free_string(&sql);
00273     db_free_string(&html);
00274     db_free_string(&str);
00275 
00276     return 0;
00277 }
 All Data Structures Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Defines