GRASS Programmer's Manual  6.4.2(2012)
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         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 }
 All Data Structures Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Defines