create_table.c 3.1 KB

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