~ubuntu-branches/ubuntu/vivid/grass/vivid-proposed

« back to all changes in this revision

Viewing changes to vector/v.digit/generate.c

  • Committer: Package Import Robot
  • Author(s): Bas Couwenberg
  • Date: 2015-02-20 23:12:08 UTC
  • mfrom: (8.2.6 experimental)
  • Revision ID: package-import@ubuntu.com-20150220231208-1u6qvqm84v430b10
Tags: 7.0.0-1~exp1
* New upstream release.
* Update python-ctypes-ternary.patch to use if/else instead of and/or.
* Drop check4dev patch, rely on upstream check.
* Add build dependency on libpq-dev to grass-dev for libpq-fe.h.
* Drop patches applied upstream, refresh remaining patches.
* Update symlinks for images switched from jpg to png.

Show diffs side-by-side

added added

removed removed

Lines of Context:
1
 
#include <stdlib.h>
2
 
#include <string.h>
3
 
#include <grass/gis.h>
4
 
#include <grass/dbmi.h>
5
 
#include <grass/form.h>
6
 
#include <grass/glocale.h>
7
 
 
8
 
/* Escape string for use in TCL */
9
 
char *escape_tcl_string(char *input)
10
 
{
11
 
    char *escaped;
12
 
 
13
 
    escaped = G_str_replace(input, "\\", "\\\\");
14
 
    escaped = G_str_replace(escaped, "[", "\\[");
15
 
    escaped = G_str_replace(escaped, "]", "\\]");
16
 
    escaped = G_str_replace(escaped, "$", "\\$");
17
 
 
18
 
    return escaped;
19
 
}
20
 
 
21
 
/* Generate form in HTML/TXT format.
22
 
 *  Pointer to resulting string is stored to 'form'. This string must be freed by application.
23
 
 *
24
 
 *  returns: -1 error 
25
 
 *            0 success
26
 
 */
27
 
int
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)
31
 
{
32
 
    int col, ncols, ctype, sqltype, more;
33
 
    char buf[5000], buf1[100];
34
 
    const char *colname;
35
 
    dbString sql, html, str;
36
 
    dbDriver *driver;
37
 
    dbHandle handle;
38
 
    dbCursor cursor;
39
 
    dbTable *table;
40
 
    dbColumn *column;
41
 
    dbValue *value;
42
 
 
43
 
    int i = 0;
44
 
 
45
 
    /* see /usr/lib/tcl8.4/encoding/ */
46
 
    static char *encoding_list[] = {
47
 
        "utf-8",
48
 
        "ascii",
49
 
        "iso8859-1",
50
 
        "iso8859-2",
51
 
        "iso8859-15",
52
 
        "iso2022-jp",
53
 
        "koi8-r",
54
 
        "euc-jp",
55
 
        NULL
56
 
    };
57
 
    char *enc_env;
58
 
 
59
 
    G__read_env();
60
 
    enc_env = G__getenv("GRASS_DB_ENCODING");
61
 
 
62
 
    /* TODO: support 'format' (txt, html), currently html only */
63
 
 
64
 
    G_debug(2,
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,
68
 
            edit_mode);
69
 
 
70
 
    db_init_string(&sql);
71
 
    db_init_string(&html);      /* here is the result stored */
72
 
    db_init_string(&str);
73
 
 
74
 
    G_debug(2, "Open driver");
75
 
    driver = db_start_driver(drvname);
76
 
    if (driver == NULL) {
77
 
        G_warning(_("Cannot open driver"));
78
 
        sprintf(buf, _("Cannot open driver '%s'<BR>"),
79
 
                escape_tcl_string(drvname));
80
 
        *form = G_store(buf);
81
 
        return -1;
82
 
    }
83
 
    G_debug(2, "Driver opened");
84
 
 
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));
93
 
        *form = G_store(buf);
94
 
        return -1;
95
 
    }
96
 
    G_debug(2, "Database opened");
97
 
 
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) */
101
 
 
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);
109
 
        sprintf(buf,
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);
114
 
        return -1;
