10 #define USE_INTERP_RESULT
15 #include <grass/gis.h>
16 #include <grass/dbmi.h>
17 #include <grass/form.h>
27 static char *Drvname, *Dbname, *Tblname, *Key;
30 static int allocatedRows = 0;
46 int set_value(ClientData cdata, Tcl_Interp * interp,
int argc,
char *argv[])
48 G_debug(2,
"set_value(): %s %s", argv[1], argv[2]);
50 if (strcmp(argv[1], F_DRIVER_FNAME) == 0) {
53 else if (strcmp(argv[1], F_DATABASE_FNAME) == 0) {
56 else if (strcmp(argv[1], F_TABLE_FNAME) == 0) {
59 else if (strcmp(argv[1], F_KEY_FNAME) == 0) {
63 if (nRows == allocatedRows) {
66 (
COLUMN *) G_realloc(Columns,
67 (allocatedRows) *
sizeof(
COLUMN));
78 int submit(ClientData cdata, Tcl_Interp * interp,
int argc,
char *argv[])
80 int i,
first, ncols, found, col, sqltype, keyval = 0, ret;
82 dbString sql, table_name, strval;
96 G_warning(
"db connection was not set by form");
97 sprintf(buf,
"set submit_msg \"db connection was not set by form.\"");
98 Tcl_Eval(interp, buf);
99 Tcl_Eval(interp,
"set submit_result 0");
106 if (driver ==
NULL) {
108 sprintf(buf,
"set submit_msg \"Cannot open driver '%s'\"", Drvname);
109 Tcl_Eval(interp, buf);
110 Tcl_Eval(interp,
"set submit_result 0");
122 "set submit_msg \"Cannot open database '%s' by driver '%s'\"",
125 Tcl_Eval(interp, buf);
126 Tcl_Eval(interp,
"set submit_result 0");
136 sprintf(buf,
"set submit_msg \"Cannot describe table '%s'\"",
138 Tcl_Eval(interp, buf);
139 Tcl_Eval(interp,
"set submit_result 0");
145 for (i = 0; i < nRows; i++) {
147 for (col = 0; col < ncols; col++) {
150 keyval = atoi(Columns[i].value);
165 sprintf(buf,
"set submit_msg \"Cannot find column type\"");
166 Tcl_Eval(interp, buf);
167 Tcl_Eval(interp,
"set submit_result 0");
173 sprintf(buf,
"update %s set ", Tblname);
177 for (i = 0; i < nRows; i++) {
178 G_debug(3,
"Index = %d of %d Name = %s, Key = %s", i, nRows,
179 Columns[i].
name, Key);
185 G_debug(3,
"GRASS_DB_ENCODING env-var is '%s', col val is '%s'",
186 G__getenv(
"GRASS_DB_ENCODING"), Columns[i].value);
188 if ((strlen(Columns[i].value) == 0) ||
193 G_setenv(
"GRASS_DB_ENCODING", Columns[i].value);
194 G_debug(3,
"Set env var GRASS_DB_ENCODING to '%s'",
196 if (Tcl_SetSystemEncoding(interp, Columns[i].value) ==
199 (
"Could not set Tcl system encoding to '%s' (%s)",
200 Columns[i].value, interp->result);
209 if (strlen(Columns[i].value) == 0) {
210 sprintf(buf,
"%s = null", Columns[i].name);
213 if (Columns[i].ctype == DB_C_TYPE_INT ||
214 Columns[i].ctype == DB_C_TYPE_DOUBLE) {
215 sprintf(buf,
"%s = %s", Columns[i].name, Columns[i].value);
218 memset(buf,
'\0', strlen(buf));
219 ret = Tcl_UtfToExternal(interp,
220 Tcl_GetEncoding(interp,
222 (
"GRASS_DB_ENCODING")),
224 strlen(Columns[i].value), 0,
NULL,
228 G_warning(
"Could not convert UTF to external.");
236 sprintf(buf,
"%s = '%s'", Columns[i].name,
244 sprintf(buf,
" where %s = %d", Key, keyval);
257 Tcl_VarEval(interp,
"set submit_msg \"Cannot update table:\n",
259 Tcl_Eval(interp,
"set submit_result 0");
262 Tcl_Eval(interp,
"set submit_msg \"Record successfully updated\"");
263 Tcl_Eval(interp,
"set submit_result 1");
274 if (Tcl_Init(interp) == TCL_ERROR)
277 if (Tk_Init(interp) == TCL_ERROR)
280 Tcl_StaticPackage(interp,
"Tk", Tk_Init, Tk_SafeInit);
287 Tcl_CreateCommand(interp,
"submit", (Tcl_CmdProc *)
submit,
288 (ClientData)
NULL, (Tcl_CmdDeleteProc *) NULL);
289 Tcl_CreateCommand(interp,
"set_value",
291 (ClientData) NULL, (Tcl_CmdDeleteProc *) NULL);
292 Tcl_CreateCommand(interp,
"reset_values",
294 (ClientData) NULL, (Tcl_CmdDeleteProc *) NULL);
302 Tcl_SetVar(interp,
"tcl_rcFileName",
"~/.grassformrc", TCL_GLOBAL_ONLY);
306 int main(
int argc,
char *argv[])