Skip to content

Commit

Permalink
dbmi: add db_get|set_login2() which supports also hostname and port
Browse files Browse the repository at this point in the history
git-svn-id: https://svn.osgeo.org/grass/grass/trunk@65056 15284696-431f-4ddb-bdfa-cd5b030d7da7
  • Loading branch information
landam committed Apr 15, 2015
1 parent 577747c commit da399c5
Show file tree
Hide file tree
Showing 5 changed files with 176 additions and 60 deletions.
4 changes: 2 additions & 2 deletions include/dbmi.h
Original file line number Diff line number Diff line change
Expand Up @@ -293,10 +293,10 @@ typedef struct
typedef struct _db_connection
{
char *driverName;
/* char *hostName; */
char *hostName;
char *databaseName;
char *schemaName;
char *location;
char *port;
char *user;
char *password;
char *keycol; /* name of default key column */
Expand Down
4 changes: 4 additions & 0 deletions include/defs/dbmi.h
Original file line number Diff line number Diff line change
Expand Up @@ -410,7 +410,11 @@ void db_zero(void *, int);
void db_zero_string(dbString *);
unsigned int db_sizeof_string(const dbString *);
int db_set_login(const char *, const char *, const char *, const char *);
int db_set_login2(const char *, const char *, const char *, const char *,
const char *, const char *, int);
int db_get_login(const char *, const char *, const char **, const char **);
int db_get_login2(const char *, const char *, const char **, const char **,
const char **, const char **);
int db_get_login_dump(FILE *);

#endif
15 changes: 5 additions & 10 deletions lib/db/dbmi_base/connect.c
Original file line number Diff line number Diff line change
Expand Up @@ -80,17 +80,12 @@ int db_get_connection(dbConnection * connection)
connection->schemaName = (char *)G_getenv_nofatal2("DB_SCHEMA", G_VAR_MAPSET);
connection->group = (char *)G_getenv_nofatal2("DB_GROUP", G_VAR_MAPSET);

/* below commented due to new mechanism: see db_get_login()
connection->hostName = G_getenv_nofatal("DB_HOST");
connection->location = G_getenv_nofatal("DB_LOCATION");
connection->user = G_getenv_nofatal("DB_USER");
connection->password = G_getenv_nofatal("DB_PASSWORD");
*/

/* try to get user/password */
db_get_login(connection->driverName, connection->databaseName,
(const char **) &(connection->user),
(const char **) &(connection->password));
db_get_login2(connection->driverName, connection->databaseName,
(const char **) &(connection->user),
(const char **) &(connection->password),
(const char **) &(connection->hostName),
(const char **) &(connection->port));

return DB_OK;
}
197 changes: 153 additions & 44 deletions lib/db/dbmi_base/login.c
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@
\brief DBMI Library (base) - login settings
(C) 1999-2014 by the GRASS Development Team
(C) 1999-2015 by the GRASS Development Team
This program is free software under the GNU General Public
License (>=v2). Read the file COPYING that comes with GRASS
Expand All @@ -29,6 +29,8 @@ typedef struct
char *database;
char *user;
char *password;
char *host;
char *port;
} DATA;

typedef struct
Expand Down Expand Up @@ -57,19 +59,28 @@ static void init_login(LOGIN * login)
}

static void add_login(LOGIN * login, const char *dr, const char *db, const char *usr,
const char *pwd)
const char *pwd, const char *host, const char *port, int idx)
{
int login_idx;

if (login->n == login->a) {
login->a += 10;
login->data =
(DATA *) realloc((void *)login->data, login->a * sizeof(DATA));
}
login->data[login->n].driver = G_store(dr);
login->data[login->n].database = G_store(db);
login->data[login->n].user = G_store(usr ? usr : "");
login->data[login->n].password = G_store(pwd ? pwd : "");

login->n++;
if (idx > -1 && idx < login->n) {
login_idx = idx;
}
else {
login_idx = login->n;
login->n++;
}
login->data[login_idx].driver = G_store(dr);
login->data[login_idx].database = G_store(db);
login->data[login_idx].user = G_store(usr ? usr : "");
login->data[login_idx].password = G_store(pwd ? pwd : "");
login->data[login_idx].host = G_store(host ? host : "");
login->data[login_idx].port = G_store(port ? port : "");
}

