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 *
00012 db_alloc_table  (int ncols)
00013 
00014 {
00015     dbTable *table;
00016     int i;
00017 
00018     table = (dbTable *) db_malloc (sizeof(dbTable));
00019     if (table == NULL)
00020         return (table = NULL);
00021 
00022     db_init_table (table);
00023 
00024     table->columns = (dbColumn *) db_calloc (sizeof(dbColumn), ncols);
00025     if (table->columns == NULL)
00026     {
00027         free(table);
00028         return (table = NULL);
00029     }
00030     table->numColumns = ncols;
00031     for (i = 0; i < ncols; i++)
00032         db_init_column (&table->columns[i]);
00033     
00034     return table;
00035 }
00036 
00043 void
00044 db_init_table  (dbTable *table)
00045 
00046 {
00047     db_zero ((void *)table, sizeof(dbTable));
00048     db_init_string (&table->tableName);
00049     db_init_string (&table->description);
00050 }
00051 
00058 void
00059 db_free_table  (dbTable *table)
00060 
00061 {
00062     int i;
00063 
00064     db_free_string (&table->tableName);
00065     for (i = 0; i < table->numColumns; i++)
00066         db_free_column (&table->columns[i]);
00067     if (table->columns)
00068         free (table->columns);
00069     free (table);
00070 }
00071 
00078 int
00079 db_set_table_name  (dbTable *table, char *name)
00080 
00081 {
00082     return db_set_string (&table->tableName, name);
00083 }
00084 
00091 char *
00092 db_get_table_name  (dbTable *table)
00093 
00094 {
00095     return db_get_string (&table->tableName);
00096 }
00097 
00104 int
00105 db_set_table_description  (dbTable *table, char *description)
00106 
00107 {
00108     return db_set_string (&table->description, description);
00109 }
00110 
00117 char *
00118 db_get_table_description  (dbTable *table)
00119 
00120 {
00121     return db_get_string (&table->description);
00122 }
00123 
00130 int
00131 db_get_table_number_of_columns (dbTable *table)
00132 
00133 {
00134     return table->numColumns;
00135 }
00136 
00143 static void
00144 set_all_column_privs  (dbTable *table, void (*set_column_priv)())
00145 
00146 {
00147     int col, ncols;
00148     dbColumn *column;
00149 
00150     ncols = db_get_table_number_of_columns (table);
00151     for (col = 0; col < ncols; col++)
00152     {
00153         column = db_get_table_column (table, col);
00154         set_column_priv (column);
00155     }
00156 }
00157 
00164 static int
00165 get_all_column_privs  (dbTable *table, int (*get_column_priv)())
00166 
00167 {
00168     int priv, col, ncols;
00169     dbColumn *column;
00170 
00171     ncols = db_get_table_number_of_columns (table);
00172     for (col = 0; col < ncols; col++)
00173     {
00174         column = db_get_table_column (table, col);
00175         priv = get_column_priv (column);
00176         if (priv != DB_GRANTED)
00177             return priv;
00178     }
00179     return DB_GRANTED;
00180 }
00181 
00188 void
00189 db_set_table_select_priv_granted  (dbTable *table)
00190 
00191 {
00192     set_all_column_privs (table, db_set_column_select_priv_granted);
00193 }
00194 
00201 void
00202 db_set_table_select_priv_not_granted  (dbTable *table)
00203 
00204 {
00205     set_all_column_privs (table, db_set_column_select_priv_not_granted);
00206 }
00207 
00214 int
00215 db_get_table_select_priv  (dbTable *table)
00216 
00217 {
00218     return get_all_column_privs (table, db_get_column_select_priv);
00219 }
00220 
00227 void
00228 db_set_table_update_priv_granted  (dbTable *table)
00229 
00230 {
00231     set_all_column_privs (table, db_set_column_update_priv_granted);
00232 }
00233 
00240 void
00241 db_set_table_update_priv_not_granted  (dbTable *table)
00242 
00243 {
00244     set_all_column_privs (table, db_set_column_update_priv_not_granted);
00245 }
00246 
00253 int
00254 db_get_table_update_priv  (dbTable *table)
00255 
00256 {
00257     return get_all_column_privs (table, db_get_column_update_priv);
00258 }
00259 
00266 void
00267 db_set_table_insert_priv_granted  (dbTable *table)
00268 
00269 {
00270     table->priv_insert = DB_GRANTED;
00271 }
00272 
00279 void
00280 db_set_table_insert_priv_not_granted  (dbTable *table)
00281 
00282 {
00283     table->priv_insert = DB_NOT_GRANTED;
00284 }
00285 
00292 int
00293 db_get_table_insert_priv  (dbTable *table)
00294 
00295 {
00296     return table->priv_insert;
00297 }
00298 
00305 void
00306 db_set_table_delete_priv_granted  (dbTable *table)
00307 
00308 {
00309     table->priv_delete = DB_GRANTED;
00310 }
00311 
00318 void
00319 db_set_table_delete_priv_not_granted  (dbTable *table)
00320 
00321 {
00322     table->priv_delete = DB_NOT_GRANTED;
00323 }
00324 
00331 int
00332 db_get_table_delete_priv  (dbTable *table)
00333 
00334 {
00335     return table->priv_delete;
00336 }
00337 
00343 int
00344 db_table_to_sql ( dbTable *table, dbString *sql)
00345 {
00346     int col, ncols;
00347     dbColumn   *column;
00348     char *colname;
00349     int sqltype, ctype;
00350     char buf[500];
00351     
00352     db_set_string ( sql, "create table ");
00353     db_append_string ( sql, db_get_table_name ( table ) );
00354     db_append_string ( sql, " ( ");
00355 
00356     ncols = db_get_table_number_of_columns(table);
00357 
00358     for ( col = 0; col < ncols; col++ ) {
00359         column = db_get_table_column (table, col);
00360         colname = db_get_column_name (column);
00361         sqltype = db_get_column_sqltype (column);
00362         
00363         ctype = db_sqltype_to_Ctype(sqltype);
00364         G_debug ( 3, "%s (%s)", colname, db_sqltype_name(sqltype) );
00365 
00366         if ( col > 0 ) db_append_string ( sql, ", " );
00367         db_append_string ( sql, colname );
00368         db_append_string ( sql, " " );
00369         /* Note: I found on Web:
00370         *  These are the ANSI data types: BIT, CHARACTER, DATE, DECIMAL, DOUBLE PRECISION, FLOAT, 
00371         *  INTEGER, INTERVAL, NUMERIC, REAL, SMALLINT, TIMESTAMP, TIME, VARBIT, VARCHAR, CHAR
00372         *  ...
00373         *  Thus, the only data types you can use with the assurance that they will 
00374         *  work everywhere are as follows:
00375         *  DOUBLE PRECISION, FLOAT, INTEGER, NUMERIC, REAL, SMALLINT, VARCHAR, CHAR */
00376         switch ( sqltype ) {
00377             case DB_SQL_TYPE_CHARACTER:
00378                 sprintf (buf, "varchar(%d)", db_get_column_length (column) );
00379                 db_append_string ( sql, buf);
00380                 break;
00381             case DB_SQL_TYPE_TEXT:
00382                 G_warning ( "Type TEXT converted to 'VARCHAR(250)'" );
00383                 db_append_string ( sql, "varchar(250)");
00384                 break;
00385             case DB_SQL_TYPE_SMALLINT:
00386             case DB_SQL_TYPE_INTEGER:
00387                 db_append_string ( sql, "integer");
00388                 break;
00389             case DB_SQL_TYPE_REAL:
00390             case DB_SQL_TYPE_DOUBLE_PRECISION:
00391             case DB_SQL_TYPE_DECIMAL:
00392             case DB_SQL_TYPE_NUMERIC:
00393             case DB_SQL_TYPE_INTERVAL:
00394                 db_append_string ( sql, "double precision");
00395                 break;
00396             case DB_SQL_TYPE_DATE:
00397                 db_append_string ( sql, "date");
00398                 break;
00399             case DB_SQL_TYPE_TIME:
00400                 db_append_string ( sql, "time");
00401                 break;
00402             case DB_SQL_TYPE_TIMESTAMP:
00403                 db_append_string ( sql, "datetime");
00404                 break;
00405             default:
00406                 G_warning ( "Unknown column type (%s)", colname);
00407                 return DB_FAILED;
00408         }
00409     }
00410     db_append_string ( sql, " )" );
00411     G_debug ( 3, db_get_string(sql) );
00412     
00413     return DB_OK;
00414 }

Generated on Sun Apr 6 17:31:38 2008 for GRASS by  doxygen 1.5.5