115
 
    }
116
 
    G_debug(2, "Select Cursor opened");
117
 
 
118
 
    table = db_get_cursor_table(&cursor);
119
 
 
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");
126
 
        return -1;
127
 
    }
128
 
 
129
 
    if (!more) {
130
 
        G_warning(_("No database record"));
131
 
        if (format == F_HTML) {
132
 
            *form = G_store("No record selected.<BR>");
133
 
        }
134
 
        else {
135
 
            *form = G_store("No record selected.");
136
 
        }
137
 
    }
138
 
    else {
139
 
        ncols = db_get_table_number_of_columns(table);
140
 
 
141
 
        /* Start form */
142
 
        if (format == F_HTML) {
143
 
            if (edit_mode == F_EDIT) {
144
 
                db_append_string(&html, "<FORM>");
145
 
 
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);
165
 
 
166
 
            }
167
 
 
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);
175
 
 
176
 
                G_debug(2, "%s: %s", colname, db_get_string(&str));
177
 
 
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);
183
 
                }
184
 
                else {
185
 
                    sprintf(buf, "<B>%s : </B>",
186
 
                            escape_tcl_string(G_strdup(colname)));
187
 
                    db_append_string(&html, buf);
188
 
 
189
 
                    if (G_strcasecmp(colname, key) == 0) {
190
 
                        sprintf(buf,
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)));
195
 
                    }
196
 
                    else {
197
 
                        switch (ctype) {
198
 
                        case DB_C_TYPE_INT:
199
 
                            sprintf(buf1, "20");
200
 
                            break;
201
 
                        case DB_C_TYPE_DOUBLE:
202
 
                            sprintf(buf1, "30");
203
 
                            break;
204
 
                        case DB_C_TYPE_STRING:
205
 
                            sprintf(buf1, "%d", db_get_column_length(column));
206
 
                            break;
207
 
                        case DB_C_TYPE_DATETIME:
208
 
                            sprintf(buf1, "20");
209
 
                            break;
210
 
                        }
211
 
                        sprintf(buf,
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)));
216
 
                    }
217
 
                    db_append_string(&html, buf);
218
 
                }
219
 
            }
220
 
 
221
 
            if (edit_mode == F_EDIT) {
222
 
                sprintf(buf,
223
 
                        _("<HR>   Assume data encoding as:<BR><BR><SELECT NAME=%s SIZE=4><HR><BR>"),
224
 
                        F_ENCODING);
225
 
                db_append_string(&html, buf);
226
 
 
227
 
                i = 0;
228
 
                while (encoding_list[i] != NULL) {
229
 
 
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]);
233
 
                    else
234
 
                        sprintf(buf, "<OPTION VALUE=\"%s\">%s",
235
 
                                encoding_list[i], encoding_list[i]);
236
 
                    ++i;
237
 
                    db_append_string(&html, buf);
238
 
                }
239
 
 
240
 
                sprintf(buf, "</SELECT>");
241
 
                db_append_string(&html, buf);
242
 
            }
243
 
 
244
 
            /* Close form */
245
 
            if (edit_mode == F_EDIT) {
246
 
                db_append_string(&html, "</FORM>");
247
 
            }
248
 
        }
249
 
        else {                  /* F_TXT */
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);
257
 
 
258
 
                G_debug(2, "%s: %s", colname, db_get_string(&str));
259
 
 
260
 
                sprintf(buf, "%s : %s\n", colname, db_get_string(&str));
261
 
                db_append_string(&html, buf);
262
 
            }
263
 
        }
264
 
    }
265
 
    G_debug(2, "FORM STRING:\n%s\n", db_get_string(&html));
266
 
 
267
 
    db_close_cursor(&cursor);
268
 
    db_close_database(driver);
269
 
    db_shutdown_driver(driver);
270
 
 
271
 
    *form = G_store(db_get_string(&html));
272
 
 
273
 
    db_free_string(&sql);
274
 
    db_free_string(&html);
275
 
    db_free_string(&str);
276
 
 
277
 
    return 0;
278
 
}