GRASS Programmer's Manual 6.4.1(2011)
|
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 for (i = 0; i < table->numColumns; i++) 00059 db_free_column(&table->columns[i]); 00060 if (table->columns) 00061 db_free(table->columns); 00062 db_free(table); 00063 } 00064 00071 int db_set_table_name(dbTable * table, const char *name) 00072 { 00073 return db_set_string(&table->tableName, name); 00074 } 00075 00082 const char *db_get_table_name(dbTable * table) 00083 { 00084 return db_get_string(&table->tableName); 00085 } 00086 00093 int db_set_table_description(dbTable * table, const char *description) 00094 { 00095 return db_set_string(&table->description, description); 00096 } 00097 00104 const char *db_get_table_description(dbTable * table) 00105 { 00106 return db_get_string(&table->description); 00107 } 00108 00115 int db_get_table_number_of_columns(dbTable * table) 00116 { 00117 return table->numColumns; 00118 } 00119 00126 static void set_all_column_privs(dbTable * table, void (*set_column_priv) ()) 00127 { 00128 int col, ncols; 00129 dbColumn *column; 00130 00131 ncols = db_get_table_number_of_columns(table); 00132 for (col = 0; col < ncols; col++) { 00133 column = db_get_table_column(table, col); 00134 set_column_priv(column); 00135 } 00136 } 00137 00144 static int get_all_column_privs(dbTable * table, int (*get_column_priv) ()) 00145 { 00146 int priv, col, ncols; 00147 dbColumn *column; 00148 00149 ncols = db_get_table_number_of_columns(table); 00150 for (col = 0; col < ncols; col++) { 00151 column = db_get_table_column(table, col); 00152 priv = get_column_priv(column); 00153 if (priv != DB_GRANTED) 00154 return priv; 00155 } 00156 return DB_GRANTED; 00157 } 00158 00165 void db_set_table_select_priv_granted(dbTable * table) 00166 { 00167 set_all_column_privs(table, db_set_column_select_priv_granted); 00168 } 00169 00176 void db_set_table_select_priv_not_granted(dbTable * table) 00177 { 00178 set_all_column_privs(table, db_set_column_select_priv_not_granted); 00179 } 00180 00187 int db_get_table_select_priv(dbTable * table) 00188 { 00189 return get_all_column_privs(table, db_get_column_select_priv); 00190 } 00191 00198 void db_set_table_update_priv_granted(dbTable * table) 00199 { 00200 set_all_column_privs(table, db_set_column_update_priv_granted); 00201 } 00202 00209 void db_set_table_update_priv_not_granted(dbTable * table) 00210 { 00211 set_all_column_privs(table, db_set_column_update_priv_not_granted); 00212 } 00213 00220 int db_get_table_update_priv(dbTable * table) 00221 { 00222 return get_all_column_privs(table, db_get_column_update_priv); 00223 } 00224 00231 void db_set_table_insert_priv_granted(dbTable * table) 00232 { 00233 table->priv_insert = DB_GRANTED; 00234 } 00235 00242 void db_set_table_insert_priv_not_granted(dbTable * table) 00243 { 00244 table->priv_insert = DB_NOT_GRANTED; 00245 } 00246 00253 int db_get_table_insert_priv(dbTable * table) 00254 { 00255 return table->priv_insert; 00256 } 00257 00264 void db_set_table_delete_priv_granted(dbTable * table) 00265 { 00266 table->priv_delete = DB_GRANTED; 00267 } 00268 00275 void db_set_table_delete_priv_not_granted(dbTable * table) 00276 { 00277 table->priv_delete = DB_NOT_GRANTED; 00278 } 00279 00286 int db_get_table_delete_priv(dbTable * table) 00287 { 00288 return table->priv_delete; 00289 } 00290 00296 int db_table_to_sql(dbTable * table, dbString * sql) 00297 { 00298 int col, ncols; 00299 dbColumn *column; 00300 const char *colname; 00301 int sqltype, ctype; 00302 char buf[500]; 00303 00304 db_set_string(sql, "create table "); 00305 db_append_string(sql, db_get_table_name(table)); 00306 db_append_string(sql, " ( "); 00307 00308 ncols = db_get_table_number_of_columns(table); 00309 00310 for (col = 0; col < ncols; col++) { 00311 column = db_get_table_column(table, col); 00312 colname = db_get_column_name(column); 00313 sqltype = db_get_column_sqltype(column); 00314 00315 ctype = db_sqltype_to_Ctype(sqltype); 00316 G_debug(3, "%s (%s)", colname, db_sqltype_name(sqltype)); 00317 00318 if (col > 0) 00319 db_append_string(sql, ", "); 00320 db_append_string(sql, colname); 00321 db_append_string(sql, " "); 00322 /* Note: I found on Web: 00323 * These are the ANSI data types: BIT, CHARACTER, DATE, DECIMAL, DOUBLE PRECISION, FLOAT, 00324 * INTEGER, INTERVAL, NUMERIC, REAL, SMALLINT, TIMESTAMP, TIME, VARBIT, VARCHAR, CHAR 00325 * ... 00326 * Thus, the only data types you can use with the assurance that they will 00327 * work everywhere are as follows: 00328 * DOUBLE PRECISION, FLOAT, INTEGER, NUMERIC, REAL, SMALLINT, VARCHAR, CHAR */ 00329 switch (sqltype) { 00330 case DB_SQL_TYPE_CHARACTER: 00331 sprintf(buf, "varchar(%d)", db_get_column_length(column)); 00332 db_append_string(sql, buf); 00333 break; 00334 case DB_SQL_TYPE_TEXT: 00335 G_warning("Type TEXT converted to 'VARCHAR(250)'"); 00336 db_append_string(sql, "varchar(250)"); 00337 break; 00338 case DB_SQL_TYPE_SMALLINT: 00339 case DB_SQL_TYPE_INTEGER: 00340 db_append_string(sql, "integer"); 00341 break; 00342 case DB_SQL_TYPE_REAL: 00343 case DB_SQL_TYPE_DOUBLE_PRECISION: 00344 case DB_SQL_TYPE_DECIMAL: 00345 case DB_SQL_TYPE_NUMERIC: 00346 case DB_SQL_TYPE_INTERVAL: 00347 db_append_string(sql, "double precision"); 00348 break; 00349 case DB_SQL_TYPE_DATE: 00350 db_append_string(sql, "date"); 00351 break; 00352 case DB_SQL_TYPE_TIME: 00353 db_append_string(sql, "time"); 00354 break; 00355 case DB_SQL_TYPE_TIMESTAMP: 00356 db_append_string(sql, "datetime"); 00357 break; 00358 default: 00359 G_warning("Unknown column type (%s)", colname); 00360 return DB_FAILED; 00361 } 00362 } 00363 db_append_string(sql, " )"); 00364 G_debug(3, "sql statement: %s", db_get_string(sql)); 00365 00366 return DB_OK; 00367 }