table.c

Go to the documentation of this file.
00001 #include <stdlib.h>
00002 #include "gis.h"
00003 #include "dbmi.h"
00004 
00011 dbTable *
00012 db_alloc_table (ncols)
00013     int ncols;
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 (table)
00045     dbTable *table;
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 (table)
00060     dbTable *table;
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 (table, name)
00080     dbTable *table;
00081     char *name;
00082 {
00083     return db_set_string (&table->tableName, name);
00084 }
00085 
00092 char *
00093 db_get_table_name (table)
00094     dbTable *table;
00095 {
00096     return db_get_string (&table->tableName);
00097 }
00098 
00105 int
00106 db_set_table_description (table, description)
00107     dbTable *table;
00108     char *description;
00109 {
00110     return db_set_string (&table->description, description);
00111 }
00112 
00119 char *
00120 db_get_table_description (table)
00121     dbTable *table;
00122 {
00123     return db_get_string (&table->description);
00124 }
00125 
00132 int
00133 db_get_table_number_of_columns(table)
00134     dbTable *table;
00135 {
00136     return table->numColumns;
00137 }
00138 
00145 static void
00146 set_all_column_privs (table, set_column_priv)
00147     dbTable *table;
00148     void (*set_column_priv)();
00149 {
00150     int col, ncols;
00151     dbColumn *column;
00152 
00153     ncols = db_get_table_number_of_columns (table);
00154     for (col = 0; col < ncols; col++)
00155     {
00156         column = db_get_table_column (table, col);
00157         set_column_priv (column);
00158     }
00159 }
00160 
00167 static int
00168 get_all_column_privs (table, get_column_priv)
00169     dbTable *table;
00170     int (*get_column_priv)();
00171 {
00172     int priv, col, ncols;
00173     dbColumn *column;
00174 
00175     ncols = db_get_table_number_of_columns (table);
00176     for (col = 0; col < ncols; col++)
00177     {
00178         column = db_get_table_column (table, col);
00179         priv = get_column_priv (column);
00180         if (priv != DB_GRANTED)
00181             return priv;
00182     }
00183     return DB_GRANTED;
00184 }
00185 
00192 void
00193 db_set_table_select_priv_granted (table)
00194     dbTable *table;
00195 {
00196     set_all_column_privs (table, db_set_column_select_priv_granted);
00197 }
00198 
00205 void
00206 db_set_table_select_priv_not_granted (table)
00207     dbTable *table;
00208 {
00209     set_all_column_privs (table, db_set_column_select_priv_not_granted);
00210 }
00211 
00218 int
00219 db_get_table_select_priv (table)
00220     dbTable *table;
00221 {
00222     return get_all_column_privs (table, db_get_column_select_priv);
00223 }
00224 
00231 void
00232 db_set_table_update_priv_granted (table)
00233     dbTable *table;
00234 {
00235     set_all_column_privs (table, db_set_column_update_priv_granted);
00236 }
00237 
00244 void
00245 db_set_table_update_priv_not_granted (table)
00246     dbTable *table;
00247 {
00248     set_all_column_privs (table, db_set_column_update_priv_not_granted);
00249 }
00250 
00257 int
00258 db_get_table_update_priv (table)
00259     dbTable *table;
00260 {
00261     return get_all_column_privs (table, db_get_column_update_priv);
00262 }
00263 
00270 void
00271 db_set_table_insert_priv_granted (table)
00272     dbTable *table;
00273 {
00274     table->priv_insert = DB_GRANTED;
00275 }
00276 
00283 void
00284 db_set_table_insert_priv_not_granted (table)
00285     dbTable *table;
00286 {
00287     table->priv_insert = DB_NOT_GRANTED;
00288 }
00289 
00296 int
00297 db_get_table_insert_priv (table)
00298     dbTable *table;
00299 {
00300     return table->priv_insert;
00301 }
00302 
00309 void
00310 db_set_table_delete_priv_granted (table)
00311     dbTable *table;
00312 {
00313     table->priv_delete = DB_GRANTED;
00314 }
00315 
00322 void
00323 db_set_table_delete_priv_not_granted (table)
00324     dbTable *table;
00325 {
00326     table->priv_delete = DB_NOT_GRANTED;
00327 }
00328 
00335 int
00336 db_get_table_delete_priv (table)
00337     dbTable *table;
00338 {
00339     return table->priv_delete;
00340 }
00341 
00347 int
00348 db_table_to_sql ( dbTable *table, dbString *sql)
00349 {
00350     int col, ncols;
00351     dbColumn   *column;
00352     char *colname;
00353     int sqltype, ctype;
00354     char buf[500];
00355     
00356     db_set_string ( sql, "create table ");
00357     db_append_string ( sql, db_get_table_name ( table ) );
00358     db_append_string ( sql, " ( ");
00359 
00360     ncols = db_get_table_number_of_columns(table);
00361 
00362     for ( col = 0; col < ncols; col++ ) {
00363         column = db_get_table_column (table, col);
00364         colname = db_get_column_name (column);
00365         sqltype = db_get_column_sqltype (column);
00366         
00367         ctype = db_sqltype_to_Ctype(sqltype);
00368         G_debug ( 3, "%s (%s)", colname, db_sqltype_name(sqltype) );
00369 
00370         if ( col > 0 ) db_append_string ( sql, ", " );
00371         db_append_string ( sql, colname );
00372         db_append_string ( sql, " " );
00373         /* Note: I found on Web:
00374         *  These are the ANSI data types: BIT, CHARACTER, DATE, DECIMAL, DOUBLE PRECISION, FLOAT, 
00375         *  INTEGER, INTERVAL, NUMERIC, REAL, SMALLINT, TIMESTAMP, TIME, VARBIT, VARCHAR, CHAR
00376         *  ...
00377         *  Thus, the only data types you can use with the assurance that they will 
00378         *  work everywhere are as follows:
00379         *  DOUBLE PRECISION, FLOAT, INTEGER, NUMERIC, REAL, SMALLINT, VARCHAR, CHAR */
00380         switch ( sqltype ) {
00381             case DB_SQL_TYPE_CHARACTER:
00382                 sprintf (buf, "varchar(%d)", db_get_column_length (column) );
00383                 db_append_string ( sql, buf);
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 Sat Jul 22 22:05:40 2006 for GRASS by  doxygen 1.4.7