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
00374
00375
00376
00377
00378
00379
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 }