/*
Expand All @@ -82,7 +93,7 @@ static int read_file(LOGIN * login)
int ret;
const char *file;
FILE *fd;
char buf[2001], dr[500], db[500], usr[500], pwd[500];
char buf[2001], dr[500], db[500], usr[500], pwd[500], host[500], port[500];

login->n = 0;
file = login_filename();
Expand All @@ -103,18 +114,19 @@ static int read_file(LOGIN * login)
while (G_getl2(buf, 2000, fd)) {
G_chop(buf);

usr[0] = pwd[0] = '\0';
ret = sscanf(buf, "%[^|]|%[^|]|%[^|]|%[^\n]", dr, db, usr, pwd);
usr[0] = pwd[0] = host[0] = port[0] = '\0';
ret = sscanf(buf, "%[^|]|%[^|]|%[^|]|%[^|]|%[^|]|%[^\n]",
dr, db, usr, pwd, host, port);

G_debug(3, "ret = %d : drv=[%s] db=[%s] usr=[%s] pwd=[%s]",
ret, dr, db, usr, pwd);
G_debug(3, "ret = %d : drv=[%s] db=[%s] usr=[%s] pwd=[%s] host=[%s], port=[%s]",
ret, dr, db, usr, pwd, host, port);

if (ret < 2) {
G_warning(_("Login file (%s) corrupted (line: %s)"), file, buf);
continue;
}

add_login(login, dr, db, usr, pwd);
add_login(login, dr, db, usr, pwd, host, port, -1);
}

fclose(fd);
Expand Down Expand Up @@ -155,40 +167,35 @@ static int write_file(LOGIN * login)
if (login->data[i].password)
fprintf(fd, "|%s", login->data[i].password);
}
fprintf(fd, "\n");
if (login->data[i].host)
fprintf(fd, "|%s", login->data[i].host);
if (login->data[i].port)
fprintf(fd, "|%s", login->data[i].port);

fprintf(fd, "\n");
}

fclose(fd);

return 0;
}

/*!
\brief Set user/password for driver/database
\param driver driver name
\param database database name
\param user user name
\param password password string
\return DB_OK on success
\return DB_FAILED on failure
*/
int db_set_login(const char *driver, const char *database, const char *user,
const char *password)
static int set_login(const char *driver, const char *database, const char *user,
const char *password, const char *host, const char *port,
int overwrite)
{
int i, found;
LOGIN login;

G_debug(3, "db_set_login(): drv=[%s] db=[%s] usr=[%s] pwd=[%s]",
driver, database, user, password);
G_debug(3, "db_set_login(): drv=[%s] db=[%s] usr=[%s] pwd=[%s] host=[%s] port=[%s]",
driver, database, user, password, host, port);

init_login(&login);

if (read_file(&login) == -1)
return DB_FAILED;

found = 0;
found = FALSE;
for (i = 0; i < login.n; i++) {
if (strcmp(login.data[i].driver, driver) == 0 &&
strcmp(login.data[i].database, database) == 0) {
Expand All @@ -202,34 +209,78 @@ int db_set_login(const char *driver, const char *database, const char *user,
else
login.data[i].password = G_store("");

found = 1;
found = TRUE;
break;
}
}

if (found) {
if (overwrite)
G_warning(_("DB connection <%s/%s> already exists and will be overwritten"),
driver, database ? database : "");
else
G_fatal_error(_("DB connection <%s/%s> already exists. "
"Re-run '%s' with '--%s' flag to overwrite existing settings."),
driver, database ? database : "", G_program_name(), "overwrite");
}

if (!found)
add_login(&login, driver, database, user, password);
add_login(&login, driver, database, user, password, host, port, -1);
else
add_login(&login, driver, database, user, password, host, port, i);

if (write_file(&login) == -1)
return DB_FAILED;

return DB_OK;
}

/*!
\brief Get user/password for driver/database if driver/database
is not found, user/password are set to NULL
/*!
\brief Set login parameters for driver/database
\deprecated Use db_set_login2() instead.
\todo: GRASS 8: to be replaced by db_set_login2().
\param driver driver name
\param database database name (can be NULL)
\param[out] user name
\param[out] password string
\param database database name
\param user user name
\param password password string
\return DB_OK on success
\return DB_FAILED on failure
*/
int db_get_login(const char *driver, const char *database, const char **user,
const char **password)
*/
int db_set_login(const char *driver, const char *database, const char *user,
const char *password)
{
return set_login(driver, database, user,
password, NULL, NULL, FALSE);
}

/*!
\brief Set login parameters for driver/database
\param driver driver name
\param database database name
\param user user name
\param password password string
\param host host name
\param port
\param overwrite TRUE to overwrite exising connections
\return DB_OK on success
\return DB_FAILED on failure
*/
int db_set_login2(const char *driver, const char *database, const char *user,
const char *password, const char *host, const char *port,
int overwrite)
{
return set_login(driver, database, user,
password, host, port, overwrite);
}

static int get_login(const char *driver, const char *database, const char **user,
const char **password, const char **host, const char **port)
{
int i;
LOGIN login;
Expand Down Expand Up @@ -257,13 +308,69 @@ int db_get_login(const char *driver, const char *database, const char **user,
else
*password = NULL;

if (login.data[i].host && strlen(login.data[i].host) > 0 && host)
*host = G_store(login.data[i].host);
else
*host = NULL;

if (login.data[i].port && strlen(login.data[i].port) > 0 && port)
*port = G_store(login.data[i].port);
else
*port = NULL;

break;
}
}

return DB_OK;
}

/*!
\brief Get login parameters for driver/database
If driver/database is not found, output arguments are set to NULL.
\deprecated Use db_set_login2() instead.
\todo: GRASS 8: to be replaced by db_set_login2().
\param driver driver name
\param database database name (can be NULL)
\param[out] user name
\param[out] password string
\return DB_OK on success
\return DB_FAILED on failure
*/
int db_get_login(const char *driver, const char *database, const char **user,
const char **password)
{
return get_login(driver, database, user,
password, NULL, NULL);
}

/*!
\brief Get login parameters for driver/database
If driver/database is not found, output arguments are set to NULL.
\param driver driver name
\param database database name (can be NULL)
\param[out] user name
\param[out] password string
\param[out] host name
\param[out] port
\return DB_OK on success
\return DB_FAILED on failure
*/
int db_get_login2(const char *driver, const char *database, const char **user,
const char **password, const char **host, const char **port)
{
return get_login(driver, database, user,
password, host, port);
}

/*!
\brief Print all connection settings to file
Expand All @@ -284,11 +391,13 @@ int db_get_login_dump(FILE *fd)
return DB_FAILED;

for (i = 0; i < login.n; i++) {
fprintf(fd, "%s|%s|%s|%s\n",
fprintf(fd, "%s|%s|%s|%s|%s|%s\n",
login.data[i].driver,
login.data[i].database,
login.data[i].user,
login.data[i].password);
login.data[i].password,
login.data[i].host,
login.data[i].port);
}

return DB_OK;
Expand Down
Loading

0 comments on commit da399c5

Please sign in to comment.