[GRASS-SVN] r40259 - grass/branches/develbranch_6/vector/v.digit
svn_grass at osgeo.org
svn_grass at osgeo.org
Tue Jan 5 11:30:17 EST 2010
Author: glynn
Date: 2010-01-05 11:30:15 -0500 (Tue, 05 Jan 2010)
New Revision: 40259
Added:
grass/branches/develbranch_6/vector/v.digit/generate.c
Modified:
grass/branches/develbranch_6/vector/v.digit/Makefile
Log:
Revert 38954, sync generate.c
Modified: grass/branches/develbranch_6/vector/v.digit/Makefile
===================================================================
--- grass/branches/develbranch_6/vector/v.digit/Makefile 2010-01-05 15:42:23 UTC (rev 40258)
+++ grass/branches/develbranch_6/vector/v.digit/Makefile 2010-01-05 16:30:15 UTC (rev 40259)
@@ -2,8 +2,8 @@
PGM = v.digit
-LIBES = $(FORMLIB) $(DISPLAYLIB) $(RASTERLIB) $(VECTLIB) $(GISLIB) $(TCLTKLIBPATH) $(TCLTKLIBS)
-DEPENDENCIES= $(FORMDEP) $(DISPLAYDEP) $(RASTERDEP) $(VECTDEP) $(GISDEP)
+LIBES = $(DISPLAYLIB) $(RASTERLIB) $(VECTLIB) $(GISLIB) $(TCLTKLIBPATH) $(TCLTKLIBS)
+DEPENDENCIES= $(DISPLAYDEP) $(RASTERDEP) $(VECTDEP) $(GISDEP)
EXTRA_CFLAGS = $(XCFLAGS) $(TCLINCDIR) $(TKINCDIR) $(VECT_CFLAGS)
XTRA_LDFLAGS=$(DFLAGS)
Copied: grass/branches/develbranch_6/vector/v.digit/generate.c (from rev 40258, grass/branches/develbranch_6/lib/form/generate.c)
===================================================================
--- grass/branches/develbranch_6/vector/v.digit/generate.c (rev 0)
+++ grass/branches/develbranch_6/vector/v.digit/generate.c 2010-01-05 16:30:15 UTC (rev 40259)
@@ -0,0 +1,277 @@
+#include <stdlib.h>
+#include <string.h>
+#include <grass/gis.h>
+#include <grass/dbmi.h>
+#include <grass/form.h>
+
+/* Escape string for use in TCL */
+char *escape_tcl_string(char *input)
+{
+ char *escaped;
+
+ escaped = G_str_replace(input, "\\", "\\\\");
+ escaped = G_str_replace(escaped, "[", "\\[");
+ escaped = G_str_replace(escaped, "]", "\\]");
+ escaped = G_str_replace(escaped, "$", "\\$");
+
+ return escaped;
+}
+
+/* Generate form in HTML/TXT format.
+ * Pointer to resulting string is stored to 'form'. This string must be freed by application.
+ *
+ * returns: -1 error
+ * 0 success
+ */
+int
+F_generate(char *drvname, char *dbname, char *tblname, char *key, int keyval,
+ char *frmname, char *frmmapset,
+ int edit_mode, int format, char **form)
+{
+ int col, ncols, ctype, sqltype, more;
+ char buf[5000], buf1[100];
+ const char *colname;
+ dbString sql, html, str;
+ dbDriver *driver;
+ dbHandle handle;
+ dbCursor cursor;
+ dbTable *table;
+ dbColumn *column;
+ dbValue *value;
+
+ int i = 0;
+
+ /* see /usr/lib/tcl8.4/encoding/ */
+ static char *encoding_list[] = {
+ "utf-8",
+ "ascii",
+ "iso8859-1",
+ "iso8859-2",
+ "iso8859-15",
+ "iso2022-jp",
+ "koi8-r",
+ "euc-jp",
+ NULL
+ };
+ char *enc_env;
+
+ G__read_env();
+ enc_env = G__getenv("GRASS_DB_ENCODING");
+
+ /* TODO: support 'format' (txt, html), currently html only */
+
+ G_debug(2,
+ "F_generate(): drvname = '%s', dbname = '%s'\n tblname = '%s', key = '%s', keyval = %d\n"
+ " form = '%s', form_mapset = '%s'\n edit_mode = %d",
+ drvname, dbname, tblname, key, keyval, frmname, frmmapset,
+ edit_mode);
+
+ db_init_string(&sql);
+ db_init_string(&html); /* here is the result stored */
+ db_init_string(&str);
+
+ G_debug(2, "Open driver");
+ driver = db_start_driver(drvname);
+ if (driver == NULL) {
+ G_warning("Cannot open driver");
+ sprintf(buf, "Cannot open driver '%s'<BR>",
+ escape_tcl_string(drvname));
+ *form = G_store(buf);
+ return -1;
+ }
+ G_debug(2, "Driver opened");
+
+ db_init_handle(&handle);
+ db_set_handle(&handle, dbname, NULL);
+ G_debug(2, "Open database");
+ if (db_open_database(driver, &handle) != DB_OK) {
+ G_warning("Cannot open database");
+ db_shutdown_driver(driver);
+ sprintf(buf, "Cannot open database '%s' by driver '%s'<BR>",
+ escape_tcl_string(dbname), escape_tcl_string(drvname));
+ *form = G_store(buf);
+ return -1;
+ }
+ G_debug(2, "Database opened");
+
+ /* TODO: test if table exist first, but this should be tested by application befor
+ * F_generate() is called, because it may be correct (connection defined in DB
+ * but table does not exist) */
+
+ sprintf(buf, "select * from %s where %s = %d", tblname, key, keyval);
+ G_debug(2, "%s", buf);
+ db_set_string(&sql, buf);
+ if (db_open_select_cursor(driver, &sql, &cursor, DB_SEQUENTIAL) != DB_OK) {
+ G_warning("Cannot open select cursor");
+ db_close_database(driver);
+ db_shutdown_driver(driver);
+ sprintf(buf,
+ "Cannot open select cursor:<BR>'%s'<BR>on database '%s' by driver '%s'<BR>",
+ escape_tcl_string(db_get_string(&sql)),
+ escape_tcl_string(dbname), escape_tcl_string(drvname));
+ *form = G_store(buf);
+ return -1;
+ }
+ G_debug(2, "Select Cursor opened");
+
+ table = db_get_cursor_table(&cursor);
+
+ if (db_fetch(&cursor, DB_NEXT, &more) != DB_OK) {
+ G_warning("Cannot fetch next record");
+ db_close_cursor(&cursor);
+ db_close_database(driver);
+ db_shutdown_driver(driver);
+ *form = G_store("Cannot fetch next record");
+ return -1;
+ }
+
+ if (!more) {
+ G_warning("No database record");
+ if (format == F_HTML) {
+ *form = G_store("No record selected.<BR>");
+ }
+ else {
+ *form = G_store("No record selected.");
+ }
+ }
+ else {
+ ncols = db_get_table_number_of_columns(table);
+
+ /* Start form */
+ if (format == F_HTML) {
+ if (edit_mode == F_EDIT) {
+ db_append_string(&html, "<FORM>");
+
+ sprintf(buf, "<INPUT type=hidden name=%s value=\"%s\">",
+ escape_tcl_string(F_DRIVER_FNAME),
+ escape_tcl_string(drvname));
+ db_append_string(&html, buf);
+ /* Note: because html_library.tcl failes to parse
+ * <INPUT name=abc value='dbname=xxx'> and returnes
+ * name="xxx" value="dbname=xxx" order of value and name parameters is changed */
+ sprintf(buf, "<INPUT type=hidden value=\"%s\" name=%s>",
+ escape_tcl_string(dbname),
+ escape_tcl_string(F_DATABASE_FNAME));
+ db_append_string(&html, buf);
+ sprintf(buf, "<INPUT type=hidden name=%s value=\"%s\">",
+ escape_tcl_string(F_TABLE_FNAME),
+ escape_tcl_string(tblname));
+ db_append_string(&html, buf);
+ sprintf(buf, "<INPUT type=hidden name=%s value=\"%s\">",
+ escape_tcl_string(F_KEY_FNAME),
+ escape_tcl_string(key));
+ db_append_string(&html, buf);
+
+ }
+
+ for (col = 0; col < ncols; col++) {
+ column = db_get_table_column(table, col);
+ sqltype = db_get_column_sqltype(column);
+ ctype = db_sqltype_to_Ctype(sqltype);
+ value = db_get_column_value(column);
+ db_convert_value_to_string(value, sqltype, &str);
+ colname = db_get_column_name(column);
+
+ G_debug(2, "%s: %s", colname, db_get_string(&str));
+
+ if (edit_mode == F_VIEW) {
+ sprintf(buf, "<B>%s : </B> %s <BR>",
+ escape_tcl_string(G_strdup(colname)),
+ escape_tcl_string(db_get_string(&str)));
+ db_append_string(&html, buf);
+ }
+ else {
+ sprintf(buf, "<B>%s : </B>",
+ escape_tcl_string(G_strdup(colname)));
+ db_append_string(&html, buf);
+
+ if (G_strcasecmp(colname, key) == 0) {
+ sprintf(buf,
+ "%s<BR> <INPUT type=hidden name=%s value=\"%s\">",
+ escape_tcl_string(db_get_string(&str)),
+ escape_tcl_string(G_strdup(colname)),
+ escape_tcl_string(db_get_string(&str)));
+ }
+ else {
+ switch (ctype) {
+ case DB_C_TYPE_INT:
+ sprintf(buf1, "20");
+ break;
+ case DB_C_TYPE_DOUBLE:
+ sprintf(buf1, "30");
+ break;
+ case DB_C_TYPE_STRING:
+ sprintf(buf1, "%d", db_get_column_length(column));
+ break;
+ case DB_C_TYPE_DATETIME:
+ sprintf(buf1, "20");
+ break;
+ }
+ sprintf(buf,
+ "<INPUT type=text size=%s name=%s value=\"%s\"><BR>",
+ escape_tcl_string(buf1),
+ escape_tcl_string(G_strdup(colname)),
+ escape_tcl_string(db_get_string(&str)));
+ }
+ db_append_string(&html, buf);
+ }
+ }
+
+ if (edit_mode == F_EDIT) {
+ sprintf(buf,
+ "<HR> Assume data encoding as:<BR><BR><SELECT NAME=%s SIZE=4><HR><BR>",
+ F_ENCODING);
+ db_append_string(&html, buf);
+
+ i = 0;
+ while (encoding_list[i] != NULL) {
+
+ if (G_strcasecmp(encoding_list[i], enc_env) == 0)
+ sprintf(buf, "<OPTION VALUE=\"%s\" SELECTED>%s",
+ encoding_list[i], encoding_list[i]);
+ else
+ sprintf(buf, "<OPTION VALUE=\"%s\">%s",
+ encoding_list[i], encoding_list[i]);
+ ++i;
+ db_append_string(&html, buf);
+ }
+
+ sprintf(buf, "</SELECT>");
+ db_append_string(&html, buf);
+ }
+
+ /* Close form */
+ if (edit_mode == F_EDIT) {
+ db_append_string(&html, "</FORM>");
+ }
+ }
+ else { /* F_TXT */
+ for (col = 0; col < ncols; col++) {
+ column = db_get_table_column(table, col);
+ sqltype = db_get_column_sqltype(column);
+ ctype = db_sqltype_to_Ctype(sqltype);
+ value = db_get_column_value(column);
+ db_convert_value_to_string(value, sqltype, &str);
+ colname = db_get_column_name(column);
+
+ G_debug(2, "%s: %s", colname, db_get_string(&str));
+
+ sprintf(buf, "%s : %s\n", colname, db_get_string(&str));
+ db_append_string(&html, buf);
+ }
+ }
+ }
+ G_debug(2, "FORM STRING:\n%s\n", db_get_string(&html));
+
+ db_close_cursor(&cursor);
+ db_close_database(driver);
+ db_shutdown_driver(driver);
+
+ *form = G_store(db_get_string(&html));
+
+ db_free_string(&sql);
+ db_free_string(&html);
+ db_free_string(&str);
+
+ return 0;
+}
More information about the grass-commit
mailing list