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
00370
00371
00372
00373
00374
00375
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 }