00001
00020 #include <stdlib.h>
00021 #include <stdio.h>
00022 #include <string.h>
00023 #include <unistd.h>
00024 #include <sys/types.h>
00025 #include <sys/stat.h>
00026 #include <grass/glocale.h>
00027 #include <grass/gis.h>
00028 #include <grass/Vect.h>
00029 #include <grass/dbmi.h>
00030
00040 const char *Vect_get_column_names(struct Map_info *Map, int field)
00041 {
00042 int num_dblinks, ncols, col;
00043 struct field_info *fi;
00044 dbDriver *driver = NULL;
00045 dbHandle handle;
00046 dbString table_name;
00047 dbTable *table;
00048 char buf[2000];
00049
00050
00051 num_dblinks = Vect_get_num_dblinks(Map);
00052 if (num_dblinks <= 0)
00053 return (NULL);
00054
00055 G_debug(3,
00056 "Displaying column names for database connection of layer %d:",
00057 field);
00058 if ((fi = Vect_get_field(Map, field)) == NULL)
00059 return (NULL);
00060 driver = db_start_driver(fi->driver);
00061 if (driver == NULL)
00062 return (NULL);
00063 db_init_handle(&handle);
00064 db_set_handle(&handle, fi->database, NULL);
00065 if (db_open_database(driver, &handle) != DB_OK)
00066 return (NULL);
00067 db_init_string(&table_name);
00068 db_set_string(&table_name, fi->table);
00069 if (db_describe_table(driver, &table_name, &table) != DB_OK)
00070 return (NULL);
00071
00072 ncols = db_get_table_number_of_columns(table);
00073 sprintf(buf, " ");
00074 for (col = 0; col < ncols; col++) {
00075 if (col == 0)
00076 sprintf(buf, "%s",
00077 db_get_column_name(db_get_table_column(table, col)));
00078 else
00079 sprintf(buf, "%s,%s", buf,
00080 db_get_column_name(db_get_table_column(table, col)));
00081 }
00082 G_debug(3, "%s", buf);
00083
00084 db_close_database(driver);
00085 db_shutdown_driver(driver);
00086
00087 return G_store(G_chop(buf));
00088 }
00089
00099 const char *Vect_get_column_types(struct Map_info *Map, int field)
00100 {
00101 int num_dblinks, ncols, col;
00102 struct field_info *fi;
00103 dbDriver *driver = NULL;
00104 dbHandle handle;
00105 dbString table_name;
00106 dbTable *table;
00107 char buf[2000];
00108
00109
00110 num_dblinks = Vect_get_num_dblinks(Map);
00111 if (num_dblinks <= 0)
00112 return (NULL);
00113
00114 G_debug(3,
00115 "Displaying column types for database connection of layer %d:",
00116 field);
00117 if ((fi = Vect_get_field(Map, field)) == NULL)
00118 return (NULL);
00119 driver = db_start_driver(fi->driver);
00120 if (driver == NULL)
00121 return (NULL);
00122 db_init_handle(&handle);
00123 db_set_handle(&handle, fi->database, NULL);
00124 if (db_open_database(driver, &handle) != DB_OK)
00125 return (NULL);
00126 db_init_string(&table_name);
00127 db_set_string(&table_name, fi->table);
00128 if (db_describe_table(driver, &table_name, &table) != DB_OK)
00129 return (NULL);
00130
00131 ncols = db_get_table_number_of_columns(table);
00132 sprintf(buf, " ");
00133 for (col = 0; col < ncols; col++) {
00134 if (col == 0)
00135 sprintf(buf, "%s",
00136 db_sqltype_name(db_get_column_sqltype
00137 (db_get_table_column(table, col))));
00138 else
00139 sprintf(buf, "%s,%s", buf,
00140 db_sqltype_name(db_get_column_sqltype
00141 (db_get_table_column(table, col))));
00142 }
00143 G_debug(3, "%s", buf);
00144
00145 db_close_database(driver);
00146 db_shutdown_driver(driver);
00147
00148 return G_store(G_chop(buf));
00149 }
00150
00151
00161 const char *Vect_get_column_names_types(struct Map_info *Map, int field)
00162 {
00163 int num_dblinks, ncols, col;
00164 struct field_info *fi;
00165 dbDriver *driver = NULL;
00166 dbHandle handle;
00167 dbString table_name;
00168 dbTable *table;
00169 char buf[2000];
00170
00171
00172 num_dblinks = Vect_get_num_dblinks(Map);
00173 if (num_dblinks <= 0)
00174 return (NULL);
00175
00176 G_debug(3,
00177 "Displaying column types for database connection of layer %d:",
00178 field);
00179 if ((fi = Vect_get_field(Map, field)) == NULL)
00180 return (NULL);
00181 driver = db_start_driver(fi->driver);
00182 if (driver == NULL)
00183 return (NULL);
00184 db_init_handle(&handle);
00185 db_set_handle(&handle, fi->database, NULL);
00186 if (db_open_database(driver, &handle) != DB_OK)
00187 return (NULL);
00188 db_init_string(&table_name);
00189 db_set_string(&table_name, fi->table);
00190 if (db_describe_table(driver, &table_name, &table) != DB_OK)
00191 return (NULL);
00192
00193 ncols = db_get_table_number_of_columns(table);
00194 sprintf(buf, " ");
00195 for (col = 0; col < ncols; col++) {
00196 if (col == 0)
00197 sprintf(buf, "%s(%s)",
00198 db_get_column_name(db_get_table_column(table, col)),
00199 db_sqltype_name(db_get_column_sqltype
00200 (db_get_table_column(table, col))));
00201 else
00202 sprintf(buf, "%s,%s(%s)", buf,
00203 db_get_column_name(db_get_table_column(table, col)),
00204 db_sqltype_name(db_get_column_sqltype
00205 (db_get_table_column(table, col))));
00206 }
00207 G_debug(3, "%s", buf);
00208
00209 db_close_database(driver);
00210 db_shutdown_driver(driver);
00211
00212 return G_store(G_chop(buf));
00213 }