#include #include #include #include #include /* 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\n"); sprintf ( buf, "Cannot open driver '%s'
", 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\n"); db_shutdown_driver(driver); sprintf ( buf, "Cannot open database '%s' by driver '%s'
", dbname, 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\n"); db_close_database(driver); db_shutdown_driver(driver); sprintf ( buf, "Cannot open select cursor:
'%s'
on database '%s' by driver '%s'
", db_get_string(&sql), dbname, 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\n"); 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.
"); } 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, "
"); sprintf (buf, "", F_DRIVER_FNAME, drvname ); db_append_string (&html, buf); /* Note: because html_library.tcl failes to parse * and returnes * name="xxx" value="dbname=xxx" order of value and name parameters is changed */ sprintf (buf, "", dbname, F_DATABASE_FNAME ); db_append_string (&html, buf); sprintf (buf, "", F_TABLE_FNAME, tblname ); db_append_string (&html, buf); sprintf (buf, "", F_KEY_FNAME, 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, "%s : %s
", colname, db_get_string(&str) ); db_append_string (&html, buf); } else { sprintf (buf, "%s : ", colname ); db_append_string (&html, buf); if ( G_strcasecmp (colname,key) == 0 ) { sprintf (buf, "%s
", db_get_string(&str), colname, 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, "
", buf1, colname, db_get_string(&str) ); } db_append_string (&html, buf); } } if ( edit_mode == F_EDIT ) { sprintf(buf, "
Assume data encoding as:

"); db_append_string(&html, buf); } /* Close form */ if ( edit_mode == F_EDIT ) { db_append_string (&html, "
"); } } 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; }