123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368 |
- #include <stdlib.h>
- #include <grass/gis.h>
- #include <grass/dbmi.h>
- /*!
- \fn
- \brief
- \return
- \param
- */
- dbTable *db_alloc_table(int ncols)
- {
- dbTable *table;
- int i;
- table = (dbTable *) db_malloc(sizeof(dbTable));
- if (table == NULL)
- return (table = NULL);
- db_init_table(table);
- table->columns = (dbColumn *) db_calloc(sizeof(dbColumn), ncols);
- if (table->columns == NULL) {
- free(table);
- return (table = NULL);
- }
- table->numColumns = ncols;
- for (i = 0; i < ncols; i++)
- db_init_column(&table->columns[i]);
- return table;
- }
- /*!
- \fn
- \brief
- \return
- \param
- */
- void db_init_table(dbTable * table)
- {
- db_zero((void *)table, sizeof(dbTable));
- db_init_string(&table->tableName);
- db_init_string(&table->description);
- }
- /*!
- \fn
- \brief
- \return
- \param
- */
- void db_free_table(dbTable * table)
- {
- int i;
- db_free_string(&table->tableName);
- for (i = 0; i < table->numColumns; i++)
- db_free_column(&table->columns[i]);
- if (table->columns)
- free(table->columns);
- free(table);
- }
- /*!
- \fn
- \brief
- \return
- \param
- */
- int db_set_table_name(dbTable * table, const char *name)
- {
- return db_set_string(&table->tableName, name);
- }
- /*!
- \fn
- \brief
- \return
- \param
- */
- const char *db_get_table_name(dbTable * table)
- {
- return db_get_string(&table->tableName);
- }
- /*!
- \fn
- \brief
- \return
- \param
- */
- int db_set_table_description(dbTable * table, const char *description)
- {
- return db_set_string(&table->description, description);
- }
- /*!
- \fn
- \brief
- \return
- \param
- */
- const char *db_get_table_description(dbTable * table)
- {
- return db_get_string(&table->description);
- }
- /*!
- \fn
- \brief
- \return
- \param
- */
- int db_get_table_number_of_columns(dbTable * table)
- {
- return table->numColumns;
- }
- /*!
- \fn
- \brief
- \return
- \param
- */
- static void set_all_column_privs(dbTable * table, void (*set_column_priv) ())
- {
- int col, ncols;
- dbColumn *column;
- ncols = db_get_table_number_of_columns(table);
- for (col = 0; col < ncols; col++) {
- column = db_get_table_column(table, col);
- set_column_priv(column);
- }
- }
- /*!
- \fn
- \brief
- \return
- \param
- */
- static int get_all_column_privs(dbTable * table, int (*get_column_priv) ())
- {
- int priv, col, ncols;
- dbColumn *column;
- ncols = db_get_table_number_of_columns(table);
- for (col = 0; col < ncols; col++) {
- column = db_get_table_column(table, col);
- priv = get_column_priv(column);
- if (priv != DB_GRANTED)
- return priv;
- }
- return DB_GRANTED;
- }
- /*!
- \fn
- \brief
- \return
- \param
- */
- void db_set_table_select_priv_granted(dbTable * table)
- {
- set_all_column_privs(table, db_set_column_select_priv_granted);
- }
- /*!
- \fn
- \brief
- \return
- \param
- */
- void db_set_table_select_priv_not_granted(dbTable * table)
- {
- set_all_column_privs(table, db_set_column_select_priv_not_granted);
- }
- /*!
- \fn
- \brief
- \return
- \param
- */
- int db_get_table_select_priv(dbTable * table)
- {
- return get_all_column_privs(table, db_get_column_select_priv);
- }
- /*!
- \fn
- \brief
- \return
- \param
- */
- void db_set_table_update_priv_granted(dbTable * table)
- {
- set_all_column_privs(table, db_set_column_update_priv_granted);
- }
- /*!
- \fn
- \brief
- \return
- \param
- */
- void db_set_table_update_priv_not_granted(dbTable * table)
- {
- set_all_column_privs(table, db_set_column_update_priv_not_granted);
- }
- /*!
- \fn
- \brief
- \return
- \param
- */
- int db_get_table_update_priv(dbTable * table)
- {
- return get_all_column_privs(table, db_get_column_update_priv);
- }
- /*!
- \fn
- \brief
- \return
- \param
- */
- void db_set_table_insert_priv_granted(dbTable * table)
- {
- table->priv_insert = DB_GRANTED;
- }
- /*!
- \fn
- \brief
- \return
- \param
- */
- void db_set_table_insert_priv_not_granted(dbTable * table)
- {
- table->priv_insert = DB_NOT_GRANTED;
- }
- /*!
- \fn
- \brief
- \return
- \param
- */
- int db_get_table_insert_priv(dbTable * table)
- {
- return table->priv_insert;
- }
- /*!
- \fn
- \brief
- \return
- \param
- */
- void db_set_table_delete_priv_granted(dbTable * table)
- {
- table->priv_delete = DB_GRANTED;
- }
- /*!
- \fn
- \brief
- \return
- \param
- */
- void db_set_table_delete_priv_not_granted(dbTable * table)
- {
- table->priv_delete = DB_NOT_GRANTED;
- }
- /*!
- \fn
- \brief
- \return
- \param
- */
- int db_get_table_delete_priv(dbTable * table)
- {
- return table->priv_delete;
- }
- /*!
- \brief Create SQL CREATE sring from table definition
- \return
- \param
- */
- int db_table_to_sql(dbTable * table, dbString * sql)
- {
- int col, ncols;
- dbColumn *column;
- const char *colname;
- int sqltype, ctype;
- char buf[500];
- db_set_string(sql, "create table ");
- db_append_string(sql, db_get_table_name(table));
- db_append_string(sql, " ( ");
- ncols = db_get_table_number_of_columns(table);
- for (col = 0; col < ncols; col++) {
- column = db_get_table_column(table, col);
- colname = db_get_column_name(column);
- sqltype = db_get_column_sqltype(column);
- ctype = db_sqltype_to_Ctype(sqltype);
- G_debug(3, "%s (%s)", colname, db_sqltype_name(sqltype));
- if (col > 0)
- db_append_string(sql, ", ");
- db_append_string(sql, colname);
- db_append_string(sql, " ");
- /* Note: I found on Web:
- * These are the ANSI data types: BIT, CHARACTER, DATE, DECIMAL, DOUBLE PRECISION, FLOAT,
- * INTEGER, INTERVAL, NUMERIC, REAL, SMALLINT, TIMESTAMP, TIME, VARBIT, VARCHAR, CHAR
- * ...
- * Thus, the only data types you can use with the assurance that they will
- * work everywhere are as follows:
- * DOUBLE PRECISION, FLOAT, INTEGER, NUMERIC, REAL, SMALLINT, VARCHAR, CHAR */
- switch (sqltype) {
- case DB_SQL_TYPE_CHARACTER:
- sprintf(buf, "varchar(%d)", db_get_column_length(column));
- db_append_string(sql, buf);
- break;
- case DB_SQL_TYPE_TEXT:
- G_warning("Type TEXT converted to 'VARCHAR(250)'");
- db_append_string(sql, "varchar(250)");
- break;
- case DB_SQL_TYPE_SMALLINT:
- case DB_SQL_TYPE_INTEGER:
- db_append_string(sql, "integer");
- break;
- case DB_SQL_TYPE_REAL:
- case DB_SQL_TYPE_DOUBLE_PRECISION:
- case DB_SQL_TYPE_DECIMAL:
- case DB_SQL_TYPE_NUMERIC:
- case DB_SQL_TYPE_INTERVAL:
- db_append_string(sql, "double precision");
- break;
- case DB_SQL_TYPE_DATE:
- db_append_string(sql, "date");
- break;
- case DB_SQL_TYPE_TIME:
- db_append_string(sql, "time");
- break;
- case DB_SQL_TYPE_TIMESTAMP:
- db_append_string(sql, "datetime");
- break;
- default:
- G_warning("Unknown column type (%s)", colname);
- return DB_FAILED;
- }
- }
- db_append_string(sql, " )");
- G_debug(3, "sql statement: %s", db_get_string(sql));
- return DB_OK;
- }
|