GRASS Programmer's Manual
6.4.2(2012)
|
00001 #include <stdlib.h> 00002 #include <grass/gis.h> 00003 #include <grass/dbmi.h> 00004 00011 dbTable *db_alloc_table(int ncols) 00012 { 00013 dbTable *table; 00014 int i; 00015 00016 table = (dbTable *) db_malloc(sizeof(dbTable)); 00017 if (table == NULL) 00018 return (table = NULL); 00019 00020 db_init_table(table); 00021 00022 table->columns = (dbColumn *) db_calloc(sizeof(dbColumn), ncols); 00023 if (table->columns == NULL) { 00024 db_free(table); 00025 return (table = NULL); 00026 } 00027 table->numColumns = ncols; 00028 for (i = 0; i < ncols; i++) 00029 db_init_column(&table->columns[i]); 00030 00031 return table; 00032 } 00033 00040 void db_init_table(dbTable * table) 00041 { 00042 db_zero((void *)table, sizeof(dbTable)); 00043 db_init_string(&table->tableName); 00044 db_init_string(&table->description); 00045 } 00046 00053 void db_free_table(dbTable * table) 00054 { 00055 int i; 00056 00057 db_free_string(&table->tableName); 00058 db_free_string(&table->description); 00059 for (i = 0; i < table->numColumns; i++) 00060 db_free_column(&table->columns[i]); 00061 if (table->columns) 00062 db_free(table->columns); 00063 db_free(table); 00064 } 00065 00072 int db_set_table_name(dbTable * table, const char *name) 00073 { 00074 return db_set_string(&table->tableName, name); 00075 } 00076 00083 const char *db_get_table_name(dbTable * table) 00084 { 00085 return db_get_string(&table->tableName); 00086 } 00087 00094 int db_set_table_description(dbTable * table, const char *description) 00095 { 00096 return db_set_string(&table->description, description); 00097 } 00098 00105 const char *db_get_table_description(dbTable * table) 00106 { 00107 return db_get_string(&table->description); 00108 } 00109 00116 int db_get_table_number_of_columns(dbTable * table) 00117 { 00118 return table->numColumns; 00119 } 00120 00127 static void set_all_column_privs(dbTable * table, void (*set_column_priv) ()) 00128 { 00129 int col, ncols; 00130 dbColumn *column; 00131 00132 ncols = db_get_table_number_of_columns(table); 00133 for (col = 0; col < ncols; col++) { 00134 column = db_get_table_column(table, col); 00135 set_column_priv(column); 00136 } 00137 } 00138 00145 static int get_all_column_privs(dbTable * table, int (*get_column_priv) ()) 00146 { 00147 int priv, col, ncols; 00148 dbColumn *column; 00149 00150 ncols = db_get_table_number_of_columns(table); 00151 for (col = 0; col < ncols; col++) { 00152 column = db_get_table_column(table, col); 00153 priv = get_column_priv(column); 00154 if (priv != DB_GRANTED) 00155 return priv; 00156 } 00157 return DB_GRANTED; 00158 } 00159 00166 void db_set_table_select_priv_granted(dbTable * table) 00167 { 00168 set_all_column_privs(table, db_set_column_select_priv_granted); 00169 } 00170 00177 void db_set_table_select_priv_not_granted(dbTable * table) 00178 { 00179 set_all_column_privs(table, db_set_column_select_priv_not_granted); 00180 } 00181 00188 int db_get_table_select_priv(dbTable * table) 00189 { 00190 return get_all_column_privs(table, db_get_column_select_priv); 00191 } 00192 00199 void db_set_table_update_priv_granted(dbTable * table) 00200 { 00201 set_all_column_privs(table, db_set_column_update_priv_granted); 00202 } 00203 00210 void db_set_table_update_priv_not_granted(dbTable * table) 00211 { 00212 set_all_column_privs(table, db_set_column_update_priv_not_granted); 00213 } 00214 00221 int db_get_table_update_priv(dbTable * table) 00222 { 00223 return get_all_column_privs(table, db_get_column_update_priv); 00224 } 00225 00232 void db_set_table_insert_priv_granted(dbTable * table) 00233 { 00234 table->priv_insert = DB_GRANTED; 00235 } 00236 00243 void db_set_table_insert_priv_not_granted(dbTable * table) 00244 { 00245 table->priv_insert = DB_NOT_GRANTED; 00246 } 00247 00254 int db_get_table_insert_priv(dbTable * table) 00255 { 00256 return table->priv_insert; 00257 } 00258 00265 void db_set_table_delete_priv_granted(dbTable * table) 00266 { 00267 table->priv_delete = DB_GRANTED; 00268 } 00269 00276 void db_set_table_delete_priv_not_granted(dbTable * table) 00277 { 00278 table->priv_delete = DB_NOT_GRANTED; 00279 } 00280 00287 int db_get_table_delete_priv(dbTable * table) 00288 { 00289 return table->priv_delete; 00290 } 00291 00297 int db_table_to_sql(dbTable * table, dbString * sql) 00298 { 00299 int col, ncols; 00300 dbColumn *column; 00301 const char *colname; 00302 int sqltype, ctype; 00303 char buf[500]; 00304 00305 db_set_string(sql, "create table "); 00306 db_append_string(sql, db_get_table_name(table)); 00307 db_append_string(sql, " ( "); 00308 00309 ncols = db_get_table_number_of_columns(table); 00310 00311 for (col = 0; col < ncols; col++) { 00312 column = db_get_table_column(table, col); 00313 colname = db_get_column_name(column); 00314 sqltype = db_get_column_sqltype(column); 00315 00316 ctype = db_sqltype_to_Ctype(sqltype); 00317 G_debug(3, "%s (%s)", colname, db_sqltype_name(sqltype)); 00318 00319 if (col > 0) 00320 db_append_string(sql, ", "); 00321 db_append_string(sql, colname); 00322 db_append_string(sql, " "); 00323 /* Note: I found on Web: 00324 * These are the ANSI data types: BIT, CHARACTER, DATE, DECIMAL, DOUBLE PRECISION, FLOAT, 00325 * INTEGER, INTERVAL, NUMERIC, REAL, SMALLINT, TIMESTAMP, TIME, VARBIT, VARCHAR, CHAR 00326 * ... 00327 * Thus, the only data types you can use with the assurance that they will 00328 * work everywhere are as follows: 00329 * DOUBLE PRECISION, FLOAT, INTEGER, NUMERIC, REAL, SMALLINT, VARCHAR, CHAR */ 00330 switch (sqltype) { 00331 case DB_SQL_TYPE_CHARACTER: 00332 sprintf(buf, "varchar(%d)", db_get_column_length(column)); 00333 db_append_string(sql, buf); 00334 break; 00335 case DB_SQL_TYPE_TEXT: 00336 G_warning("Type TEXT converted to 'VARCHAR(250)'"); 00337 db_append_string(sql, "varchar(250)"); 00338 break; 00339 case DB_SQL_TYPE_SMALLINT: 00340 case DB_SQL_TYPE_INTEGER: 00341 db_append_string(sql, "integer"); 00342 break; 00343 case DB_SQL_TYPE_REAL: 00344 case DB_SQL_TYPE_DOUBLE_PRECISION: 00345 case DB_SQL_TYPE_DECIMAL: 00346 case DB_SQL_TYPE_NUMERIC: 00347 case DB_SQL_TYPE_INTERVAL: 00348 db_append_string(sql, "double precision"); 00349 break; 00350 case DB_SQL_TYPE_DATE: 00351 db_append_string(sql, "date"); 00352 break; 00353 case DB_SQL_TYPE_TIME: 00354 db_append_string(sql, "time"); 00355 break; 00356 case DB_SQL_TYPE_TIMESTAMP: 00357 db_append_string(sql, "datetime"); 00358 break; 00359 default: 00360 G_warning("Unknown column type (%s)", colname); 00361 return DB_FAILED; 00362 } 00363 } 00364 db_append_string(sql, " )"); 00365 G_debug(3, "sql statement: %s", db_get_string(sql)); 00366 00367 return DB_OK; 00368 }