create_table.c 3.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148
  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. init_error();
  24. db_init_string(&sql);
  25. /* db_table_to_sql ( table, &sql ); */
  26. db_set_string(&sql, "create table ");
  27. db_append_string(&sql, db_get_table_name(table));
  28. db_append_string(&sql, " ( ");
  29. ncols = db_get_table_number_of_columns(table);
  30. for (col = 0; col < ncols; col++) {
  31. column = db_get_table_column(table, col);
  32. colname = db_get_column_name(column);
  33. sqltype = db_get_column_sqltype(column);
  34. G_debug(3, "%s (%s)", colname, db_sqltype_name(sqltype));
  35. if (col > 0)
  36. db_append_string(&sql, ", ");
  37. db_append_string(&sql, colname);
  38. db_append_string(&sql, " ");
  39. switch (sqltype) {
  40. case DB_SQL_TYPE_CHARACTER:
  41. sprintf(buf, "varchar(%d)", db_get_column_length(column));
  42. db_append_string(&sql, buf);
  43. break;
  44. case DB_SQL_TYPE_TEXT:
  45. db_append_string(&sql, "text");
  46. break;
  47. case DB_SQL_TYPE_SMALLINT:
  48. db_append_string(&sql, "smallint");
  49. break;
  50. case DB_SQL_TYPE_INTEGER:
  51. db_append_string(&sql, "integer");
  52. break;
  53. case DB_SQL_TYPE_REAL:
  54. db_append_string(&sql, "real");
  55. break;
  56. /* TODO: better numeric types */
  57. case DB_SQL_TYPE_DOUBLE_PRECISION:
  58. case DB_SQL_TYPE_DECIMAL:
  59. case DB_SQL_TYPE_NUMERIC:
  60. case DB_SQL_TYPE_INTERVAL:
  61. db_append_string(&sql, "double precision");
  62. break;
  63. case DB_SQL_TYPE_DATE:
  64. db_append_string(&sql, "date");
  65. break;
  66. case DB_SQL_TYPE_TIME:
  67. db_append_string(&sql, "time");
  68. break;
  69. case DB_SQL_TYPE_TIMESTAMP:
  70. db_append_string(&sql, "timestamp");
  71. break;
  72. default:
  73. G_warning(_("Unknown column type (%s)"), colname);
  74. return DB_FAILED;
  75. }
  76. }
  77. db_append_string(&sql, " )");
  78. G_debug(3, " SQL: %s", db_get_string(&sql));
  79. res = PQexec(pg_conn, db_get_string(&sql));
  80. if (!res || PQresultStatus(res) != PGRES_COMMAND_OK) {
  81. append_error(_("Unable to create table:\n"));
  82. append_error(db_get_string(&sql));
  83. append_error("\n");
  84. append_error(PQerrorMessage(pg_conn));
  85. report_error();
  86. PQclear(res);
  87. db_free_string(&sql);
  88. return DB_FAILED;
  89. }
  90. PQclear(res);
  91. /* Grant privileges */
  92. db_get_connection(&connection);
  93. db_set_string(&sql, "grant select on ");
  94. db_append_string(&sql, db_get_table_name(table));
  95. db_append_string(&sql, " to public");
  96. if (connection.group) {
  97. db_append_string(&sql, ", group ");
  98. db_append_string(&sql, connection.group);
  99. }
  100. G_debug(3, " SQL: %s", db_get_string(&sql));
  101. res = PQexec(pg_conn, db_get_string(&sql));
  102. if (!res || PQresultStatus(res) != PGRES_COMMAND_OK) {
  103. append_error(_("Unable to grant select on table:\n"));
  104. append_error(db_get_string(&sql));
  105. append_error("\n");
  106. append_error(PQerrorMessage(pg_conn));
  107. report_error();
  108. PQclear(res);
  109. db_free_string(&sql);
  110. return DB_FAILED;
  111. }
  112. PQclear(res);
  113. db_free_string(&sql);
  114. return DB_OK;
  115. }