table.c 6.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368
  1. #include <stdlib.h>
  2. #include <grass/gis.h>
  3. #include <grass/dbmi.h>
  4. /*!
  5. \fn
  6. \brief
  7. \return
  8. \param
  9. */
  10. dbTable *db_alloc_table(int ncols)
  11. {
  12. dbTable *table;
  13. int i;
  14. table = (dbTable *) db_malloc(sizeof(dbTable));
  15. if (table == NULL)
  16. return (table = NULL);
  17. db_init_table(table);
  18. table->columns = (dbColumn *) db_calloc(sizeof(dbColumn), ncols);
  19. if (table->columns == NULL) {
  20. free(table);
  21. return (table = NULL);
  22. }
  23. table->numColumns = ncols;
  24. for (i = 0; i < ncols; i++)
  25. db_init_column(&table->columns[i]);
  26. return table;
  27. }
  28. /*!
  29. \fn
  30. \brief
  31. \return
  32. \param
  33. */
  34. void db_init_table(dbTable * table)
  35. {
  36. db_zero((void *)table, sizeof(dbTable));
  37. db_init_string(&table->tableName);
  38. db_init_string(&table->description);
  39. }
  40. /*!
  41. \fn
  42. \brief
  43. \return
  44. \param
  45. */
  46. void db_free_table(dbTable * table)
  47. {
  48. int i;
  49. db_free_string(&table->tableName);
  50. for (i = 0; i < table->numColumns; i++)
  51. db_free_column(&table->columns[i]);
  52. if (table->columns)
  53. free(table->columns);
  54. free(table);
  55. }
  56. /*!
  57. \fn
  58. \brief
  59. \return
  60. \param
  61. */
  62. int db_set_table_name(dbTable * table, const char *name)
  63. {
  64. return db_set_string(&table->tableName, name);
  65. }
  66. /*!
  67. \fn
  68. \brief
  69. \return
  70. \param
  71. */
  72. const char *db_get_table_name(dbTable * table)
  73. {
  74. return db_get_string(&table->tableName);
  75. }
  76. /*!
  77. \fn
  78. \brief
  79. \return
  80. \param
  81. */
  82. int db_set_table_description(dbTable * table, const char *description)
  83. {
  84. return db_set_string(&table->description, description);
  85. }
  86. /*!
  87. \fn
  88. \brief
  89. \return
  90. \param
  91. */
  92. const char *db_get_table_description(dbTable * table)
  93. {
  94. return db_get_string(&table->description);
  95. }
  96. /*!
  97. \fn
  98. \brief
  99. \return
  100. \param
  101. */
  102. int db_get_table_number_of_columns(dbTable * table)
  103. {
  104. return table->numColumns;
  105. }
  106. /*!
  107. \fn
  108. \brief
  109. \return
  110. \param
  111. */
  112. static void set_all_column_privs(dbTable * table, void (*set_column_priv) ())
  113. {
  114. int col, ncols;
  115. dbColumn *column;
  116. ncols = db_get_table_number_of_columns(table);
  117. for (col = 0; col < ncols; col++) {
  118. column = db_get_table_column(table, col);
  119. set_column_priv(column);
  120. }
  121. }
  122. /*!
  123. \fn
  124. \brief
  125. \return
  126. \param
  127. */
  128. static int get_all_column_privs(dbTable * table, int (*get_column_priv) ())
  129. {
  130. int priv, col, ncols;
  131. dbColumn *column;
  132. ncols = db_get_table_number_of_columns(table);
  133. for (col = 0; col < ncols; col++) {
  134. column = db_get_table_column(table, col);
  135. priv = get_column_priv(column);
  136. if (priv != DB_GRANTED)
  137. return priv;
  138. }
  139. return DB_GRANTED;
  140. }
  141. /*!
  142. \fn
  143. \brief
  144. \return
  145. \param
  146. */
  147. void db_set_table_select_priv_granted(dbTable * table)
  148. {
  149. set_all_column_privs(table, db_set_column_select_priv_granted);
  150. }
  151. /*!
  152. \fn
  153. \brief
  154. \return
  155. \param
  156. */
  157. void db_set_table_select_priv_not_granted(dbTable * table)
  158. {
  159. set_all_column_privs(table, db_set_column_select_priv_not_granted);
  160. }
  161. /*!
  162. \fn
  163. \brief
  164. \return
  165. \param
  166. */
  167. int db_get_table_select_priv(dbTable * table)
  168. {
  169. return get_all_column_privs(table, db_get_column_select_priv);
  170. }
  171. /*!
  172. \fn
  173. \brief
  174. \return
  175. \param
  176. */
  177. void db_set_table_update_priv_granted(dbTable * table)
  178. {
  179. set_all_column_privs(table, db_set_column_update_priv_granted);
  180. }
  181. /*!
  182. \fn
  183. \brief
  184. \return
  185. \param
  186. */
  187. void db_set_table_update_priv_not_granted(dbTable * table)
  188. {
  189. set_all_column_privs(table, db_set_column_update_priv_not_granted);
  190. }
  191. /*!
  192. \fn
  193. \brief
  194. \return
  195. \param
  196. */
  197. int db_get_table_update_priv(dbTable * table)
  198. {
  199. return get_all_column_privs(table, db_get_column_update_priv);
  200. }
  201. /*!
  202. \fn
  203. \brief
  204. \return
  205. \param
  206. */
  207. void db_set_table_insert_priv_granted(dbTable * table)
  208. {
  209. table->priv_insert = DB_GRANTED;
  210. }
  211. /*!
  212. \fn
  213. \brief
  214. \return
  215. \param
  216. */
  217. void db_set_table_insert_priv_not_granted(dbTable * table)
  218. {
  219. table->priv_insert = DB_NOT_GRANTED;
  220. }
  221. /*!
  222. \fn
  223. \brief
  224. \return
  225. \param
  226. */
  227. int db_get_table_insert_priv(dbTable * table)
  228. {
  229. return table->priv_insert;
  230. }
  231. /*!
  232. \fn
  233. \brief
  234. \return
  235. \param
  236. */
  237. void db_set_table_delete_priv_granted(dbTable * table)
  238. {
  239. table->priv_delete = DB_GRANTED;
  240. }
  241. /*!
  242. \fn
  243. \brief
  244. \return
  245. \param
  246. */
  247. void db_set_table_delete_priv_not_granted(dbTable * table)
  248. {
  249. table->priv_delete = DB_NOT_GRANTED;
  250. }
  251. /*!
  252. \fn
  253. \brief
  254. \return
  255. \param
  256. */
  257. int db_get_table_delete_priv(dbTable * table)
  258. {
  259. return table->priv_delete;
  260. }
  261. /*!
  262. \brief Create SQL CREATE sring from table definition
  263. \return
  264. \param
  265. */
  266. int db_table_to_sql(dbTable * table, dbString * sql)
  267. {
  268. int col, ncols;
  269. dbColumn *column;
  270. const char *colname;
  271. int sqltype, ctype;
  272. char buf[500];
  273. db_set_string(sql, "create table ");
  274. db_append_string(sql, db_get_table_name(table));
  275. db_append_string(sql, " ( ");
  276. ncols = db_get_table_number_of_columns(table);
  277. for (col = 0; col < ncols; col++) {
  278. column = db_get_table_column(table, col);
  279. colname = db_get_column_name(column);
  280. sqltype = db_get_column_sqltype(column);
  281. ctype = db_sqltype_to_Ctype(sqltype);
  282. G_debug(3, "%s (%s)", colname, db_sqltype_name(sqltype));
  283. if (col > 0)
  284. db_append_string(sql, ", ");
  285. db_append_string(sql, colname);
  286. db_append_string(sql, " ");
  287. /* Note: I found on Web:
  288. * These are the ANSI data types: BIT, CHARACTER, DATE, DECIMAL, DOUBLE PRECISION, FLOAT,
  289. * INTEGER, INTERVAL, NUMERIC, REAL, SMALLINT, TIMESTAMP, TIME, VARBIT, VARCHAR, CHAR
  290. * ...
  291. * Thus, the only data types you can use with the assurance that they will
  292. * work everywhere are as follows:
  293. * DOUBLE PRECISION, FLOAT, INTEGER, NUMERIC, REAL, SMALLINT, VARCHAR, CHAR */
  294. switch (sqltype) {
  295. case DB_SQL_TYPE_CHARACTER:
  296. sprintf(buf, "varchar(%d)", db_get_column_length(column));
  297. db_append_string(sql, buf);
  298. break;
  299. case DB_SQL_TYPE_TEXT:
  300. G_warning("Type TEXT converted to 'VARCHAR(250)'");
  301. db_append_string(sql, "varchar(250)");
  302. break;
  303. case DB_SQL_TYPE_SMALLINT:
  304. case DB_SQL_TYPE_INTEGER:
  305. db_append_string(sql, "integer");
  306. break;
  307. case DB_SQL_TYPE_REAL:
  308. case DB_SQL_TYPE_DOUBLE_PRECISION:
  309. case DB_SQL_TYPE_DECIMAL:
  310. case DB_SQL_TYPE_NUMERIC:
  311. case DB_SQL_TYPE_INTERVAL:
  312. db_append_string(sql, "double precision");
  313. break;
  314. case DB_SQL_TYPE_DATE:
  315. db_append_string(sql, "date");
  316. break;
  317. case DB_SQL_TYPE_TIME:
  318. db_append_string(sql, "time");
  319. break;
  320. case DB_SQL_TYPE_TIMESTAMP:
  321. db_append_string(sql, "datetime");
  322. break;
  323. default:
  324. G_warning("Unknown column type (%s)", colname);
  325. return DB_FAILED;
  326. }
  327. }
  328. db_append_string(sql, " )");
  329. G_debug(3, "sql statement: %s", db_get_string(sql));
  330. return DB_OK;
  331. }