create_table.c 3.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146
  1. /*!
  2. \file db/driver/postgres/create_table.c
  3. \brief DBMI - Low Level PostgreSQL database driver - create table
  4. This program is free software under the GNU General Public License
  5. (>=v2). Read the file COPYING that comes with GRASS for details.
  6. \author Radim Blazek
  7. */
  8. #include <grass/dbmi.h>
  9. #include <grass/glocale.h>
  10. #include "globals.h"
  11. #include "proto.h"
  12. int db__driver_create_table(dbTable * table)
  13. {
  14. int col, ncols;
  15. dbColumn *column;
  16. const char *colname;
  17. int sqltype;
  18. char buf[500];
  19. PGresult *res;
  20. dbString sql;
  21. dbConnection connection;
  22. G_debug(3, "db__driver_create_table()");
  23. db_init_string(&sql);
  24. /* db_table_to_sql ( table, &sql ); */
  25. db_set_string(&sql, "create table ");
  26. db_append_string(&sql, db_get_table_name(table));
  27. db_append_string(&sql, " ( ");
  28. ncols = db_get_table_number_of_columns(table);
  29. for (col = 0; col < ncols; col++) {
  30. column = db_get_table_column(table, col);
  31. colname = db_get_column_name(column);
  32. sqltype = db_get_column_sqltype(column);
  33. G_debug(3, "%s (%s)", colname, db_sqltype_name(sqltype));
  34. if (col > 0)
  35. db_append_string(&sql, ", ");
  36. db_append_string(&sql, colname);
  37. db_append_string(&sql, " ");
  38. switch (sqltype) {
  39. case DB_SQL_TYPE_CHARACTER:
  40. sprintf(buf, "varchar(%d)", db_get_column_length(column));
  41. db_append_string(&sql, buf);
  42. break;
  43. case DB_SQL_TYPE_TEXT:
  44. db_append_string(&sql, "text");
  45. break;
  46. case DB_SQL_TYPE_SMALLINT:
  47. db_append_string(&sql, "smallint");
  48. break;
  49. case DB_SQL_TYPE_INTEGER:
  50. db_append_string(&sql, "integer");
  51. break;
  52. case DB_SQL_TYPE_REAL:
  53. db_append_string(&sql, "real");
  54. break;
  55. /* TODO: better numeric types */
  56. case DB_SQL_TYPE_DOUBLE_PRECISION:
  57. case DB_SQL_TYPE_DECIMAL:
  58. case DB_SQL_TYPE_NUMERIC:
  59. case DB_SQL_TYPE_INTERVAL:
  60. db_append_string(&sql, "double precision");
  61. break;
  62. case DB_SQL_TYPE_DATE:
  63. db_append_string(&sql, "date");
  64. break;
  65. case DB_SQL_TYPE_TIME:
  66. db_append_string(&sql, "time");
  67. break;
  68. case DB_SQL_TYPE_TIMESTAMP:
  69. db_append_string(&sql, "timestamp");
  70. break;
  71. default:
  72. G_warning(_("Unknown column type (%s)"), colname);
  73. return DB_FAILED;
  74. }
  75. }
  76. db_append_string(&sql, " )");
  77. G_debug(3, " SQL: %s", db_get_string(&sql));
  78. res = PQexec(pg_conn, db_get_string(&sql));
  79. if (!res || PQresultStatus(res) != PGRES_COMMAND_OK) {
  80. db_d_append_error("%s\n%s\n%s",
  81. _("Unable to create table:"),
  82. db_get_string(&sql),
  83. PQerrorMessage(pg_conn));
  84. db_d_report_error();
  85. PQclear(res);
  86. db_free_string(&sql);
  87. return DB_FAILED;
  88. }
  89. PQclear(res);
  90. /* Grant privileges */
  91. db_get_connection(&connection);
  92. db_set_string(&sql, "grant select on ");
  93. db_append_string(&sql, db_get_table_name(table));
  94. db_append_string(&sql, " to public");
  95. if (connection.group) {
  96. db_append_string(&sql, ", group ");
  97. db_append_string(&sql, connection.group);
  98. }
  99. G_debug(3, " SQL: %s", db_get_string(&sql));
  100. res = PQexec(pg_conn, db_get_string(&sql));
  101. if (!res || PQresultStatus(res) != PGRES_COMMAND_OK) {
  102. db_d_append_error("%s\n%s\%s",
  103. _("Unable to grant select on table:"),
  104. db_get_string(&sql),
  105. PQerrorMessage(pg_conn));
  106. db_d_report_error();
  107. PQclear(res);
  108. db_free_string(&sql);
  109. return DB_FAILED;
  110. }
  111. PQclear(res);
  112. db_free_string(&sql);
  113. return DB_OK;
  114. }