create_table.c 3.4 KB

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