4
#include <grass/dbmi.h>
5
#include <grass/form.h>
6
#include <grass/glocale.h>
8
/* Escape string for use in TCL */
9
char *escape_tcl_string(char *input)
13
escaped = G_str_replace(input, "\\", "\\\\");
14
escaped = G_str_replace(escaped, "[", "\\[");
15
escaped = G_str_replace(escaped, "]", "\\]");
16
escaped = G_str_replace(escaped, "$", "\\$");
21
/* Generate form in HTML/TXT format.
22
* Pointer to resulting string is stored to 'form'. This string must be freed by application.
28
F_generate(char *drvname, char *dbname, char *tblname, char *key, int keyval,
29
char *frmname, char *frmmapset,
30
int edit_mode, int format, char **form)
32
int col, ncols, ctype, sqltype, more;
33
char buf[5000], buf1[100];
35
dbString sql, html, str;
45
/* see /usr/lib/tcl8.4/encoding/ */
46
static char *encoding_list[] = {
60
enc_env = G__getenv("GRASS_DB_ENCODING");
62
/* TODO: support 'format' (txt, html), currently html only */
65
"F_generate(): drvname = '%s', dbname = '%s'\n tblname = '%s', key = '%s', keyval = %d\n"
66
" form = '%s', form_mapset = '%s'\n edit_mode = %d",
67
drvname, dbname, tblname, key, keyval, frmname, frmmapset,
71
db_init_string(&html); /* here is the result stored */
74
G_debug(2, "Open driver");
75
driver = db_start_driver(drvname);
77
G_warning(_("Cannot open driver"));
78
sprintf(buf, _("Cannot open driver '%s'<BR>"),
79
escape_tcl_string(drvname));
83
G_debug(2, "Driver opened");
85
db_init_handle(&handle);
86
db_set_handle(&handle, dbname, NULL);
87
G_debug(2, "Open database");
88
if (db_open_database(driver, &handle) != DB_OK) {
89
G_warning(_("Cannot open database"));
90
db_shutdown_driver(driver);
91
sprintf(buf, _("Cannot open database '%s' by driver '%s'<BR>"),
92
escape_tcl_string(dbname), escape_tcl_string(drvname));
96
G_debug(2, "Database opened");
98
/* TODO: test if table exist first, but this should be tested by application befor
99
* F_generate() is called, because it may be correct (connection defined in DB
100
* but table does not exist) */
102
sprintf(buf, "select * from %s where %s = %d", tblname, key, keyval);
103
G_debug(2, "%s", buf);
104
db_set_string(&sql, buf);
105
if (db_open_select_cursor(driver, &sql, &cursor, DB_SEQUENTIAL) != DB_OK) {
106
G_warning(_("Cannot open select cursor"));
107
db_close_database(driver);
108
db_shutdown_driver(driver);
110
_("Cannot open select cursor:<BR>'%s'<BR>on database '%s' by driver '%s'<BR>"),
111
escape_tcl_string(db_get_string(&sql)),
112
escape_tcl_string(dbname), escape_tcl_string(drvname));
113
*form = G_store(buf);
116
G_debug(2, "Select Cursor opened");
118
table = db_get_cursor_table(&cursor);
120
if (db_fetch(&cursor, DB_NEXT, &more) != DB_OK) {
121
G_warning(_("Cannot fetch next record"));
122
db_close_cursor(&cursor);
123
db_close_database(driver);
124
db_shutdown_driver(driver);
125
*form = G_store("Cannot fetch next record");
130
G_warning(_("No database record"));
131
if (format == F_HTML) {
132
*form = G_store("No record selected.<BR>");
135
*form = G_store("No record selected.");
139
ncols = db_get_table_number_of_columns(table);
142
if (format == F_HTML) {
143
if (edit_mode == F_EDIT) {
144
db_append_string(&html, "<FORM>");
146
sprintf(buf, "<INPUT type=hidden name=%s value=\"%s\">",
147
escape_tcl_string(F_DRIVER_FNAME),
148
escape_tcl_string(drvname));
149
db_append_string(&html, buf);
150
/* Note: because html_library.tcl failes to parse
151
* <INPUT name=abc value='dbname=xxx'> and returnes
152
* name="xxx" value="dbname=xxx" order of value and name parameters is changed */
153
sprintf(buf, "<INPUT type=hidden value=\"%s\" name=%s>",
154
escape_tcl_string(dbname),
155
escape_tcl_string(F_DATABASE_FNAME));
156
db_append_string(&html, buf);
157
sprintf(buf, "<INPUT type=hidden name=%s value=\"%s\">",
158
escape_tcl_string(F_TABLE_FNAME),
159
escape_tcl_string(tblname));
160
db_append_string(&html, buf);
161
sprintf(buf, "<INPUT type=hidden name=%s value=\"%s\">",
162
escape_tcl_string(F_KEY_FNAME),
163
escape_tcl_string(key));
164
db_append_string(&html, buf);
168
for (col = 0; col < ncols; col++) {
169
column = db_get_table_column(table, col);
170
sqltype = db_get_column_sqltype(column);
171
ctype = db_sqltype_to_Ctype(sqltype);
172
value = db_get_column_value(column);
173
db_convert_value_to_string(value, sqltype, &str);
174
colname = db_get_column_name(column);
176
G_debug(2, "%s: %s", colname, db_get_string(&str));
178
if (edit_mode == F_VIEW) {
179
sprintf(buf, "<B>%s : </B> %s <BR>",
180
escape_tcl_string(G_strdup(colname)),
181
escape_tcl_string(db_get_string(&str)));
182
db_append_string(&html, buf);
185
sprintf(buf, "<B>%s : </B>",
186
escape_tcl_string(G_strdup(colname)));
187
db_append_string(&html, buf);
189
if (G_strcasecmp(colname, key) == 0) {
191
"%s<BR> <INPUT type=hidden name=%s value=\"%s\">",
192
escape_tcl_string(db_get_string(&str)),
193
escape_tcl_string(G_strdup(colname)),
194
escape_tcl_string(db_get_string(&str)));
201
case DB_C_TYPE_DOUBLE:
204
case DB_C_TYPE_STRING:
205
sprintf(buf1, "%d", db_get_column_length(column));
207
case DB_C_TYPE_DATETIME:
212
"<INPUT type=text size=%s name=%s value=\"%s\"><BR>",
213
escape_tcl_string(buf1),
214
escape_tcl_string(G_strdup(colname)),
215
escape_tcl_string(db_get_string(&str)));
217
db_append_string(&html, buf);
221
if (edit_mode == F_EDIT) {
223
_("<HR> Assume data encoding as:<BR><BR><SELECT NAME=%s SIZE=4><HR><BR>"),
225
db_append_string(&html, buf);
228
while (encoding_list[i] != NULL) {
230
if (G_strcasecmp(encoding_list[i], enc_env) == 0)
231
sprintf(buf, "<OPTION VALUE=\"%s\" SELECTED>%s",
232
encoding_list[i], encoding_list[i]);
234
sprintf(buf, "<OPTION VALUE=\"%s\">%s",
235
encoding_list[i], encoding_list[i]);
237
db_append_string(&html, buf);
240
sprintf(buf, "</SELECT>");
241
db_append_string(&html, buf);
245
if (edit_mode == F_EDIT) {
246
db_append_string(&html, "</FORM>");
250
for (col = 0; col < ncols; col++) {
251
column = db_get_table_column(table, col);
252
sqltype = db_get_column_sqltype(column);
253
ctype = db_sqltype_to_Ctype(sqltype);
254
value = db_get_column_value(column);
255
db_convert_value_to_string(value, sqltype, &str);
256
colname = db_get_column_name(column);
258
G_debug(2, "%s: %s", colname, db_get_string(&str));
260
sprintf(buf, "%s : %s\n", colname, db_get_string(&str));
261
db_append_string(&html, buf);
265
G_debug(2, "FORM STRING:\n%s\n", db_get_string(&html));
267
db_close_cursor(&cursor);
268
db_close_database(driver);
269
db_shutdown_driver(driver);
271
*form = G_store(db_get_string(&html));
273
db_free_string(&sql);
274
db_free_string(&html);
275
db_free_string(&str);