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 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 free(table->columns);
00062 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
00323
00324
00325
00326
00327
00328
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, db_get_string(sql));
00365
00366 return DB_OK;
00367 }