GRASS Programmer's Manual
6.4.2(2012)
|
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 }