Skip to content

Commit

Permalink
PostgreSQL DB driver: create/delete_database() implemented
Browse files Browse the repository at this point in the history
git-svn-id: https://svn.osgeo.org/grass/grass/trunk@53606 15284696-431f-4ddb-bdfa-cd5b030d7da7
  • Loading branch information
landam committed Oct 29, 2012
1 parent dd3aaad commit 58385a1
Showing 1 changed file with 95 additions and 0 deletions.
95 changes: 95 additions & 0 deletions db/drivers/postgres/db.c
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,7 @@
(>=v2). Read the file COPYING that comes with GRASS for details.
\author Radim Blazek
\author Create/drop database by Martin Landa <landa.martin gmail.com>
*/

#include <stdlib.h>
Expand All @@ -26,6 +27,8 @@ static void notice_processor(void *arg, const char *message)
}
}

static int create_delete_db();

int db__driver_open_database(dbHandle * handle)
{
char buf[500];
Expand Down Expand Up @@ -187,3 +190,95 @@ int db__driver_close_database()
PQfinish(pg_conn);
return DB_OK;
}

/*!
\brief Create new empty PostgreSQL database.
\param handle dbHandle
\return DB_OK on success
\return DB_FAILED on failure
*/
int db__driver_create_database(dbHandle *handle)
{
return create_delete_db(handle, TRUE);
}

/*!
\brief Drop existing PostgreSQL database.
\param handle dbHandle
\return DB_OK on success
\return DB_FAILED on failure
*/
int db__driver_delete_database(dbHandle *handle)
{
return create_delete_db(handle, FALSE);
}

/* create or drop database */
int create_delete_db(dbHandle *handle, int create)
{
dbString stmt;
const char *template_db, *name, *user, *password;

PGCONN pgconn;
PGresult *res;

db_init_string(&stmt);

template_db = "template1";
name = db_get_handle_dbname(handle); /* database to create */

if (parse_conn(template_db, &pgconn) == DB_FAILED) {
db_d_report_error();
return DB_FAILED;
}
G_debug(3,
"db_driver_create_database(): host = %s, port = %s, options = %s, tty = %s, "
"dbname = %s, user = %s, password = %s, "
"schema = %s", pgconn.host, pgconn.port, pgconn.options,
pgconn.tty, pgconn.dbname, pgconn.user, pgconn.password,
pgconn.schema);
db_get_login("pg", template_db, &user, &password);

pg_conn = PQsetdbLogin(pgconn.host, pgconn.port, pgconn.options, pgconn.tty,
pgconn.dbname, user, password);
if (PQstatus(pg_conn) == CONNECTION_BAD) {
db_d_append_error(_("Connection failed."));
db_d_append_error("\n");
db_d_append_error(PQerrorMessage(pg_conn));
db_d_report_error();
PQfinish(pg_conn);
return DB_FAILED;
}

/* create new database */
if (create)
db_set_string(&stmt, "CREATE DATABASE ");
else
db_set_string(&stmt, "DROP DATABASE ");
db_append_string(&stmt, name);

res = PQexec(pg_conn,
db_get_string(&stmt));
if (!res || PQresultStatus(res) != PGRES_COMMAND_OK) {
if (create)
db_d_append_error(_("Unable to create database <%s>"), name);
else
db_d_append_error(_("Unable to drop database <%s>"), name);
db_d_append_error("\n");
db_d_append_error(PQerrorMessage(pg_conn));
db_d_report_error();

PQclear(res);
PQfinish(pg_conn);
return DB_FAILED;
}

PQclear(res);
PQfinish(pg_conn);

return DB_OK;
}

0 comments on commit 58385a1

Please sign in to comment.