dbmi_base/table.c

Go to the documentation of this file.
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         /* 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, db_get_string(sql));
00365 
00366     return DB_OK;
00367 }